基于图像sobel边缘提取和形态学特征匹配的多碎片图像拼接算法matlab仿真
目录
1.引言
破碎图像碎片复原在文物数字化、破损档案修复等场景具备实用价值。多碎片图像拼接不同于普通全景图像拼接,碎片之间不存在完整重叠区域,仅依靠碎片边界的边缘、形态轮廓信息完成匹配、配准与图像融合。整体流程包含碎片图像读取预处理、Sobel算子边缘提取、形态学轮廓特征计算、碎片边界特征匹配、迭代图像配准融合、多子块图像叠加复原六大环节。利用Sobel算子提取碎片四周边缘轮廓,形态学处理过滤噪声边缘;然后完成碎片边界形态特征相似度检索,然后完成图像变换配准,迭代将碎片逐步拼合,最终叠加生成完整复原图像。
2.算法测试效果



3.算法涉及理论知识概要
3.1 碎片图像读取与图像预处理
系统GUI触发读取碎片文件,批量读取碎片RGB图像Irgb。彩色碎片图像首先转换为灰度图像,消除色彩通道干扰,便于后续边缘检测。RGB转灰度的计算公式:

其中,*代表二维卷积运算。预处理之后图像送入Sobel边缘提取模块,该部分对应代码中`func_get_debris`函数的前期处理流程,同时保存原始RGB碎片图、灰度图,供后续配准融合使用。
3.2 Sobel算子边缘提取
Sobel算子利用横向、纵向梯度模板分别计算图像x方向、y方向灰度梯度,获取碎片物体边界。x 方向Sobel卷积核Sx,y方向卷积核Sy。

设置阈值LVL(程序中LVL取0.6~0.62),对梯度幅值二值化得到边缘二值图E(x,y):

Gmax为整张图像梯度幅值最大值。E(x,y)=1的像素代表边缘点,即代码中保存的`edges{i}`边缘矩阵。阈值LVL控制边缘保留多少细节,LVL越高,仅保留强轮廓,过滤细碎纹理边缘;LVL过低会引入大量无效纹理干扰后续碎片匹配。
3.3 形态学处理优化边缘轮廓
Sobel直接输出的边缘图存在断点、细小毛刺、孤立噪声点,需要形态学运算优化轮廓。主要使用腐蚀、膨胀运算。设结构元为B,二值边缘图像E。膨胀运算,扩大边缘连通域,填补边缘细小断裂:

经过形态学开运算,得到优化后的碎片边界轮廓图像。提取轮廓的形态特征向量:轮廓长度、轮廓点坐标序列、边界点梯度方向,构成该碎片的形态特征描述子。不同碎片之间,对比边界形态特征向量的相似度,该过程对应`func_RL`特征匹配函数输入。
3.4 碎片形态学特征匹配检索
输入待匹配碎片边缘特征,和其余全部碎片的轮廓特征做相似度计算。设碎片A轮廓特征向量为 Fa,候选碎片B轮廓特征向量Fb。采用归一化相关系数衡量形态轮廓相似度:

ii2即为匹配最优碎片编号。同时输出匹配边界的坐标偏移量R1b,C1b,代表两片碎片之间水平、竖直方向配准偏移。这一步对应代码`func_RL`,输出最优匹配碎片索引与偏移参数,若相似度低于下限阈值,则判定没有可匹配碎片。
3.5 多组子块图像矩阵叠加复原完整图像
程序中将碎片分为多组子集分别迭代拼接,每组碎片迭代完成,输出子拼接图像 IRGB1, IRGB2, IRGB3, IRGB4。创建足够大的零矩阵作为画布,设置各组子块垂直方向放置偏移系数,将各组子块缩放(除以系数1.3做亮度压缩)后放到画布不同位置:

裁剪边缘多余空白,转换uint8数据类型,在GUI的axes3控件显示最终复原图像。
综上所述,完整算法执行流程:
①GUI界面读取全部碎片图像,RGB图像转为灰度图,高斯平滑降噪;
②Sobel算子计算梯度幅值,设定LVL阈值做二值化得到碎片边缘图;
③形态学开运算去除边缘毛刺噪声,提取碎片边界形态特征向量;
④func_RL计算不同碎片轮廓特征相似度,搜索最优匹配碎片,获取配准偏移量;
⑤func_hbing、func_hbing2完成图像平移配准、加权融合,func_get_debris2重新提取拼接后图像边缘特征,迭代匹配下一块碎片;
⑥多组碎片分别拼接得到多个子复原块,画布矩阵叠加,裁剪后输出完整复原图像。
4.核心程序
function [Images,Images0,IC02,edges] = func_get_debris(Image,LVL);
%二值化
IC0 = im2bw(Image,LVL*graythresh(Image));
% figure(1);
% subplot(231)
% imshow(IC0);title('二值化图像');
%提取各个碎片
[L,n] = bwlabel(IC0);
[rows,cols] = size(IC0);
L2(1:rows,1:cols,3) = 0;
Index = 0;
for i=1:n
i
[r,c] = find(L==i);
a1(i) = max(r);
a2(i) = min(r);
b1(i) = max(c);
b2(i) = min(c);
w(i) = b1(i)-b2(i);
h(i) = a1(i)-a2(i);
square(i) = w(i) * h(i);
if square(i) > 5000
Index = Index + 1;
%将碎片像素信息保存下来
Images = Image(a2(i):a1(i),b2(i):b1(i),:);
IC02 = IC0(a2(i):a1(i),b2(i):b1(i));
Images0 = IC0(a2(i):a1(i),b2(i):b1(i));
%
L2(a2(i)+1:a2(i)+2 ,b2(i)+1:b1(i),1) = 255;
L2(a1(i)+1:a1(i)+2 ,b2(i)+1:b1(i),1) = 255;
L2(a2(i)+1:a1(i) ,b2(i)+1:b2(i)+2,1) = 255;
L2(a2(i)+1:a1(i) ,b1(i)+1:b1(i)+2,1) = 255;
L2(a2(i)+1:a2(i)+2 ,b2(i)+1:b1(i),2) = 0;
L2(a1(i)+1:a1(i)+2 ,b2(i)+1:b1(i),2) = 0;
L2(a2(i)+1:a1(i) ,b2(i)+1:b2(i)+2,2) = 0;
L2(a2(i)+1:a1(i) ,b1(i)+1:b1(i)+2,2) = 0;
L2(a2(i)+1:a2(i)+2 ,b2(i)+1:b1(i),3) = 0;
L2(a1(i)+1:a1(i)+2 ,b2(i)+1:b1(i),3) = 0;
L2(a2(i)+1:a1(i) ,b2(i)+1:b2(i)+2,3) = 0;
L2(a2(i)+1:a1(i) ,b1(i)+1:b1(i)+2,3) = 0;
end
end
pixel2 = zeros(rows,cols,3);
for i = 1:rows
for j = 1:cols
if L2(i,j) == 255
pixel2(i,j,1) = L2(i,j,1);
pixel2(i,j,2) = L2(i,j,2);
pixel2(i,j,3) = L2(i,j,3);
else
pixel2(i,j,1) = IC0(i,j);
pixel2(i,j,2) = IC0(i,j);
pixel2(i,j,3) = IC0(i,j);
end
end
end
% subplot(232)
% imshow(pixel2);title('提取碎片');
% subplot(233)
% imshow(Images);title('提取碎片');
% subplot(234)
% imshow(IC02);title('提取碎片二值图');
%边缘提取
IC02 = imfill(IC02,'hole');
edges = edge(IC02,'sobel');
edges = bwareaopen(edges,50);
5.完整算法代码文件获得
完整程序见博客首页左侧或者打开本文底部GZH名片
(V关注后回复码:X153)
V

浙公网安备 33010602011771号