如何统一图像内数字颜色并将其提取为字符串?
数字颜色统一与OCR提取解决方案
问题描述
输入图片:
需求:将图片中数字的颜色统一,随后提取数字为字符串。
已完成的代码:
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()
运行后得到的结果:
需要解决的问题:如何调整代码,统一所有数字的颜色并完成图像转字符串的数字提取?
解决方案
第一步:统一数字颜色
当前代码已分别提取绿色、黑色数字的掩码,只需合并两类掩码,生成前景为白色、背景为黑色的二值图,即可实现颜色统一:
# 合并绿色与黑色数字的掩码 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引擎提取二值图中的数字,需先完成依赖安装:
安装Python库:
pip install pytesseract系统层面需安装Tesseract引擎(Windows从官网下载安装包,Ubuntu执行
sudo apt install tesseract-ocr)。代码中添加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
相关产品推荐
相关产品推荐

