• 形态学算法应用之重建开操作的python实现——数字图像处理


    原理

    重建开操作是形态学图像处理中的一种操作,用于去除图像中的小型噪点或填补图像中的小型空洞。它基于两个主要的形态学操作:腐蚀和膨胀。

    1. 在重建开操作中,首先对原始图像进行腐蚀操作。腐蚀操作是通过将结构元素与图像进行逐像素的比较,如果结构元素完全包含在图像中的某一区域,则该区域的像素值被设置为1,否则为0。这个操作将导致边界区域的收缩。

    2. 接下来,对腐蚀后的图像进行膨胀操作。膨胀操作是通过将结构元素与图像进行逐像素的比较,如果结构元素与图像中的某一区域有重叠,则该区域的像素值被设置为1,否则为0。这个操作将导致边界区域的扩张。

    3. 然后,将腐蚀后的图像与经过膨胀操作的图像进行逐像素的逻辑或运算。这将导致原始图像中的边界区域被重建并填补。边界区域是指原始图像中与腐蚀操作后的图像不完全重合的区域。
      重建开操作的原理是通过腐蚀和膨胀操作的组合来去除小型噪点或填补小型空洞。腐蚀操作收缩图像的边界,膨胀操作扩张图像的边界,而逻辑或运算将边界区域重建并填补。这样可以改善图像的质量,并去除不需要的细节。

    具体过程

    重建开操作的数学原理可以通过数学表达式来描述。假设A表示原始图像,B表示结构元素,R表示重建开操作的结果。
    重建开操作可以使用以下迭代方式进行计算:

    1. 初始化:设R0 = A。
    2. 重建开操作的迭代过程如下:
      腐蚀操作:Erosion(Ri, B) = Ci
      对于每个像素(i, j),Ci(i, j) = min { Ri(x, y) | (x, y)属于B的邻域}。
      膨胀操作:Dilation(Ci, B) = Di
      对于每个像素(i, j),Di(i, j) = max { Ci(x, y) | (x, y)属于B的邻域}。
      重建操作:Ri+1 = Di ∧ A
      对于每个像素(i, j),Ri+1(i, j) = min { Di(i, j), A(i, j)}。
    3. 重复步骤2,直到Ri+1 = Ri。此时,R = Ri 即为最终的重建开操作结果。
      在迭代过程中,腐蚀操作用于收缩图像边界,膨胀操作用于扩张图像边界,而重建操作用于重建并填补边界区域。重建开操作的结果R将去除小型噪点或填补小型空洞,以改善图像质量。

    python实现下图

    在这里插入图片描述

    提示

    结果图显示了对文本图像进行普通开操作和重建开操作的结果。
    第一步,用51×1的矩形结构元对图像进行一次腐蚀(结果显示在上图右上角);
    第二步,在腐蚀的基础上再执行一次基于同样结构元的膨胀便完成了普通开操作(结果显示在上图左下角 )。普通开操作并不能有效恢复腐蚀后所保留物体的形状;
    第三步,用3×3的方形结构元进行重建开操作,遵循公式R_G^D (F)=D_G^((k)) (F)=D_G^((1)) [D_G^((n-1)) (F)],其中D_G^((0)) (F)=F和D_G^((1)) (F)=(F⊕B)∩G,直到D_G^((k)) (F)=D_G^((k+1)) (F)。在实验中,初始标记图像F即为第一步得到的腐蚀结果,模板图像G即为读入的原始图像,B即为3×3的方形结构元。收敛后的R_G^D (F)=D_G^((k)) (F)即为上面结果图中右下角所示恢复出的包含长的垂直笔画的字符。

    python代码

    import cv2
    import  numpy as np
    import matplotlib.pyplot as plt
    
    img=cv2.imread("Fig0929.tif",0)
    kernel=np.ones((51,1),dtype=np.uint8)
    img_erode=cv2.erode(img,kernel)  #开操作
    img_open=cv2.dilate(img_erode,kernel)  #闭操作
    
    img_dst = img_erode.copy()
    img_last = np.zeros(img.shape)
    
    # 用3*3的方形结构元进行重建开操作,每步均执行膨胀+和模板图像的与操作
    kernel = np.ones((3, 3), dtype=np.uint8)
    while (np.sum(img_dst-img_last) != 0):
        img_last = img_dst
        img_dst = cv2.dilate(img_last, kernel)
        img_dst = np.logical_and(img_dst, img)
        img_dst = img_dst.astype(np.float)
    plt.subplot(2, 2, 1)
    plt.imshow(img, cmap='gray')
    plt.axis('off')
    plt.title('original')
    plt.subplot(2,2,2)
    plt.imshow(img_erode, cmap='gray')
    plt.axis('off')
    plt.title('erode')
    
    plt.subplot(2,2,3)
    plt.imshow(img_open,cmap='gray')
    plt.axis('off')
    plt.title("open")
    
    plt.subplot(2, 2, 4)
    plt.imshow(img_dst, cmap='gray')
    plt.axis('off')
    plt.title('recon_open')
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    结果展示

    在这里插入图片描述
    使用5*5的方形结构元进行重建开操作
    在这里插入图片描述

    总结

    标准开操作即先进行腐蚀,然后对腐蚀结果利用同一个结构元进行膨胀;重建开操作即先进行腐蚀(这一步骤与标准开操作相同),然后利用该腐蚀结果作为标记,原图像作为模板,进行重建,整个过程叫做重建开操作。
    形态学开操作首先删除小物体,再通过膨胀试图恢复遗留前景重建开操作由于有了G的约束,解决了传统开操作高度依赖准确结构元才能正确恢复形状的缺点
    重建开操作的作用是:准确提取图像中与结构元(腐蚀时的,膨胀时用一般的就可以了)相似的模式

  • 相关阅读:
    生气时睡觉,糊涂时读书
    微信小程序登录获取不到头像和昵称解决办法!
    软件测试经典面试题【必备100道】
    前端必要收藏相关要点
    SQL教程之每个分析工程师都需要知道的 5 个 SQL 函数
    攻破《数组与指针》相关笔试题(二)
    [单片机框架][bsp层][N32G4FR][bsp_tim] tim配置和使用
    【2023集创赛】加速科技杯三等奖作品:私密性高精度刷手身份认证系统
    FreeSWITCH windows编译
    网络——路由器
  • 原文地址:https://blog.csdn.net/qq_49370210/article/details/136434127