概要
形态学,是图像处理中应用最为广泛的技术之一,主要用于从图像中提取 对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。
结构元素:
设有两幅图像B,X。 若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。 结构元素通常都是一些比较小的图像。
信息补充:
# kernel = np.ones((5,5),np.uint8)
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7,7))
# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
print(kernel)
一、腐蚀和膨胀
图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,其中膨胀类似于“领域扩张”,将图像中的白色部分进行扩张
,其运行结果图比原图的白色区域更大; 腐蚀类似于“领域 被蚕食”,将图像中白色部分进行缩减细化
,其运行结果图比原 图的白色区域更小。
1、腐蚀-cv2.erode(src,element,anchor,iterations)
腐蚀的运算符是“-”。
该公式表示图像A用卷积模板B来进行腐蚀处理, 通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。
把结构元素B平移a后得到Ba,若Ba包含于X,我们 记下这个a点
,所有满足上述条件的a点组成的集合 称做X被B腐蚀(Erosion)的结果。如右图所示。
其中X是被处理的对象,B是结构元素。对于任意一 个在阴影部分的点a,Ba 包含于X,所以X被B腐蚀的结果就是那个阴影部分
。阴影部分在X的范围之 内,且比X小,就象X被剥掉了一层似的。
![](https://img-blog.csdnimg.cn/20200819145639899.png#pic_center)
![](https://img-blog.csdnimg.cn/20200819145844330.png#pic_center)
- 函数:
cv2.erode(src,element,anchor,iterations)
- 参数
参数1:src,原图像
参数2:element,腐蚀操作的内核,默认为一个简单的 3x3 矩阵
参数3:anchor,默认为Point(-1,-1),内核中心点
参数4:iterations,腐蚀次数,默认值1
kernel = np.ones((3, 3), np.uint8)
# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
erosion = cv2.erode(img, kernel, iterations=1)
![](https://img-blog.csdnimg.cn/20200819152004978.png#pic_center)
2、膨胀-cv2.dilate(img, kernel, iterations=1)
膨胀(dilation)可以看做是腐蚀的对偶运算, 其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点
。所有满足上述条件的a点 组成的集合称做X被B膨胀的结果。如右图所示。
其中X是被处理的对象,B是结构元素,对于任意一 个在阴影部分的点a,Ba击中X,所以X被B膨胀的 结果就是那个阴影部分。阴影部分包括X的所有范围,就象X膨胀了一圈似的。
![](https://img-blog.csdnimg.cn/20200819150929978.png#pic_center)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
dilation = cv2.dilate(img, kernel, iterations=1)
![](https://img-blog.csdnimg.cn/20200819165744528.png#pic_center)
代码汇总
import numpy as np
import cv2
import matplotlib.pyplot as plt
# -------------------------腐蚀-------------------------
flag = 0
# flag = 1
if flag:
img = cv2.imread('./image/morphology.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
erosion = cv2.erode(img, kernel, iterations=1)
plt.subplot(1, 2, 1), plt.imshow(img), plt.title('ori'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(erosion), plt.title('erosion'), plt.xticks([]), plt.yticks([]