使用opencv python识别图像中的文本数据以读取mm/dd、描述和数量

使用opencv python识别图像中的文本数据以读取mm/dd、描述和数量,python,opencv,image-processing,expression,ocr,Python,Opencv,Image Processing,Expression,Ocr,进口稀土 进口cv2 导入pytesseract 从PyteSeract导入输出 从PIL导入图像 from pytesseract import image_to_string img = cv2.imread('/home/cybermakarov/Desktop/1.Chase Bank-page-002.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT) keys = list(d.keys()) da

进口稀土 进口cv2 导入pytesseract 从PyteSeract导入输出 从PIL导入图像

from pytesseract import image_to_string

img = cv2.imread('/home/cybermakarov/Desktop/1.Chase Bank-page-002.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys())


date_pattern = '^(0[1-9]|[12]|[1-9]|3[02])/'
Description_pattern='([0-9]+\/[0-9]+)|([0-9]+)|([0-9\,\.]+)'


n_boxes = len(d['text'])
for i in range(n_boxes):
    if int(d['conf'][i]) > 60:
        if re.match(description_pattern, d['text'][i]):
            (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
            detect_img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 300, 0), 2)

crop_img = img[y:y+h, x:x+w]

cv2.imshow('img',img)
#cv2.imshow("Cropped",  crop_img)
cv2.waitKey(0)
请帮助我使用正则表达式识别日期、说明和金额, 我真的很努力地去识别这些模式,但是没有。第二 问题是我想在代码识别日期时裁剪图像, 说明和金额

以下是我的图片:


要识别图像中的文本,必须对图像进行预处理。为此,我们可以删除水平和垂直网格线,然后将图像放入Pytesseract OCR。以下是检测到的要删除的行,以绿色突出显示:

结果

Pytesseract的输出

ELECTRONIC WITHDRAWALS

DATE DESCRIPTION AMOUNT
01/02 Merchant Service Merch Fee 8030996550 CCD ID: 1841010148 $34.30
01/03 Authnet Gateway Billing 104820413 CCD ID: 1870568569 22.95
01/04 01/04 Online Transfer To Mma ...4622 Transaction#: 7794410276 200.00
01/08 01/08 Online Payment 7732727073 To Cleaning Connoisseur 300.00
01/11 01/11 Online Payment 7744233248 To Ramsey Sweis 148.80
01/11 01/11 Online Transfer To Mma ...4622 Transaction#: 7816805988 200.00
01/11 01/11 Payment To Chase Card Ending IN 2342 500.00
01/11 Aqaba Holdings, Inahl-51 Ahl-51 CCD ID: 1113720048 1,441.21
01/14 01/12 Payment To Chase Card Ending IN 2342 1,000.00
01/14 01/12 Online Transfer To Mma ...4622 Transaction#: 7841026719 1,000.00
01/16 01/16 Payment To Chase Card Ending IN 2342 1,000.00
01/16 01/16 Online Payment 7852542882 To Oakhurst Golf & Country Club 495.00
01/17 01/17 Online Payment 7762351731 To Ramsey Sweis 399.05
01/18 01/18 Online Transfer To Mma ...4622 Transaction#: 7837118990 200.00
01/18 Small Business Icpayment PPD ID: 1131414876 302.24
01/22 01/21 Payment To Chase Card Ending IN 2342 1,000.00
01/23 01/23 Payment To Chase Card Ending IN 2342 1,000.00
01/25 01/25 Online Payment 77868551 17 To Lv Office Limited Partnership 644.40
代码


在应用OCR之前,需要对图像进行预处理以删除水平线。您可以将输入图像添加到帖子中吗?这是我使用open with regix进行简单检测的实际图像,您可以在我的代码中看到。为了帮助您,我们需要使用示例图像,请添加您尝试进行OCR的图像,而不是您的应用程序的屏幕截图workspace@nathancy添加了原始图像,非常好,它提高了检测精度,但下一个问题不是找到所有的日期,我需要描述和金额正则表达式的逻辑,第三个问题是我需要裁剪检测到的日期、描述和金额,以便将其传递给tesseract。OCR中的所有日期都打印到控制台,我不知道你找到所有的日期是什么意思。获得数据后,可以执行过滤以获得所需的文本。这个答案只是为了帮助您将图像中的数据提取为字符串格式,然后您可以对其应用额外的处理。我使用tesseract在单个中获取所有数据,因此很难确定分割日期、描述和数量。我想找到所有相关数据,以便插入excel表格。
import cv2
import pytesseract
import numpy as np

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

image = cv2.imread('1.jpg')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (35,1))
detect_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(result, [c], -1, (255,255,255), -1)

# Find vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,15))
detect_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(result, [c], -1, (255,255,255), -1)

data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey()