2016年8月17日

使用R進行簡易的影像比對-以蝴蝶斑點為例

接到了一個支線任務,簡單來說,學生的科展題目為蝴蝶翅膀斑點的影像辨識。將蝴蝶左翅膀腹側的照片轉正,翅寬為圖寬,翅長為圖長,切成約略正方形的圖片。

在圖片上放上15X15的方格,以人工的方式判斷該格子內是否有蝴蝶斑蚊,若有則為1,若無則為0。依此建立該種蝴蝶的模式矩陣。

同種蝴蝶可以建立多個模式矩陣,並以多數決的方式決定矩陣內為有斑點或無斑點,在學生過去的科展中,同種蝴蝶取十張照片。

多種蝴蝶均建立好模式矩陣後,待測蝴蝶照片依樣正規化處理建立斑點的01矩陣,並與模式矩陣比較,看誰的差異較少(漢明距離),差異最少者及比對成該種蝴蝶。


這個方法有幾項缺失,
  1. 該蝴蝶照片不一定為正方形,放上15X15的網格不一定能填滿。通常將網格拉長。
  2. 蝴蝶照片沒有去背(背景視為0),是使用人工的方式判斷背景與蝴蝶的翅膀,不利自動化。應該在拍攝前在蝴蝶翅膀後放白紙或黑紙。
  3. 第三人工判讀花費大量時間,且沒有明確定義斑點的概念為何,網格放置的位置也會影響結果。
  4. 第三點人工判讀時間太多,因此只能侷限在15X15的矩陣,解析度可能不足。

因此我設法替他們完成自動化辨識的這個部分。間單來說所有的照片應正規化處理後輸入R進行判讀,R會依照演算法(簡單一點就是黑白01,困難一點是特爭值,當然還有其他複雜的圖形辨識法)輸出該種蝴蝶的模式。建立好模式資料庫後,輸入正規化後的照片便可與資料庫比對,找出最相近的蝶種。

我的自動化可分成幾個步驟

  1.   圖片正規化。所有的圖片透過GIMP轉正,以人工方式將背景塗成白色(屆時會判斷成1),最後縮小成300X300(或是15X15)的正方形蝴蝶圖片,不依照照片的長寬縮放,強迫轉成正方形。以png的格式儲存。縮放或是轉檔的部分可透過ImageMagickconvert指令進行批次轉檔。
  2. 讀入R中,用png套件包中的readPNG()函數將圖片讀入,形成三維的矩陣,第三維分別為RGB與透明度。
  3. 演算法處理。在readPNG()RGB三色是在01之間的數值,1為全色,0為無色,若RGB均為1則為白色,均為0則為黑色。若要將圖片處理成黑白01的矩陣,則將RGB三色平均,大於0.5者為1,小於0.5者為0。完成後即為建立該蝶種的模式矩陣(可以多個模式矩陣),嚴格一點可以參考大津演算法(Otsu's method)。可用writePNG()輸出成模擬圖。
  4. 比較蝶種。輸入正規化的樣本圖片,與所有矩陣進行漢明距離計算,使用e1071套件中的hamming.distance()函數。簡單一點兩個矩陣相減取絕對值再加總意思也是一樣的,因為是01的矩陣。距離最小的則判斷成結果。

1 則留言:

  1. 最近又要開始寫部落格 忽然看到你的部落格 忽然想起你 最近好嗎?? 還在玩裝備?? 我回嘉義了,沒去參加北搜了 那你勒?

    回覆刪除