一、灰度开运算和灰度闭运算
- 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:灰度级开运算和闭运算
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 10.29: 灰度级开运算和闭运算
imgGray = cv2.imread(r"E:/OpenCV/Fig0508a.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()
三、资料
youcans_的博客:
https://blog.csdn.net/youcans/article/details/123565713