Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用OCR从图像中提取文本_Python_Opencv_Tesseract_Python Tesseract_Pytesser - Fatal编程技术网

在python中使用OCR从图像中提取文本

在python中使用OCR从图像中提取文本,python,opencv,tesseract,python-tesseract,pytesser,Python,Opencv,Tesseract,Python Tesseract,Pytesser,我想从图像的特定区域提取文本,比如身份证上的姓名和身份证号码。我想从中提取文本的身份证是中文的(中文身份证)。 我尝试过这个代码,但它只是提取了我不需要的地址和出生日期。我只需要姓名和身份证号码 import cv2 from PIL import Image import pytesseract import argparse import os image = cv2.imread("E:/face.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BG

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

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)
我还附上了我试图从中提取文本的图像。据我所知,我已经试过了,但没有成功。任何帮助和指导都将不胜感激


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

代码:

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))


使用它,让我知道你是否能够找到相关的文本信息

在pytesseract中,lang='chi_sim'试图将数字也解释为汉字。
使用lang='eng'正确识别数字

你得到了吗?作为tesseract的输出…显示错误。显示错误将帮助这里的人给出解决方案。如果您不知道如何继续解决此问题,请查找其他教程。@devahishprasad是的,我从代码中获得此输出(出生 1991年7.月14日 住 址 上濂市宝山区渭`鳙七村鹏 号5o3雹)@奎师那我请求帮助。我现有的代码没有给我想要的结果,所以我请求帮助here@Tehseen你也可以附上二值图像吗?如果二值图像本身有任何信息丢失,那么它将无法识别字符。我已经使用了你的代码,我能够提取图像上第一行的名称,但是它仍然没有提取卡的最后一行上的ID号。图像上很清楚,但我不知道为什么它没有提取。这是我从这段代码中得到的输出“姓名` 费家杰…翼 叠沣瓢 男二 黾族汉 _ …′^出<代码>…生>)翼叠G肝勇7.月斓亘 住址 上诲市宝山区泗塘七村93 '号503室"′ ′′二"我已将原始图像转换为灰度,然后对该灰度图像进行膨胀,然后找到绝对差异,现在结果有所改善。现在我得到了ID号,但不令人满意。这是输出“性别 男〈 “ =) 黾族汉… ` _ _′ .…′′z′'出 生<代码>'「或叠g′丐菩荠二]7′_眉菩卒垂′暮′日>“`住 址 上诲市宝山区泗塘七村腋 号503菖] ′…<代码>]..
uu′'
毛 ′ 公民身份号码 '′′“31b『D9i991o蓁141011“@Tehseen我想你已经调整了一些膨胀参数,比如使用的内核类型和内核的大小。或者也可以尝试执行中值模糊来去除不需要的小斑点(在选择内核大小时也要小心)。我已经更新了膨胀代码,如“Explated_img=cv2.Explate(灰色,np.one)((5,5),np.uint8)和“bg_img=cv2.medianBlur(displated_img,23)”现在更好了,但仍然是第一行的内容,而且我只想提取第一行的名称和最后一行的ID号。这是我现在得到的输出。姓 名 费家加 __ 「`′' 性名u′男… ' 民族汉 __ 出生 199壕年~7.月童4.日 住 址 上海市宝山区泗塘七村93乙工乙道 ′ 公民身份号码 310109199107141011..您能指导我如何针对特定区域仅提取姓名和ID号吗?
#--- 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))