Opencv 形态学操作

  • 形态学操作:使图像的形态发生改变的操作
  • 目的:用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的
  • 常用操作:膨胀、腐蚀、开操作、闭操作,梯度计算,顶帽变换,黑帽变换等
  • 应用场景:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化等;分割出独立的图像元素,或者图像中相邻的元素;求取图像中明显的极大值区域和极小值区域;求取图像梯度
  • kernel:每次操作的范围,有三种不同的形状:MORPH_RECT(矩形),MORPH_ELLIPSE(椭圆形), MORPH_CROSS(交叉形)
# 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.形态变换)
Opencv 形态学操作_第1张图片

腐蚀

原图中的高亮区域(白色)被蚕食,效果图拥有比原图更小的高亮区域。具体操作是选择kernel范围内打最小值赋给anchor中的元素,即最小值滤波。

# 可以执行多次,也可以自定义kernel:
kernel = np.ones((5,5), np.uint8)
erosion = cv2.erode(img,kernel,iterations=1) 

Opencv 形态学操作_第2张图片

膨胀

原理与腐蚀类似,不过是高亮区域被扩增,即最大值滤波。

dilation = cv2.dilate(img,kernel,iterations=1)

Opencv 形态学操作_第3张图片

开操作

先腐蚀后膨胀,用来消除小白点,平滑较大物体的边界

opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

Opencv 形态学操作_第4张图片

闭操作

先膨胀后腐蚀,用来消除白色前景中打小黑点

closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

Opencv 形态学操作_第5张图片

形态梯度

可以突出团块(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)

Opencv 形态学操作_第6张图片

顶帽

原始图像-开运算(先腐蚀再膨胀)以后的图像,突出明亮区域。可以用来提取一些小毛刺之类的图像。

kernel = np.ones((3, 3), np.uint8)
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

Opencv 形态学操作_第7张图片

黑帽

闭运算(先膨胀再腐蚀)后的图像 - 原始图像,突出较暗区域

kernel = np.ones((3, 3), np.uint8)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

Opencv 形态学操作_第8张图片

你可能感兴趣的:(机器学习)