如何提取图片中的数字?

请将这个图片下载后,保存为 sample.png

from PIL import Image
import pytesseract
text=pytesseract.image_to_string(Image.open('sample.png'),lang='eng')  
print(text)

尝试另外一段代码

import cv2
import pytesseract
img = cv2.imread("/tmp/sample.png")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                            cv2.THRESH_BINARY_INV, 23, 100)
bnt = cv2.bitwise_not(thr)
txt = pytesseract.image_to_string(bnt, config="--psm 6")
res = ''.join(i for i in txt if i.isalnum())
print(res)

结果 ee ,差太远了。

没有任何结果,请问哪位可以提取这里面的字符?

阅读 2.9k
avatarAI BotBETA

要提取图片中的数字,你可以尝试调整图像预处理的步骤,以提高 OCR(光学字符识别)的准确性。以下是一个更详细的示例,结合了 OpenCV 和 pytesseract 来处理图像并提取数字:

### 解决方案

你可以尝试以下代码,它使用了更复杂的图像预处理步骤来提高 OCR 的准确性:

import cv2
import pytesseract
import numpy as np

读取图像

img = cv2.imread('sample.png')

转换为灰度图像

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

应用高斯模糊以减少噪声

blurred = cv2.GaussianBlur(gray, (5, 5), 0)

使用Otsu's二值化方法

ret3, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

反转颜色(如果需要)

binary = cv2.bitwise_not(binary)

使用pytesseract提取文本

custom_config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(binary, config=custom_config, lang='eng')

提取并打印数字

digits = ''.join(filter(str.isdigit, text))
print("Extracted Digits:", digits)


### 解释

1. **读取图像**:使用 OpenCV 读取图像文件。
2. **转换为灰度图像**:将图像转换为灰度,因为 OCR 通常对灰度图像或二值图像效果更好。
3. **高斯模糊**:应用高斯模糊来减少图像中的噪声。
4. **Otsu's二值化**:使用 Otsu's 方法自动确定阈值并进行二值化。
5. **反转颜色**:有时反转颜色(白色文本变为黑色,黑色背景变为白色)可以提高 OCR 的准确性。
6. **使用 pytesseract 提取文本**:配置 pytesseract 以使用特定的 OCR 引擎和页面分割模式(PSM)。
7. **提取数字**:从提取的文本中过滤出数字。

这个代码示例可能需要根据实际的图像情况进行调整,比如调整模糊参数、二值化方法或 OCR 配置等。希望这能帮助你提取图片中的数字!
1 个回答

运用了形态学操作中的腐蚀来去除经过处理之后网格所形成的白点,但是还是有一些误差,第三个字符'5' tesseract 会识别为'S',正在想办法改进算法。

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
image = cv2.imread('sample.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
inverted_image = cv2.bitwise_not(gray_image)
binary_image = cv2.adaptiveThreshold(inverted_image, 255, 
                                     cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                                     cv2.THRESH_BINARY, 11, 2)
denoised_image = cv2.medianBlur(binary_image, 3)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4))
eroded_image = cv2.erode(denoised_image, kernel)
mask = (denoised_image == 255) & (eroded_image == 0)
denoised_image[mask] = 0
cv2.imwrite('preprocessed_image.png', denoised_image)
text = pytesseract.image_to_string(denoised_image, config='--psm 6')
print("result:", text.strip())

处理后的图片:
腐蚀前:腐蚀前
腐蚀后:腐蚀后

输出:

result: CRSP

注:
这段代码中运用了光学字符识别(OCR)引擎Tesseract,代码中的pytesseract.pytesseract.tesseract_cmd参数根据Tesseract安装位置更改。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏