簡體   English   中英

適當的圖像閾值處理,以使用opencv在python中為OCR做好准備

[英]Proper image thresholding to prepare it for OCR in python using opencv

我真的是opencv的新手,也是python的初學者。

我有這張圖片:

原始bmp 24位圖像

我想以某種方式應用適當的閾值以僅保留6位數字。

更大的圖景是,我打算嘗試在每個數字級別(kNearest.findNearest)上使用k最近鄰算法對每個數字分別對圖像進行手動OCR。

問題是我無法充分清理數字,尤其是帶有藍色水印的“ 7”數字。

我到目前為止嘗試過的步驟如下:

我正在從磁盤讀取圖像

# IMREAD_UNCHANGED is -1
image = cv2.imread(sys.argv[1], cv2.IMREAD_UNCHANGED)

然后,我只保留藍色通道以消除數字“ 7”周圍的藍色水印,從而有效地將其轉換為單個通道圖像

image = image[:,:,0] 
# openned with -1 which means as is, 
# so the blue channel is the first in BGR

單通道-僅紅色-圖片

然后我將其相乘以增加數字和背景之間的對比度:

image = cv2.multiply(image, 1.5)

倍增圖像以增加對比度

最后,我執行Binary + Otsu閾值化:

_,thressed1 = cv2.threshold(image,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

瓦胡島二進制閾值圖像

如您所見,除了數字'7'保留了大量噪音外,最終結果還不錯。

如何提高最終結果? 請在可能的情況下提供圖像示例結果,這比僅提供代碼段更好理解。

您可以嘗試對具有不同內核(例如3、51)的灰度(模糊)圖像進行中值模糊處理,將模糊結果除以閾值。 像這樣的東西:

在此處輸入圖片說明


#!/usr/bin/python3
# 2018/09/23 17:29 (CST) 
# (中秋節快樂)
# (Happy Mid-Autumn Festival)

import cv2 
import numpy as np 

fname = "color.png"
bgray = cv2.imread(fname)[...,0]

blured1 = cv2.medianBlur(bgray,3)
blured2 = cv2.medianBlur(bgray,51)
divided = np.ma.divide(blured1, blured2).data
normed = np.uint8(255*divided/divided.max())
th, threshed = cv2.threshold(normed, 100, 255, cv2.THRESH_OTSU)

dst = np.vstack((bgray, blured1, blured2, normed, threshed)) 
cv2.imwrite("dst.png", dst)

結果:

在此處輸入圖片說明

完全刪除煩人的圖章似乎並不容易。

您可以做的是通過

  • 計算低通圖像(高斯濾波器,形態學閉合); 過濾器的大小應略大於字符的大小;

  • 將原始圖像除以低通圖像。

然后,您可以使用Otsu。

在此處輸入圖片說明

如您所見,結果並不完美。

為什么不只將圖像中的值保持在某個閾值之上?

像這樣:

import cv2
import numpy as np

img = cv2.imread("./a.png")[:,:,0]  # the last readable image

new_img = []
for line in img:
    new_img.append(np.array(list(map(lambda x: 0 if x < 100 else 255, line))))

new_img = np.array(list(map(lambda x: np.array(x), new_img)))

cv2.imwrite("./b.png", new_img) 

看起來很棒:

您可能甚至會更多地使用閾值並獲得更好的結果。

我在藍色頻道上嘗試了與伊夫略有不同的方法: 藍色通道

  • 應用中值過濾器(r = 2):

過濾圖像

  • 使用邊緣檢測(例如,Sobel運算符):

檢測到邊緣

  • 自動閾值(大津)

閾值圖像

  • 圖像關閉

封閉圖像

這種方法似乎使輸出的雜音少一些。 但是,必須解決數字中的漏洞。 這可以通過檢測被白色像素完全包圍的黑色輪廓並將其簡單地填充為白色來完成。

暫無
暫無

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

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