重建开操作是形态学图像处理中的一种操作,用于去除图像中的小型噪点或填补图像中的小型空洞。它基于两个主要的形态学操作:腐蚀和膨胀。
在重建开操作中,首先对原始图像进行腐蚀操作。腐蚀操作是通过将结构元素与图像进行逐像素的比较,如果结构元素完全包含在图像中的某一区域,则该区域的像素值被设置为1,否则为0。这个操作将导致边界区域的收缩。
接下来,对腐蚀后的图像进行膨胀操作。膨胀操作是通过将结构元素与图像进行逐像素的比较,如果结构元素与图像中的某一区域有重叠,则该区域的像素值被设置为1,否则为0。这个操作将导致边界区域的扩张。
然后,将腐蚀后的图像与经过膨胀操作的图像进行逐像素的逻辑或运算。这将导致原始图像中的边界区域被重建并填补。边界区域是指原始图像中与腐蚀操作后的图像不完全重合的区域。
重建开操作的原理是通过腐蚀和膨胀操作的组合来去除小型噪点或填补小型空洞。腐蚀操作收缩图像的边界,膨胀操作扩张图像的边界,而逻辑或运算将边界区域重建并填补。这样可以改善图像的质量,并去除不需要的细节。
重建开操作的数学原理可以通过数学表达式来描述。假设A表示原始图像,B表示结构元素,R表示重建开操作的结果。
重建开操作可以使用以下迭代方式进行计算:
结果图显示了对文本图像进行普通开操作和重建开操作的结果。
第一步,用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)即为上面结果图中右下角所示恢复出的包含长的垂直笔画的字符。
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的约束,解决了传统开操作高度依赖准确结构元才能正确恢复形状的缺点
重建开操作的作用是:准确提取图像中与结构元(腐蚀时的,膨胀时用一般的就可以了)相似的模式