碎紙片的拼接復原

摘  要

對重要文件的拼接復原,傳統上都由人工完成,拼接準確率雖然高但是效率很低。本文旨在建立模型,利用計算機編程加少量的人工干預實現碎紙片的拼接復原。

針對問題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結果:

正面:

 

 反面:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章