小言_互联网的博客

在OpenCV里实现开运算

528人阅读  评论(0)

前面学习腐蚀和膨胀算法,并且深刻地认识到它们的特性以及作用。如果由这两种组合出来的运算又有什么样的不同呢?比如一个图像先腐蚀后膨胀的操作,会有什么结果呢?因为腐蚀是把图片白色变小,膨胀又是把图片白色变大,是否会保持原图不变呢?带着这些问题来研究一下先腐蚀后膨胀的算法,我们把这样的算法叫做开运算,在数学上用下面公式表示:

I∘S=(I⊝S)⨁S

开运算的作用有:

(1)开运算能够除去孤立的小点,毛刺和小桥,而总的位置和形状不便。

(2)开运算是一个基于几何运算的滤波器。

(3)结构元素大小的不同将导致滤波效果的不同。

(4)不同的结构元素的选择导致了不同的分割,即提取出不同的特征。

 

在了解开运算的方法之后,可以使用前面学习过的函数erode和dilate来完成,不过在OpenCV里提供了把这两个操作合并的函数morphologyEx

其中参数解释如下:

src

输入图像,图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。

dst

输出图像,需和源图片保持一样的尺寸和类型。

op

表示形态学运算的类型:

MORPH_OPEN – 开运算(Opening operation)

MORPH_CLOSE – 闭运算(Closing operation)

MORPH_GRADIENT - 形态学梯度(Morphological gradient)

MORPH_TOPHAT - 顶帽(Top hat)

MORPH_BLACKHAT - 黑帽(Black hat)

kernel

形态学运算的内核。为NULL,使用参考点位于中心3x3的核。一般使用函数getStructuringElement配合这个参数的使用,

kernel参数填保存getStructuringElement返回值的Mat类型变量。

anchor

锚的位置,其有默认值(-1,-1),表示锚位于中心。

iterations

迭代使用函数的次数,默认值为1。

borderType

用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_CONSTANT。

borderValue

当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),

 

一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

 

下面用例子来演法消除白噪声的情况:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np

#图片的路径
imgname = "szbin2.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_RECT,(5,5))
print(kernel)
#开运算
out = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
cv2.imshow("out",out)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

输入图片

输出图片

 

从结果可以看到原图上的白色小线条已经给滤掉了,这样就可以去掉白噪声,恢复图像的原本面貌。

https://blog.csdn.net/caimouse/article/details/51749579

 


转载:https://blog.csdn.net/caimouse/article/details/101828884
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场