Dr.*_*pis 4 python ocr opencv image-processing image-thresholding
我真的是 opencv 的新手,也是 python 的初学者。
我有这张图片:
我想以某种方式应用适当的阈值来保留 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”保留了很多噪音。
如何改善最终结果?请在可能的情况下提供图像示例结果,这比仅代码片段更好理解。
可以尝试用不同的内核(如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)
结果?
| 归档时间: |
|
| 查看次数: |
2483 次 |
| 最近记录: |