2013年全国大学生数学建模竞赛B题碎纸片复原(含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

四、完整word论文和源代码

请添加图片描述

### 回答1: 2013数学建模B题是关于纸片拼接的问题。这个问题的目标是通过拼接多张长方形纸片来覆盖一个特定形状的图案。 要解决这个问题,我们需要编写一段代码。首先,我们需要引入相关的库,如numpy和matplotlib。然后,我们可以定义一个函数用来计算纸片的拼接方式。 在该函数中,我们可以使用一个二维数组来表示拼接图案的形状。对于每个图案,我们可以定义它的位置和方向。然后,我们可以使用循环来遍历所有可能的纸片拼接方式。 在每个循环迭代中,我们可以计算拼接图案的完整性。如果图案被完全覆盖,则可以将这个拼接方案添加到结果列表中。 最后,我们可以使用matplotlib库将所有的完整拼接方案可视化。这样可以方便我们理解和分析结果。 在编写代码时,我们应该注意到以下几点: 1. 我们需要采用递归或者回溯的方式来处理多次纸片的拼接。 2. 我们可以使用numpy库来处理矩阵运算,提高计算效率。 3. 我们需要使用循环来遍历不同的纸片位置和方向,并选择合适的拼接方式。 总结起来,通过设计合适的算法和编写相应的代码,我们可以有效地解决2013数学建模B题中纸片拼接的问题。这将帮助我们找到能够覆盖特定图案的纸片拼接方式,并且便于进一步研究和分析。 ### 回答2: 2013数学建模B题是关于纸片拼接的问题。纸片是由一系列正方形格子组成的,每个格子有两种颜色,要求将纸片拼接成一个整体,并且要求相邻格子的颜色不能相同。 要解决这个问题,可以使用代码来进行模拟拼接的过程。首先,可以定义一个二维数组来表示纸片,数组的每个元素代表一个格子,可以用0和1来表示两种颜色。然后,可以编写一个函数来检查相邻格子的颜色是否相同,如果相同则返回False,否则返回True。 接下来,可以编写一个递归函数来进行拼接操作。从纸片的某一个位置开始,分别尝试将下一个格子放置在其上、下、左、右四个方向上,然后递归调用函数进行拼接。在递归函数中,需要进行边界条件的判断,避免越界。如果成功拼接完所有的格子,则找到了一个有效的拼接方案,可以将其记录下来。 最后,在主函数中调用递归函数,遍历所有可能的起始位置,找到所有有效的拼接方案。在找到方案的同时,可以统计拼接方案的数量,并将每个方案输出,以供分析和参考。 总的来说,通过编写纸片拼接的代码,可以对2013数学建模B题进行求解。该代码通过模拟纸片拼接的过程,使用递归函数来穷举所有可能的拼接方案,并找到所有有效的方案。这样就可以是解决问题,得到了纸片拼接的结果。 ### 回答3: 2013数学建模B题是关于纸片拼接的问题。在这个问题中,我们需要编写一个代码来实现给定纸片的拼接方案。 首先,我们需要将纸片的形状和尺寸输入到代码中。可以使用一个矩阵来表示每个纸片的形状,其中0表示没有纸片,1表示有纸片。例如,对于一个4x4的纸片,我们可以使用一个4x4的矩阵来表示它的形状。 接下来,我们需要定义拼接的规则。可以使用一些条件来限制纸片的拼接方式。例如,我们可以定义两个纸片只能拼接在相邻的边上,而不能拼接在角上。 然后,我们可以编写一个递归函数来实现纸片的拼接。这个函数将遍历每个位置,检查当前位置是否为空,如果为空,则尝试将其他纸片拼接在这个位置上。如果成功拼接,则递归调用函数来尝试将下一个纸片拼接在剩余的空位置上。如果不能拼接,则回溯到上一个位置,并尝试其他的拼接方式,直到找到合适的拼接方案或所有的尝试都失败为止。 最后,我们可以输出拼接后的纸片。可以将纸片的形状打印出来,或者保存成一个矩阵,其中1表示有纸片,0表示没有纸片。 对于该问题的解决方案,需要根据实际情况来具体编写代码。以上是一个简单的思路和步骤,可以根据问题的具体要求来进一步完善代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦是远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值