2012-04-04 67 views
10

我試圖從一個遊戲板中爲一個項目提取字母。目前,我可以檢測遊戲板,將其分割爲各個方塊並提取每個方塊的圖像。準確的二進制圖像分類

我得到的輸入是這樣的(這些是單個字母):

enter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description here

起初,我還想跟每個圖像的黑色像素的數量和使用作爲識別不同字母的一種方式,這對於受控輸入圖像來說工作得有點好。但是,我所遇到的問題是,我無法爲與這些圖像略有不同的圖像創建圖像。

我有大約5個每個字母的樣品來訓練,這應該足夠好。

有沒有人知道什麼是一個很好的算法來使用它?

我的想法(歸一化圖像後):

  • 計數的圖像,並且每一個字母圖像,看看哪一個產生錯誤的至少量之間的差。但這對於大型數據集不起作用。
  • 檢測拐角並比較相對位置。
  • ???

任何幫助,將不勝感激!

+2

歡迎來到OCR。 – delnan 2012-04-04 20:14:21

+0

嘿,我在測試圖像上試了一下Tessearact,但是它失敗了(甚至在將分割模式設置爲「一個單詞」之後)。對於這個具體的案例,IMO來說,OCR似乎是一種矯枉過正,因爲這些圖像在任何情況下都非常相似。 – Blender 2012-04-04 20:17:59

+1

尺度和旋轉不變性呢? – moooeeeep 2012-04-04 20:36:17

回答

13

我覺得這是某種監督式學習。您需要對圖像進行特徵提取,然後根據您爲每幅圖像計算出的特徵矢量進行分類。

特徵提取

在一見鍾情,即特徵提取部分看起來像Hu-Moments一個很好的方案。只需計算image moments,然後從這些計算cv::HuMoments。然後你有一個7維實值特徵空間(每個圖像一個特徵向量)。 或者,您可以省略此步驟並將每個像素值用作單獨的特徵。我認爲this answer中的建議朝着這個方向發展,但增加了一個PCA壓縮以減少特徵空間的維度。

分類

對於分級部分,幾乎可以使用任何你喜歡的分類算法。您可以對每個字母使用SVM(二進制yes-no分類),您可以使用NaiveBayes(最大可能字母是什麼),或者您可以使用k-NearestNeighbor(kNN,特徵空間中的最小空間距離)方法,例如flann

尤其對於基於距離的分類器(例如kNN),您應該考慮對您的特徵空間進行歸一化(例如,將所有維度值縮放到某個範圍的歐幾里得距離,或者使用諸如馬氏距離之類的東西)。這是爲了避免在分類過程中存在價值差異較大的特徵。

評價

當然,你需要訓練數據,即圖像特徵向量給出正確的字母。 還有一個流程,用於評估您的流程,例如交叉驗證。


在這種情況下,您可能還想看看template matching。在這種情況下,您將使用訓練集中的可用模式卷積候選圖像。輸出圖像中的高值表示該圖案位於該位置的可能性很高。

+0

非常感謝您的幫助!我儘可能爲單個圖像計算Hu時刻,但在此之後,分類讓我難以接受大量的錯誤。希望我能在第二天內使用它,看看它的工作效果如何! – Blender 2012-04-05 07:56:57

+0

剛拿到分類器就行!對於我的訓練數據(duh)它是100%準確的,但是對於新輸入有一些麻煩。我將用更準確的樣本對它進行更多的培訓。 – Blender 2012-04-05 08:26:30

+0

@Blender - 很高興這有幫助! – moooeeeep 2012-04-05 08:49:38

5

這是一個識別問題。我個人使用PCA和機器學習技術(可能是SVM)的組合。這些都是相當大的主題,因此我怕我真的不能過多闡述,但這裏的非常基本的過程:

  1. 收集你的訓練圖像(超過每一封信,但不要發瘋)
  2. 標籤他們(可能意味着很多東西,在這種情況下,它意味着組中的字母,邏輯組 - 全部圖片 - > 1,所有的B圖像 - > 2等)
  3. 訓練分類
    • 通過PCA分解運行一切
    • 將您所有的訓練圖像投影到PCA空間
    • 運行通過SVM投影圖像(如果它是一類分類,做他們一次一個,否則做一次全部。)
    • 保存了你的PCA特徵向量和SVM訓練數據
  4. 運行識別
    • 負載在PCA空間
    • 負載在SVM訓練數據
    • 對於每一個新的形象,項目成PCA空間,並問你的SVM分類它。
    • 如果你得到一個答案(一個數字)映射回一個字母(1 - > A,2 - > B等)。
+0

謝謝!我現在正在閱讀PCA。最後用於線性代數... – Blender 2012-04-04 20:40:47

4
+0

我通過第二個閱讀,我似乎已經這樣做(比較不同的像素和找到最小化該錯誤的圖像)。第一個是有點隱蔽,並沒有解釋發生了什麼很好,但謝謝你的鏈接!我會對第一個如何工作做一些研究。 – Blender 2012-04-04 21:09:12

2

幾天前我有類似的問題。但它是數字識別。不適用於字母表。

我在OpenCV中使用kNearestNeighbour實現了一個簡單的OCR。

下面的鏈接和代碼:

Simple Digit Recognition OCR in OpenCV-Python

的字母執行。希望它有效。

+0

當我實際編碼算法時,這個答案真的很有用。謝謝! – Blender 2012-04-05 09:01:18

0

您可以嘗試通過上傳你的訓練數據(〜1秒的,2S,3S 50個....圖像9S)到demo.nanonets.ai(免費使用)

1)在這裏上傳你的訓練數據構建模型:

demo.nanonets.ai

2)然後查詢使用以下(Python代碼)的API:

import requests 
import json 
import urllib 
model_name = "Enter-Your-Model-Name-Here" 
url = "http://images.clipartpanda.com/number-one-clipart-847-blue-number-one-clip-art.png" 
files = {'uploadfile': urllib.urlopen(url).read()} 
url = "http://demo.nanonets.ai/classify/?appId="+model_name 
r = requests.post(url, files=files) 
print json.loads(r.content) 

3)的響應是這樣的:

{ 
    "message": "Model trained", 
    "result": [ 
    { 
     "label": "1", 
     "probability": 0.95 
    }, 
    { 
     "label": "2", 
     "probability": 0.01 
    }, 

    .... 

    { 
     "label": "9", 
     "probability": 0.005 
    } 
    ] 
}