形态学造作是根据图象形状进行的简单操作。一般情况下对二值化图象进行的操作,需要输入两个参数,一个是原始图像,第二个是被称为结构化元素或和,它是用来决定操作性质的两个基本操作是腐蚀和膨胀。
腐蚀
腐蚀会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。主要的函数是cv2.erode()
cv2.erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
这是erode函数的完整定义,src是输入图象;kenel是卷积的内核,默认的是一个3X3的矩阵,可以自定义;iteration是腐蚀的次数默认的是1,当然也可以自定义,否则效果不显著。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('C:/Users/dell/Desktop/u.jpg',0)
kenel=np.ones((5,5),np.uint8)
erosion=cv2.erode(img,kenel,iterations=3)
plt.subplot(1,2,1),plt.imshow(img)
plt.title('original'),plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(erosion)
plt.title('eroded'),plt.xticks([]),plt.yticks([])
plt.show()
这里我腐蚀了3次,一次的话效果根本不显著。
膨胀
与腐蚀想法,卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪是,先腐蚀在膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来谅解两个分开的物体。所用到的函数是cv2.dilate()
dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
参数的用法也和前面的一样,我就不赘述了。
dilation=cv2.dilate(img,kenel,iterations=3)
程序也是相应的参数换一下。
高级运算
先腐蚀再膨胀的叫做开运算,就像之前说的用来除噪
主要函数是cv2.morphologyEx()
morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
主要的参数是scr是输入图片;op是选择相对饮的高级操作;kenel是核的大小;iteration可选。
open=cv2.morphologyEx(img,cv2.MORPH_OPEN,kenel)
程序换相应行的命令就好。图象效果一般,因为没找到有噪声的图片。
闭运算是先膨胀在腐蚀,经常用来填充前景物体中的消毒或者小黑点
close=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kenel,iterations=3)
这个的效果还好一点。
形态学梯度就是一幅图像膨胀与腐蚀的差别,输出结果就像图象的轮廓。
gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kenel,iterations=3)
相应的位置换参数就好
礼貌是原始图像与进行开运算得到的图像结果之差
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kenel,iterations=3)
相应的位置换换参数。
黑帽是闭运算的到的图象与原始图像的差
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kenel,iterations=5)
原始相应的位置换换参数就好。
小结
这一节的基本操作是腐蚀,膨胀,大部分参数都是固定的那些。但是关于卷积核,除了一般的正方形,opencv还有cv2.getStructuringElement函数来构造圆形和椭圆的。
cv2.getStructuringElement(shape, ksize, anchor=None)
shape是形状主要有cv2.MORPH_RECT(矩形),cv2.MORPH_ELLIPSE(椭圆),cv2.MORPH_CROSS(交叉);ksize是矩阵的尺寸。