Opencv-python形态学滤波操作

形态学滤波

定义结构元素

形态学处理的核心就是定义结构元素,在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))

img

膨胀与腐蚀

腐蚀:腐蚀会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为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 黑帽运算

猜你喜欢

转载自blog.csdn.net/weixin_52564375/article/details/121448777