# ksize 默认为3, anchor默认为-1,即中间元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,ksize=(11,11), anchor=(5, 5))
MORPH_RECT:
[[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1]]
MORPH_ELLIPSE:
[[0,0,1,0,0],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[0,0,1,0,0]],
MORPH_CROSS:
[[0,0,1,0,0],
[0,0,1,0,0],
[1,1,1,1,1],
[0,0,1,0,0],
[0,0,1,0,0]
以下图为例:(示例参考:OpenCV-Python教程:14.形态变换)
原图中的高亮区域(白色)被蚕食,效果图拥有比原图更小的高亮区域。具体操作是选择kernel范围内打最小值赋给anchor中的元素,即最小值滤波。
# 可以执行多次,也可以自定义kernel:
kernel = np.ones((5,5), np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
原理与腐蚀类似,不过是高亮区域被扩增,即最大值滤波。
dilation = cv2.dilate(img,kernel,iterations=1)
先腐蚀后膨胀,用来消除小白点,平滑较大物体的边界
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
先膨胀后腐蚀,用来消除白色前景中打小黑点
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
可以突出团块(blob)的边缘,保留物体的边缘轮廓。实际操作是膨胀后的图像减去腐蚀后的图像
# 下面的decrease 和 gradient结果是一样的
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(img, kernel, iterations=2)
dilate = cv2.dilate(img, kernel, iterations=2)
decrease = dilate - erosion
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=2)
原始图像-开运算(先腐蚀再膨胀)以后的图像,突出明亮区域。可以用来提取一些小毛刺之类的图像。
kernel = np.ones((3, 3), np.uint8)
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
闭运算(先膨胀再腐蚀)后的图像 - 原始图像,突出较暗区域
kernel = np.ones((3, 3), np.uint8)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)