小言_互联网的博客

在OpenCV里实现腐蚀

491人阅读  评论(0)

在这里将开始学习形态学,什么是形态学呢?形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质(最具区分能力-most discriminative)的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。它最初是从数学中的集合论发展而来,并用于处理二值图的,虽然运算简单,但是效果比较好。常用的形态学处理方法包括:腐蚀、膨胀、开运算、闭运算、顶帽运算、底帽运算,其中腐蚀和膨胀是最基本的方法,其它都是基于这二者的组合。

 

首先来学习腐蚀的处理,可以来回忆一下前面的中值平滑,当时是用一个窗口滑动一个图片,取这个窗口所有元素的中值作为输出作为平滑结果。其实腐蚀的处理与这个是类似的,只不过它不是取中值,而是取最小值作为输出,并且它的窗口是不规则的,可以是任何形状。这个滑动窗口也与卷积核类似,同样需要一个锚点。

可以从上图看到,[1,1,1]是结构元素,中间元素圈起来的就是锚点,结构元素都是由0和1组成,0是表这个元素不起作用,1是表示这个元素起作用。在最上面结果元素的有效范围内,看到有三个图像元素(1,0,0),从这里取最小值0作为图像输出。下面图像是灰度图,从结构元素的有效范围内取得最小值14,作为腐蚀的输出。因此可用下面的公式来表示腐蚀处理:

这个公式表示遍历所有结构元素相交的图像元素,并且结构元素的值不为0,取得最小值输出。可以用数学语言表示这个操作如下:

E=I⊝S

E表示输出结果,I表示处理图像,S表示结构元素。

通过上面的学习,可以理解到腐蚀处理是很简单的一个操作,第一步要先定义好结构元素,可以采用numpy里函数来定义,如下例:

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

#结构元素
kernel = np.ones((5,5),np.uint8)
print(kernel)


cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

[[1 1 1 1 1]

 [1 1 1 1 1]

 [1 1 1 1 1]

 [1 1 1 1 1]

 [1 1 1 1 1]]

有结构元素之后,就是进行滑动并取最小值,在OpenCV里已经定义好erode函数:

第1个参数,InputArray类型的src,输入图象,即源图象,填Mat类的对象便可。图象通道的数量可以是任意的,但图象深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之1。

第2个参数,OutputArray类型的dst,即目标图象,需要和源图片有1样的尺寸和类型。

第3个参数,InputArray类型的kernel,腐蚀操作的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们1般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。详细信息可见上文。

第4个参数,Point类型的anchor,锚的位置,其有默许值(⑴,⑴),表示锚位于单位(element)的中心,我们1般不用管它。

第5个参数,int类型的iterations,迭代使用erode()函数的次数,默许值为1。

第6个参数,int类型的borderType,用于推断图象外部像素的某种边界模式。注意它有默许值BORDER_DEFAULT。

第7个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默许值morphologyDefaultBorderValue(),1般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

 

接着下来通过例子来演示腐蚀:

#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 = np.ones((5,5),np.uint8)
print(kernel)

#腐蚀
out = cv2.erode(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/101784743
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场