使用cv2与pytesseract提取黑底红字截图文本失败求助
问题解决:黑底红字截图文本提取失败
核心问题是PIL截图的色彩空间与OpenCV默认色彩空间不匹配:
ImageGrab.grab()获取的图像是RGB格式- 你用
cv2.COLOR_BGR2GRAY转换灰度,相当于把RGB当成BGR处理,红字的红色通道会被错误映射,导致灰度图中红字对比度极低,阈值处理后文字被完全过滤,Tesseract自然识别不到。
修复代码
直接把灰度转换的色彩空间参数改成COLOR_RGB2GRAY即可:
import sys from PIL import ImageGrab import cv2 import numpy as np from pytesseract import pytesseract pytesseract.tesseract_cmd = r'C:\site-packages\Tesseract-OCR\tesseract.exe' def Extract(tupleCoordenates): pic = ImageGrab.grab(bbox=tupleCoordenates) img = np.array(pic) # 修正色彩空间转换:RGB转灰度 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) limiar, imgThreash = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) text = pytesseract.image_to_string(imgThreash) return text
额外优化(针对红字场景)
因为红字在RGB的R通道中亮度最高,可以直接提取R通道做阈值处理,进一步提升对比度:
def Extract(tupleCoordenates): pic = ImageGrab.grab(bbox=tupleCoordenates) img = np.array(pic) # 直接提取R通道 r_channel = img[:, :, 0] limiar, imgThreash = cv2.threshold(r_channel, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) text = pytesseract.image_to_string(imgThreash) return text
注释:存盘后再读取正常,是因为
cv2.imread()会自动把JPG等格式的图像转换成BGR,此时色彩空间匹配,灰度转换自然正确。
内容的提问来源于stack exchange,提问作者wmendes
相关产品推荐
相关产品推荐

