数字图像处理(入门篇)十一 形态学处理

目录

一 基本的数学形态学操作

1 膨胀

 2 腐蚀 

 3 开运算

 4 闭运算

二 实践

(1)代码

(2)结果图

        形态学图像处理的基本思想是基于结构元素来处理图像,该方法适用于图像处理的各个方面。

       基本的数学形态学操作有:膨胀和腐蚀。二值膨胀和腐蚀运算是形态学图像处理的基础,它们互为对偶运算(逆运算)。

       膨胀和腐蚀的组合操作有:开运算、闭运算、击中或击不中变换。

       其中,击中或击不中变换在这里不作介绍。

一 基本的数学形态学操作

1 膨胀

        在二值图像中,膨胀(Dilation)是对对象进行“加长”或“变粗”的操作。膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程,可以用来填补物体中的“空洞”,具有扩大图像的作用,在一定程度上影响了目标区域的形状。结构元素的集合控制二值图像变粗的方式和程度。

数字图像处理(入门篇)十一 形态学处理_第1张图片

 2 腐蚀 

        腐蚀(Erosion)是对二值图像中的对象进行“收缩”或“细化”的操作,是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。像在膨胀中的作用一样,结构元素控制收缩的方式和程度。

数字图像处理(入门篇)十一 形态学处理_第2张图片

 3 开运算

        先腐蚀后膨胀的过程称为开运算(Opening)。开运算是可以用来消除小物体、去除细小的噪声、断开狭窄的连接、平滑较大物体的边界的同时并不明显改变其面积的运算。开运算完全删除了不包含结构元素的对象区域。

 4 闭运算

数字图像处理(入门篇)十一 形态学处理_第3张图片

        与开运算相同的是,形态学闭运算可以平滑对象的轮廓,与开运算不同的是,闭运算会将狭窄的缺口连接起来形成细长的口,并且填充物体内部比结构元素小的孔洞。

二 实践

(1)代码

import cv2
import matplotlib.pyplot as plt
import numpy as np
def dealImageResult(img_path):
    img = cv2.imread(img_path)
    RGBImage = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    Gaussian = cv2.GaussianBlur(grayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
    Binary = cv2.adaptiveThreshold(Gaussian, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, -2)
    kernel_1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))  #矩形
    # 腐蚀
    eroded = cv2.erode(Binary, kernel_1)
    # 膨胀
    dilated = cv2.dilate(Binary, kernel_1)
    # 设置卷积核
    kernel_open = np.ones((3, 3), np.uint8)
    # 图像开运算
    open_result = cv2.morphologyEx(Binary, cv2.MORPH_OPEN, kernel_open)
    # 闭运算
    close_kernel = np.ones((3, 3), np.uint8)
    close_result = cv2.morphologyEx(Binary, cv2.MORPH_CLOSE, close_kernel)
    fig = plt.figure(figsize=(10, 10))
    titles = ["img", "grayImage", "Binary", "eroded", "dilated", "open", "close"]
    images = [RGBImage, grayImage, Binary, eroded, dilated, open_result, close_result]
    for i in range(7):
        plt.subplot(3, 3, i + 1), plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("test.png")
    pass

(2)结果图

数字图像处理(入门篇)十一 形态学处理_第4张图片

 

 

 

 

你可能感兴趣的:(数字图像处理,计算机视觉,opencv,python)