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

如何统一图像内数字颜色并将其提取为字符串?

数字颜色统一与OCR提取解决方案

问题描述

输入图片:
input image

需求:将图片中数字的颜色统一,随后提取数字为字符串。

已完成的代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt


def downloadImage(URL):
    """Downloads the image on the URL, and convers to cv2 BGR format"""
    from io import BytesIO
    from PIL import Image as PIL_Image
    import requests

    response = requests.get(URL)
    image = PIL_Image.open(BytesIO(response.content))
    return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)


URL = "https://i.imgur.com/prvJaK3.jpg"

# Read image
colorImage = downloadImage(URL)

RED, GREEN, BLUE = 0, 1, 2
# Filter image with much of GREEN, and little of RED and BLUE
greenImage = (
      (colorImage[:, :, RED] < 50)
    & (colorImage[:, :, GREEN] > 100)
    & (colorImage[:, :, BLUE] < 50)
)

blackImage = (
      (colorImage[:, :, RED] < 60)
    & (colorImage[:, :, GREEN] < 100)
    & (colorImage[:, :, BLUE] < 60)
)

plt.imshow(blackImage)
plt.show()

运行后得到的结果:
output image

需要解决的问题:如何调整代码,统一所有数字的颜色并完成图像转字符串的数字提取?


解决方案

第一步:统一数字颜色

当前代码已分别提取绿色、黑色数字的掩码,只需合并两类掩码,生成前景为白色、背景为黑色的二值图,即可实现颜色统一:

# 合并绿色与黑色数字的掩码
combined_mask = greenImage | blackImage

# 创建空白二值图,背景设为黑色,数字设为白色
binary_image = np.zeros_like(colorImage[:, :, RED], dtype=np.uint8)
binary_image[combined_mask] = 255

# 显示处理后的二值图
plt.imshow(binary_image, cmap='gray')
plt.show()

第二步:数字提取(OCR)

使用Tesseract OCR引擎提取二值图中的数字,需先完成依赖安装:

  1. 安装Python库:

    pip install pytesseract
    

    系统层面需安装Tesseract引擎(Windows从官网下载安装包,Ubuntu执行sudo apt install tesseract-ocr)。

  2. 代码中添加OCR提取逻辑:

import pytesseract

# 若Tesseract未加入系统环境变量,Windows需指定路径
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 配置OCR仅识别数字
custom_config = r'--oem 3 --psm 6 outputbase digits'
extracted_text = pytesseract.image_to_string(binary_image, config=custom_config)

# 清理提取结果,去除多余换行与空格
extracted_text = extracted_text.strip().replace('\n', '')
print("提取的数字字符串:", extracted_text)

完整整合代码

import numpy as np
import cv2
import matplotlib.pyplot as plt
import pytesseract


def downloadImage(URL):
    """Downloads the image on the URL, and converts to cv2 BGR format"""
    from io import BytesIO
    from PIL import Image as PIL_Image
    import requests

    response = requests.get(URL)
    image = PIL_Image.open(BytesIO(response.content))
    return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)


URL = "https://i.imgur.com/prvJaK3.jpg"

# 读取图片
colorImage = downloadImage(URL)

RED, GREEN, BLUE = 0, 1, 2
# 提取绿色数字掩码
greenImage = (
      (colorImage[:, :, RED] < 50)
    & (colorImage[:, :, GREEN] > 100)
    & (colorImage[:, :, BLUE] < 50)
)

# 提取黑色数字掩码
blackImage = (
      (colorImage[:, :, RED] < 60)
    & (colorImage[:, :, GREEN] < 100)
    & (colorImage[:, :, BLUE] < 60)
)

# 合并掩码并生成二值图
combined_mask = greenImage | blackImage
binary_image = np.zeros_like(colorImage[:, :, RED], dtype=np.uint8)
binary_image[combined_mask] = 255

# 可选:形态学闭运算去除小噪声,优化OCR识别率
kernel = np.ones((2,2), np.uint8)
binary_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)

# 显示处理后的图像
plt.imshow(binary_image, cmap='gray')
plt.show()

# OCR提取数字
custom_config = r'--oem 3 --psm 6 outputbase digits'
extracted_text = pytesseract.image_to_string(binary_image, config=custom_config)
extracted_text = extracted_text.strip().replace('\n', '')

print("提取的数字:", extracted_text)

关键说明

  • 形态学闭运算(MORPH_CLOSE)可选,用于消除图像中的小噪点,让数字边缘更连贯,提升OCR识别准确率。
  • OCR配置中--psm 6指定图像为单一均匀文本块,outputbase digits限制仅识别数字,避免干扰字符被误识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:55:37