Mythsman


乐极生悲,苦尽甘来。


二值形态学之开运算和闭运算

开闭运算是二值形态学的重要部分,是对腐蚀和膨胀算法的扩展应用,在图像的去噪方面也是十分的常用。

二值开运算

定义

用结构元素B(即模板核)对图像A进行开运算,可以用符号$A\circ B$来表示,其定义式为:

$A\circ B=(A\Theta B)\bigoplus B$

所以开运算实际上就是A先被B腐蚀,再被B膨胀。

作用

很明显,开运算可以消除一些很小的背景噪点(椒盐噪声),平滑较大物体的边界而不明显改变其体积。也会磨光矩形的内边缘,以及分离一些粘连目标。

(这里所说的背景噪点是指以黑色为背景色,白色为前景色)

OpenCV调用

#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然后才好使用)

效果图

binary
opening

二值闭运算

定义

用结构元素B(即模板核)对图像A进行闭运算,可以用符号$A\cdot B$来表示,其定义式为:

$A\cdot B=[A\bigoplus (-B)]\Theta (-B)$

所以闭运算实际上就是A先被B膨胀,再被B腐蚀。

作用

闭运算在去除图像的前景噪声方面具有很好的应用,通过闭运算之后,图像原有目标的间断可以得到连接、目标内部的孔洞可以得到填充而基本不改变原图的大小以及形态。同时也会磨光凸向图像内部的边角。

OpenCV调用

#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()

没啥好说的了,对着开操作改下参数就好了。

效果图

binary
closing