摘 要
對重要文件的拼接復原,傳統上都由人工完成,拼接準確率雖然高但是效率很低。本文旨在建立模型,利用計算機編程加少量的人工干預實現碎紙片的拼接復原。
針對問題1,由於對任意一個字符來講,筆畫是連續的,所以對於一般情況,即使文字被切開,兩邊的像素還是有聯繫的,是呈現離散性漸變的。針對此特徵,建立了文字連續性模型來求解該問題。而又因爲被切開的兩邊碎片邊緣灰度是具有高相關性的,所以,又建立了向量相關模型來求解進行圖片拼接。用兩種模型分別求解,都得到了對附件一和附件二的正確拼接結果。
針對問題2,可以採用第一問的模型,先進行全局搜索,找出每個碎片最相似的右側鄰近碎片,拼接出每一行的圖片,再利用向量相關性進行橫向拼接,得到拼接結果。但是,由於紙片同時被橫向與縱向切割,碎片小,數量多,碎片之間的信息量不夠,容易造成誤判。所以建立向量投影分類模型,首先將可能處於同一行的碎片用模糊C均值(FCM)聚類方法分到同一類。對於漢字或英文的缺行碎片(碎片中只有一行或者兩行字),利用掩碼補充模型將投影中缺失的行用掩碼補齊,然後再放入分類。分類完成後,將每一類中的碎片進行橫向排序拼接。每一類橫向拼接完成後,從而拼接成完整圖片。對於不能正確拼接的部分,採取了多種人工干預的策略,最終得到正確的拼接結果。
針對問題3,由於附件中的碎片分爲正反兩面,所以可以建立組合匹配模型將碎片首先將正反面碎片的灰度矩陣上下拼接,每張碎片的拼接方案有兩種(灰度矩陣a放在左右鏡像處理後的b上或灰度矩陣b放在左右鏡像處理後的a上)。拼接過後,邊緣灰度向量信息會增加爲原來的兩倍,這時利用問題二中的全局搜索模型用向量相關性的方法進行匹配拼接。拼接出所有行後,將每一行的下半部分矩陣切割放在上半部分的右邊,又可增加橫向拼接時的邊緣信息,然後各行再次利用向量相關性的方法進行橫向拼接,最終得到結果圖,但是仍然存在較多的碎片不能正確匹配,需要人工干預。
由於碎片在切割時的隨機性,使得機器自動拼接存在一定的難度,因此,採取恰當的人工干預的措施,是保證正確拼接的必要手段。
關鍵詞:文字連續性 匹配 FCM聚類方法 掩碼補充模型 向量投影分類模型
一.問題背景及重述
破碎文件的拼接在司法物證復原、歷史文獻修復以及軍事情報獲取等領域都有着重要的應用。傳統上,拼接復原工作需由人工完成,準確率較高,但效率很低。特別是當碎片數量巨大,人工拼接很難在短時間內完成任務。但如果藉助計算機技術,開發出碎紙片的自動拼接技術,提高拼接復原效率將會大大提高。
問題1:給定的來自同一頁印刷文字文件的碎紙機破碎紙片(僅縱切),建立碎紙片拼接復原模型和算法,並且拼接復原附件1和附件2給出的中、英文各一頁文件的碎片數據。
問題2: 對於碎紙機既縱切又橫切的情形,設計碎紙片拼接復原模型和算法,並針對附件3和附件4給出的中、英文各一頁文件的碎片數據進行拼接復原。
問題3:從現實情形出發,還可能有雙面打印文件的碎紙片拼接復原問題需要解決。附件5給出了一頁英文印刷文字雙面打印文件的碎片數據。設計相應的碎紙片拼接復原模型與算法,並就附件5的碎片數據給出拼接復原結果。
二.模型假設
1、不計碎紙片邊緣的磨損,沒有邊緣像素損耗;
2、假設紙張垂直放入碎紙機即每張小碎紙片都是規則矩形;
3、圖片中的文字像素沒有任何斷點;
4、圖像上沒有任何噪聲或污點造成像素干擾。
三.變量說明
四.模型準備與問題分析
針對題目中附件所給的圖片信息,我們學習準備了圖像的處理方法[1]、模式匹配方法[2]和圖像拼接方法[3,4]。將圖片批處理成範圍值0-255之間的灰度矩陣(純黑爲0,純白爲255,數字越大,顏色越亮)。
問題一中的附件圖片,碎片數據較少,每一張碎片都比較大,那麼相應的灰度矩陣中包含的信息就比較多,處理起來相對容易。而且仔細觀察,分別只有一張圖片的最左端和最右端邊緣是沒有文字的。由於完整紙片切開後,邊緣處仍然是有聯繫的。所以可以提取圖像邊緣的灰度信息,首先找出第一張圖片,然後利用圖片的邊緣信息找出下一張圖片與之拼接。
問題二中,給出的圖片碎片比較小,只有180*72像素,圖像信息以及邊緣信息都比較少。而且,由於既橫切又縱切,圖片的順序被打亂,無法直接拼接。因此,首先得將這些碎片分類,將同一行的圖片歸在同一類中,然後將歸類後的圖片進行橫向排序,拼接出這一行的圖片碎片,因爲有些碎片包含的邊緣信息過少,可能無法分類或者成功排序,這時進行人工干預。每一行圖片按排序拼接後,即可將問題轉化爲第一問的問題進行縱向拼接,最終得到結果。
問題三中附件五的碎片與問題二中附件四的類似,都是英文小碎片,但是正反面被打亂。雖然正反面一開始無法識別,但是某一張圖的正面與另一張正面橫向投影對齊,反面的橫向投影也就會對齊。所以我們可以利用a面和b面的矩陣上下組合,變成一個大的單面圖片,一方面增加了拼接的信息量,同時又將問題轉化爲第二問中類似的問題,利用第二問的模型即可找出雙面碎片的拼接結果。
五.模型建立與求解
5.1 問題一的求解
5.1.1 基於文字連續性模型的碎片拼接
首先,對問題1的分析可知,該問題爲一個圖像處理問題。根據字的特徵,我們知道筆畫是連續的,圖片放大之後我們也能看到有字的部分圖像偏暗,由字中間向邊緣,慢慢變亮直至超過字範圍而變成白色。我們利用這一點,建立文字連續性模型來處理拼接問題。
(a) (b)
圖1:點陣字體的鋸齒現象
由字體放大圖1(a)可以看出筆畫周邊的鋸齒,每一個鋸齒方塊就是一個像素,範圍大小在255以下。切割後的圖像,這些鋸齒也會分開。但是,雖然像素分開了,由於漢字字體或者英文字體大部分是連體的,所以這些碎片的圖像灰度信息會有一定的相關性或者說是連續性。
如圖1(b),假如圖片像素按照紅線所示切開分爲a,b兩塊。可以看到紅線左右兩邊的像素塊大都是相連的,最理想的情況就是如同像素塊2,3或者4,5在同一位置直接對應,這種情況就可以認爲這兩個像素塊匹配,匹配數num加1。但是,也有可能出現像素塊1這樣的情況,與之對應的位置沒有像素塊,但是下方或者上方有像素塊,由於這些像素的連續性,所以也認爲像素1得到匹配,num=num+1。
讀取所有圖片,由於紙張有頁邊距,若某一張碎片爲完整紙片上的最左一張,則其圖像左側必定全爲白色,即灰度值的前幾列爲255,通過這種方法,能很快找到第一張碎片,將其放入集合中,記爲。
找到第一張碎片後,用第一張碎片的右邊緣去和中所有碎片的左邊緣進行匹配。由於白色點太多,匹配成功數會很大,影響結果。所以,我們只選取非白色點進行匹配,匹配過程中,非白色點的總數記爲sumofb,每選取邊緣非白色點匹配一次,sumofb=sumofb+1。
匹配率[3]的計算方法爲:
(1)
求得第一張碎片的右邊緣和集合中每張碎片左邊緣的匹配率後,將所得的匹配率對比,選取匹配率最高的那張碎片,將其放入集合中,記爲(i爲碎片的排列順序),將右邊緣像素去和中剩餘碎片的左邊緣像素進行匹配,重複此類操作,直到中沒有碎片,最終得到排序結果即爲碎片的拼接方案。計算所得集合中與的最大匹配率如表1所示。
表1:附件一中中文字符碎片拼接順序及匹配情況:
當前碎片編號 |
8 |
14 |
12 |
15 |
13 |
10 |
2 |
16 |
1 |
最佳匹配碎片編號 |
14 |
12 |
15 |
13 |
10 |
2 |
16 |
1 |
4 |
最大匹配率 |
0.83 |
0.96 |
0.82 |
0.92 |
0.97 |
0.92 |
0.97 |
0.94 |
0.83 |
當前碎片編號 |
4 |
5 |
9 |
13 |
18 |
11 |
7 |
17 |
0 |
最佳匹配碎片編號 |
5 |
9 |
13 |
18 |
11 |
7 |
17 |
0 |
6 |
最大匹配率 |
0.85 |
0.87 |
0.97 |
0.92 |
0.74 |
0.89 |
0.98 |
0.91 |
0.99 |
表2:附件一中英文字符碎片拼接順序及匹配情況:
當前碎片編號 |
3 |
6 |
2 |
7 |
15 |
18 |
11 |
0 |
5 |
最佳匹配碎片編號 |
6 |
2 |
7 |
15 |
18 |
11 |
0 |
5 |
1 |
最大匹配率 |
0.93 |
0.91 |
0.95 |
0.92 |
0.89 |
0.90 |
0.76 |
0.96 |
0.88 |
當前碎片編號 |
1 |
9 |
13 |
10 |
8 |
12 |
14 |
13 |
16 |
最佳匹配碎片編號 |
9 |
13 |
10 |
8 |
12 |
14 |
13 |
16 |
4 |
最大匹配率 |
0.99 |
0.87 |
0.87 |
0.94 |
093 |
0.92 |
0.96 |
0.84 |
0.82 |
5.1.2 基於向量相關性的碎片拼接
提取碎片邊緣向量,選出第一張圖片後,計算右邊緣向量與集合中的每一張碎片左邊緣向量的相關係數[5]:
(2)
將所得的對比,選出相關係數最最大的,放入集合中。再用選出的碎片右邊緣向量與中剩餘碎片匹配,重複此操作,直到中沒有碎片,最終得到排序結果即爲碎片的拼接方案。計算求得集合中與的相關係數爲:
表3:附件二中中文字符碎片拼接順序及匹配情況:
當前碎片編號 |
8 |
14 |
12 |
15 |
13 |
10 |
2 |
16 |
1 |
最相關碎片編號 |
14 |
12 |
15 |
13 |
10 |
2 |
16 |
1 |
4 |
最大相關係數 |
0.80 |
0.85 |
0.88 |
0.91 |
0.84 |
0.89 |
0.94 |
0.88 |
0.86 |
當前碎片編號 |
4 |
5 |
9 |
13 |
18 |
11 |
7 |
17 |
0 |
最相關碎片編號 |
5 |
9 |
13 |
18 |
11 |
7 |
17 |
0 |
6 |
最大相關係數 |
0.88 |
0.88 |
0.88 |
0.87 |
0.86 |
0.86 |
0.84 |
0.88 |
0.90 |
5.2 問題二的求解
問題二中所給附件三、四都是小碎片,寬度爲72像素,與第一問中的一致,但是高度只有180像素,爲第一問碎片的1/11,所以左右邊緣的灰度信息較少,容易造成誤判。
5.2.1 模型1 建立全局搜索的碎片拼接模型
由問題一的求解可以看出,利用向量相關模型或者文字連續性模型可以不必區分碎片的文字語言。所以對於問題二,可以建立全局搜索模型,同時利用第一問中的向量相關分析來進行碎片拼接。全局搜索模型算法如下:
Step 1:根據頁邊距找出11張處於紙片第一列的碎紙片,記爲集合。取其中一張記爲,放入;
Step 2:我們從存放於U的所有紙片中任取一張碎紙片與進行向量匹配,記錄下匹配的相關係數,取相關係數最大的那張圖片作爲的下一張紙片,記爲,以此法依次匹配得到後面的18張圖片(最後一張同樣存在頁邊距);對於得到的這樣一條橫串,我們記爲
Step 3:從上面的集合中再任取一張圖片記爲,重複step2;
Step 4:當,我們根據問題1中的方法對進行拼接,即可得到整張紙片原圖。
5.2.2模型2 基於向量投影分類的碎片拼接模型
但是由於附件三和四中都給出了209張碎片,如果進行全局搜索的話,時間複雜度,計算量十分龐大。所以爲了減少計算時間,我們首先根據碎片中行距的位置對碎片進行預分類,將同一行的碎片分在一類,再對同一類中的碎片利用第一文的方法進行排序。
由於中英文文字在像素圖片中的顯示形式不一樣,所以我們通過這兩種文字顯示的不同特徵來用兩種投影方式來進行分類排序。
1、 中文字的碎片拼接
(1)中文字碎片向量投影
針對中文字像素圖片,可以利用中文字是方塊字的特點首先建立向量投影匹配分組模型。附件3中所給11×19共209張圖片,可以拼成完整的一篇文章,那麼同一行的文字被切開後,字體仍然在相對的同一高度上。
圖2 碎片投影
所以,利用這一特徵,我們可以首先利用掩碼補充法將圖片中文字的行間距找出來,利用不同行的文字中行間距在圖片中的高度不通,對碎片經行預分類,將同一行的碎片分在一類總,然後利用第一問中的方法對行內小塊經行排序。掩碼補充法的具體做法是:將像素矩陣水平投影,如圖2,設當某一像素行都爲白色255時,投影值只爲0,當一像素行有小於255的像素塊時,此行投影爲1。最終,209張圖片生成209列的投影矩陣Shadow。
(2)字符的填補
投影碎片的灰度信息,由於中文字中有上下結構的字,如,附件三中的“010.bmp”碎片中的“翁”字,中間有一小段的投影出現缺失。這時,由於投影向量中全白色段的長度很小(甚至可能爲1個像素點),並且上下兩字段的長度加起來接近一箇中文字符塊的高度時,我們將此段的投影向量填充爲1,似得其投影矩陣具有連續性。
圖3 字符缺損補充
(3) 字塊的填補
利用掩碼補充模型補充缺行碎片。在投影過程中,會遇到缺行的圖片,這種缺行的圖片大致分爲三種:
圖4 掩碼補充時的特殊情況
如圖4所示,有上部缺行,中部缺行和底部缺行。如果出現這樣的情況,因爲若全爲白色的像素行過多,就有可能匹配不到分組。所以我們建立掩碼補充模型,補充缺失的文字像素投影行,將缺失的文字像素投影段都補充爲1,每一列的投影矩陣都叫做“投影編碼”。
首先,我們將缺失投影行的圖片搜尋出來,由於缺失一個字段,那麼這些圖片的向量投影值爲1的連續段就會小於3,只有兩段甚至是一段。利用這個方法,我們成功找出了缺失字段的圖片,分別是第5 9 15 17 22 2628 33 41 61 67 71 72 75 86 90 94 102 107 109 110 111 114 115 118 120 124 126140 141 146 147 151 153 154 155 156 158 166 167 174 182 185 186 188 195 197 198205 206 208共51張(此數列的值比實際圖片編號大一,如,第五張對應附件三中的004號圖片)圖片。
然後,我們將這些缺損字段的圖片投影數據進行整合,計算每一段全白色段和非全白色段的段長(例如投影編碼爲00000011111100011,就記爲6,6,3,2)並存入段長矩陣中,爲了以後處理方便,我們都以全白色段的段長值開頭,若起始爲非純白色段,則在此段長前加一0值,作爲開頭的全白色段長。
經過投影后的統計,一箇中文字的高度Hz大約爲41-42像素,而兩行中文字之間的間距Dz大約爲26-28像素。首先我們考慮上部缺行的圖片,由於我們規定了段長矩陣中的第一列都爲全白色段的長度,所以當第一列的值LenofD[i,1]大於間距Dz時,表示這張圖片上部是有缺損的。然後根據上部缺損的不同長度段長LenofD[i,1],將LenofD[i,1]分割成幾個段長(這些段長爲全白色段與非全白色段間隔表示),放在矩陣head中,用分割後的段長head取代LenofD[i,1]。
(3)
對於中部缺行的圖片我們也採取類似的方案進行處理。對於圖片中間部分的全白色段段長LenofD[i,mid],因爲中部缺損肯定的是缺[非全白色段,全白色段,非全白色段]或者是[非全白色段,全白色段,非全白色段,全白色段,非全白色段],只有兩種情況,所以當LenofD[i,mid]大於(2×Dz+Hz)時:
(4)
用mid矩陣取代LenofD[i,mid]。
最後一種底部缺行的處理方案也與上部缺行的類似。如果圖片底部的LenofD[i,bom]大於間距Dz,就將LenofD[i,bom]分解成小塊段長:
(5)
用bom矩陣取代LenofD[i,bom]。
將補充好的段長矩陣LenofDnew,重新按照段長和全白色段,非全白色段間隔排列的規則還原出新的投影矩陣Shadownew,在Shadownew中的原先缺行圖片的缺失段都會被賦值1,這些補充後值爲1的段就稱作“掩碼”。補充掩碼後的投影急診對應的圖片,就相當於在缺行的那一段,補充了一個高度Hz的字段,效果如圖5:
圖5 掩碼遮蓋
(4)用FCM聚類方法將碎片分類
將這些覆蓋掩碼後的投影矩陣Shadownew用模糊C均值(FCM)聚類方法[2]進行分類,根據投影矩陣中的投影編碼一共分爲11類碎片。每一類所包含的圖片序號爲(序號比實際編號大一):
表4:FCM預分類結果
C1 |
6 11 30 38 45 49 56 60 65 76 93 99 105 112 172 173 181 202 207 |
C2 |
7 20 21 37 53 62 64 68 70 73 79 80 97 100 117 132 163 164 178 |
C3 |
3 12 23 29 50 55 58 66 92 96 119 130 142 144 179 187 189 191 193 |
C4 |
9 10 25 26 36 39 47 75 82 89 104 106 123 131 149 162 168 190 194 |
C5 |
1 8 33 46 54 57 69 71 94 127 138 139 154 159 167 175 176 197 209 |
C6 |
17 22 67 107 110 111 140 146 151 158 174 182 185 188 198 205 |
C7 |
35 43 44 48 59 78 85 91 95 98 113 122 125 128 137 145 150 165 184 |
C8 |
4 13 15 32 40 52 74 83 108 116 129 135 136 160 161 170 177 200 204 |
C9 |
14 16 18 28 34 72 81 84 86 133 134 153 157 166 171 183 199 201 203 206 |
C10 |
2 19 24 27 31 42 51 63 77 87 88 101 121 143 148 169 180 192 196 |
C11 |
5 41 61 90 102 103 109 114 115 118 120 124 126 141 147 152 155 156 186 195 208 |
分類後C6中只有16張圖片(少3張),C9中有20張(多1張),C11中有21張(多2張)。
(5)將分類好的碎片逐類橫向拼接
分類完畢之後,繼續利用向量相關模型進行橫向拼接,拼接好同一類的一行之後,觀察是否有拼接出錯碎片。此時,由於程序對有些碎片無法正確匹配,必須進行人工干預,根據語義和偏旁部首進行手工拼接。
圖6 人工干預前後比較
如圖6,第46張與第25張碎片匹配出錯,因爲“迎”和“晴”都切在了豎線上,所以相關係數會很大,這是第一類典型的出錯原因:邊緣字形相近;第74張與第9張匹配出錯,因爲第74張碎片的右端邊緣沒有任何中文字符,造成正確無法計算相關係數,這是第二類出錯原因:碎片邊緣沒有任何字符灰度信息。
人工干預時,根據中文字的特徵,以及上下文的語義,我們進行手動調整錯誤的圖片的位置,將此行拼成正確圖片。
當每一個分類都成功拼接出正確圖片行後,將這11個分類用在縱向進行拼接。縱向拼接成功後,在用向量相關模型進行橫向拼接,最終得到正確結果:
表5:附件三的拼接結果
49 |
54 |
65 |
143 |
186 |
2 |
57 |
192 |
178 |
118 |
190 |
95 |
11 |
22 |
129 |
28 |
91 |
188 |
141 |
61 |
19 |
78 |
67 |
69 |
99 |
162 |
96 |
131 |
79 |
63 |
116 |
163 |
72 |
6 |
177 |
20 |
52 |
36 |
168 |
100 |
76 |
62 |
142 |
30 |
41 |
23 |
147 |
191 |
50 |
179 |
120 |
86 |
195 |
26 |
1 |
87 |
18 |
38 |
148 |
46 |
161 |
24 |
35 |
81 |
189 |
122 |
103 |
130 |
193 |
88 |
167 |
25 |
8 |
9 |
105 |
74 |
71 |
156 |
83 |
132 |
200 |
17 |
80 |
33 |
202 |
198 |
15 |
133 |
170 |
205 |
85 |
152 |
165 |
27 |
60 |
14 |
128 |
3 |
159 |
82 |
199 |
135 |
12 |
73 |
160 |
203 |
169 |
134 |
39 |
31 |
51 |
107 |
115 |
176 |
94 |
34 |
84 |
183 |
90 |
47 |
121 |
42 |
124 |
144 |
77 |
112 |
149 |
97 |
136 |
164 |
127 |
58 |
43 |
125 |
13 |
182 |
109 |
197 |
16 |
184 |
110 |
187 |
66 |
106 |
150 |
21 |
173 |
157 |
181 |
204 |
139 |
145 |
29 |
64 |
111 |
201 |
5 |
92 |
180 |
48 |
37 |
75 |
55 |
44 |
206 |
10 |
104 |
98 |
172 |
171 |
59 |
7 |
208 |
138 |
158 |
126 |
68 |
175 |
45 |
174 |
0 |
137 |
53 |
56 |
93 |
153 |
70 |
166 |
32 |
196 |
89 |
146 |
102 |
154 |
114 |
40 |
151 |
207 |
155 |
140 |
185 |
108 |
117 |
4 |
101 |
113 |
194 |
119 |
123 |
2、英文字的碎片拼接
(1)英文字碎片向量投影
對於英文字母,我們可以利用英文字母“四線三格”的書寫格式,如圖7所示:
圖7 英文字符“四線三格”表示
這種書寫格式我們也可以通過碎片灰度矩陣的每行灰度值的和表示成折線圖,從中圖7
觀察出來。每當那一行的值變化比較劇烈時,那一行一般情況下總是四線中的某一線。
通過多次分析得出相鄰兩條直線之間的距離,大致分別爲(12,20,15,25),之後製作模板,把每一個碎片與模板比較。
通過尋找每一個碎片起始直線位置,與模板對應尋找可以匹配的個數,通過循環找出與模板匹配率最高的模式。根據匹配的模式,從起始位置對碎片根據此模式的間距向上向下添加直線,完成直線填補工作。
之後,通過模糊C均值(FCM)聚類方法進行分類,根據補齊直線投影矩陣分出11類,由於分類方法的模糊性特徵,造成分出的類別誤差相對較大(如下),在之後運用相關性函數匹配時造成了很大的錯誤,在人工干預時大大增加了工作量。
表6:英文碎片分類結果
C1 |
7 15 18 24 48 55 61 62 63 69 71 85 91 92 97 100 101 102 104 123 138 147 149 157 173 175 186 196 197 199 209 |
C2 |
27 29 34 143 163 170 |
C3 |
3 5 12 22 33 40 65 66 68 76 105 107 113 120 137 148 150 155 180 181 185 190 191 192 193 198 205 |
C4 |
8 50 119 134 169 |
C5 |
10 11 17 20 45 57 58 67 72 83 84 93 94 106 122 127 135 142 146 153 158 172 177 183 184 195 203 206 |
C6 |
19 23 28 35 36 43 56 75 89 111 115 152 156 166 168 |
C7 |
16 21 37 42 44 46 74 77 78 80 103 109 117 124 136 141 144 162 174 200 208 |
C8 |
1 2 49 51 53 54 64 73 82 86 88 90 98 116 121 125 126 129 130 132 139 140 154 160 161 176 178 188 194 201 |
C9 |
4 6 14 25 31 38 41 47 52 59 108 112 114 118 128 131 133 145 151 159 164 179 187 189 202 207 |
C10 |
13 32 39 60 70 79 95 96 99 165 167 204 |
C11 |
9 26 30 81 87 110 171 182 |
儘管直線修補後誤差依然不小,相比於直接模糊C均值(FCM)聚類方法分類,大大提高了成功率,所以可以根據英文字書寫格式的這種特徵來進行向量投影。
表7:附件四的拼接順序
191 |
75 |
11 |
154 |
190 |
184 |
2 |
104 |
180 |
64 |
106 |
4 |
149 |
32 |
204 |
65 |
39 |
67 |
147 |
201 |
148 |
170 |
196 |
198 |
94 |
113 |
164 |
78 |
103 |
91 |
80 |
101 |
26 |
100 |
6 |
17 |
28 |
146 |
86 |
51 |
107 |
29 |
40 |
158 |
186 |
98 |
24 |
117 |
150 |
5 |
59 |
58 |
92 |
30 |
37 |
46 |
127 |
19 |
194 |
93 |
141 |
88 |
121 |
126 |
105 |
155 |
114 |
176 |
182 |
151 |
22 |
57 |
202 |
71 |
165 |
82 |
159 |
139 |
1 |
129 |
63 |
138 |
153 |
53 |
38 |
123 |
120 |
175 |
85 |
50 |
160 |
187 |
97 |
203 |
31 |
20 |
41 |
108 |
116 |
136 |
73 |
36 |
207 |
135 |
15 |
76 |
43 |
199 |
45 |
173 |
79 |
116 |
179 |
143 |
208 |
21 |
7 |
49 |
61 |
119 |
33 |
142 |
168 |
62 |
169 |
54 |
192 |
133 |
118 |
189 |
162 |
197 |
112 |
70 |
84 |
60 |
14 |
68 |
174 |
137 |
195 |
8 |
47 |
172 |
156 |
96 |
23 |
99 |
122 |
90 |
185 |
109 |
132 |
181 |
95 |
69 |
167 |
163 |
166 |
188 |
111 |
144 |
206 |
3 |
130 |
34 |
13 |
110 |
25 |
27 |
178 |
171 |
42 |
66 |
205 |
10 |
157 |
74 |
145 |
83 |
134 |
55 |
18 |
56 |
35 |
16 |
9 |
183 |
152 |
44 |
81 |
77 |
128 |
200 |
131 |
52 |
125 |
140 |
193 |
87 |
89 |
48 |
72 |
12 |
177 |
124 |
0 |
102 |
115 |
根據不同的文字特徵,對中英文碎片採取了不同的數學模型,漢字屬於方塊字,有明顯的筆畫連續性,字寬、字高,通過對方塊字字塊的判斷可以比較好的判斷匹配率;英文有明顯的四線三格模式,通過直線尋找可以很好地把英文特徵識別,提高匹配率。
5.3問題三的求解
5.3.1 基於組合匹配模型的雙面碎片拼接
針對第三問附件中碎片的正反面,若某一碎片正面與另一碎片正面能夠匹配,那麼這兩張圖片的反面就是匹配的。利用這一特性,我們可以建立組合匹配模型。
將碎片圖像信息轉化爲灰度矩陣,將每張圖片的a,b面所對應的灰度矩陣上下拼接,每張碎片的拼接方案有兩種(灰度矩陣a放在左右鏡像處理後的b上或灰度矩陣b放在左右鏡像處理後的a上),效果如圖8所示:
圖8 拼接方案
通過拼接大大增加碎片的信息量,在接下來的模式匹配尋找,行列拼接時提高了成功率。
拼接之後,延用第二問的全局搜索模型。首先,搜索碎片的行首、行尾放到兩個數組中,並把行首、行尾爲之標記;接着,全文搜索,運用相關係數函數匹配,尋找出與之匹配率最高的碎片,放進一個集合中。
由於灰度矩陣的相似性,匹配時出現錯誤,形成一段一段拼接好的碎片圖像,觀察每一行用肉眼可以看出的錯誤的位置,並進行調整,最後,把每一行的碎片拼接完成。每一行拼接好之後,假設a面爲正面,b面爲反面,把b面的灰度矩陣連接到a面後面,形成Z(a,b)灰度矩陣;如果b爲正面,a爲反面,形成Z(b,a)灰度矩陣。
把每一行的灰度矩陣,之後把灰度矩陣進行轉置,運用第一問的碎片相關性方法對灰度矩陣進行匹配,最後得出正確結果:
表8:附件五碎片正面拼接順序
136a |
047b |
020b |
164a |
081a |
189a |
029b |
018a |
108b |
066b |
110b |
174a |
183a |
150b |
155b |
140b |
125b |
111a |
078a |
005b |
152b |
147b |
060a |
059b |
014b |
079b |
144b |
120a |
022b |
124a |
192b |
025a |
044b |
178b |
076a |
036b |
010a |
089b |
143a |
200a |
086a |
187a |
131a |
056a |
138b |
045b |
137a |
061a |
094a |
098b |
121b |
038b |
030b |
042a |
084a |
153b |
186a |
083b |
039a |
097b |
175b |
072a |
093b |
132a |
087b |
198a |
181a |
034b |
156b |
206a |
173a |
194a |
169a |
161b |
011a |
199a |
090b |
203a |
162a |
002b |
139a |
070a |
041b |
170a |
151a |
001a |
166a |
115a |
065a |
191b |
037a |
180b |
149a |
107b |
088a |
013b |
024b |
057b |
142b |
208b |
064a |
102a |
017a |
012b |
028a |
154a |
179b |
158b |
058b |
207b |
116a |
179a |
184a |
114b |
035b |
159b |
073a |
193a |
163b |
130b |
021a |
202b |
053a |
077a |
016a |
019a |
092a |
190a |
050b |
201b |
031b |
171a |
146b |
172b |
122b |
182a |
040b |
127b |
188b |
068a |
008a |
117a |
167b |
075a |
063a |
067b |
046b |
168b |
157b |
128b |
195b |
165a |
105b |
204a |
141b |
135a |
027b |
080a |
000a |
185b |
176b |
126a |
074a |
032b |
069b |
004b |
077b |
148a |
085a |
007a |
03a |
009a |
145b |
082a |
205b |
015a |
101b |
118a |
129a |
062b |
052b |
071a |
033a |
119b |
160a |
095b |
051a |
048b |
133b |
023a |
054a |
196a |
112b |
103b |
055a |
100a |
106a |
091b |
049a |
026a |
113b |
134b |
104b |
006b |
123b |
109b |
096a |
043b |
099b |
表9:附件五碎片反面拼接順序
078b |
111b |
125a |
140a |
155a |
150a |
183b |
174b |
110a |
066a |
108a |
018b |
029a |
189b |
081b |
164b |
020a |
047a |
136b |
089a |
010b |
036a |
076b |
178a |
044a |
025b |
192a |
124b |
022a |
120b |
144a |
079a |
014a |
059a |
060b |
147a |
152a |
005a |
186b |
153a |
084b |
042b |
030a |
038a |
121a |
098a |
094b |
061b |
137b |
045a |
138a |
056b |
131b |
187b |
086b |
200b |
143b |
199b |
011b |
161a |
169b |
194b |
173b |
206b |
156a |
034a |
181b |
198b |
087a |
132b |
093a |
072b |
175a |
097a |
039b |
083a |
088b |
107a |
149b |
180a |
037b |
191a |
065b |
115b |
166b |
001b |
151b |
170b |
041a |
070b |
139b |
002a |
162b |
203b |
090a |
114a |
184b |
179b |
116b |
207a |
058a |
158a |
179a |
154b |
028b |
012a |
017b |
102b |
064b |
208a |
142a |
057a |
024a |
013a |
146a |
171b |
031a |
201a |
050a |
190b |
092b |
019b |
016b |
077b |
053b |
202a |
021b |
130a |
163a |
193b |
073b |
159a |
035a |
165b |
195a |
128a |
157a |
168a |
046a |
067a |
063b |
075b |
167a |
117b |
008b |
068b |
188a |
127a |
040a |
182b |
122a |
172a |
03b |
007b |
085b |
148b |
077a |
004a |
069a |
032a |
074b |
126b |
176a |
185a |
000b |
080b |
027a |
135b |
141a |
204b |
105a |
023b |
133a |
048a |
051b |
095a |
160b |
119a |
033b |
071b |
052a |
062a |
129b |
118b |
101a |
015b |
205a |
082b |
145a |
009b |
099a |
043a |
096b |
109a |
123a |
006a |
104a |
134a |
113a |
026b |
049b |
091a |
106b |
100b |
055b |
103a |
112a |
196b |
054b |
六.模型結果的分析與檢驗
6.1 連續性模型的實驗分析檢驗
利用文字連續性模型,最終成功將附件一和附件二的長條型中英文字體碎片很好的拼接起來了,拼接後的文章語意通順,說明結果正確。由於問題一中的縱向切割,使得形成的邊緣處除了第一張和最後一張外,其餘碎片沒有完全空白的情況,這給我們尋找第一張碎片帶來了很大的便利。這種先找出第一張碎片,再繼續拼接後續碎片的方法。可以大大簡化邊緣匹配的過程。
經過程序實驗論證,針對問題一的中英文碎片拼接,拼接後的正確率爲100%。
這種連續性模型可以很好的拼接出邊緣所含信息較多的碎片。但如果對於邊緣只含有少量文字或者與其他碎片含有相似字形較多的碎片,就會產生誤差。
所以這種模型適用於邊緣信息較多的碎片拼接。
6.2 全局搜索模型以及向量投影分組模型的分析檢驗
問題二中所給附件三、四都是小碎片,寬度爲72像素,與第一問中的一致,但是高度只有180像素,爲第一問碎片的1/11,所以左右邊緣的像素信息也只爲附件一和二的1/11,如果實用文全局搜索模型利用向量相關性的方法來拼接碎片的時間複雜度。
而如果使用向量投影分組模型,把每一行有黑點的情況投影到一個數組中,組成以一個180*209的數組,之後運用聚類分析方法分出11類,分類時由於空白處造成分類誤差,運用相關係數函數匹配判斷時出現匹配錯誤後,運用人工干預,分爲11類。然後進行橫向匹配,此時的時間複雜度只爲。此模型能節約大量運算時間並且能較好得適應邊緣特徵並不明顯的時候,但由於分類的誤差,造成最後匹配時出現了錯誤,需要人工干預,增加了工作量。
6.3 組合匹配模型的分析檢驗
通過圖片的組合拼接,把碎片的信息量進行擴充,增大信息量,圖片特徵,在下面的對每一行的分類,每一列的匹配拼接提高了成功率。並通過反面對正面的檢測分析,可以更好的避免誤差,減少人工干預的次數,減少了工作量。但由於使用的是全局搜索模型,在時間複雜度,耗時較多。
圖9附件五碎片橫向拼接
根據碎片拼接圖片可以看出,有碎片拼接錯誤,主要緣由是匹配函數的選取,相關性的匹配,近似灰度矩陣就會造成干擾。使得最後匹配的數據出現了錯誤,造成一段一段的碎片,給人工干預時造成了一定的麻煩。通過反面的拼接去檢驗正面拼接的正確性。
七.模型的評價與推廣
7.1 模型的評價
(1)問題一中的連續性模型對於拼接邊緣信息量較大的碎片有較高的效率以及很高的準確率,但是當單獨用該模型解決例如附件三、四的小碎片時,雖然效率很高,但是準確率較低。比如,如果有兩張或者多張圖片邊緣切割都爲白色時,可能就會出現無法匹配的情況,這時就需要人工干預;向量相關模型相對於文字連續性模型,具有更高的準確度。
(2)問題二中的全局搜索模型不僅耗時多,而且由於給的信息很少,在這麼多圖片中匹配,會造成準確率很低的情況;向量投影分組模型,投影圖片灰度向量到投影矩陣中,利用FCM聚類分析方法讓打亂的橫切及縱切的圖片得以分類,從而分步實現了碎片的排序,簡化了拼接過程,大大減少了循環匹配的次數;
(3)問題三中組合匹配模型將附件五中的a,b兩圖片上下拼接,然後用拼接後的圖片進行分類,這樣不僅提高了效率,還一定程度上增加了碎片所提供的信息。
7. 2 模型的推廣
這三種模型針對不同的情況,利用多種模型和匹配方法,能夠較好的解決題目中的三個問題。
但是,我們仍然可以考慮其他特徵,結合連續性模型或者向量相關模型綜合考慮,比如字寬特徵,計算兩邊的碎片邊緣被切開字的缺損字寬,兩邊相加,當和值與標準字寬相差較大時,就可以排除不利因素。
現在已經有很多模式識別的算法和軟件,我們可以利用文字識別算法來計算拼接後的兩片碎片上的文字上的準確率,當準確率較高時,則認爲匹配成功。利用已有的技術,可以大大效率有準確率
八.參考文獻
[1] 章毓晉. 圖像處理(第三版). 清華大學出版社,2012.2
[2] 邊肇祺,張學工. 模式識別(第二版).清華大學出版社 2000.1
[3] 馮宇平,戴明,孫立悅,張威. 圖像自動拼接融合的優化設計.光學精密工程.2012,18(2)
[4] 李仁發,楊高波. 特徵提取與圖像處理(第二版).電子工業出版社 2010.10
[5] 陳麗莉,劉貴喜.一種有效的序列圖像自動拼接方法. 光電子激光. 2011,22(7)
九.附錄
附錄一:程序代碼
% 第一問代碼 文件名:Qusetion1.m
files=dir('C:\Users\ZYF\Desktop\新建文件夾\B\附件1\*.bmp'); %批量載入圖像
for n=1:numel(files)
image{n}=imread(['C:\Users\ZYF\Desktop\新建文件夾\B\附件1\'files(n).name]);
end
[h,z]=size(image{1,1});
for k=1:n
byz(:,k)=image{1,k}(:,1); %將第k張圖片的最左邊一列放入矩陣byz的第k列
byy(:,k)=image{1,k}(:,z); %將第k張圖片的最右邊一列放入矩陣byy的第k列
end
%利用頁邊距尋找第一張圖片
for i=1:n
sum=0;
for j=1:h
if byz(j,i)==255
sum=sum+1;
else
break;
end
end
if sum==h
f=i;
end
end
paixu=zeros(1,n);
index=1;
paixu(index)=f;
%依據連續性模型需找匹配點
for i=2:n
max=0;
for j=1:n
sumofbp=0;
num=0;
for k=2:h-1
ifbyy(k,paixu(index))~=255
ifbyz(k,j)<255||byz(k-1,j)<255||byz(k+1,j)<255
num=num+1;
else
num=num;
end;
end
end
if num>max
max=num;
signal=j;
end
end
index=index+1;
paixu(index)=signal; %存放排好序的圖片序號
end
temp=image{paixu(1)};
for i=2:n
temp=[tempimage{paixu(i)}]; %將排序好的圖片存放與temp
end
imshow(temp) %完整顯示整張紙片
%第二問中文拼接中投影代碼 文件名reflect.m
% 碎片預處理,圖像投影,存放投影數組
files=dir('C:\Users\ZYF\Desktop\新建文件夾\B\附件3\*.bmp');%載入圖像
figure;
A=zeros(1,180);
for n=1:numel(files)
image{n}=imread(['C:\Users\ZYF\Desktop\新建文件夾\B\附件3\' files(n).name]);
end
[x,y]=size(image{1});
flag1=zeros(x,n);
for i=1:n
for j=1:x
sum=0;
for k=1:y
ifimage{i}(j,k)<255
break;
else
sum=sum+1;
end
end
if sum==y
flag1(j,i)=0;
else
flag1(j,i)=1;
end
end
end
%如果採用掩碼模型,則運行代碼yanma.m(包含3個函數top.m,mid.m,back.m)
%附件三掩碼補充代碼 文件名 yanma.m
files4=dir('C:\Users\asus\Desktop\2013B3\附件3\*.bmp');%載入圖像
for n4=1:numel(files4)
image4{n4}=imread(['C:\Users\asus\Desktop\2013B3\附件3\' files4(n4).name]);
end
fid1=fopen('C:\Users\asus\Desktop\數模數據.txt','wt');
fid2=fopen('C:\Users\asus\Desktop\需補充.txt','wt');
[x,y]=size(image4{1});
flag=zeros(x,n4);
%向量投影
for i=1:n4
for j=1:x
sum=0;
for k=1:y
ifimage4{i}(j,k)<255
break;
else
sum=sum+1;
end
end
if sum==y
flag(j,i)=0;
else
flag(j,i)=1;
end
end
end
sumofb=0;
for i=1:209
sumofb=0;
for j=1:179
ifflag(j,i)==1&&flag(j+1,i)==0
sumofb=sumofb+1;
else
sumofb=sumofb;
end
end
if flag(180,i)==1
sumofb=sumofb+1;
end
numofb(i)=sumofb;
end
for i=1:209
if numofb(i)<3
fprintf(fid2,'%g ',i);
end
end
flagnew=flag;
A=[5 9 15 17 22 26 28 33 41 61 67 71 72 75 86 90 94 102 107 109 110111 114 115 118 120 124 126 140 141 146 147 151 153 154 155 156 158 166 167 174182 185 186 188 195 197 198 205 206 208];
[ax,ay]=size(A);
shul=zeros(ay,6);
for i=1:ay%統計投影白色0和黑色1的數量
sumofd=0;
index=1;
if flag(1,A(i))==1%若第一個爲黑色,則白色個數爲0
shul(i,index)=0;
index=index+1;
end
for j=1:179
ifflag(j,A(i))==flag(j+1,A(i))
sumofd=sumofd+1;
else
sumofd=sumofd+1;
shul(i,index)=sumofd;
index=index+1;
sumofd=0;
end
end
shul(i,index)=sumofd+1;
end
for i=1:ay
if shul(i,1)>26
topout=top(shul(i,1));
hebin(i,:)=[topoutshul(i,2:6)];
end
end
for i=1:ay
for j=3
if shul(i,j)>31
midout=mid(shul(i,j));
hebin(i,:)=[shul(i,1:2) midout shul(i,4:6)];
end
end
end
for i=1:ay
for j=5
if shul(i,j)>26
backout=back(shul(i,j));
hebin(i,:)=[shul(i,1:4) backout];
end
end
end
for i=1:ay
if hebin(i,1)~=0
temp=hebin(i,1);
else
temp=1;
end
for j=2:2:6
flagnew(temp:(temp+hebin(i,j)),A(i))=1;
temp=temp+hebin(i,j)+hebin(i,j+1);
end
end
%top函數代碼 文件名top.m
%top函數
function [ topout ] = top( in)
if in<69
topout=[0 in-26 26];
elseif 68<in<95
topout=[in-68 42 26];
elseif 94<in<137
topout=[0 in-94 26 42 26];
elseif 136<in<163
topout=[in-136 42 26 4226];
else
topout=[0 in-162 26 42 2642 26];
end
end
%mid函數 文件名 mid.m
%mid函數
function [ midout ] = mid( in )
if in<101
midout=[26 in-52 26];
elseif 100<in<163
midout=[26 42 26 in-12026];
end
end
%back函數 文件名 back.m
%back函數
function [ backout ] = back( in )
if in<69
backout=[26 in-26 0 0];
elseif 68<in<95
backout=[26 42 in-68 0];
elseif 94<in<137
backout=[26 42 26 in-94];
end
end
%第二問C均值分類代碼 文件名Classify.m
%模糊C均值(fcm)分類
clear;
close all;
load flag1.mat;
files=dir('C:\Users\ZYF\Desktop\新建文件夾\B\附件3\*.bmp');%載入圖像
figure;
for n=1:numel(files)
image{n}=imread(['C:\Users\ZYF\Desktop\新建文件夾\B\附件3\' files(n).name]);
end
data = flag1';
[center,U,obj_fcn] = fcm(data, 11);
maxU = max(U);
%index(i)中存放第i類分組的圖片
index(1).t = find(U(1,:) == maxU);
index(2).t = find(U(2, :) == maxU);
index(3).t = find(U(3,:) == maxU);
index(4).t = find(U(4,:) == maxU);
index(5).t = find(U(5,:) == maxU);
index(6).t = find(U(6,:) == maxU);
index(7).t = find(U(7,:) == maxU);
index(8).t = find(U(8,:) == maxU);
index(9).t = find(U(9,:) == maxU);
index(10).t = find(U(10,:) == maxU);
index(11).t= find(U(11,:) == maxU);
%第二問中文拼接代碼 文件名Question_Chinese.m
clear;
close all;
% 問題二漢字匹配拼接
load index.mat;
class=12;
files=dir('C:\Users\ZYF\Desktop\新建文件夾\B\附件3\*.bmp');%載入圖像
for n=1:numel(files)
image{n}=imread(['C:\Users\ZYF\Desktop\新建文件夾\B\附件3\' files(n).name]);
end
for k=1:n
bz(:,k)=image{1,k}(:,1); %將第k張圖片的最左邊一列放入矩陣bz的第k列
br(:,k)=image{1,k}(:,72); %將第k張圖片的最右邊一列放入矩陣br的第k列
end
ind=1;
for oo=1:class
tmp=[];
first=index(oo).t; %將index分組的第oo組存放入first矩陣
cd=length(first);
f=zeros(1,cd); %標記圖片是否已被使用,初始爲0
kk=0;
for j=1:cd
sum=0;
for p=1:180
for q=1:5
ifimage{first(1,j)}(p,q)==255
sum=sum+1;
end
end
end
if sum==900
figure (oo);
subplot(1,cd,1)
imshow( image{first(j)});
kk=first(j);
f(1,1)=first(j); %已用圖片
break;
end
end
jj=1;
if(kk==0)
figure (oo);
subplot(1,cd,1)
imshow( image{first(1)});
kk=first(1);
f(1,1)=first(1); % 已用圖片
end
tmp=[tmp kk];
sign=kk;
for z=1:cd
max=0;
for a=1:cd
sum1=0;
hh=0;
for ll=1:cd
if(first(a)==f(1,ll))
hh=1;
end
end
if(hh==0)
co=corrcoef(double(bz(:,first(a))),double(br(:,kk)));% 相關性函數判斷
sum1=abs(co(1,2));
if(max<sum1)
max=sum1;
sign=first(a);
end
end
end
if(kk ~= sign)
tmp=[tmp sign];
subplot(1,cd,jj+1)
imshow(image{sign});
kk=sign; %現在圖片
f(1,jj+1)=sign;
jj=jj+1;
else
for d=1:cd
for s=1:cd
gg=0;
if(first(d) ==f(1,s))
gg=1;
end
end
if(gg==0)
kk=first(d);
break;
end
end
cc(ind).a=tmp;
ind=ind+1;
tmp=[kk];
end
end
end
%第二問英文添加直線代碼 文件名 Line.m
% 英文直線的修補
clear;
close all;
files=dir('.\附件4\*.bmp');%載入圖像
for n=1:numel(files)
image{n}=imread(['.\附件4\' files(n).name]);
A(n).t=sum(image{n},2);
end
B=[12,20,15,25,12,20,15,25];%做模板
B1=[12,20,15,25,12,20,15,25,12,20,15,25];
B2=[20,15,25,12,20,15,25,12,20,15,25,12];
B3=[15,25,12,20,15,25,12,20,15,25,12,20];
B4=[25,12,20,15,25,12,20,15,25,12,20,15];
idx1=zeros(600,1);% 模板數組
idx1(1,1)=1;
mm=1;
for i=1:6
for j=1:4
mm=mm+B(j);
idx1(mm,1)=1;
end
end
%ind=A(10).t;
BZ=zeros(180,209);
for pp=1:209
ind=A(pp).t;
for i=2:179 % 拐點找出
if(ind(i-1)-ind(i)>10 &&ind(i+1)-ind(i)>10)
BZ(i,pp)=1;
end
end
if ind(1)<ind(2)
BZ(1,pp)=1;
end
if ind(180)<ind(179)
BZ(180,pp)=1;
end
po=find(BZ(:,pp)==1);
gg=1;
max=0;
for ii=1:5 % 與模板匹配
dd=0;
fh=0;
for z=po(1):180
if(BZ(z,pp)==1&&idx1(z+gg,1)==1||z+1<=180&&BZ(z+1,pp)==1&&idx1(z+gg,1)==1||(z-1)~=0&& BZ(z-1,pp)==1&&idx1(z+gg,1)==1)% 與模板匹配
dd=dd+1;
end
end
if(max<dd)
SG=ii;
max=dd;
kh=po(1);
end
gg=gg+B(ii);
end
if SG==1||SG==4
AB=kh;
j=1;
while AB-B1(5-j)>=1
BZ(AB-B1(5-j))=1;
AB=AB-B1(5-j);
j=mod(j+1,4);
end
AD=kh;
j=1;
while AD+B1(j)<=180
BZ(AD+B1(j),pp)=1;
AD=AD+B1(j);
j=j+1;
end
end
if SG==2
AB=kh;
j=1;
while AB-B2(5-j)>=1
BZ(AB-B2(5-j))=1;
AB=AB-B2(5-j);
j=mod(j+1,4);
end
AD=kh;
j=1;
while AD+B2(j)<=180
BZ(AD+B2(j),pp)=1;
AD=AD+B2(j);
j=j+1;
end
end
if SG==3
AB=kh;
j=1;
while AB-B3(5-j)>=1
BZ(AB-B3(5-j))=1;
AB=AB-B3(5-j);
j=mod(j+1,4);
end
AD=kh;
j=1;
while AD+B3(j)<=180
BZ(AD+B3(j),pp)=1;
AD=AD+B3(j);
j=j+1;
end
end
if SG == 4
AB=kh;
j=1;
while AB-B4(5-j)>=1
BZ(AB-B4(5-j))=1;
AB=AB-B4(5-j);
j=mod(j+1,4);
end
AD=kh;
j=1;
while AD+B4(j)<=180
BZ(AD+B4(j),pp)=1;
AD=AD+B4(j);
j=j+1;
end
end
end
%第二問英文拼接主代碼 文件名 Question.m
clear;
close all;
load index2.mat;
class=12;
files=dir('C:\Users\ZYF\Desktop\新建文件夾\B\附件4\*.bmp');%載入圖像
for n=1:numel(files)
image{n}=imread(['C:\Users\ZYF\Desktop\新建文件夾\B\附件4\'files(n).name]);
end
for k=1:n
bz(:,k)=image{1,k}(:,1); %首行
br(:,k)=image{1,k}(:,72);%末行
end
ind=1; % 類別計數器
for oo=1:class
dx=0; % 倒序尋找
tmp=[];
first=index2(oo).t;
cd=length(first);
f=zeros(1,length(first)); %標記
kk=0;
while (sum(f)<length(first))
if length(tmp)==0 % 找行首塊
for j=1:length(first)
if f(j)==0
im=image{ first(j)};
sumim=sum(im,1);
ifsum(sumim(1:10))==255*180*10 % 找到行首
figure (oo);
subplot(1,length(first),1)
imshow( image{first(j)});
kk=first(j);
f(j)=1;% 標記已用圖片
break;
end
end
end
% 找塊尾
for j=1:length(first)
if f(j)==0
im=image{ first(j)};
sumim=sum(im,1);
ifsum(sumim(70:72))==255*180*3 % 找到行尾
figure (oo);
subplot(1,length(first),1)
imshow( image{ first(j)});
kk=first(j);
f(j)=1;% 標記已用圖片
dx=1;
break;
end
end
end
if(kk==0) % dou找不到,用第可用一個圖片
figure (oo);
subplot(1,length(first),1);
imshow( image{ first(1)});
pos=find(f==0);
kk=first(pos(1));
f(pos(1))=1; % 標記已用圖片
end
tmp=[tmp kk];
end
maxsum=0; % 找最接近的
sign=kk;
for z=1:length(first)
if f(z)==0 % 沒有用過
sum1=0;
for p=1:180
if dx==1
cha=abs(bz(p,kk)-br(p,first(z)));
if ( cha ==0 &&bz(p,kk)~= 255 && br(p,first(z))~=255)
sum1=sum1+1;
end
else
cha=abs(br(p,kk)-bz(p,first(z)));
if ( cha <20&& br(p,kk)~= 255 && bz(p,first(z))~=255)
sum1=sum1+1;
end
end
end
if(maxsum<sum1)
maxsum=sum1;
fpos=z;
sign=first(z);
end
end
end
if maxsum<1
sign=kk;
end
if(kk~=sign)
%找到了
if dx==1
tmp=[sign tmp ];
else
tmp=[tmp sign];
end
imshow(image{sign});
kk=sign;%現在圖片
f(fpos)=1;
else %沒找到
cc(ind).a=tmp;ind=ind+1;
kk=0;tmp=[];dx=0;
end
end
end
for i=1:length(cc)
figure(20);clf;
for j=1:length(cc(i).a)
subplot(1,length(cc(i).a),j);
imshow(image{cc(i).a(j)});
end
pause;
end
%第三問英文拼接主代碼 文件名 Question3_English.m
clc,clear;
% 碎片匹配連接
for n=1:209
fnamea=[num2str(n-1,'%03d') 'a.bmp'];
fnameb=[num2str(n-1,'%03d') 'b.bmp'];
image5{n}.a=imread(['.\附件5\' fnamea]);
image5{n}.b=imread(['.\附件5\' fnameb]);
image5a{2*n-1}=[image5{n}.a;fliplr(image5{n}.b)];%碎片a、b組合連接
image5a{2*n} =[image5{n}.b;fliplr(image5{n}.a)];
end
figure(1);clf;
subplot(2,1,1);imshow(image5{1}.a);
subplot(2,1,2);imshow(image5{1}.b);
figure(2);clf;
subplot(1,2,1);imshow(image5a{1});title('ab');% 顯示組合效果
subplot(1,2,2);imshow(image5a{2});title('ba');
save image5.mat;
%load image5
n=209;
for k=1:2*n
bz(:,k)=image5a{1,k}(:,1);
br(:,k)=image5a{1,k}(:,72);
end
first=zeros(1,22);
last=zeros(1,22);
flag=zeros(2*n,1);
for i=1:2*n
im=image5a{i};
sim=sum(im,1);
if sum(sim(1:5))==360*255*5
flag(i)=1; % 標記行首
end
if sum(sim(72-4:72))==360*255*5
flag(i)=2; % 標記行尾
end
end
first=find(flag==1);
last=find(flag==2);
ind=1;
flg=zeros(2*n,1); % 判斷是否被用過
for hh=1:length(first)
tmp=[];
k=first(hh);
tmp=[tmp k];
flg(k)=1;
ry=1;% 另起一行的標誌
while ry == 1
maxsum=0;
for i=1:2*n
sum1=0;
if( (flag(i)~= 1) && (flg(i)==0) )
co=corrcoef(double(bz(:,i)),double(br(:,k)));
sum1=abs(co(1,2));
if(maxsum<sum1)
maxsum=sum1;
sign=i;
end
end
end
if(k ~= sign) % 找到了
tmp=[tmp sign]
k=sign; % 現在圖片
flg(k)=1;
ry=1;
else
cc(ind).a=tmp; % 沒找到
ind=ind+1;
ry=0;
end
end
end
save cc.mat cc
% for i=1:length(cc)
% figure(i);clf;
% for j=1:length(cc(i).a)
% leibie(i,j)=cc(i).a(j);
% subplot(1,length(cc(i).a),j);
% imshow(image5a{cc(i).a(j)});
% end
% end
%第三問英文拼接圖片顯示代碼 文件名 Question3show.m
% 附件5碎片拼接後,每一行的顯示
load image5.mat;
load cc.mat;
close all;
for i=1:length(cc)
figure(i);clf;
for j=1:length(cc(i).a)
leibie(i,j)=cc(i).a(j);
subplot(1,length(cc(i).a),j);
imshow(image5a{cc(i).a(j)});
end
end
附件二:實驗結果
附件1結果:
附件2結果:
附件3結果:
附件4結果:
附件5結果:
正面:
反面: