You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 06:15:04