使用Pytesseract与CV2优化数字识别:图像反转异常排查
CV2图像预处理反色问题的解决方案
你当前的代码中,preprocess_image函数使用THRESH_BINARY_INV + cv2.THRESH_OTSU进行二值化,这本身就是反二值化操作——会将黑字白底的原始图像转换为白字黑底,和你的预期完全相反。你提到调整反转参数无效,可能是OTSU自动阈值计算受图像亮度影响,或是中间文件读写引入了额外问题,以下是针对性解决方案:
方案1:直接替换反二值化为普通二值化
将反二值化参数改为THRESH_BINARY,直接生成黑字白底的二值图像:
def preprocess_image(image_path): image = cv2.imread(image_path) grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 替换THRESH_BINARY_INV为THRESH_BINARY _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) return binary
方案2:根据图像亮度自动判断是否反转
如果原始图像的背景亮度不稳定(比如存在阴影、偏色),OTSU自动阈值可能误判,可通过计算平均亮度动态调整二值化方式:
def preprocess_image(image_path): image = cv2.imread(image_path) grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 计算图像平均亮度 mean_brightness = grey.mean() # 背景偏亮(平均亮度>127)用普通二值化,偏暗则用反二值化 if mean_brightness > 127: _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) else: _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) return binary
方案3:规避文件读写的潜在问题
你的代码多次将图像保存为文件再读取,可能因格式兼容问题导致像素值意外反转。可以直接在内存中完成截图转CV2、CV2转PIL的转换,无需存盘:
import numpy as np def take_screenshot_and_preprocess(x1, y1, x2, y2, config=None): screenshot = pyautogui.screenshot(region=(x1, y1, x2 - x1, y2 - y1)) # 直接将PIL截图转为CV2格式的BGR图像 screenshot_cv = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR) grey = cv2.cvtColor(screenshot_cv, cv2.COLOR_BGR2GRAY) mean_brightness = grey.mean() if mean_brightness > 127: _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) else: _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) return binary def extract_text_from_image(preprocessed_image, config=None): # 直接将CV2灰度图转为PIL图像 preprocessed_pil_image = Image.fromarray(preprocessed_image) text = pytesseract.image_to_string(preprocessed_pil_image, config=config) return text
补充说明
你提到调整反转参数无效,可能是因为原始截图的背景并非纯均匀白色,OTSU自动计算的阈值导致二值化结果不符合预期。使用平均亮度判断的方案可以适配更多场景,而内存直接转换则能避免文件读写带来的未知问题。
内容的提问来源于stack exchange,提问作者WParcival
相关产品推荐
相关产品推荐

