形态学滤波
定义结构元素
形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的getStructuringElement函数,也可以直接使用NumPy的ndarray来定义一个结构元素。
函数原型:
Mat getStructuringElement(int shape, //核的形状 0:矩形 1:十字交叉形 2: 椭圆
Size ksize,//核大小
Point anchor=Point(-1,-1) //核中心位置,默认位于形状中心处
);
椭圆:cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
矩形:cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
十字交叉:cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
膨胀与腐蚀
腐蚀:腐蚀会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。
一般在除噪上的步骤是,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来将两者物体分开。
膨胀和腐蚀是相对白色部分(高亮部分)而言的,膨胀是图像中的高亮部分进行膨胀,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮部分被腐蚀,效果图拥有比原图更小的高亮区域。
实例程序:
import numpy as np
import cv2.cv2 as cv2 # 默认格式为BGR
import matplotlib.pyplot as plt # python图片处理库
def cv2_imread(file_path, flag=1):
# 读取图片数据
return cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), flag)
if __name__ == "__main__":
# 读取图像
img = cv2_imread("D:\\MATLAB2020\\bin\\yige.jpg")
#增加噪音
for i in range(3000): # 添加3000个噪声点
x = np.random.randint(0, h) # 随机取行
y = np.random.randint(0, w) # 随机取列
img[x, y, :] = 255 # 行和列设置为白色噪声点
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5, 5))
print(kernel)
eroded=cv2.erode(img,kernel)
dilated=cv2.dilate(eroded,kernel)
image_output = np.hstack((img, eroded, dilated))
plt.axis('off') # 关闭坐标轴 设置为on则表示开启坐标轴
img= cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
eroded = cv2.cvtColor(eroded, cv2.COLOR_BGR2RGB)
dilated = cv2.cvtColor(dilated, cv2.COLOR_BGR2RGB)
plt.subplot(131)
plt.imshow(img)
plt.title("img")
plt.subplot(132)
plt.imshow(eroded)
plt.title("eroded")
plt.subplot(133)
plt.imshow(dilated)
plt.title("dilated")
plt.show() # 显示图像
开运算与闭运算
开运算:先腐蚀后膨胀
(1)开运算能够除去孤立的小点,毛刺,而总的位置和形状不便。
(2)开运算是一个基于几何运算的滤波器。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
闭运算:先膨胀后腐蚀
(1)闭运算能够填平小湖(即小孔),弥合小裂缝,而总的位置和形状不变。
(2)闭运算是通过填充图像的凹角来滤波图像的。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同结构元素的选择导致了不同的分割。
开运算可以用来消除小物体,在纤细点处分离物体。
相关函数:
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#开运算
cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#闭运算
形态学梯度运算
梯度=膨胀-腐蚀
形态学梯度能够提取物体边缘
相关函数:
cv2.morphologyEx(img,cv2.MORTH_GRADIENT,kernel)#闭运算
顶帽与黑帽
顶帽:原图像 - 开运算图
突出原图像中比周围亮的区域
黑帽:闭运算图 - 原图像
突出原图像中比周围暗的区域
相关函数:
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#开运算
cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#闭运算
总结
膨胀和腐蚀是相对白色部分(高亮部分)而言的,膨胀是图像中的高亮部分进行膨胀,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮部分被腐蚀,效果图拥有比原图更小的高亮区域。开运算可以用来消除小物体,在纤细点处分离物体。闭运算能够排除黑色区域。形态学梯度可以用来保留物体的边缘轮廓。黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域。
cv2.morphologyEx函数的标识符:
标识符 | 含义 |
---|---|
MORPH_OPEN | 开运算 |
MORPH_CLOSE | 闭运算 |
MORPH_ERODE | 腐蚀运算 |
MORPH_DILATE | 膨胀运算 |
MORTH_GRADIENT | 形态学梯度运算 |
MORTH_TOPHAT | 顶帽运算 |
MORTH_BLACKHAT | 黑帽运算 |