文章目录
- 一、部分题目
- 二、部分论文
- 三、部分源代码
- 四、完整word版论文和源代码(两种获取方式)
一、部分题目
2013高教社杯全国大学生数学建模竞赛题目
B题 碎纸片的拼接复原
破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上,拼接复原工作需由人工完成,准确率较高,但效率很低。特别是当碎片数量巨大,人工拼接很难在短时间内完成任务。随着计算机技术的发展,人们试图开发碎纸片的自动拼接技术,以提高拼接复原效率。请讨论以下问题:
问题1 对于给定的来自同一页印刷文字文件的碎纸机破碎纸片(仅纵切),建立碎纸片拼接复原模型和算法,并针对附件1、附件2给出的中、英文各一页文件的碎片数据进行拼接复原。如果复原过程需要人工干预,请写出干预方式及干预的时间节点。复原结果以图片形式及表格形式表达(见【结果表达格式说明】)。
问题2 对于碎纸机既纵切又横切的情形,请设计碎纸片拼接复原模型和算法,并针对附件3、附件4给出的中、英文各一页文件的碎片数据进行拼接复原。如果复原过程需要人工干预,请写出干预方式及干预的时间节点。复原结果表达要求同上。
问题3 上述所给碎片数据均为单面打印文件,从现实情形出发,还可能有双面打印文件的碎纸片拼接复原问题需要解决。附件5给出的是一页英文印刷文字双面打印文件的碎片数据。请尝试设计相应的碎纸片拼接复原模型与算法,并就附件5的碎片数据给出拼接复原结果,结果表达要求同上。
二、部分论文
三、部分源代码
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
%分类算法,一类为一个裁剪行
num=209;
for i=1:num %读取所有碎纸片
if i<11
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(strcat('00',num2str(i-1)),'bmp');
elseif i<101
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(strcat('0',num2str(i-1)),'bmp');
else
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(num2str(i-1),'bmp');
end
end
biaozhun=zeros(1,num);
for i=1:num
temp=img0(:,72*i-71:72*i);
temp2=zeros(180,1);
for j=1:180
if(sum(temp(j,:))==72*255)
temp2(j)=255;
end
end
for j=1:180
if(temp2(j+1)==255 && temp2(j)~=255) %寻找第一个变为255的行数(黑变白)
b=j;
break;
end
end
biaozhun(i)=b;
end
biaozhunpaixu=sort(biaozhun);
fenlei=zeros(11,19);
for i=1:11 %分类,19个分一类
fenlei(i,:)=find(biaozhun<=biaozhunpaixu(i*19) & biaozhun>=biaozhunpaixu(i*19-18));
end
%寻找第一片
diyipian=zeros(1,11);
k=1;
for i=1:209
if(sum(sum(img0(:,i*72-71:i*72-62)))==255*180*10)
diyipian(k)=i;
k=k+1;
end
end
%把实际第一片换到第一位
for i=1:11
[m,n]=find(fenlei==diyipian(i));
fenlei(m,n)=fenlei(m,1);
fenlei(m,1)=diyipian(i);
end
gezhangtouying;
num=418;
%寻找第一个完整行的下边界作为分类依据
%计算第一个完整行的高度,分为三类:小字母[23,25] 一头或一尾或大写[34,39] [47,52]
biaozhun=zeros(num,1);
for i=1:num
for j=1:179
if(touying(j,i)==0 && touying(j+1,i)~=0)
for k=1:52
if(touying(j+k,i)~=0 && touying(j+1+k,i)==0)
break;
end
end
%k为该完整行的高度
if(k>=23 && k<=27)%对于小字母k+j为要记录的底部
biaozhun(i)=k+j;
elseif(k>=31 && k<=42)
biaozhun(i)=k+j;
elseif(k>=45 && k<=54)
biaozhun(i)=k+j-14;
end
if(k<23)
continue;
end
break;
end
end
end
temp=[4 8 11 29 79 102 107 136 142 146 157 159 161 163 168 174 175 199 204 222 240 259 270 272 278 289 295 306 307 312 313 322 330 336 342 347 363 377 378 386 399 400 405 410 413 417];
[t,n]=size(temp);
for i=1:n
biaozhun(temp(i))=biaozhun(temp(i))-14;
end
biaozhun(22)=84;%逗号
biaozhun(11)=84;%?
biaozhun(275)=(96)
biaozhun(69)=107;%下面半个
biaozhun(127)=86;
biaozhun(235)=86;
biaozhun(271)=33;%18
biaozhun(279)=55;%24
biaozhun(305)=84;%23
biaozhun(55)=32;%45
biaozhun(108)=76;%23
biaozhun(225)=55;%27
biaozhun(255)=85;%25
biaozhun(132)=53;%26
biaozhun(139)=95;%38
biaozhun(213)=55;%41
biaozhun(242)=84;%34
biaozhun(282)=74;%40
biaozhun(304)=53;%19
biaozhun(379)=75;%28
biaozhun(126)=109;%15
biaozhun(135)=85;
biaozhun(285)=63;%32
biaozhun(405)=76;%19?
%biaozhun(74)=biaozhun(74)-12+14;
%biaozhun(93)=biaozhun(93)-11;
%biaozhun(105)=biaozhun(105)-11;
%biaozhun(173)=89;%逗号
%biaozhun(95)=86;%逗号
%[0 2 22 25 33 34 62 40 74 102 110 113 140 151 167 169 173 201 208]-14
%!!73-12 104-11 92-11
%73
%寻找每行开头5列像素的255
diyipian=zeros(1,22);
k=1;
for i=1:num
if(sum(sum(img0(:,i*72-71:i*72-60)))==255*180*12)
diyipian(k)=i;
k=k+1;
end
end
%减64
for i=1:num
if biaozhun(i)>66
biaozhun(i)=biaozhun(i)-64*floor(biaozhun(i)/64)
end
end
%计算每块第一块黑色区域的下边界
%65为行间距
%for i=1:num
% if(biaozhun(i)-65*floor(biaozhun(i)/65)>11)
% biaozhun(i)=biaozhun(i)-65*floor(biaozhun(i)/65);
% end
%end
biaozhunpaixu=sort(biaozhun);
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
%第一块黑色的下边缘
%{
for i=1:num
for j=1:179
if(touying(j,i)-touying(j+1,i)>=9 && touying(j+1,i)<14)
biaozhun(i)=j;
break;
end
end
end
ans=sort(biaozhun);
%}
%像素数直方图
num=209;
for i=1:num %读取所有碎纸片
if i<11
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(strcat('00',num2str(i-1)),'bmp');
elseif i<101
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(strcat('0',num2str(i-1)),'bmp');
else
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(num2str(i-1),'bmp');
end
end
touying=zeros(180,209);%touying用每一列记录对应图片黑色像素点数
for i=1:209
for j=1:180
touying(j,i)=length(find(img0(j,i*72-71:i*72)~=255));
end
end
%计算投影
num=418;
for j=1:num %读取所有碎纸片
if mod(j,2)==1
si='a';
else
si='b';
end
i=ceil(j/2);
if i<11
[img0(:,j*72-71:j*72),cmap0(:,j*3-2:j*3)]=imread(['00',num2str(i-1),si],'bmp');
elseif i<101
[img0(:,j*72-71:j*72),cmap0(:,j*3-2:j*3)]=imread(['0',num2str(i-1),si],'bmp');
else
[img0(:,j*72-71:j*72),cmap0(:,j*3-2:j*3)]=imread([num2str(i-1),si],'bmp');
end
end
touying=zeros(180,num);%touying用每一列记录对应图片黑色像素点数
for i=1:num
for j=1:180
touying(j,i)=length(find(img0(j,i*72-71:i*72)~=255));
end
end
%image(img0(:,1:72));
%colormap(cmap0(:,1:3));
num=19;
sign=hang(i);
for i=1:num %读取所有碎纸片
if sign(i)<11
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(strcat('00',num2str(sign(i)-1)),'bmp');
elseif sign(i)<101
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(strcat('0',num2str(sign(i)-1)),'bmp');
else
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(num2str(sign(i)-1),'bmp');
end
end
img1=im2double(img0)*255;
for i=1:19
for j=1:19 %deta255(i,j)i的右侧和j的左侧的M距离
deta255(i,j)=sum(abs(img1(:,i*72)-img1(:,j*72-71)));
end
end
%人为干预
%deta255(13,7)=inf;deta255(13,6)=inf;deta255(8,7)=inf;
deta255(10,2)=0
now=1;
img(:,1:72)=img0(:,now*72-71:now*72);
shunxu(1)=sign(now);
now_temp(1)=now;
for i=2:num
deta255(:,now)=inf;
now=find(deta255(now,:)==min(deta255(now,:)))
now_temp(i)=now;
shunxu(i)=sign(now);
img(:,i*72-71:i*72)=img0(:,now*72-71:now*72);
end
figure;
image(img);
colormap(cmap0(:,1:3));
hold on;
for i=1:num
text((i-1)*72,150,int2str(now_temp(i)));
end
for i=1:num
plot([72*i-1,72*i-1],[0,180])
end
%img0(:,1:72:1368)=0;
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
img_gehang=zeros(180*11,72*19);
img0=zeros(180*11,72*19);
cmap0=zeros(180*11,72*19);
for i=1:11
for j=1:19 %读取所有碎纸片
if gehang(i,j)<11
[img0(180*i-179:180*i,j*72-71:j*72),cmap0(256*i-255:256*i,j*3-2:j*3)]=imread(strcat('00',num2str(gehang(i,j)-1)),'bmp');
elseif gehang(i,j)<101
[img0(180*i-179:180*i,j*72-71:j*72),cmap0(256*i-255:256*i,j*3-2:j*3)]=imread(strcat('0',num2str(gehang(i,j)-1)),'bmp');
else
[img0(180*i-179:180*i,j*72-71:j*72),cmap0(256*i-255:256*i,j*3-2:j*3)]=imread(num2str(gehang(i,j)-1),'bmp');
end
end
end
image(img0);
colormap(cmap0(1:256,1:3));
touying=zeros(1980,1);
touying(find(sum(img0,2)==1368*255))=255;
hold on
axis off
for i=1:11
plot([0 1368],[i*180 i*180])
end
for i=1:180
for j=1:11
touying1(i,j)=touying((j-1)*180+i);
end
end
for i=1:19
plot([i*72 i*72],[0 1980])
end
%对于纵向剪裁的纸片的拼接,适用于中、英文
img0=zeros(1980,1368);cmap0=zeros(256,19*3);img=zeros(1980,1368);
for i=1:19%读取所有碎纸片
[img0(:,i*72-71:i*72),cmap0(:,i*3-2:i*3)]=imread(num2str(i-1),'bmp');
end
deta255=zeros(19);
for i=1:19
for j=1:19 %deta255(i,j)i的右侧和j的左侧
deta255(i,j)=abs(sum(abs((img0(:,i*72)-img0(:,j*72-71)))));
end
end
img(:,1:72)=img0(:,9*72-71:9*72);
now=9;%第一片序号
for i=2:19
now=find(deta255(now,:)==min(deta255(now,:)));
img(:,i*72-71:i*72)=img0(:,now*72-71:now*72);
end
image(img);
colormap(cmap0(:,1:3));
hold on
num=19
for i=1:num
text((i-1)*72,1980,int2str(now_temp(i)-1));
end
for i=1:num
plot([72*i-1,72*i-1],[0,1980])
end
axis off
完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode