python:opencv形态学转换之腐蚀膨胀操作 开闭运算 实例
一、腐蚀/膨胀
膨胀操作:是对高亮的部分向外进行扩大,输出图的高亮部分要大于原图区域。它可以做到把图像周围背景合并到物体中,如果两个物体之间具体较近,那么膨胀运算就会使得这两个物体连接在一起,所以膨胀对于填补图像分割后的空洞很有用处。对于灰度图像的膨胀操作一般采用极大运算,提升图像整体亮度,增强图像的亮细节,消除暗细节。对于二值图像,膨胀操作可以扩大白色区域的面积,在元白色目标的轮廓上增加设定的大小。在Python中常用执行膨胀操作的函数为eroda函数。
腐蚀操作效果与膨胀操作完全相反,是原图中高亮的区域被识别然后按设定的比例向内减小,输出结果图的高亮部分要小于原图。它能消除目标物体的边界轮廓,可以把小于结构元素的点去除。如果图像两个目标物体之间有细微的连接,则可以通过设定卡好的结构元素,通过腐蚀操作将两目标物体分开,又不会损害到两物体的形态信息。灰度图像的腐蚀操作采用极小运算,使图像的整体变暗,增强图像的暗细节,削弱了亮细节。对于二值图像,腐蚀操作可以缩小白色区域,扩大黑色区域。常用dilate函数实现腐蚀操作。
#腐蚀膨胀操作程序 起始点
import cv2
import numpy as np
import matplotlib.pyplot as plt
img2 = cv2.imread('C:/Users/asus/Pictures/Saved Pictures/er1.jpg') #读取图像
kernel = np.ones((9,9), np.float32)
result1 = cv2.erode(img2,kernel) #腐蚀运算
result2 = cv2.dilate(img2,kernel) #膨胀运算
titles = ['original image','erode', 'dilate'] #输出图片命名
imgs = [img2,result1,result2]
for i in range(3):
plt.subplot(2,3,i+1)#注意,这和matlab中类似,没有0,数组下标从1开始
plt.imshow(imgs[i])
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
#腐蚀膨胀运算程序 结束点
结果分析:
从原图可以看出图中字母部分为暗区域,字母中分布着白色的像素点,在白色外围区域上有黑色像素块构成的噪声。从结果可以看到腐蚀操作扩大了暗区域,溶解了高亮区域,很容易去除了字母内的白色像素点:而膨胀操作扩大了白色区域,很好地去除了摆设背景下的黑色噪音。
二、开/闭运算
开闭运算同样是具有相反操作过程的运算,但它们的用处有相似的地方,都能用来平滑边界。开运算是先腐蚀再膨胀,可用来消除细小噪声,去毛刺,在纤细处分离物体以及平滑较大物体边界的作用。闭运算是先膨胀再腐蚀,能用来填充物体内部的细小空洞,连接临近物体和平滑边界。
import cv2
import numpy as np
import matplotlib.pyplot as plt
ori = cv2.imread ('C:/Users/asus/Pictures/Saved Pictures/er1.jpg') # 图像的地址
k = np.ones((10, 10), np.uint8)
ope = cv2.morphologyEx(ori, cv2.MORPH_OPEN,k) # 闭运算
clo = cv2.morphologyEx(ori, cv2.MORPH_CLOSE,k) # 开运算
titles = ['original image','opening', 'closeing'] # 命名
imgs = [ori,ope,clo]
for i in range(3):
plt.subplot(2,3,i+1)
plt.imshow(imgs[i])
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
分析:
从输出来看,开运算很好地去除了字母内部的白色噪点,对于白色区域内的噪点无作用;
闭运算与开运算相反,去除了白色区域内的噪声,但也损害了字母的边界轮廓特征。