文章目录
- 前言
- 一、阈值控制
- 二、腐蚀与膨胀
- 1.腐蚀
- 2.膨胀
- 3.形态学操作
- 总结
前言
前面讲解了图像基础理论、图像的变换以及图像滤波等操作,本章,将会介绍图像的形态学操作。
图像的形态学指的是一组数学方法和工具,用于图像分析和处理。形态学方法主要利用形态学操作来改变图像中的特定区域形状和大小,并提取出图像中有用的信息。常见的形态学操作包括膨胀、腐蚀、开操作和闭操作等。
膨胀操作可以使图像中的物体变大,被广泛应用于图像分割、形态学重建等场合。腐蚀操作可以使图像中的物体变小,被广泛应用于图像去噪、分割等场合。开操作可以去除小的区域,而保留更大的连通区域,常用于去除噪声。闭操作则可以填充物体内部的空洞,常用于图像增强和形态学重建。
形态学方法可以应用于图像的前景和背景分割,轮廓提取、几何形状分析和对象计数等方面。通过应用多种形态学操作,可以得到各种有用的形状信息,从而提高图像处理和分析的准确性和效率。
一、阈值控制
-
cv2.threshold是OpenCV中的一个函数,用于图像的二值化处理。
作用: 将图像像素值大于一个指定阈值的像素设置为一定值,而小于阈值的像素则设置为另一个值。该函数的语法如下:ret,thresh = cv2.threshold(src, thresh, maxval, type)
其中,
src
表示要进行二值化处理的源图像,thresh
表示二值化的阈值,maxval
表示二值化后的最大值,即像素值大于等于阈值的像素设置的值,type
表示二值化的类型,有以下几种选项:- cv2.THRESH_BINARY:常用的二值化类型,大于阈值的像素设置为
maxval
,小于等于阈值的像素设置为0。 - cv2.THRESH_BINARY_INV:与
cv2.THRESH_BINARY
相反,大于阈值的像素设置为0,小于等于阈值的像素设置为maxval
。 - cv2.THRESH_TRUNC:将大于阈值的像素值设置为阈值,小于等于阈值的像素值不变。
- cv2.THRESH_TOZERO:将小于阈值的像素值设置为0,大于等于阈值的像素值不变。
- cv2.THRESH_TOZERO_INV:与
cv2.THRESH_TOZERO
相反,大于阈值的像素值设置为0,小于等于阈值的像素值不变。
返回值包括阈值
ret
和二值化后的图像thresh
。
cv2.threshold
方法也能自动计算threshVal
值,具体介绍如下:ret,thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
其中,
src
表示要进行二值化处理的源图像,0
表示阈值暂时未指定,255
表示二值化后的灰度级最大值,cv2.THRESH_BINARY+cv2.THRESH_OTSU
表示同时使用二值化类型和自动阈值计算方法。返回值中,
ret
为计算得到的最优的阈值,thresh
为二值化后的图像。需要注意的是,在应用该自动二值化方法时,应该先对图像进行灰度化处理,然后再使用该方法。该方法可在某些情况下提高图像处理的效率,并且可以用于各种类型的图像二值化处理,一般适用于具有双峰直方图的图像。其中一个峰表示背景对象,另一个峰表示前景对象。
- cv2.THRESH_BINARY:常用的二值化类型,大于阈值的像素设置为
-
自适应阈值算法
cv2.adaptiveThreshold
函数是 OpenCV 中的另一种图像二值化方法,该方法可以根据每个像素周围的像素灰度值的变化情况来确定局部阈值。这种方法特别适合处理光照不均匀的图像,因为它考虑了每个像素周围像素的灰度值变化来自适应地确定适当的阈值。该函数的语法格式如下:
dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
其中,
src
表示要进行二值化处理的源图像,maxval
表示输出图像中的最大值,adaptiveMethod
表示自适应方法的类型:- cv2.ADAPTIVE_THRESH_MEAN_C:使用邻域块的平均值作为阈值。
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C:使用邻域块的加权和的高斯窗口函数作为阈值。
thresholdType
表示二值化类型,可以使用以下类型:- cv2.THRESH_BINARY:二值化类型为 0 和 maxval,与
cv2.threshold
函数的cv2.THRESH_BINARY
类型相同。 - cv2.THRESH_BINARY_INV:二值化类型为 maxval 和 0,与
cv2.threshold
函数的cv2.THRESH_BINARY_INV
类型相同。
blockSize
表示邻域块的大小,该值应该是一个奇数。我们将这个块中每个像素的局部阈值计算为该块中所有像素的加权平均值,其中像素强度作为加权系数。块越大,则所需平均时间越长。C
表示从平均值或加权平均值中减去的常数。返回值即为二值化后的图像
dst
。需要注意的是,自适应阈值二值化方法的结果具有潜在的噪声,并且在图像局部存在多种颜色和纹理时可能不如全局二值化方法表现良好。
二、腐蚀与膨胀
1.腐蚀
-
作用: 腐蚀操作可以将目标物体的边缘磨损掉,使得物体变小,边缘更加光滑。在实际应用中,通过腐蚀操作可以去除噪声,连接物体中间的窄断,平滑物体的边缘。同时,腐蚀操作也可用于图像分割、图像骨架提取和轮廓检测等任务中。
-
原理: 使用一个结构元素(Kernel)在图像上滑动,将结构元素覆盖到的所有像素都用结构元素的中心元素来代替。具体地,根据结构元素内的像素进行像素值的计算,如果与中心像素相对应的结构元素内的所有像素都是前景像素(像素值为1),则将中心像素设置为1。否则,将中心像素设为背景像素(像素值为0)。
-
接口:
dst = cv2.erode(src, kernel, iterations=None)
其中,参数
src
表示输入的二值图像,参数kernel
是用来决定腐蚀操作效果的结构元素,参数iterations
表示腐蚀操作的迭代次数。kernel可以手动构造(手动只能构造矩形的核,使用
cv2.getStruringElement(shape, ksize[, anchor]) ->retval
可构造其他形状的核)
2.膨胀
- 原理: 卷积核中值为1框住的像素中,存在非零时,卷积核中心对于的像素为非零。
- 作用: 膨胀是一种常见的形态学图像处理操作,用于增加图像的大小,连接未闭合的图像区域,以及分离图像中的邻近物体。
cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
cv2.dilate()
是 OpenCV 库中的一个函数,用来执行图像膨胀操作(Dilation)。膨胀是一种常见的形态学图像处理操作,用于增加图像的大小,连接未闭合的图像区域,以及分离图像中的邻近物体。
具体来说,cv2.dilate()
可以对二值图像或灰度图像执行膨胀操作,将每个像素的邻域扩张到指定的区域,并将中心像素设置为邻域中最大的像素值,从而使图像中的白色区域变得更大、更连续。函数的语法如下:
cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
其中,参数含义如下:
src
: 需要执行膨胀操作的输入图像,可以是任何维度和通道数的灰度图像或二值图像。kernel
: 膨胀操作使用的结构元素 (kernel)。它可以是一个矩形、椭圆或自定义形状的内核。结构元素可以通过cv2.getStructuringElement()
函数创建。例如,可以使用cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
创建一个 5x5 大小的矩形内核。dst
: 和输入图像src
大小和类型相同的输出图像。如果不提供,则函数会创建一个与输入图像相同大小和类型的空输出图像。anchor
: 膨胀操作的锚点。通常设置为内核中心,即 (-1,-1)。iterations
: 膨胀操作迭代次数,指定操作执行的次数。默认为 1。borderType
: 边界填充类型,默认为cv2.BORDER_CONSTANT
,表示使用常数进行边界填充。borderValue
: 边界填充所使用的值。默认为 0。
3.形态学操作
# op: cv2.MORPH_ 形态学的操作类型
cv2.morphologyEX(src, op, kernel:np.ndarray[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
名称 | 操作 | OpenCV的op | 应用 |
---|---|---|---|
开运算 | 先腐蚀再膨胀 | cv2.MORPH-OPEN | 去除边界上的毛刺、去二值图的噪点 |
闭运算 | 先膨胀再腐蚀 | cv2.MORPH_CLOSE | 中空形状或者邻近的形状形成一整块 |
梯度运算 | 膨胀减去腐蚀 | cv2.MORPH_GRADIENT | 图像的边缘 |
礼帽 | 原始减去开运算 | cv2.MORPH_TOPHAT | 把由开运算去除的像素显出来 可以用来突出或提取图像中的一些小特征、边缘、纹理等 |
黑帽 | 闭运算减去原始 | cv2.MORPH_BLACKHAT | 将闭运算填充的像素,从原图中截取出来 将图像中与背景匹配的小的特征或者纹理从原图像中去除,从而让图像在许多图像处理任务中更加透明 |
总结
图像形态学是一种基于集合论的数学理论,在对数字图像进行处理时非常实用。该理论主要涉及两个部分:形态学操作和结构元素。形态学操作包括膨胀、腐蚀、开运算、闭运算、梯度运算等等,这些操作可以用来改变数字图像区域的形状和大小。结构元素是形态学操作的基础,其实就是一个小的二值图像,用于与目标图像的不同部分相匹配。在应用形态学操作时,结构元素的形状和大小会影响到结果。
膨胀操作可以使图像的白色区域增加,黑色区域减少,用于填充空隙和连接断开的部分。腐蚀操作则相反,可以使图像的白色区域减少,黑色区域增加,用于去除噪声和分离形状相同但不相连的部分。开运算和闭运算是一对互逆操作,用于平滑图像、消除小尺度物体和提取形状特征。梯度运算可以用于检测图像中的边缘、轮廓和区域间的界限。
总的来说,图像形态学能够对数字图像进行形态学分析和处理,通过不同的操作得到不同的目标图像,广泛应用于图像处理、模式识别、计算机视觉等领域。