在前面学习了腐蚀的过程,就是根据结构元素范围里在图片找最小值作为输出,如果把这个找最小值修改一下,改为找最大值,那么这个算法就叫做膨胀了。同样邻域的形状由结构元决定,既然取邻域内的最大值,那么膨胀后的输出图像的总体亮度的平均值比起原图会有所上升,图像中较亮的物体的尺寸会变大;相反,较暗物体的尺寸会减小,甚至消失。可以用下面的公式来表示:
数学公式表示如下:
D=I⨁S
D表示输出,I表示输入图像,S表示结构元。
在OpenCV里定义膨胀函数如下:
其中参数如下:
第1个参数,InputArray类型的src,输入图象,即源图象,填Mat类的对象便可。图象通道的数量可以是任意的,但图象深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。
第2个参数,OutputArray类型的dst,即目标图象,需要和源图片有一样的尺寸和类型。
第3个参数,InputArray类型的kernel,膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核。
第4个参数,Point类型的anchor,锚的位置,其有默许值(⑴,⑴),表示锚位于中心。
第5个参数,int类型的iterations,迭代使用erode()函数的次数,默许值为1。
第6个参数,int类型的borderType,用于推断图象外部像素的某种边界模式。注意它有默许值BORDER_DEFAULT。
第7个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默许值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。
在前面使用np.ones函数来创建结构元,如果是创建规则的结构元,还是可以的,如果要创建一些非规则的结构元,就不太方便了,这时需要使用OpenCV里定义的getStructuringElement函数来解决,这个函数定义如下:
参数shape是表示结构元的形状,定义有三种:
MORPH_RECT:产生矩形的结构元
MORPH_CROSS:产生十字交叉的结构元
MORPH_ELLIPSE:产生椭圆形的结构元
参数ksize是表示结构元的尺寸。
参数anchor是表示结构元的锚点。
下面来产生一个3X3的矩形结构元:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
print(kernel)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
[[1 1 1]
[1 1 1]
[1 1 1]]
再创建一个十字交叉5X5的结构元:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print(kernel)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
[[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]]
接着下来使用上面的结构元函数来获取结构元,然后使用膨胀函数dilate来操作相同的图片:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
#图片的路径
imgname = "szbin1.png"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)
#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))
#显示原图
cv2.imshow("Image",image)
#结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print(kernel)
#腐蚀
out = cv2.dilate(image,kernel,iterations = 1)
cv2.imshow("out",out)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
输入图片
输出图片
从输出结果上来看,深圳这两个字的白色元素增多,笔画变粗,这就是膨胀的由来。
https://blog.csdn.net/caimouse/article/details/51749579
转载:https://blog.csdn.net/caimouse/article/details/101793082