碎纸片自动拼接技术研究
- 问题重述
图像碎片自动拼接技术的研究是一个有很大实用价值的课题。如,考古研究中对破碎珍贵文物的修复,公共机关破案时遇到的破碎证物的修复等。传统上,拼接复原工作需由人工完成,准确率较高,但效率很低,特别是当碎片数量巨大,人工拼接很难在短时间内完成任务,这种落后的无奈之举和信息时代高效的现实需求之间的矛盾愈来愈明显。基于此,需要建立数学模型和算法将图像碎片自动拼接,即借助计算机,通过特征匹配技术来识别出相邻接的图像碎片,进而重现整个物体的原貌,以提高拼接复原效率。题目要求建立粉碎机横纵切单面纸片和双面纸片的复原模型与算法,将人工复原和机器复原相结合,探寻干预节点,并通过所建立的方法对题目附件中的粉碎图片进行还原。
- 问题分析
碎纸片拼接方法的研究一般模型如下:实物碎片→碎片数字化→图像预处理→提取边界→特征分析检测→找匹配段→拼接复原。常规文档碎纸片计算机拼接方法一般利用碎片边缘的尖点特征、尖角特征、面积特征等几何特征,搜索与之匹配的相邻碎纸片并进行拼接。但是这种基于边界几何特征的拼接方法并不适用于边缘形状相似的碎纸片。而题目中所给的图片均为相同形状的图形,拼接时如果只利用碎片的边界特征,拼接效果并不理想。当然,因此我们也省去了将图片预处理和提取边界的步骤。
尽管图片是规整的,但是我们所要拼接的内容涉及到文字内容,所以我们可以大胆设想文字特征类似于非规则图片的曲线性,由此看来与碎片匹配时,涉及到一个重要的问题就是曲线匹配。曲线匹配的关键技术是确定坐标变换中具有不变性的量,即不变量为匹配依据,用不变量重新表征边界曲线。既然通过不变量表征两条边界曲线特征,就需要在特征不变量序列中找公共序列,但实际情况又不能满足严格的对应相等,所以把最长公共子序列问题的思想蕴涵其中,即我们可以对左右两列从上至下去坐标值,并设定阈值,通过阈值的划分性进行匹配。
每个小纸片都是只有黑白两色的图片,用Matlab进行处理,把黑白信息转换成矩阵,设置白色区域为0,黑色区域为1,然后只考虑切缝处,如果一个纸片的切缝的右端有“1”,则另外至少有一张纸片的左边切缝的相同地方有“1”,运用Matlab建立算法程序,求出图片标号的次序,最后进行人工干预的检查,完成将碎纸片拼接的题目。
- 模型假设
1、
2、
3、
4、
- 符号说明
- A 为碎片的总代号,AL为碎片左边,AR为碎片右边;
- 图片分割后的每一像素点为
;
- 变量i为碎片的数量;
- J为被撕纸张中文字得行数;
- 模型建立与求解
1 纵切碎片的复原问题:
-
- 纵切复原模型的建立思路
1.1.1 碎片拼接的匹配性原则
图像碎片复原需要实物碎片数字化的过程,数字化的方法将直接影响到碎片匹配过程的准确性,比如实物碎片扫描精度较低,预处理中闽值分割采用的闽值不合理等等。但不管怎样,数字化与预处理之后二维图像碎片的匹配应该满足匹配结果唯一性、顺序性、规范性的准则。【1】
① 匹配的唯一性。在碎片的匹配过程中,一般都会找到不只一组的匹配对,要通过匹配算法识别出真正的匹配对,排除掉其他似是而非的匹配。另外,在正确的匹配中,要处理好对误差的控制,应该把误差控制在一定的范围之内,如果误差超出了一定的范围,就变成了错误。甚至通过人工干预的手段以达到控制误差的目的。
② 匹配的顺序性。在匹配查找中,我们可能会遇到两个或者两个以上的碎片与同一碎片的相匹配的情况,这个时候,我们应该把只有一个匹配的碎片优先处理,这样可以避免有多个匹配的碎片被反复计算。
③ 匹配的规范性。复原对象破碎前的原形是唯一的,而我们复原碎片的目的,就是要将碎片复原成原来的样子,如果我们复原的结果不能让我们看到复原对象的真正原形,那我们的复原就没有意义。
1.1.2 灰度分析的相似性原则
灰度信息的图像配准算法和搜索算法中有互相关法、序贯相似度检测匹配法等方法。互相关法通过计算基准图像与搜索窗口之间相关值来确定匹配程度。对于图像
和小于图像尺寸的模板
,他们的归一化互相关函数为:
序贯相似检测法相比于互相关法具有更快的速度,其相似性度如下:
其中T和I分别为模板和图像的均值。在图像不匹配的位置类加时,E(u, v)增长很快,而在图像匹配的位置上E(u, v)随累加的次数增长缓慢,可以设定一个闽值或者设定累加次数作为匹配的依据。【2】
![]() |
基于匹配的多重原则和灰度分析的相似性的考虑,我们为解决问题一,按照模型的流程图:
建立了Matlab算法程序。(见附录)
1.2算法分析
1.2.1 碎片数字化处理
该程序通过Matlab软件将碎片进行数字化处理,即图片中文字的坐标化处理,图形的矩阵化处理,将问题数学化。此算法利用Matlab独特的矩阵处理方法,对图像做出二值化分析,将每一张碎片分为72X1980的矩阵,对其进行左右分析。分别从碎片左边至右边和右边至左边进行相似化处理与分析。通过循环结构综合对每张碎片逐一分析、对比,最终获得相应的排列顺序。
1.2.2 相似化分析与二值法阈值
为达到碎片拼接的相似化处理,通过Matlab程序采用大津法(OTSU法)【3】将t记为前景与背景的分割阈值,前景点数占图像比例为w0, 平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。则图像的总平均灰度为:
前景和背景图象的方差:
当方差g最大时,可以认为此时前景和背景差异最大,也就是此时的灰度是最佳阈值。因此,依据均方差限来自动选定区域,也可用分水岭算法选定区域,如果要求简单可以根据待处理图像的先验人为的设定大小,如要求自适应就需要做大量的度量计算。综合多方面的考虑,我们通过Matlab最终设立了程序(见附录)得到阈值为251。
由于纵切问题的简单性,人工干预成分较少,即可得出对单一纵切碎片的复原,其中的难点在于对碎片的数字化处理之后的每一张碎片左右两部分的相似化分析及计算二值法的阈值。最后通过Matlab软件输入
a1=imread('C:\Users\Administrator\Desktop\数学建模\B\附件1\008.bmp');
等语句按序导入图片,获得复原图。(汉字复原图见附录图1)
1.3 算法检验
为了检测顺序的正确性与复原的完整性,应用此程序对附件二中的英文单一纵切的碎片进行排序,同样获得了复原图,进一步校验了算法准确性。(英文复原图见附录图2)
- 模型的评价与应用
基于互信息的图像配准使用交互信息来比较两幅图像的统计相似性,将图像灰度看成具有独立样本空间的均匀随机过程,用统计特征及概率密度函数来描述图像的统计特性。交互信息配准图像的方法是:两幅图像匹配使其交互信息达到极大值。该算法计算量大且要求图像之间具有较大的重叠区域。
基于灰度的图像匹配算法直接利用图像的灰度值进行匹配,可以充分利用图像的像素信息,但是也造成算法的处理信息庞大,处理速度慢,并且对图像的差别敏感,图像中的微小变化可能对配准结果造成重大影响,所以基于灰度的图像配准算法的鲁棒性较差,只能用于具有相同外界条件的两幅图像之间的配准。所以我们将灰度分析应用与Matlab的软件中,用循环检验算法将图形匹配表达出来,基于灰度匹配又高于其分析方法。
- 参考文献
【1】
【2】李俊超,基于尺度不变特征的自动图像拼接技术研究,中国知网, 9月13日
【3】 曹莉华,图像边缘提取中的一种动态阈值获取法,小型微型计算机系统,1997
- 其中书籍的表述方式为:
[编号] 作者,书名,出版地:出版社,出版年。
参考文献中期刊杂志论文的表述方式为:
[编号] 作者,论文名,杂志名,卷期号:起止页码,出版年。
参考文献中网上资源的表述方式为:
[编号] 作者,资源标题,网址,访问时间(年月日)。
附录:
阈值求解程序:
I=imread('C:\Users\Administrator\Desktop\数学建模\B\附件1\002.bmp'); imshow(I);
[N,M]=size(I);
length=N*M;
L=256;
count=0;
for k=0:L-1
for i=1:N
for j=1:M
if I(i,j)==k
count=count+1;
end
end
end
P(k+1)=count/length;
count=0;
end
for i=1:L
if P(i)~=0
first=i;
break
end
end
for i=L:-1:1
if P(i)~=0
last=i ;
break
end
end
entropy1=0;
for i=first:last
if (P(i)~=0)
entropy1=entropy1+P(i)*log2(1/P(i));
end
end
ep=0;
averF=0;
averB=0;
for t=0:L
y=t+1 ;
if (y>first)&&(y<last)
for k=1:y
ep=ep+P(k)
end
w0(y)=ep;
w1(y)=1-w0(y);
for i=1:t
ep=averF+(i)*P(i)/w0(y);
end
u0(y)=averF;
for i=t:L
averB=averB+(i)*P(i)/w1(y);
end
u1(y)=averB;
u=w0(y)*u0(y)+w1(y)*u1(y);
arg(y)=w0(y)*(u0(y)-u)*(u0(y)-u)+w1(y)*(u1(y)-u)*(u1(y)-u); end
ep=0;
averF=0;
averB=0;
end
high=arg(1);
for i=2:last-first-3
if high<arg(i)
high=arg(i);
x=i; %
end
end
t=x-1;
I0=0;
I1=0;
for i=1:N
for j=1:M
if (I(i,j)>=t)
y1(i,j)=255;
I1=I1+1;
else
y1(i,j)=0;
I0=I0+1;
end
end
end
figure,imshow(y1);
entropy1;
back=(I0/(N*M))*log2(N*M/I0);
fore=(I1/(N*M))*log2(N*M/I1);
entropy2=back+fore
%exetime=second(now-time)
t
纵切的复原拼接程序:
A{1}=imread('000.BMP');
A{2}=imread('001.BMP');
A{3}=imread('002.BMP');
A{4}=imread('003.BMP');
A{5}=imread('004.BMP');
A{6}=imread('005.BMP');
A{7}=imread('006.BMP');
A{8}=imread('007.BMP');
A{9}=imread('008.BMP');
A{10}=imread('009.BMP');
A{11}=imread('010.BMP');
A{12}=imread('011.BMP');
A{13}=imread('012.BMP');
A{14}=imread('013.BMP');
A{15}=imread('014.BMP');
A{16}=imread('015.BMP');
A{17}=imread('016.BMP');
A{18}=imread('017.BMP');
A{19}=imread('018.BMP');
for i=1:19
for j=1:1980
for k=1:72
if A{i}(j,k)<=251
A{i}(j,k)=1;
else A{i}(j,k)=0;
end
end
end
AL{i}=A{i}(:,1);
AR{i}=A{i}(:,72);
end
t(1,1)=0;
t1(1,19)=0;
t(1,1)=1;
t1(1,1)=1;
leftn=1;
for i=1:19
left=AR{leftn};
if left==0
break
end
samemax=0;
for j=1:19
same=0;
right=AL{j};
for k=1:1980
if left(k,1)==right(k,1)
same=same+1;
end
end
if same>=1800
if same>samemax
if t1(1,j)<1
t(1,i+1)=j;
end
end
end
end
if t(1,i+1)==0
break
end
leftn=t(1,i+1);
t1(1,leftn)=1;
end
for i=1:19
right=AL{t(1,1)};
samemax=0;
for j=1:19
same=0;
left=AR{j};
for k=1:1980
if left(k,1)==right(k,1)
same=same+1;
end
end
if same>=1800
if same>samemax
if t1(1,j)<1
t=[0,t];
t(1,1)=j;
end
end
end
end
if t(1,1)==0
break
end
t1(1,1)=1;
end
for i=1:19
t(1,i)=t(1,i)-1;
end
t