2013大学生数学建模中B问题的编程
点评【说明】本点评仅供参考,各赛区评卷组根据自己对题目的理解和学生的回答自主进行点评。
本课题要求从数据中提取合适的特征,建立合理有效的模型,对纸片进行拼接和还原。可以考虑的特征是相邻灰度向量的匹配、按行或列的灰度级的总和以及行间距。关于算法模型,要有具体的算法流程(如流程图、算法描述、伪代码等。)和设计原则。虽然正确的回收结果是唯一的,但不能只以学生提供的回收效果来判断学生解的好坏,而要以数学模型、求解方法、计算结果(如回收率)来判断。另一方面,评估中需要考虑人工干预的量和干预时间节点的合理性。问题1。只有垂直切割的文本的恢复问题,由于“只有垂直切割”和大张纸,具有明显的信息特征。一种直观的建模方法是根据一定的特征定义两个片段之间的(不对称)距离,利用最优哈密尔顿路径或最优哈密尔顿圈(TSP)的思想建立优化模型。TSP的求解方法有很多种,学生在求解TSP的过程中需要注意非对称距离矩阵或有向图的特性。也可能有各种优化模型和算法,只要模型合理,修复效果好,都应该认可。这个问题比较简单,恢复过程无需人工干预即可完成,恢复率可以接近或达到100%。问题2。一种针对水平和垂直切割文本恢复的直观建模方法是:首先,利用文本文件的行信息特征,建立同一行中片段的聚类模型。得到行聚类结果后,使用与问题1类似的方法完成每行碎片的排序。最后,对排序后的行进行垂直排序。这个问题也有各种各样的解决方案,应该根据其合理性、创新性和有效性对模型和方法进行分级。比如考虑到四个邻居的特写图,碎片一步步生长也是比较自然的想法。问题3。恢复文本两面的问题是问题2的延续,基本解法与问题2相同。但不同的是,这里需要充分利用双面文字的特征信息。可以很好地利用这些特征信息,提高恢复率。在阅卷过程中,可以考虑学生对问题的拓展。比如在模型的测试中,如果学生可以自己构建片段来测试和评估我们团队提出的镶嵌复原模型的复原效果,可以考虑适当加分。阅卷时要有程序,程序的运行结果要和试卷给出的结果一致。
清除%释放空间
Clc%清除屏幕
%图像数据读取
left _ col =[];
right _ col =[];
对于fp = 0 : 208
str = int 2 str(FP);
如果fp & lt10
name = ['0' '0' str '。BMP '];
elseif fp & gt= 10 & amp;fp & lt100
name = ['0' str '。BMP '];
其他
name = [str '。BMP '];
结束
a = imread(名称);
[m,n] =大小(a);
left_col = [left_col a(:,1)];
right_col = [right_col a(:,n)];
结束
%已阅读完
left _ col = double(left _ col);%类型转换
right_col = double(右列);
%查找纸张最左边(left_col)像素全部为255(空白)的所有列。
row = 1;
对于bi = 1:209;
数字=长度(find(left_col(:,bi)= = 255);
如果数量== 180
S(row,1)= bi;% Save第一列中的像素为空(灰度值:255)并将其放入数组s的第一列。
row = row+1;
结束
结束
S = [S(:,1)个零(row-1,18)];%矩阵初始化
O = [ones(row-1,19)];%初始化一个单位矩阵。
sign = 1;
w = 0;
对于r = 1:row-1;%行
对于p = 1:18;%列p+1
num = 1000000000;%使num足够大
对于j = 1:209;
count = 0;
count = length(find(S = = j));%消除重复
如果count ~= 0
继续;
其他
空白=长度(find(right_col(:,S(r,p))= = 255);%如果草稿纸右边空白全是255(即空白),则跳出并终止这一行后面的拼接。
如果空白== 180
符号= 0;
打破;%跳出这个循环,进入P循环。
其他
ri=right_col(:,S(r,p));%计算左右拼接精度
le=left_col(:,j);
c = ri-le;
c = c.^2;
error = sum(c(:);
结束
如果num & gt=误差%找出差异最小且准确度最高的一个。
num =错误;
w = j;
结束
结束
结束
如果符号== 0
sign = 1;
打破;%跳出P周期,进入R周期。
其他
S(r,p+1)= w;% 2D数组存储每张纸片的拼接位置。
结束
结束
结束
S = S-O;%数据整理,图片从000.bmp开始,数组下标从1开始。
//////////////////////////////////////////////////////////////////////////
第三个问题是废纸的特征分类代码:
清除%释放空间
Clc%清除屏幕
%图像数据读取
char namea = (209,7);
char nameb = (209,7);
对于fpa = 0 : 208
str = int 2 str(FPA);
如果平安险& lt10
FPA = FPA+1;
namea(fpa,:=[' 0 ' ' 0 ' str ' a . BMP '];
elseif fpa & gt= 10 & amp;fpa & lt100
FPA = FPA+1;
namea(fpa,:=[' 0 ' str ' a . BMP '];
其他
FPA = FPA+1;
namea(fpa,:=[str ' a . BMP '];
结束
结束
对于afp = 1:209
a= imread(namea(afp,);
fdataa(:,:,AFP)= a;
结束
%%%读取反向b的数据。
对于fpb = 0 : 208
str = int 2 str(fpb);
如果fpb & lt10
fpb = FP b+ 1;
nameb(fpb,:=[' 0 ' ' 0 ' str ' b . BMP '];
elseif fpb & gt= 10 & amp;fpb & lt100
fpb = FP b+ 1;
nameb(fpb,:=[' 0 ' str ' b . BMP '];
其他
fpb = FP b+ 1;
nameb(fpb,:=[str ' b . BMP '];
结束
结束
对于bfp = 1:209
b= imread(nameb(bfp,);
fdatab(:,:,BFP)= b;
结束
%已阅读完
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
qfdataa = ~ fdataa%反转
qfdatab = ~ fdatab%反转
对于lj = 1:209%行累计和
Ldataa(:,lj) = sum(qfdataa(:,:,lj),2);%前(a)累计总和
Ldatab(:,lj) = sum(qfdatab(:,:,lj),2);%负(b)累积和
结束
Ldataa(Ldataa & gt;0)=1;正标准化百分比
Ldatab(Ldatab & gt;0)=1;负标准化百分比
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%数据分类横向锋(a)分类
for flta = 1:209;
对于pflta = 1:209
numa = 0;
对于flha = 1:180;
if Ldataa(flha,flta) == Ldataa(flha,pflta)
numa = numa+1;
结束
结束
tsavea(flta,pf LTA)= numa;%保存每两张图片之间的匹配度。
结束
结束
%数据分类横向反向(b)分类
for fltb = 1:209;
对于pfltb = 1:209
number = 0;
对于flhb = 1:180;
如果Ldatab(flhb,fltb) == Ldatab(flhb,pfltb)
number = number+1;
结束
结束
tsaveb(fltb,pfl TB)= number;%保存每两张图片之间的匹配度。
结束
结束
%%%%%%%%%%%%%%%%%%%%%%%
总匹配度%
% ts ave =(ts avea+ts aveb)/2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%查找纸张最左边(left_col)像素全部为255(空白)的所有列。
% fdataa = double(fdataa);
% fdatab = double(fdatab);
row = 1;
对于bi = 1:209;
number=length(find(fdataa(:,1,bi)~ = 0 & amp;fdatab(:,72,bi)~ = 0));
如果数量== 180
S(row,1)= bi;% Save第一列中的像素为空(灰度值:255)并将其放入数组s的第一列。
row = row+1;
结束
结束
S = [S(:,1)个零(row-1,18)];%矩阵初始化
O = [ones(row-1,19)];%初始化一个单位矩阵。
%%%%%%%%%%%%%%%%%%