开闭运算是二值形态学的重要部分,是对腐蚀和膨胀算法的扩展应用,在图像的去噪方面也是十分的常用。
用结构元素B(即模板核)对图像A进行开运算,可以用符号A\circ B来表示,其定义式为:
A\circ B=(A\Theta B)\bigoplus B
所以开运算实际上就是A先被B腐蚀,再被B膨胀。
很明显,开运算可以消除一些很小的背景噪点(椒盐噪声),平滑较大物体的边界而不明显改变其体积。也会磨光矩形的内边缘,以及分离一些粘连目标。
(这里所说的背景噪点是指以黑色为背景色,白色为前景色)
#coding:utf-8
import cv2
import numpy as np
im=cv2.imread("test.png",cv2.IMREAD_GRAYSCALE)#以二值图读入
im=cv2.bitwise_not(im)#由于背景为白色,将其置反从而统一标准
thresh,im=cv2.threshold(im,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)#OTSU转化为二值图
cv2.imshow('binary',im)
cv2.imwrite('binary.png',im)
kernel=np.ones((2,2),np.uint8)#模板核
opening=cv2.morphologyEx(im,cv2.MORPH_OPEN,kernel)#进行开运算消除背景噪声
cv2.imshow('opening',opening)
cv2.imwrite('opening.png',opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
这里调用的是cv2.morphologyEx函数,这是专门用于处理形态学问题的,传入适当参数即可。
由于图像本身是以白色为背景,因此将他的像素取个反,使他符合约定俗称的黑色背景。
(写的时候发现一个问题,就是imread好像并不直接支持gif图像格式的读取,因此本来是test.gif的图片还得事先进行convert,转化为test.png然后才好使用)
用结构元素B(即模板核)对图像A进行闭运算,可以用符号A\cdot B来表示,其定义式为:
A\cdot B=[A\bigoplus (-B)]\Theta (-B)
所以闭运算实际上就是A先被B膨胀,再被B腐蚀。
闭运算在去除图像的前景噪声方面具有很好的应用,通过闭运算之后,图像原有目标的间断可以得到连接、目标内部的孔洞可以得到填充而基本不改变原图的大小以及形态。同时也会磨光凸向图像内部的边角。
#coding:utf-8
import cv2
import numpy as np
im=cv2.imread("test.png",cv2.IMREAD_GRAYSCALE)#以二值图读入
thresh,im=cv2.threshold(im,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)#OTSU转化为二值图
cv2.imshow('binary',im)
cv2.imwrite('binary.png',im)
kernel=np.ones((2,2),np.uint8)#模板核
closing=cv2.morphologyEx(im,cv2.MORPH_CLOSE,kernel)#进行闭运算消除前景噪声
cv2.imshow('closing',closing)
cv2.imwrite('closing.png',closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
没啥好说的了,对着开操作改下参数就好了。