建设工程规划许可证公示网站,小程序开发外包服务公司,app程序开发制作公司,网站主机租用多少钱1、基本概念
图像分割是计算机视觉和图像处理中的一个关键步骤#xff0c;它指的是将图像划分为多个区域或对象的过程。这些区域或对象在某种特性#xff08;如颜色、形状、纹理或亮度等#xff09;上是一致的或相似的#xff0c;而在不同区域之间则存在明显的差异。图像分…1、基本概念
图像分割是计算机视觉和图像处理中的一个关键步骤它指的是将图像划分为多个区域或对象的过程。这些区域或对象在某种特性如颜色、形状、纹理或亮度等上是一致的或相似的而在不同区域之间则存在明显的差异。图像分割的目标是从图像中提取出感兴趣的部分以便于后续的图像分析和理解。 具体来说图像分割可以进一步细分为不同的类型包括
阈值分割这是最简单的一种分割方法它基于图像的灰度值或颜色值来设定一个或多个阈值从而将图像分割为不同的区域。例如在二值化过程中选择一个阈值将高于该阈值的像素设为白色低于该阈值的像素设为黑色。基于边缘的分割这种方法依赖于图像中的边缘信息即灰度值或颜色值发生显著变化的位置。通过检测这些边缘可以将图像划分为不同的部分。基于区域的分割这种方法根据像素的相似性将图像划分为区域。常见的算法包括区域生长和分裂合并等。基于图论的分割如最小割/最大流算法等将图像视为一个图像素作为图的节点节点之间的相似性作为边的权重通过求解图的最优划分来实现图像分割。基于深度学习的分割近年来随着深度学习技术的发展基于卷积神经网络CNN的图像分割方法取得了显著的效果。这些方法通过学习大量的训练数据来自动提取图像特征并实现对图像的精确分割。例如全卷积网络FCN、U-Net等模型在医学图像分割、场景理解等领域得到了广泛应用。
2、OpenCV的分割API
2.1 threshold
cv.threshold 是 OpenCV 库中用于图像阈值化处理的一个非常重要的函数使用最多的就是其中包含的OTSU分割方法又称大津法。其函数原型和参数详细解释如下
retval, dst cv.threshold(src, thresh, maxval, type[, dst])参数详细解释
src输入图像。这可以是 8 位的灰度图也可以是 32 位的浮点数图像。但在实际应用中阈值处理通常在灰度图像上进行。dst输出图像。与输入图像具有相同的大小和类型。函数处理后的图像将存储在这里。thresh这是用于将像素分类的阈值。如果源图像中某个像素的灰度值大于或等于这个阈值则目标图像中对应像素的灰度值将被设置为 maxval对于某些阈值类型如 THRESH_BINARY否则将被设置为 0对于 THRESH_BINARY 类型。maxval当像素值超过或在某些阈值类型下小于阈值时应该赋予的新值。对于二值化操作这个值通常是 255表示白色。type阈值类型决定了阈值操作的具体方式。常见的阈值类型包括
cv::THRESH_BINARY或 cv2.THRESH_BINARY 在 Python 中二值化。大于阈值的像素被设置为 maxval小于阈值的像素被设置为 0。cv::THRESH_BINARY_INV或 cv2.THRESH_BINARY_INV反二值化。与 THRESH_BINARY 相反小于阈值的像素被设置为 maxval大于阈值的像素被设置为 0。cv::THRESH_TRUNC或 cv2.THRESH_TRUNC截断。大于阈值的像素被设置为阈值本身小于阈值的像素保持不变。cv::THRESH_TOZERO或 cv2.THRESH_TOZERO设为零。大于阈值的像素保持不变小于阈值的像素被设置为 0。cv::THRESH_TOZERO_INV或 cv2.THRESH_TOZERO_INV反向设为零。小于阈值的像素保持不变大于阈值的像素被设置为 0。cv::THRESH_OTSU 和 cv::THRESH_TRIANGLE这两种类型用于自动计算最佳阈值而不是使用固定的阈值。它们通常与其他阈值类型结合使用以获取更好的分割效果。函数返回实际使用的阈值。
OTSU的分割方法对于图像直方图为双峰的场景分割效果较好。示例代码如下
import cv2 as cv
import numpy as npdef OTSU(input):_, bw cv.threshold(input, 128, 255, cv.THRESH_OTSU)return bwif __name__ __main__:image cv.imread(sky.jpg, cv.IMREAD_GRAYSCALE)bw OTSU(image)result np.concatenate([image, bw], axis1)cv.imwrite(otsu.jpg, result)cv.imshow(bw, bw)cv.waitKey() 2.2 adaptiveThreshold
adaptiveThreshold是OpenCV中的自适应分割函数这个函数允许为图像的不同部分应用不同的阈值特别适用于处理光照不均或背景复杂变化的场景比如文档图像。
void cv::adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);参数说明
src输入的8位单通道图像通常是灰度图。dst输出图像与输入图像有相同的尺寸和类型。maxValue当像素值超过或根据阈值类型小于计算得到的阈值时赋予的像素值。adaptiveMethod使用的自适应阈值算法。有两种选择 cv::ADAPTIVE_THRESH_MEAN_C表示使用局部区域的平均值减去C来计算阈值。cv::ADAPTIVE_THRESH_GAUSSIAN_C表示使用局部区域的高斯加权和减去C来计算阈值。thresholdType阈值类型必须是cv::THRESH_BINARY或cv::THRESH_BINARY_INV。THRESH_BINARY如果像素值大于阈值则设为最大值否则设为0。THRESH_BINARY_INV如果像素值大于阈值则设为0否则设为最大值。 blockSize局部区域的大小用于计算阈值必须是正奇数。C从均值或加权均值中减去的常数。 示例代码如下
import cv2 as cv
import numpy as np
def Ada(input):bw cv.adaptiveThreshold(input, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, 5)return bwif __name__ __main__:image cv.imread(doc.jpg, cv.IMREAD_GRAYSCALE)bw Ada(image)result np.concatenate([image, bw], axis1)cv.imwrite(doc-result.jpg, result)cv.imshow(bw, bw)cv.waitKey()2.3 边缘分割Canny算子
函数定义
edges cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])参数说明
imageInputArray类型输入图像应为单通道的8位图像灰度图像。在Python中这个参数直接传入图像变量即可。edgesOutputArray类型输出图像用于存放检测到的边缘。这个图像应与原图像具有相同的尺寸和类型。在Python中这个参数通常是可选的因为函数会返回一个包含边缘的图像。threshold1double类型第一个滞后性阈值低阈值用于弱边缘的检测。这个阈值较低可以捕获更多的边缘细节但也可能导致噪声被误检为边缘。threshold2double类型第二个滞后性阈值高阈值用于强边缘的检测。这个阈值较高可以确保检测到的边缘更加显著和连续。通常高低阈值的比在2:1到3:1之间效果较好。apertureSizeint类型默认为3Sobel算子的尺寸即用于计算图像梯度的滤波器的孔径大小。这个参数影响边缘检测的灵敏度和精度。L2gradientbool类型默认为false一个计算图像梯度幅值的标识。如果设为true则使用L2范数来计算梯度幅度即两个方向倒数的平方和再开方如果设为false则使用L1范数即将两个方向导数的绝对值相加。L2范数通常能提供更精确的结果但计算量稍大。
示例代码
import cv2 as cv
import numpy as np
if __name__ __main__:image cv.imread(lingjian.jpg, cv.IMREAD_GRAYSCALE)bw cv.Canny(image, 30, 90)result np.concatenate([image, bw], axis1)cv.imwrite(lingjian-result.jpg, result)cv.imshow(bw, bw)cv.waitKey()3、小结
1、图像处理的分割方法一般都是针对特定的应用场景进行开发因此API的调参是工作中常见的任务。 2、二值化是图像分割的特殊情况图像分割是一项基本的视觉任务。