2013高教社杯全国大学生数学建模竞赛B题
评阅要点[说明]本要点仅供参考,各赛区评阅组应根据对题目的理解及学生的解答,自主地进行评阅。
本题要求对数据提取合适的特征、建立合理有效的碎纸片拼接复原模型。可以考虑的特征有邻边灰度向量的匹配、按行或按列对灰度求和、行距等。关于算法模型,必须有具体的算法过程(如流程图、算法描述、伪代码等)及设计原理。虽然正确的复原结果是唯一的,但不能仅从学生提供的复原效果来评定学生解答的好坏,而应根据所建的数学模型、求解方法和计算结果(如复原率)三方面的内容做出评判。另一方面,评判中还需要考虑人工干预的多少和干预时间节点的合理性。问题1.仅有纵切文本的复原问题由于“仅有纵切”,碎纸片较大,所以信息特征较明显。一种比较直观的建模方法是:按照某种特征定义两条碎片间的(非对称)距离,采用最优Hamilton路或最优Hamilton圈(即TSP)的思想建立优化模型。关于TSP的求解方法有很多,学生在求解过程中需要注意到非对称距离矩阵或者是有向图等特点。还可能有种种优化模型与算法,只要模型合理,复原效果好,都应当认可。本问题相对简单,复原过程可以不需要人工干预,复原率可以接近或达到100%。问题2. 有横、纵切文本的复原问题一种较直观的建模方法是:首先利用文本文件的行信息特征,建立同一行碎片的聚类模型。在得到行聚类结果后,再利用类似于问题1中的方法完成每行碎片的排序工作。最后对排序后的行,再作纵向排序。本问题的解法也是多种多样的,应视模型和方法的合理性、创新性及有效性进行评分。例如,考虑四邻近距离图,碎片逐步增长,也是一种较为自然的想法。问题3.正反两面文本的复原问题这个问题是问题2的继续,基本解决方法与问题2方法相同。但不同的是:这里需要充分利用双面文本的特征信息。该特征信息利用得好,可以提升复原率。 在阅卷过程中,可以考虑学生对问题的扩展。例如,在模型的检验中,如果学生能够自行构造碎片,用以检验与评价本队提出的拼接复原模型的复原效果,可考虑适当加分。阅卷时应有程序,程序的运行结果应和论文给出的结果一致。
clear %释放空间
clc %清屏
%图片数据读取
left_col = [];
right_col = [];
for fp = 0 : 208
str = int2str(fp);
if fp < 10
name = ['0' '0' str '.bmp'];
elseif fp >= 10 & fp < 100
name = ['0' str '.bmp'];
else
name = [str '.bmp'];
end
a = imread(name);
[m,n] = size(a);
left_col = [left_col a(:,1)];
right_col = [right_col a(:,n)];
end
%读取完毕
left_col = double(left_col);%类型转换
right_col = double(right_col);
% 找纸片最左边(left_col)像素全为255(空白)的所有列
row = 1;
for bi=1:209;
number=length(find(left_col(:,bi)==255));
if number == 180
S(row,1)=bi;%保存第一列像素为空(灰度值:255)的放在数组S第一列
row = row + 1;
end
end
S = [S(:,1) zeros(row-1,18)];%矩阵初始化
O = [ones(row-1,19)]; %初始化一个单位矩阵
sign = 1;
w = 0;
for r=1:row-1;%行
for p=1:18;%列p+1
num = 10000000000;%使num足够大
for j=1:209;
count = 0;
count = length(find(S==j));%除去重复
if count ~= 0
continue;
else
blank = length(find(right_col(:,S(r,p)) == 255));%如果碎纸片右边界全为255(即空白),则跳出,终止此行后面拼接
if blank == 180
sign = 0;
break;%跳出本循环,进入p循环
else
ri=right_col(:,S(r,p));%计算左右拼接精确度
le=left_col(:,j);
c=ri-le;
c = c.^2;
error=sum(c(:));
end
if num >= error %找出差值最小的,精确度最高
num = error;
w = j;
end
end
end
if sign == 0
sign = 1;
break; %跳出p循环,进入r循环
else
S(r,p+1)=w; %二维数组储存每个碎纸片拼接位置
end
end
end
S = S - O; %数据整理,图片从000.bmp开始,数组下标从1开始
//////////////////////////////////////////////////////////////////////////
第三题碎纸片特征分类代码:
clear %释放空间
clc %清屏
%图片数据读取
char namea = (209,7);
char nameb = (209,7);
for fpa = 0 : 208
str = int2str(fpa);
if fpa < 10
fpa = fpa + 1;
namea(fpa,:) = ['0' '0' str 'a.bmp'];
elseif fpa >= 10 & fpa < 100
fpa = fpa + 1;
namea(fpa,:) = ['0' str 'a.bmp'];
else
fpa = fpa + 1;
namea(fpa,:) = [str 'a.bmp'];
end
end
for afp = 1:209
a= imread(namea(afp,:));
fdataa(:,:,afp) = a;
end
%%%读取反面b的数据
for fpb = 0 : 208
str = int2str(fpb);
if fpb < 10
fpb = fpb + 1;
nameb(fpb,:) = ['0' '0' str 'b.bmp'];
elseif fpb >= 10 & fpb < 100
fpb = fpb + 1;
nameb(fpb,:) = ['0' str 'b.bmp'];
else
fpb = fpb + 1;
nameb(fpb,:) = [str 'b.bmp'];
end
end
for bfp = 1:209
b= imread(nameb(bfp,:));
fdatab(:,:,bfp) = b;
end
%读取完毕
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
qfdataa = ~fdataa; %取反
qfdatab = ~fdatab; %取反
for lj = 1:209 %行累加求和
Ldataa(:,lj) = sum(qfdataa(:,:,lj),2); %正面(a)累加求和
Ldatab(:,lj) = sum(qfdatab(:,:,lj),2); %反面(b)累加求和
end
Ldataa(Ldataa>0)=1; %正面归一化
Ldatab(Ldatab>0)=1; %反面归一化
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 数据分类 横向 正面(a)分类
for flta = 1:209;
for pflta = 1:209
numa = 0;
for flha = 1:180;
if Ldataa(flha,flta) == Ldataa(flha,pflta)
numa = numa + 1;
end
end
tsavea(flta,pflta) = numa; %保存每两张图片之间的匹配度
end
end
% 数据分类 横向 反面(b)分类
for fltb = 1:209;
for pfltb = 1:209
numb = 0;
for flhb = 1:180;
if Ldatab(flhb,fltb) == Ldatab(flhb,pfltb)
numb = numb + 1;
end
end
tsaveb(fltb,pfltb) = numb; %保存每两张图片之间的匹配度
end
end
%%%%%%%%%%%%%%%%%%%%%%%
%总匹配度
%tsave = (tsavea + tsaveb)/2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 找纸片最左边(left_col)像素全为255(空白)的所有列
% fdataa = double(fdataa);
% fdatab = double(fdatab);
row = 1;
for bi=1:209;
number=length(find(fdataa(:,1,bi)~=0 & fdatab(:,72,bi)~=0));
if number == 180
S(row,1)=bi;%保存第一列像素为空(灰度值:255)的放在数组S第一列
row = row + 1;
end
end
S = [S(:,1) zeros(row-1,18)];%矩阵初始化
O = [ones(row-1,19)]; %初始化一个单位矩阵
%%%%%%%%%%%%%%%%%%
标签:建模