您的位置首页百科快答

2013大学生数学建模B题编程

2013大学生数学建模B题编程

的有关信息介绍如下:

2013大学生数学建模B题编程

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)]; %初始化一个单位矩阵

%%%%%%%%%%%%%%%%%%