如何使用Python提取图像中绿色字体的数字
问题原因
你现在写的代码第一步就把图像转成了灰度图,直接丢失了最核心的绿色字体颜色特征,三个数字全部混在灰度图里,OCR根本没法区分哪个是目标内容,自然识别结果不对。
正确实现逻辑
核心思路是先靠颜色特征把绿色数字单独抠出来,再做OCR识别,步骤如下:
- 把读取到的BGR图像转成HSV颜色空间,这个颜色空间对特定颜色的筛选精度远高于原生BGR格式
- 设定绿色对应的HSV阈值范围,生成掩码把非绿色的背景、其他颜色数字全部过滤成黑色,只保留绿色数字区域
- 简单做个形态学操作去掉掩码里的噪点,再喂给Tesseract做识别,同时限定只识别数字,提升准确率
可直接运行的修正代码
import cv2 import numpy as np import pytesseract # 读取原图 img = cv2.imread("image.png") # 转HSV空间做颜色筛选 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 绿色的HSV阈值范围,可根据实际图片的绿色深浅微调 lower_green = np.array([35, 40, 40]) upper_green = np.array([77, 255, 255]) # 生成绿色区域掩码 green_mask = cv2.inRange(hsv_img, lower_green, upper_green) # 开运算去小噪点 kernel = np.ones((2, 2), np.uint8) clean_mask = cv2.morphologyEx(green_mask, cv2.MORPH_OPEN, kernel) # 识别时限定只识别数字,psm设为7适配单行数字场景 result = pytesseract.image_to_string( clean_mask, config="--oem 3 --psm 7 -c tessedit_char_whitelist=0123456789" ) print(result.strip())
调参提示
- 如果运行后没识别到数字,就把HSV的绿色范围稍微调宽一点,不同截图里的绿色受亮度、压缩影响会有偏差
- 如果识别结果带多余杂项,就把形态学操作的核大小稍微调大一点,过滤残留的噪点
内容的提问来源于stack exchange,提问作者skyhan
相关产品推荐
相关产品推荐

