适当的图像阈值处理以使用 opencv 在 python 中为 OCR 做准备

Dr.*_*pis 4 python ocr opencv image-processing image-thresholding

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

我有这张图片:

原始 bmp 24 位图像

我想以某种方式应用适当的阈值来保留 6 位数字。

更大的图景是我打算尝试分别对每个数字的图像执行手动 OCR,在每个数字级别上使用 k-最近邻算法 (kNearest.findNearest)

问题是我无法充分清理数字,尤其是带有蓝色水印的“7”数字。

到目前为止,我尝试过的步骤如下:

我正在从磁盘读取图像

# IMREAD_UNCHANGED is -1
image = cv2.imread(sys.argv[1], cv2.IMREAD_UNCHANGED)
Run Code Online (Sandbox Code Playgroud)

然后我只保留蓝色通道以去除数字“7”周围的蓝色水印,有效地将其转换为单通道图像

image = image[:,:,0] 
# openned with -1 which means as is, 
# so the blue channel is the first in BGR
Run Code Online (Sandbox Code Playgroud)

单通道 - 仅红色 - 图像

然后我将它乘以一点以增加数字和背景之间的对比度:

image = cv2.multiply(image, 1.5)
Run Code Online (Sandbox Code Playgroud)

相乘图像以增加对比度

最后我执行 Binary+Otsu 阈值处理:

_,thressed1 = cv2.threshold(image,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
Run Code Online (Sandbox Code Playgroud)

二值欧胡岛阈值图像

正如您所看到的,最终结果非常好,除了数字“7”保留了很多噪音。

如何改善最终结果?请在可能的情况下提供图像示例结果,这比仅代码片段更好理解。

Kin*_*t 金 6

可以尝试用不同的内核(如3、51)对灰度(blur)图像进行中值模糊,将模糊结果进行划分,并对其进行阈值处理。像这样的东西?

在此处输入图片说明


#!/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)
Run Code Online (Sandbox Code Playgroud)

结果?

在此处输入图片说明