古詩詞大全網 - 成語經典 - 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)]; %初始化壹個單位矩陣

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