Pytesseract 读取彩色文本
Pytesseract read coloured text
我正在尝试使用 Pytesseract
阅读彩色(红色和橙色)文本。
我试着不对图像进行灰度化,但这也不起作用。
图像,它可以读取
无法读取的图像
我当前的代码是:
tesstr = pytesseract.image_to_string(
cv2.cvtColor(nm.array(cap), cv2.COLOR_BGR2GRAY),
config="--psm 7")
您可以申请:
-
- 侵蚀
-
- 自适应阈值
侵蚀会降低图像的厚度,如:
Original Image
Erosion
当我们对 53 和 31 图像应用腐蚀时
Original Image
Erosion
-
当blockSize
=27
-
Erosion
Threshold
当blockSize
=11
-
Erosion
Threshold
对于每个图像,我们需要应用不同的阈值处理
代码:
import cv2
from pytesseract import image_to_string
img_lst = ["fifty_three.png", "thirty_one.png"]
for img_pth in img_lst:
img = cv2.imread(img_pth)
(h, w) = img.shape[:2]
img = cv2.resize(img, (w*2, h*2))
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
erd = cv2.erode(gry, None, iterations=2)
if img_pth == "fifty_three.png":
thr = cv2.adaptiveThreshold(erd, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 27, 5)
else:
thr = cv2.adaptiveThreshold(erd, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 5)
txt = image_to_string(thr, config="--psm 6 digits")
print(txt)
cv2.imshow("thr", thr)
cv2.waitKey(0)
结果:
53
31
可能问题1:为什么两个不同的块大小参数?
嗯,每个图像的厚度是不同的。所以文本识别需要两个不同的参数。
可能的问题2:为什么None
定义为erode
方法的内核?
不幸的是,我找不到合适的腐蚀内核。因此我设置为 None.
这个小函数(如下)适用于任何颜色
ec9Ut.png
击球结果
x18MN.png
击球结果
SFr48.png
击球结果
import cv2
from pytesseract import image_to_string
def getText(filename):
img = cv2.imread(filename)
HSV_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(HSV_img)
thresh = cv2.threshold(v, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
txt = image_to_string(thresh, config="--psm 6 digits")
return txt
text = getText('ec9Ut.png')
print(text)
text = getText('x18MN.png')
print(text)
text = getText('SFr48.png')
print(text)
输出
46
31
53
我正在尝试使用 Pytesseract
阅读彩色(红色和橙色)文本。
我试着不对图像进行灰度化,但这也不起作用。
图像,它可以读取
无法读取的图像
我当前的代码是:
tesstr = pytesseract.image_to_string(
cv2.cvtColor(nm.array(cap), cv2.COLOR_BGR2GRAY),
config="--psm 7")
您可以申请:
-
- 侵蚀
-
- 自适应阈值
侵蚀会降低图像的厚度,如:
Original Image | Erosion |
---|---|
当我们对 53 和 31 图像应用腐蚀时
Original Image | Erosion |
---|---|
-
当
blockSize
=27Erosion Threshold
当
blockSize
=11Erosion Threshold
对于每个图像,我们需要应用不同的阈值处理
代码:
import cv2
from pytesseract import image_to_string
img_lst = ["fifty_three.png", "thirty_one.png"]
for img_pth in img_lst:
img = cv2.imread(img_pth)
(h, w) = img.shape[:2]
img = cv2.resize(img, (w*2, h*2))
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
erd = cv2.erode(gry, None, iterations=2)
if img_pth == "fifty_three.png":
thr = cv2.adaptiveThreshold(erd, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 27, 5)
else:
thr = cv2.adaptiveThreshold(erd, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 5)
txt = image_to_string(thr, config="--psm 6 digits")
print(txt)
cv2.imshow("thr", thr)
cv2.waitKey(0)
结果:
53
31
可能问题1:为什么两个不同的块大小参数?
嗯,每个图像的厚度是不同的。所以文本识别需要两个不同的参数。
可能的问题2:为什么None
定义为erode
方法的内核?
不幸的是,我找不到合适的腐蚀内核。因此我设置为 None.
这个小函数(如下)适用于任何颜色
ec9Ut.png
击球结果
x18MN.png
击球结果
SFr48.png
击球结果
import cv2
from pytesseract import image_to_string
def getText(filename):
img = cv2.imread(filename)
HSV_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(HSV_img)
thresh = cv2.threshold(v, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
txt = image_to_string(thresh, config="--psm 6 digits")
return txt
text = getText('ec9Ut.png')
print(text)
text = getText('x18MN.png')
print(text)
text = getText('SFr48.png')
print(text)
输出
46
31
53