評閱要點[說明]本要點僅供參考,各賽區評閱組應根據對題目的理解及學生的解答,自主地進行評閱。
本題要求對數據提取合適的特征、建立合理有效的碎紙片拼接復原模型。可以考慮的特征有鄰邊灰度向量的匹配、按行或按列對灰度求和、行距等。關於算法模型,必須有具體的算法過程(如流程圖、算法描述、偽代碼等)及設計原理。雖然正確的復原結果是唯壹的,但不能僅從學生提供的復原效果來評定學生解答的好壞,而應根據所建的數學模型、求解方法和計算結果(如復原率)三方面的內容做出評判。另壹方面,評判中還需要考慮人工幹預的多少和幹預時間節點的合理性。問題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)]; %初始化壹個單位矩陣
%%%%%%%%%%%%%%%%%%