首页 > 其他分享 >图像形态学(腐蚀与膨胀讲解)+

图像形态学(腐蚀与膨胀讲解)+

时间:2025-01-17 20:31:11浏览次数:3  
标签:__ kernel img imshow custom 形态学 腐蚀 讲解 cv

 练习题目

己知一幅二值目标图像A和结构元素B如下图所示,其中结构元素B的原点由小三角形标识。请分别写出结构元素B对值图像A进行腐蚀运算与膨账运算的结果。

腐蚀操作(计算)

定义

        腐蚀操作是形态学图像处理中的基本操作之一。它通过一个结构元(也称为卷积核)对图像进行扫描,根据结构元的形状和大小,将图像中的某些区域进行缩小或“腐蚀”。具体来说,只有当结构元完全覆盖在图像的某个部分时,该位置才会被保留,否则会被设置为背景(通常是黑色)。

腐蚀操作流程图

知识点

结构体的标识点:它是赋值的位置点。

移动过程:结构体中含有1的的区域在目标图像的左上角一格一格的移动。

腐蚀操作:腐蚀就是目标图像中的元素包含结构体,除标识位为1,其余为0。

计算步骤

目标图像A

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

腐蚀后的图像

0

0

0

1

0

1

0

1

0

0

0

0

0

0

0

结构元素B

0

0

1

1

膨胀操作(计算)

膨胀定义

        膨胀操作是形态学图像处理中的基本操作之一。它通过一个结构元(也称为卷积核)对图像进行扫描,根据结构元的形状和大小,将图像中的某些区域进行扩展或“膨胀”。具体来说,只要结构元覆盖的区域中有一个像素为前景(通常是白色),该位置就会被设置为前景。

膨胀流程图

知识点

结构体:膨胀操作的结构体的变化(反射结构元素),及对角线对称变化。

移动:移动到最后一个格子停下。

计算步骤

目标图像A

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

膨胀后的图像

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

结构元素B

1

1

0

0

进阶练习

己知一幅二值目标图像A和结构元素B如下图所示,其中结构元素B的原点由小三角形标识。请分别写出结构元素B对值图像A进行腐蚀运算与膨账运算的结果。

目标图像A

1

1

1

1

1

1

1

1

1

1

1

结构元素B

1

1

1

腐蚀后的图像

0

0

0

1

0

1

0

1

1

0

0

结构元素B

1

1

1

膨胀后的图像

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

结构元素B

1

1

1

腐蚀与膨胀操作(代码)

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def __imshow(pos_array, img, title_name='', immediate=False):
    plt.subplot(pos_array[0], pos_array[1], pos_array[2])
    plt.axis('off')
    plt.imshow(img, cmap='gray') # include: cv.cvtColor(img, cv.COLOR_BGR2RGB)
    plt.title(title_name)
    if immediate:
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.tight_layout()
        plt.show()

def __simple_task():
    # step1, load an image
    custom_target_img = np.zeros((6, 6), dtype=np.uint8)
    custom_target_img[0, 3] = 1
    custom_target_img[1, 1] = 1
    custom_target_img[1, 4] = 1
    custom_target_img[2, 1] = 1
    custom_target_img[2, 2] = 1
    custom_target_img[3, 2] = 1
    custom_target_img[3, 3] = 1
    custom_target_img[4, 2] = 1
    custom_target_img[4, 3] = 1

    # step, set kernel
    kernel = np.ones((1, 2), np.uint8)
    print(f'kernel={kernel}')

    # step2,erode and dilate
    erosion_result = cv.erode(custom_target_img, kernel, anchor=(0, 0))
    dilate_result = cv.dilate(custom_target_img, kernel, anchor=(1, 0))

    # step3, erode and dilate
    erosion_result2 = cv.erode(custom_target_img, kernel, anchor=(1, 0))
    dilate_result2 = cv.dilate(custom_target_img, kernel, anchor=(0, 0))

    # step4, display
    __imshow([3, 2, 1], custom_target_img, '目标图像')
    __imshow([3, 2, 3], erosion_result, '原点(0,0),腐蚀')
    __imshow([3, 2, 4], dilate_result,'原点(0,0),膨胀')

    __imshow([3, 2, 5], erosion_result2, '原点(1,0),腐蚀')
    __imshow([3, 2, 6], dilate_result2,'原点(1,0),膨胀', immediate=True)

def __erode():
    # step1
    img = cv.imread('images/little_circle.png', cv.IMREAD_GRAYSCALE)

    # step2
    ksize = (5, 5)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, ksize)
    erosion_result = cv.erode(img, kernel)

    kernel2 = cv.getStructuringElement(cv.MORPH_CROSS, ksize)
    erosion_result2 = cv.erode(img, kernel2)

    kernel3 = cv.getStructuringElement(cv.MORPH_ELLIPSE, ksize)
    erosion_result3 = cv.erode(img, kernel3)

    # step3
    __imshow([2, 2, 1], img, '目标图像')
    __imshow([2, 3, 4], erosion_result,'5*5矩形,腐蚀')
    __imshow([2, 3, 5], erosion_result2,'5*5十字形,腐蚀')
    __imshow([2, 3, 6], erosion_result3,'5*5椭圆,腐蚀', immediate=True)

def __dilate():
    # step1
    img = cv.imread('images/small_squares.tif', cv.IMREAD_GRAYSCALE)

    # step2
    kernel = np.ones((3, 3), np.uint8)
    dilation_result = cv.dilate(img, kernel)

    kernel2 = np.ones((7, 7), np.uint8)
    dilation_result2 = cv.dilate(img, kernel2)

    # step3
    __imshow([2, 2, 1], img, '目标图像')
    __imshow([2, 2, 3], dilation_result,'3*3矩形,膨胀')
    __imshow([2, 2, 4], dilation_result2,'7*7矩形,膨胀', immediate=True)


def __opening_closing_operation():
    # step1
    raw_img = cv.imread('images/fingerprint.png', cv.IMREAD_GRAYSCALE)
    ret, img = cv.threshold(raw_img, 127, 255, cv.THRESH_BINARY)

    # step2
    ksize = (5, 5)
    c_kernel = np.ones(ksize, np.uint8)
    rect_kernel = cv.getStructuringElement(cv.MORPH_RECT, ksize)

    # step3
    erosion = cv.erode(img, c_kernel, iterations=1)
    custom_opening_result = cv.dilate(erosion, c_kernel, iterations=1)
    opening_result = cv.morphologyEx(img, cv.MORPH_OPEN, rect_kernel)

    # step4
    dilation = cv.dilate(img, c_kernel, iterations=1)
    custom_closing_result = cv.erode(dilation, c_kernel, iterations=1)
    closing_result = cv.morphologyEx(img, cv.MORPH_CLOSE, rect_kernel, iterations=1)

    # step5
    __imshow([3, 2, 1], img, '目标图像')
    __imshow([3, 2, 3], custom_opening_result, '先腐蚀后膨胀')
    __imshow([3, 2, 4], opening_result,'开运算')
    __imshow([3, 2, 5], custom_closing_result, '先膨胀后腐蚀')
    __imshow([3, 2, 6], closing_result,'闭运算', immediate=True)


if __name__ == '__main__':
    __simple_task()
    __erode()
    __dilate()
    __opening_closing_operation()
    pass

运行结果

简单二值目标图像处理结果

二值化图像进行腐蚀操作处理结果

二值化图像进行膨胀操作处理结果

开运算和闭运算处理结果

补充

  1. 二值化是以0或1的形式表示
  2. 腐蚀与膨胀操作中的“计算步骤”中的“0”的意图为撑起格子和显示腐蚀情况。

标签:__,kernel,img,imshow,custom,形态学,腐蚀,讲解,cv
From: https://blog.csdn.net/m0_74350977/article/details/145190847

相关文章