形态学算法应用之重建开操作的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()

结果展示

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

总结

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

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值