簡體   English   中英

提高圖像中字母的質量

[英]Improve the quality of the letters in a image

我正在處理有文字的圖像。 問題是這些圖像是收據,經過大量的轉換后,文本質量下降。 我正在使用python和opencv。 我正在嘗試使用doc 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()

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

在此輸入圖像描述

我明白了:

在此輸入圖像描述

你可以看到它好一點。 但它仍然太糟糕了。 OCR(tesseract)不能很好地識別這里的角色。 我已經訓練過,但是你可以注意到,每個“e”都是不同的,依此類推。

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

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

這是整個圖像,所以你可以看到它的外觀:

在此輸入圖像描述

正如我所說,它並沒有那么糟糕,但對字母的一點點“優化”將是完美的。

經過多年這個主題的工作,我現在可以告訴我,我想要做的事情需要付出很大的努力,它很慢,而且從來沒有按照我的預期工作。 字符中像素的不規則性總是不可預測的,這就是“簡單算法”不起作用的原因。

問題:那么擁有一個可以讀取損壞字符的體面OCR是不可能的嗎?

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

那怎么樣? 神經網絡 :)

這里有兩篇很棒的論文對我很有幫助:

我們可以使用LSTM網絡構建與語言無關的OCR嗎?

在深度卷積序列中讀取場景文本

對於那些不熟悉RNN的人,我可以建議:

了解LSTM網絡

還有一個python庫,它工作得很好(不幸的是,對C ++來說更好):

ocropy

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

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

例如:

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添加數組。

根據我的經驗,侵蝕會損害OCR質量。 如果您有灰度圖像(非二進制),則可以使用更好的二值化算法。 我使用SAUVOLA算法進行二值化。 如果您只有二進制圖像,那么您可以做的最好的事情是消除噪音(刪除所有小點)。

我找到了Ramer-Douglas-Peucker算法,我試圖在Haskell中為閉合多邊形實現它。 也許它可以解決一些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM