基于Python pytesseract的图像识别:无法提取商品对应价格的问题求助
价格识别失效的核心原因
你目前的代码没有做任何适配性处理,直接把全图扔给Tesseract跑通用识别,存在三个硬伤:
- 无前置图像预处理:原图的光影、货架纹理会和价格区的文字混在一起,Tesseract很容易把高对比度的大字号价格当成背景噪声过滤掉
- 无文本位置采集:原来用的
image_to_string只会返回识别到的纯文本,根本拿不到每段文字在图里的坐标,就算识别出了价格,也没法定位它对应哪个商品 - 无针对性识别配置:Tesseract默认配置对带小数点、货币符号的数字组合识别精度低,很容易漏识价格区域的数字。
可直接上手的实现步骤(面向零基础,无复杂算法)
1. 安装必要依赖
除了你已经装好的pytesseract和本地Tesseract-OCR,只需要装个OpenCV做简单图像预处理:pip install opencv-python
注意要确认本地Tesseract已经装了简体中文、英文的语言包,不然混排的商品名+数字识别率会打折扣
2. 替换原有识别代码,解决识别率问题
把原来的裸识别代码替换成带预处理、带坐标采集的版本,核心逻辑不用自己改:
import pytesseract import cv2 # 保留你已完成的本地Tesseract路径配置 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract' # 读入本地图片 img = cv2.imread("local-filename.jpg") # 灰度转换+二值化预处理,把文字和背景拉开对比度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 调用带坐标返回的OCR方法 ocr_result = pytesseract.image_to_data( thresh, lang='chi_sim+eng', # 限定识别字符范围,减少噪声干扰,针对数字、货币符号优化 config='--psm 6 -c tessedit_char_whitelist=0123456789.$¥' )
这里两个关键配置不用深究原理,直接用即可:
--psm 6是指定Tesseract按“统一排版的文本块”识别,适配超市价签规整的排版逻辑,比默认的全图乱扫模式准确率高很多- 字符白名单把识别范围锁死在数字、货币符号、小数点上,不会把货架上的无关杂点识别成无意义乱码
3. 实现商品-价格配对逻辑
拿到带坐标的识别结果后,用超市货架的通用排版规则做简单匹配就行,不用搞复杂的深度学习模型:
超市货架标识的通用排版规律:同一行陈列的商品,对应的价格固定在该商品名的右侧/下方固定距离处
- 先从返回的识别结果里过滤掉置信度低于60%的块,这些基本都是光影、纹理导致的识别噪声
- 把所有识别到的文本块按纵向坐标排序,纵向位置差小于50像素的块归为同一货架行
- 在每一行的文本块里,找符合“包含数字、带小数点/货币符号”特征的块,就是该行的对应价格;剩下的文本块按横向坐标顺序拼接,就是对应的商品名
简单的判断逻辑示例:
for line in ocr_result.splitlines()[1:]: line_parts = line.split() if len(line_parts) < 12: continue confidence = int(line_parts[10]) text_content = line_parts[11] # 过滤低置信度噪声 if confidence < 60: continue block_x = int(line_parts[6]) block_y = int(line_parts[7]) # 判断当前块是不是价格 is_price = any(c.isdigit() for c in text_content) and ('.' in text_content or '$' in text_content or '¥' in text_content) # 按y坐标分桶归为同一行,把同桶内的价格和商品名做绑定即可
针对当前这张货架图的调优小技巧
- 这张图里的价格字号比商品名大很多,可以在预处理时把轮廓面积超过普通文本块2倍的区域单独裁剪出来,单独喂给Tesseract识别,数字识别率能提升到90%以上——混在小字号文本里识别大字号数字也是很多人用Tesseract识别价格时最容易踩的坑
- 如果还是有数字漏识,可以单独把二值化后的图片做一次轻微的膨胀/腐蚀操作,把粘连的数字笔画分开,减少识别错误
- 配对的时候不要把距离超过100像素的块硬凑成一对,超市价签的价格和对应商品的横向距离一般不会太远,避免跨商品配对错误。
内容的提问来源于stack exchange,提问作者6563cc10d2
相关产品推荐
相关产品推荐

