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

如何用Python通过模板匹配将含长数字的图片转换为字符串?

嘿,这个需求其实是典型的模板匹配+字符识别场景,我给你梳理一套清晰的落地步骤,跟着来就行:

第一步:先做好预处理,保证匹配基础
  • 把你的长串数字图片和单个数字模板(0-9各一张最好)统一处理成相同尺寸、相同明暗格式:比如都转成白底黑字的二值图,大小固定为比如20x30像素。如果模板是直接从目标图片里抠出来的,那样式完全匹配,准确率会飙升。
  • 要是目标图片有噪点,先做个简单的滤波,比如用cv2.GaussianBlur()模糊一下,或者用阈值二值化把背景和数字彻底分开。
第二步:用模板匹配定位所有数字

推荐用Python的OpenCV库来做,逻辑很直观:

  1. 把目标图和所有模板都转成灰度图:
    gray_target = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY)
    gray_template = cv2.imread("template_0.png", 0)  # 直接读灰度图
    
  2. 对每个数字模板,用cv2.matchTemplate()在目标图里找匹配区域,推荐用cv2.TM_CCOEFF_NORMED作为匹配方法——返回的数值越接近1,匹配度越高。
  3. 记录每个匹配区域的x轴坐标(因为数字是横向排列的,x坐标决定顺序)、对应的数字,以及匹配分值。
第三步:去重+排序,拿到正确顺序
  • 设置一个匹配阈值(比如0.9),只保留匹配分值超过阈值的结果,过滤掉误匹配。
  • 可能会出现同一个数字被多次匹配的情况(比如相邻区域分值都很高),这时候可以用“非极大值抑制”或者简单的坐标判断:如果两个匹配结果的x坐标差小于模板宽度的一半,就视为同一个数字,只保留分值最高的那个。
  • 把所有有效结果按x坐标从小到大排序,这样排序后的数字就是图片里的真实顺序了。
第四步:生成并保存结果字符串

遍历排序后的匹配结果,把每个模板对应的数字(比如template_5.png对应字符'5')拼接成字符串,最后写入文件即可。

给你个极简代码示例(基于OpenCV)
import cv2
import numpy as np

# 加载目标图片和数字模板
target_img = cv2.imread("long_numbers.png")
gray_target = cv2.cvtColor(target_img, cv2.COLOR_BGR2GRAY)
# 用字典存模板和对应数字
num_templates = {
    '0': cv2.imread("template_0.png", 0),
    '1': cv2.imread("template_1.png", 0),
    '2': cv2.imread("template_2.png", 0),
    # 继续补充3-9的模板
}

match_results = []
threshold = 0.9  # 匹配阈值,可根据实际情况调整

for num, template in num_templates.items():
    w, h = template.shape[::-1]
    # 执行模板匹配
    match_res = cv2.matchTemplate(gray_target, template, cv2.TM_CCOEFF_NORMED)
    # 找到所有符合阈值的匹配位置
    locations = np.where(match_res >= threshold)
    # 记录每个匹配的x坐标、对应数字、匹配分值
    for pt in zip(*locations[::-1]):
        match_results.append((pt[0], num, match_res[pt[1], pt[0]]))

# 按x坐标从小到大排序,保证数字顺序正确
match_results.sort(key=lambda x: x[0])

# 去重:过滤相邻的重复匹配
final_nums = []
prev_x = -1000  # 初始值设远一点
for x, num, score in match_results:
    if x - prev_x > w // 2:
        final_nums.append(num)
        prev_x = x

# 生成结果字符串并保存
result_str = ''.join(final_nums)
print("识别结果:", result_str)
with open("number_result.txt", "w", encoding="utf-8") as f:
    f.write(result_str)
额外小 tips
  • 如果数字有轻微变形或者字体差异,试试先提取目标图的数字轮廓,再和模板的轮廓做匹配(用cv2.matchShapes()),鲁棒性会更好。
  • 要是数字排列不是严格横向,那可以改成按y坐标+ x坐标的组合排序,适配更多排版场景。

内容的提问来源于stack exchange,提问作者Bradderz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:16