小言_互联网的博客

在OpenCV里实现膨胀

494人阅读  评论(0)

在前面学习了腐蚀的过程,就是根据结构元素范围里在图片找最小值作为输出,如果把这个找最小值修改一下,改为找最大值,那么这个算法就叫做膨胀了。同样邻域的形状由结构元决定,既然取邻域内的最大值,那么膨胀后的输出图像的总体亮度的平均值比起原图会有所上升,图像中较亮的物体的尺寸会变大;相反,较暗物体的尺寸会减小,甚至消失。可以用下面的公式来表示:

数学公式表示如下:

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场