OpenCV-Python——第13章:图像的形态学操作(腐蚀,膨胀,开运算,闭运算....)

目录

1.1 腐蚀    1.2 膨胀     2 高级形态学转换    3 举例


形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来。数学形态学有2个基本的运算,即腐蚀和膨胀,而腐蚀和膨胀通过结合又形成了开运算和闭运算。 

1 基础形态学转换

1.1 腐蚀

cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)

  • src:输入图像
  • kernel:卷积核
  • dst:输出图像
  • anchor:核的基准点,默认为(-1, -1), 说明位于核的中心位置,基准点即kernel中与进行处理的像素点重合的点。
  • iterations:迭代次数
  • borderType:边界类型
  • borderValue:边界参数

腐蚀可以使目标区域范围“变小”,其实质造成图像的边界收缩,可以用来消除小且无意义的目标物。

1.2 膨胀

cv2.dilate(src, kernel, dst, anchor, iterations, borderType, borderValue)

  • 同上

粗略地说,膨胀会使目标区域范围“变大”,将于目标区域接触的背景点合并到该目标物中,使目标边界向外部扩张。作用就是可以用来填补目标区域中某些空洞以及消除包含在目标区域中的小颗粒噪声。 膨胀也可以用来连接两个分开的物体。

 

2 高级形态学转换

cv2.morphologyEx(src, op, kernel, dst, anchor, iterations, borderType, borderValue)

  • 同上
  • op:操作类型共5种

开运算: cv2.MORPH_OPEN     

            先进性腐蚀再进行膨胀就叫做开运算。就像我们上面介绍的那样,它被用 来去除噪声。

闭运算: cv2.MORPH_CLOSE        

            先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。

形态学梯度: cv2.MORPH_GRADIENT 

            结果看上去就像前景物体的轮廓。

礼帽: cv2.MORPH_TOPHAT

            原始图像与进行开运算之后得到的图像的差。

黑帽: cv2.MORPH_BLACKHAT

            进行闭运算之后得到的图像与原始图像的差。

它们与基础形态学转换之间的关系也可表示为:

  • Opening:    dst = open(src, element) = dilate(erode(src, element), element)

  • Closing:    dst = close{src, element) = erode(dilate(src, element), element)

  • Morphological gradient:    dst = morph_grad(src, element) = dilate(src, element) - erode(src, element)

  • “Top hat”:    dst = tophat(src, element) = src - open(src, element)

  • “Black hat”:    dst = blackhat(src, element) = close(src, element)  - src

 

3 举例

输入图像如下:

开运算,闭运算的输入图像 

OpenCV-Python——第13章:图像的形态学操作(腐蚀,膨胀,开运算,闭运算....)_第1张图片

 其他的输入图像:

OpenCV-Python——第13章:图像的形态学操作(腐蚀,膨胀,开运算,闭运算....)_第2张图片

代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('test17.png')
img1 = cv2.imread('test16.png')

kernel = np.ones((5, 5), np.uint8)  # 卷积核
kernel2 = np.ones((10, 10), np.uint8)  # 卷积核

erosion = cv2.erode(img, kernel, iterations=1)  # 腐蚀
dilation = cv2.dilate(img, kernel, iterations=1)  # 膨胀
opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)  # 开运算
closing = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel)  # 闭运算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)  # 形态学梯度
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel2)  # 礼帽
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel2)  # 黑帽

plt.subplot(241), plt.imshow(img), plt.title('Original')
plt.subplot(242), plt.imshow(erosion), plt.title('Erosion')
plt.subplot(243), plt.imshow(dilation), plt.title('Dilation')
plt.subplot(244), plt.imshow(opening), plt.title('Opening')
plt.subplot(245), plt.imshow(closing), plt.title('Closing')
plt.subplot(246), plt.imshow(gradient), plt.title('Gradient')
plt.subplot(247), plt.imshow(tophat), plt.title('Tophat')
plt.subplot(248), plt.imshow(blackhat), plt.title('Blackhat')

plt.show()

结果如下:

OpenCV-Python——第13章:图像的形态学操作(腐蚀,膨胀,开运算,闭运算....)_第3张图片

你可能感兴趣的:(—OpenCV)