5

我想从图像的特定区域提取文本,例如身份证上的姓名和身份证号码。我要从中提取文本的身份证是中文的(中国身份证)。我已经尝试过这段代码,但它只是提取了我不需要的地址和出生日期。我只需要姓名身份证号码

import cv2
from PIL import Image
import pytesseract
import argparse
import os

image = cv2.imread("E:/face.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
filename = "{}.png".format(os.getpid())
cv2.imwrite(filename,gray)

text = pytesseract.image_to_string(Image.open(filename), lang='chi_sim')
print(text)
os.remove(filename)

我还附上了我试图从中提取文本的图像。我已经根据我的知识进行了尝试,但没有成功。任何帮助和指导将不胜感激。在此处输入图像描述

这是二进制图像

4

2 回答 2

6

我可以在查找文本信息之前建议一个预处理步骤。代码很容易理解。

代码:

image = cv2.imread(r'C:\Users\Jackson\Desktop\face.jpg')

#--- dilation on the green channel ---
dilated_img = cv2.dilate(image[:,:,1], np.ones((7, 7), np.uint8))
bg_img = cv2.medianBlur(dilated_img, 21)

#--- finding absolute difference to preserve edges ---
diff_img = 255 - cv2.absdiff(image[:,:,1], bg_img)

#--- normalizing between 0 to 255 ---
norm_img = cv2.normalize(diff_img, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
cv2.imshow('norm_img', cv2.resize(norm_img, (0, 0), fx = 0.5, fy = 0.5))

在此处输入图像描述

#--- Otsu threshold ---
th = cv2.threshold(norm_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv2.imshow('th', cv2.resize(th, (0, 0), fx = 0.5, fy = 0.5))

在此处输入图像描述

使用它,如果您能找到相关的文字信息,请告诉我!

于 2018-07-11T07:47:48.673 回答
0

在 pytesseract 中, lang = 'chi_sim' 尝试将数字也解释为汉字。使用 lang = 'eng' 正确获取数字

于 2019-06-24T04:20:13.853 回答