[英]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是不可能的嗎?
答:不,這不是不可能的。 但它需要“一點點”,而不僅僅是使用侵蝕,形態學關閉或類似的東西。
那怎么樣? 神經網絡 :)
這里有兩篇很棒的論文對我很有幫助:
對於那些不熟悉RNN的人,我可以建議:
還有一個python庫,它工作得很好(不幸的是,對C ++來說更好):
我真的希望這可以幫助別人。
您是否考慮了相鄰像素並添加了它們的總和。
例如:
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.