天天看點

手撕不規則碎紙片複原-畢設

這是畢業之後寫的第一篇部落格,在這裡我想把做畢設的過程和所需要的資料說清楚。

老師說這是一個研究所學生的畢業設計題目,有點難度。 之是以當時選了這個題目是因為感覺它比較有意思。 在最開始的幾個星期裡,由于數字圖像處理相關知識的欠缺,完全不知道怎麼下手去做,頭發快愁白了。從頭到尾學一遍matlab圖像處理,時間來不及;逛論壇發文章似乎也沒多大用;看論文又覺得廢話太多實在沒耐心......做畢業設計的各種現象~

廢話不說,現在看需求(來自設計任務書):

設計要求學生以手撕産生的不規則破碎紙片的複原為背景,設計、開發一套“手撕不規則碎紙片複原系統”軟體。該系統可用于各種檔案,票據等手撕産生的不規則碎紙片的形狀特征的數字化,形狀特征的提取,複原等。

此外,學生通過該題目的設計過程,可以初步掌握軟體系統的開發原理和開發方法,得到軟體工程的訓練,提高解決實際問題的能力。

(1)整個系統由待複原資料上傳子系統、特征提取子系統、複原結果釋出子系統及複原結果的評價分析子系統等組成;

(2)系統要支援人工幹預功能(是否需要人工幹預,如果需要,說明幹預的時間點及幹預方法);

(3)系統要實作對于來自同一頁(無缺失,無多餘)的印刷文字,手寫文字,常見票據的手工撕碎後的不規則碎紙片的上傳、數字化、形狀特征提取及複原的功能;

(5)該系統的開發,采用Matlab(實作功能部分)和Java(實作界面部分)技術;

(6)系統要采用模拟手撕碎紙片資料進行測試。

說的比較官方,官方的東西讓人覺得沒有胃口。 什麼子系統子系統的,說是功能不就結了。四個功能:上傳、特征提取、複原、評價;

開始做的時候沒有必要拘泥于這些東西,有了想法和思路,最後實作功能才是工作重點。 但是做完之後還得編四五十頁廢話連篇的說明文檔,再寫個4頁的簡介,翻譯一篇一萬字元以上的外文文獻,整個PPT,刻CD光牒……總之不能讓你閑着。

關于設計中的“人工幹預”現在肯定不太了解,不過後面一定會知道它是幹預什麼了。

現在可以回到題目中, “手撕不規則的碎紙片”重點要抓住“不規則”三個字, 它就說明,設計一定要基于碎片的形狀特征出發來實作,若以其它的非形狀的特征出發,很可能就跑題了。對于碎紙機中切割出來的規則碎紙的複原,一定不是這個題目要做的事情,其他人在做,咱就不操心了。

利用數字圖像的形狀特征實作複原,第一步就是碎紙片特征的提取工作。人工拼接,大多數情況下也是根據碎片的形狀來判斷,偶爾也會結合碎片上面的圖案來判斷。拼圖遊戲是根據圖案判斷的,它的每個碎片形狀一緻。不知道圖檔裡面資料是怎麼樣的?用記事本打開一堆亂碼……不知道如何提取形狀特征? 不怕人笑話,此時需要學習了。

圖像:

在數字圖像處理領域,圖像分為模拟圖像和數字圖像兩種,在計算機上處理的圖像均為數字圖像。根據數字圖像在計算機中表示方法不同,分為二進制圖像,索引圖像,灰階圖像,RGB圖像和多幀圖像。

數字圖像的産生主要有兩種管道,一種是通過像數位照相機這樣的裝置直接拍攝得到數字圖像,還有一種是通過圖像采集卡、掃描器等數字化裝置,将模拟圖像轉變為數字圖像。 下圖是拍攝獲得的一張碎紙片(RGB)圖像:

手撕不規則碎紙片複原-畢設

圖像的表示:

圖像的表示方法是對圖像處理算法描述和利用計算機處理圖像的基礎。一個二維圖像,在計算機中通常為一個二維數組f (x, y),或者是一個M×N的二維矩陣(其中,M為圖像的行數,N為圖像的列數)下面介紹5種圖像的表示方法:二進制圖像、索引圖像、灰階圖像、RGB圖像和多幀圖像。

二進制圖像也稱為二值圖像,通常用一個二維數組來描述,1位表示一個像素,組成圖像的像素值非0即1,沒有中間值,通常0表示黑色,1表示白色,如圖1.8所示。二進制圖像一般用來描述文字或者圖形,其優點是占用空間少,缺點是當表示人物或風景圖像時隻能描述輪廓。

灰階圖像也稱為單色圖像,通常也由一個二維數組表示一副圖像,8位表示一個像素,0表示黑色,255表示白色,1~254表示不同的深淺灰色,一副灰階圖像放大4×4大小像素,如圖1.9所示。通常灰階圖像顯示了黑色與白色之間許多級的顔色深度,比人眼所能識别的顔色深度範圍要寬的多。

RGB圖像也稱為真彩色,是一種彩色圖像的表示方法,利用3個大小相同的二維數組表示一個像素,3個數組分别代表R、G、B三個分量,R表示紅色,G表示綠色,B表示藍色,通過三種基本顔色可以合成任意顔色,如圖1.10所示RGB圖像。每個像素中的每種顔色分量占8位,每一位由[0,255]中的任意數值表示,那麼一個像素由24位表示,允許的最大值為224(即1677216,通常記為16M)。

索引圖像是一種把像素值直接作為RGB調色闆下标的圖像。在MATLAB中,索引圖像包含一個資料矩陣X和一個顔色映射(調色闆)矩陣map。資料矩陣可以是8位無符号整型、16位無符号整型或雙精度類型的。

多幀圖像是一種包含多幅圖像或幀的圖像檔案,又稱為多頁圖像或圖像序列,主要用于需要對時間或場景上相關圖像集合進行操作的場合。例如,計算機X線斷層掃描圖像或電影幀等。

對于數字圖像了解到這裡就夠了,如果還沒有安裝matlab建議現在趕緊裝一個。處理數字圖像,沒有這個可不行,盡量安裝高一點的版本,如Matlab2012a,至于為什麼,後面再說。

安裝好之後,建個檔案夾,把工作目錄切換過去。 它的指令行很方面,用過RedHat或者Ubuntu的同鞋直接在指令視窗中切cd ..ls ..不會的就在目前目錄視窗中用滑鼠點吧。接下來随便找一張圖檔,試試這些指令 [ MATLAB圖像處理工具箱函數], 試着寫m檔案,觀察一下各種類型圖檔的資料長的是什麼樣子,試試不同類型圖檔的轉換,可以将matlab讀到的圖檔資料輸出,輸入I(讀入的變量)+回車就行。

如何提取碎片圖像的輪廓:

圖像分割技術,圖像分割就是把圖像分成各具特性的區域,并提取出感興趣目标的技術。圖像分割在很多領域都有着非常廣泛的應用,并涉及各種不同類型的圖像。圖像分割技術,主要包括邊緣分割技術、門檻值分割技術和區域分割技術等。

邊緣檢測是利用物體和背景在某種圖像特性上的差異來實作的。常見的邊緣檢測方法有:微分算子、Canny算子和LOG算子等。常用的微分算子有Sobel算子、Roberts算子Prewit算子等。門檻值分割技術是最簡單的一種圖像分割方法,關鍵在于尋找合适的門檻值,通常根據圖像的直方圖來選取。除了邊緣分割和門檻值分割等方法以外,還可以采用區域分割。區域分割主要包括區域生長法和分水嶺分割法。

在這裡不采用邊緣檢測的方法,我們用邊界追蹤的方法來擷取碎紙片的輪廓特征,具體原因參考 中國知網的邊界追蹤搜尋結果。

邊界跟蹤的算法參考[ matlab圖像分割算法源碼 - 塵封已久的日志 - 網易部落格]的第11個方法。

下面開始寫程式,不知道matlab的資料類型和函數寫法,請找找 [ 《精通matlab圖像處理》張強 王正林編寫] 電子工業出版社出版。

試完部落格中提到的第11種邊界跟蹤的方法,似乎已經能将碎紙片圖像的輪廓曲線提取出來了。

提取出來碎紙片輪廓的圖像:

手撕不規則碎紙片複原-畢設

用whos檢視matlab中的資料:

contour 大小n*2 類型double  輪廓坐标

到這裡輪廓的提取已經完成了,接下來是輪廓的表示,輪廓表示也有很多種方法,通常分為兩類,一類是編碼方式,如鍊碼,遊程碼,freeman碼。 一類是對輪廓的簡化表示, 如樣條,多邊形逼近和特征點提取等的表示方法。 

鍊碼:鍊碼用于描述目标圖像的邊界,通過規定鍊的起始坐标和鍊起始點坐标的斜率用一小段線段來表示圖像中的曲。鍊碼按照标準方向的斜率分為4向鍊碼或8向鍊碼,如下圖所示。因為鍊碼表示圖像邊界時隻需标記起點坐标,其餘點用線段的方向數代表方向即可,這種表示方法節省大量的存儲空間。

手撕不規則碎紙片複原-畢設

将邊界跟蹤得到的碎片輪廓資料contour程式設計轉化為鍊碼來表示,用8方向的鍊碼表示。表示完成之後需要将要做比對的兩條鍊碼中的其中一條進行反方向的轉化,因為在邊界跟蹤的時候用統一方向 比如順時針 進行跟蹤的,統一方向的兩條鍊碼沒有辦法進行比對運算,是以要将邊界跟蹤的一條鍊碼做相反方向的轉化。

在這裡隆重介紹一種基于鍊碼的二維碎片輪廓比對算法,學會之後,最難搞的碎紙片比對就完成了。

上面這些過程僅供參考,方法還有很多,沒有多少基礎的話是摸着石頭過河,把目前的問題解決了就好,走多少彎路沒關系。

繼續閱讀