2016-09-07 155 views
2

我正在處理具有文字的圖像。問題是這些圖像是收據,經過很多轉換後,文字質量下降。 我正在使用python和opencv。 我嘗試了很多來自文檔Morphological Transformations的形態轉換的組合,但我沒有得到滿意的結果。提高圖像中字母的質量

我現在這樣做的權利(我要評論什麼,我已經試過了,只是讓註釋掉我使用的是什麼):

kernel = np.ones((2, 2), np.uint8) 
# opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) 
# closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) 
# dilation = cv2.dilate(opening, kernel, iterations=1) 
# kernel = np.ones((3, 3), np.uint8) 
erosion = cv2.erode(img, kernel, iterations=1) 
# gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) 
# 
img = erosion.copy() 

有了這個,從這個原始圖像:

enter image description here

我得到這個:

enter image description here

好像你看到的那樣好一點。但它仍然太糟糕了。 OCR(tesseract)不能很好地識別這些字符。我已經訓練過,但正如你可以注意到的,每個「e」都是不同的,等等。

我得到了很好的結果,但我想,如果我解決了這個問題,他們會更好。

也許我可以做另一件事,或者使用形態轉換的更好的組合。如果還有其他工具(PIL,imagemagick等)可以使用,我可以使用它。

這裏的整體形象,所以你可以看到它的外觀:

enter image description here

正如我所說,這是沒有那麼糟糕,但有點是字母的更「優化」將是完美的。

+1

嘗試使用形態閉合而不是侵蝕。至於這些字母,它們看起來與一開始有所不同,所以我認爲用簡單的算法就可以做很多事情。一些掃描儀用完全相同的位圖替換類似的字母,所以也許你可以複製這種行爲。但請注意:施樂機器中存在一個非常醜陋的錯誤,使圖書館員的生活非常不舒服 – meetaig

回答

0

經過多年研究這個主題,我現在可以告訴我,我想要做的事情需要付出很大的努力,速度很慢,從未像我預期的那樣工作。字符中像素的不規則性總是不可預知的,這就是「簡單算法」不起作用的原因。

問題:這是不可能的,那麼有一個體面的OCR,它可以讀取損壞的字符?

答:不,這不是不可能的。但是,這需要「一點點」,而不僅僅是使用侵蝕,形態學關閉或類似的東西。

那麼,怎麼樣?神經網絡:)

這裏有兩個驚人的論文,幫助我很多:

Can we build language-independent OCR using LSTM networks?

Reading Scene Text in Deep Convolutional Sequences

對於那些誰不熟悉RNN,我可以建議是:

Understanding LSTM Networks

還有一個python庫,它工作得很好(不幸的是,甚至更好的爲C++):

ocropy

我真的希望這可以幫助別人。

0

您是否考慮過相鄰像素並添加它們的總和?

例如:

n = numpy.zeros((3,3)) 
s = numpy.zeros((3,3)) 
w = numpy.zeros((3,3)) 
e = numpy.zeros((3,3)) 

n[0][1] = 1 
s[2][1] = 1 
w[1][0] = 1 
e[1][2] = 1 

img_n = cv2.erode(img, n, iterations=1) 
img_s = cv2.erode(img, s, iterations=1) 
img_w = cv2.erode(img, w, iterations=1) 
img_e = cv2.erode(img, e, iterations=1) 

result = img_n + img_s + img_w + img_e + img 

此外,既可以numpy的或CV2添加的陣列。

+0

謝謝,我會尋找_a相鄰像素算法_左右。 但是在你提出的答案中,我認爲用'n [4]'表示'n [1] [0]'或?由於n是3行3列的矩陣。 但是,它不工作。 _result_看起來完全如_img_。也許應該改變一些東西。 –

+0

用修改後的蒙版更新了答案。基本上'n'在北方有更大的權重,'南方有更多的權重等等。你可以增加捲積蒙版的大小並嘗試。 –

0

以我的經驗腐蝕損害OCR質量。如果你有灰度圖像(不是二進制),你可以使用更好的二值化算法。我使用SAUVOLA算法進行二值化。如果你只有二進制圖像,你可以做的最好的事情是消除噪音(去除所有小點)。

+0

謝謝你的回答。 你如何使用Sauvola? Leptonica?我使用OpenCV中提出的otsu二值化,但如果我找到如何在python上實現(或使用它),也可以使用Sauvola進行測試。 –

+0

我使用SAUVOLA算法的C++實現。 https://github.com/benob/opencv-utils/blob/master/include/binarize.h 你也可以嘗試使用MEAN的adaptiveThreshold(http://docs.opencv.org/3.1.0/d7/ D4D/tutorial_py_thresholding.html)。這種二值化表現出與SAUVOLA類似的結果。 –