形态学操作是根据图像形状(一般为二值化图像,即黑白图像)进行的简单操作,最基本的两个就是腐蚀与膨胀。
腐蚀:求局部最小值的操作。从数学角度看,腐蚀就是将图像(或者图像的一部分)与卷积核进行卷积。卷积核与图像卷积,即计算核覆盖区域像素的最小值,并把这个最小值赋值给参考点指定的像素。所以整幅图的高亮区域逐渐减少。
作用:这对于去除白噪声很有用,也可以用来断开连接在一起的物体。
函数:cv2.erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
参数含义:src:处理的图像,kernel:卷积核,其他参数都有默认值,一般不用管。
kernel参数一般配合getStructuringElement函数来使用。详细介绍请点击下方链接:结构化元素(卷积核的设置)
膨胀:与腐蚀相反,膨胀是求局部最大值的操作。所以膨胀会增加图像中的白色区域。在去噪时一般先用腐蚀,再用膨胀。膨胀也可以用来连接两个分割的物体。
函数:cv2.dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
开运算:先腐蚀在膨胀,被用来去除噪声。
函数:cv2.morphologyEx(src, op=cv2.MORPH_OPEN , kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
参数含义:op表示形态学运算的类型,当op=cv2.MORPH_OPEN 时,就执行开运算。
具体选择如下:
标识符 | 含义 |
---|---|
MORPH_OPEN | 开运算 |
MORPH_CLOSE | 闭运算 |
MORPH_GRADIENT | 形态学梯度 |
MORPH_TOPHAT | 礼帽 |
MORPH_BLACKHAT | 黑帽 |
闭运算:先膨胀后腐蚀,能够排除小型黑洞。
函数:cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
形态学梯度:膨胀图与腐蚀图之差,一般用来保留物体的轮廓边缘。
函数:cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
礼帽(顶帽):原始图像与开运算之后得到的图像之差。它常常用来分离比邻近点亮一点的斑块。
函数:cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
黑帽:原始图像与闭运算之后得到的图像之差。它常常用来分离比邻近点暗一点的斑块。
函数:cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../002.jpg',0) #0是灰度图,默认是三通道彩色图像
#方框滤波
blur1=cv2.boxFilter(img,-1,(5,5),normalize=False)
#均值滤波
blur2=cv2.blur(img,(5,5))
#高斯滤波
blur3=cv2.GaussianBlur(img,(5,5),0)
#中值滤波
blur4=cv2.medianBlur(img,5)
#双边滤波
blur5=cv2.bilateralFilter(img,9,75,75)
images=[img,blur1,blur2,blur3,blur4,blur5]
titles=['img',"blur1",'blur2',"blur3","blur4","blur5"]
for i in range(6):
plt.subplot(3,2,i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
# 给坐标轴赋值,这里赋值为空
plt.xticks([])
plt.yticks([])
plt.show()