[英]Thresholding image using opencv library in python with different flags using for loop
[英]Proper image thresholding to prepare it for OCR in python using opencv
我真的是opencv的新手,也是python的初學者。
我有這張圖片:
我想以某種方式應用適當的閾值以僅保留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)
結果:
為什么不只將圖像中的值保持在某個閾值之上?
像這樣:
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)
您可能甚至會更多地使用閾值並獲得更好的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.