OpenCV入门(十一)快速学会OpenCV 10 形态学操作
作者:Xiou
形态学,即数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。
形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。例如,在识别手写数字时,能够通过形态学运算得到其骨架信息,在具体识别时,仅针对其骨架进行运算即可。
形态学处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域都有非常重要的应用。
形态学操作主要包含:腐蚀、膨胀、开运算、闭运算、形态学梯度(Morphological Gradient)运算、顶帽运算(礼帽运算)、黑帽运算等操作。
腐蚀操作和膨胀操作是形态学运算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等不同形式的运算。
形态学处理在图像处理上的应用有:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化,分割出独立的图像元素或者图像中相邻的元素,求取图像中明显的极大值区域和极小值区域,以及求取图像梯度等。
测试原图:
1.腐蚀
腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。腐蚀用来“收缩”或者“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。例如,在图中,左图是原始图像,右图是对其腐蚀的处理结果。
语法格式:
dst = cv2.erode( src, kernel[, anchor[, iterations[, borderType[,
borderValue]]]] )
● dst是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
● src是需要进行腐蚀的原始图像,图像的通道数可以是任意的。但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
● kernel代表腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
● anchor代表element结构中锚点的位置。该值默认为(-1, -1),在核的中心位置。
● iterations是腐蚀操作迭代的次数,该值默认为1,即只进行一次腐蚀操作。
● borderType代表边界样式,一般采用其默认值BORDER_CONSTANT。该项的具体值如表所示。
● borderValue是边界值,一般采用默认值。在C++中提供了函数morphologyDefault BorderValue()来返回腐蚀和膨胀的“魔力(magic)”边界值,Python不支持该函数。
代码实例:
import cv2
# 读取图片
img = cv2.imread("test.jpg")
# 腐蚀
erode = cv2.erode(img, kernel=(3, 3), iterations=5)
# 图片展示
cv2.imshow("test", img)
cv2.imshow("erode", erode)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
2.膨胀
膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。
如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。二值图像的膨胀示例如图所示。
同腐蚀过程一样,在膨胀过程中,也是使用一个结构元来逐个像素地扫描要被膨胀的图像,并根据结构元和待膨胀图像的关系来确定膨胀结果。
语法结构:
dst = cv2.dilate( src, kernel[, anchor[, iterations[, borderType[,
borderValue]]]])
● dst代表膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
● src代表需要进行膨胀操作的原始图像。图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。
● element代表膨胀操作所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
参数kernel、anchor、iterations、borderType、borderValue与函数cv2.erode()内相应参数的含义一致。
代码实例:
# 读取图片
img = cv2.imread("white.png")
# 膨胀
dilate = cv2.dilate(img, kernel=(3, 3), iterations=5)
# 图片展示
cv2.imshow("dilate", dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
3.开运算
开运算进行的操作是先将图像腐蚀,再对腐蚀的结果进行膨胀。开运算可以用于去噪、计数等。
语法结构如下:
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
代码实例:
import cv2
img = cv2.imread("xiou.png")
# 开运算
open = cv2.morphologyEx(img, cv2.MORPH_OPEN, (3, 3), iterations=10)
# 图像展示
cv2.imshow('open', open)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
4.闭运算
闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。
语法结构:
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
代码实例:
import cv2
img = cv2.imread("xiou.png")
# 闭运算
close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, (3, 3), iterations=5)
# 图像展示
cv2.imshow('close', close)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
5.形态学梯度运算
形态学梯度运算是用图像的膨胀图像减腐蚀图像的操作,该操作可以获取原始图像中前景图像的边缘。
语法结构如下:
result = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
代码实例:
import cv2
img = cv2.imread("xiou.png")
# 梯度运算
close = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, (5, 5), iterations=5)
# 图像展示
cv2.imshow('close', close)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
6.礼帽运算
礼帽运算是用原始图像减去其开运算图像的操作。礼帽运算能够获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。
法结构如下:
result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
代码实例:
import cv2
img = cv2.imread("xiou.png")
# 礼帽运算
close = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, (5, 5), iterations=10)
# 图像展示
cv2.imshow('close', close)
cv2.imshow("test",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
7.黑帽运算
黑帽运算是用闭运算图像减去原始图像的操作。黑帽运算能够获取图像内部的小孔,或前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分。
语法结构如下:
result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
代码实例:
import cv2
img1 = cv2.imread("test.jpg")
img2 = cv2.imread("xiou.png")
# 黑帽运算
close1 = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, (5, 5), iterations=10)
close2 = cv2.morphologyEx(img2, cv2.MORPH_BLACKHAT, (5, 5), iterations=10)
# 图像展示
cv2.imshow('close', close1)
cv2.imshow("test",close2)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果: