【youcans 的 OpenCV 例程200篇】138. 灰度开运算和灰度闭运算
5.2 灰度开运算和灰度闭运算
OpenCV 提供了函数 cv.morphologyEx 可以实现图像的灰度开运算和灰度闭运算。
函数说明:
cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )→ dst
函数 cv.morphologyEx 使用侵蚀(erosion)和膨胀(dilation)作为基本操作来执行高级形态转换。
参数说明:
- src:输入图像,可以为单通道或多通道,图像深度必须为 CV_8U, CV_16U, CV_16S, CV_32F 或 CV_64F
- dst:输出图像,大小和类型与 src 相同
- op:形态学运算类型
- cv.MORPH_ERODE:腐蚀
- cv.MORPH_DILATE:膨胀
- cv.MORPH_OPEN:开运算, 先腐蚀再膨胀
- cv.MORPH_CLOSE:闭运算, 先膨胀再腐蚀
- cv.MORPH_GRADIENT:形态学梯度, 膨胀图与腐蚀图之差
- cv.MORPH_TOPHAT:顶帽变换, 原图像与开运算之差
- cv.MORPH_BLACKHAT:黑帽变换, 闭运算图与原图像之差
- cv.MORPH_HITMISS: 击中击不中运算
- kernel:结构元(卷积核),null 时使用 3*3 矩形卷积核
- anchor:卷积核的锚点位置,负值表示以卷积核的中心为锚点
- iterations:应用腐蚀和膨胀的次数,可选项,默认值为 1
- borderType:边界扩充的类型
- borderValue:当 borderType=BORDER_CONSTANT 时以常量 value 填充扩充边界,默认值为 (0,0,0)
注意事项:
- 函数支持就地模式,开运算操作可以迭加使用多次。
- 迭代次数是应用腐蚀和膨胀操作的次数,注意两次迭代的开操作相当于应用“腐蚀→腐蚀→膨胀→膨胀”,而不是“腐蚀→膨胀→腐蚀→膨胀”。
例程 10.29:灰度级开运算和闭运算
# 10.29: 灰度级开运算和闭运算
imgGray = cv2.imread("../images/Fig0937a.tif", flags=0) # flags=0 灰度图像
element = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) # 全 1 结构元
imgErode = cv2.erode(imgGray, kernel=element) # 灰度腐蚀
imgDilate = cv2.dilate(imgGray, kernel=element) # 灰度膨胀
imgOpen = cv2.morphologyEx(imgGray, cv2.MORPH_OPEN, element) # 灰度开运算
imgClose = cv2.morphologyEx(imgGray, cv2.MORPH_CLOSE, element) # 灰度闭运算
imgGrad = cv2.morphologyEx(imgGray, cv2.MORPH_GRADIENT, element) # 形态学梯度
plt.figure(figsize=(9, 7))
plt.subplot(231), plt.axis('off'), plt.title("Origin")
plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255)
plt.subplot(232), plt.title("Eroded image"), plt.axis('off')
plt.imshow(imgErode, cmap='gray', vmin=0, vmax=255)
plt.subplot(233), plt.title("Dilated image"), plt.axis('off')
plt.imshow(imgDilate, cmap='gray', vmin=0, vmax=255)
plt.subplot(234), plt.title("Opening image"), plt.axis('off')
plt.imshow(imgOpen, cmap='gray', vmin=0, vmax=255)
plt.subplot(235), plt.title("Closing image"), plt.axis('off')
plt.imshow(imgClose, cmap='gray', vmin=0, vmax=255)
plt.subplot(236), plt.title("Gradient image"), plt.axis('off')
plt.imshow(imgGrad, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()
灰度开运算先腐蚀再膨胀,可以去除相对于结构元素较小的亮细节,保持整体的灰度和较大的亮区域不变。
灰度闭运算先膨胀再腐蚀,可以去除相对于结构元素较小的暗细节,保持整体的灰度和较大的暗区域不变。
把图像像素点的灰度值视为高度,不同的灰度级表示不同的高度,整个图像就像一张高低起伏的地形图。明亮的区域(灰度值大)相当于高山,黑暗的区域(灰度值小)相当于深谷,边缘区域即明亮与黑暗的交界相当于悬崖。
灰度开运算和灰度闭运算在形式上与二战图像的开运算和闭运算是一致的:
( f ∘ b ) = ( f ⊖ b ) ⊕ b ( f ∙ b ) = ( f ⊕ b ) ⊖ b (f \circ b) = (f \ominus b) \oplus b \\ (f \bullet b) = (f \oplus b) \ominus b (f∘b)=(f⊖b)⊕b(f∙b)=(f⊕b)⊖b
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123565713)
Copyright 2022 youcans, XUPT
Crated:2022-3-24