目录
1. 介绍
2. code
1. 介绍
灰度级的开运算和闭运算和二值图像的处理一样,只不过一个作用于灰度图,一个作用于二值图像
灰度级的开运算公式为:
- 先对图像做腐蚀,然后对腐蚀的结果做膨胀运算
灰度级的闭运算公式为:
- 先对图像做膨胀,然后对膨胀的结果做腐蚀运算
这里通过图像函数的表达来理解灰度级的开闭运算
之前介绍过二值图像开运算的几何解释,就是用结构元来前景像素的内部滑动,能到达的位置就是开运算的结果
这里灰度级的也可以做这样的理解,就是用结构元从底部向上推,能推到的位置就是开运算的处理结果。而闭运算,就是结构元从上面往下面推,推到的位置就是闭运算的处理结果
因此,我们可以得到下面的结论:
- 灰度级开运算:会消除亮点
- 灰度级闭运算:会消除暗点
这个结果也很容易理解,因为开运算是先腐蚀,再膨胀。腐蚀相当于最小值的操作,很容易将亮点腐蚀掉,那么膨胀再还原的时候,亮点已经消失了,还原不回来了。所以灰度级的开运算的效果是消除亮点,尤其是暗背景中的亮点
同理,闭运算可以消除暗点,尤其是亮背景下的暗点
因此,如果图像有椒盐噪声的话,可以用开运算消除盐粒噪声,再用闭运算消除胡椒噪声
2. code
代码实现:
import numpy as np
import cv2def noise(img): # 添加椒盐噪声for i in range(1000):x = np.random.randint(0,img.shape[0])y = np.random.randint(0,img.shape[1])img[x][y] = np.random.randint(0,2) * 255 # 随机产生0 255 椒盐噪声return img.astype(np.uint8)img = cv2.imread('./flower.jpg',0)
dst = noise(img.copy()) # 产生噪声图像kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))dst_open = cv2.morphologyEx(dst,cv2.MORPH_OPEN,kernel) # 灰度开运算
dst_close = cv2.morphologyEx(dst,cv2.MORPH_CLOSE,kernel) # 灰度闭运算cv2.imshow('img',np.hstack((img,dst,dst_open,dst_close))) # show
cv2.waitKey()
cv2.destroyAllWindows()
处理结果:
图像顺序:原图、椒盐污染的图片、开运算对噪声图片处理、闭运算对噪声图片处理
这里发现,开运算处理后的图像,所以消除了盐粒噪声,但是图像有点偏暗。这里因为之前说过,开闭运算主要看第一次的处理,第二次只是还原大部分的图像而已。所以开运算先腐蚀的话,就会比原图稍微暗一些。