2012-03-21 267 views
2

這是一個後續的Prepare complex image for OCR合併邊緣和填充區域

我有一個形象的Canny邊緣檢測與數字輸出:

Canny edge image

正如你所看到的,我有一個數字不同的邊緣,從信用卡上的浮雕而導致。目標將是具有固體數字,這適合於字符識別。

這是一種嘗試以「填充」使用形態關閉操作與菱形形狀的5x5的結構化元素的數字:

Morphological close operation

我嘗試過各種結構元素,但是沒有多大成功。您可以看到如何創建孔(數字9和0)以及形狀被扭曲(數字3)。

你能否推薦一種更好的方法來填充結構,但沒有將不同的數字粘合在一起並保持原始形狀?

然而,即使在應用關閉操作後數字很差並且數字垂直分開,也已經有了很好的識別結果。

感謝, 瓦倫丁

+0

瓦倫丁,我正在處理與您一樣的問題(使用OCR讀取信用卡)。我已經使用tesseract在手動預處理後讀取圖像取得了一些成功,但我仍在努力使這些處理自動化。 我在想你最終解決了什麼問題?你的代碼是否可用?我很樂意與你比較筆記。 – bjmc 2012-11-02 21:13:03

+0

你可以給我發一封郵件(www.valentin-manthei。如果你想的話)。我通過使用模板/特徵匹配技術和附加標準來改進結果,從而實現了OCR。儘管如此,預處理是最糟糕的部分。整個過濾器鏈可動態調整參數,現在最終可以完全掃描一些信用卡號碼,但只能在良好環境下(閃電,分辨率)進行掃描。 – valentin 2012-11-05 14:32:48

回答

2

enter image description here我認爲,你可以使用高級灰度二值化技術,達到更好的效果,就像大內核(我用50×50)sauvola二值化。該閾值濾波器考慮了灰度值的局部變化,並且對限幅變化不敏感。它也有一些高通/低通屬性取決於設置。 見實施JavaOCR項目:

http://sourceforge.net/projects/javaocr/

(PS:50×50內核是沒有問題的 - 這個實現速度內核大小無關)

更新,只是試圖信用卡,二值化在我的OCR撥號結果如下:

反射表面會產生很多噪音,但我認爲這可以通過一些更多的預處理來管理 。

+0

非常感謝您的意見。這是40x40內核和sauvola算法的結果:http://i.imgur.com/QWlPc.jpg(雖然我沒有在JavaOCR中找到sauvola源代碼)。結果非常嘈雜,但可能會用高斯模糊進行優化。但是,我不確定這是如何解決部分數字的問題,這不適用於字符識別(我只能用所有方法得到輪廓)。 – valentin 2012-03-21 14:24:51

+0

由於sauvola使用Mx和widnow上的方差,它已經具有低通濾波器屬性。但對銀反射塑料表面來說顯然還不夠。在這個示例中,我的切片代碼無法提取字形,但我敢說,即使圖像失真,我在JavaOCR中使用的基於概率的識別對於信用卡號字體也會很好地工作 – 2012-03-21 17:58:12

1

你還沒有顯示任何代碼,所以我們不能太多幫助。這裏是如何使用一些形態學操作來填補一些空白而不改變大小的片段,然後再嘗試canny操作。

// OTSU, then binary threshold 
Imgproc.threshold(colorImg, grayImg, 0, 255.0, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY); 

// Morphological reduction of noise, strengthen lines 
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(7, 7)); 
Imgproc.dilate(grayImg, grayImg2, element); 
Imgproc.erode(grayImg2, grayImg, element); 

// Edge detection 
Imgproc.Canny(grayImg, output, 50, 50); 

但是,您應該看看card.io,它讀取信用卡。預處理圖像處理非常困難,因爲光照變化非常大。你最好使用機器學習。