一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用 OpenCV 和 pytesseract 的光學字符識別 (OCR)

 新用戶41252833 2022-11-29 發(fā)布于河北

使用輪廓法計算銀行對賬單(pdf文件)的平均銀行余額

圖片

在金融世界中,銀行對賬單是客戶申請貸款時最常見的文件之一,這是正確的。銀行對賬單告訴貸款機構客戶支付貸款 EMI 的能力,平均銀行余額是用于相同目的的變量之一。ABB(平均銀行余額)是使用銀行對賬單中的期末余額欄計算的,該欄通常位于銀行對賬單的最后一個位置。

還有其他方法可以從圖像中讀取文本,然后對其進行必要的分析。

在本文中,我們將看到使用 OpenCV 和 pytesseract 讀取和提取特定信息以計算我們感興趣的變量。

輸入

使用了一家印度私人銀行的銀行對賬單的 PDF 文件作為編寫此代碼的輸入。

OpenCV

OpenCV(開源計算機視覺)是用 C++ 編寫的 Python 庫,最初由 Intel 開發(fā),也可以免費使用。OpenCV 用于讀取圖像并執(zhí)行圖像處理技術。我使用 Contour 方法檢測然后提取圖像的特定部分。要安裝 OpenCV 庫,你可以在 anaconda 提示符下使用以下命令:

pip install opencv-python

Tesseract

Tesseract 是最初由惠普開發(fā)的光學字符識別引擎。2005 年,惠普將其開源,其開發(fā)自 2006 年以來一直由谷歌贊助。

用 Python 閱讀 PDF

我們將使用 pdf2image 庫將 PDF 轉換為圖像。要安裝此庫,你可以在 anaconda 提示符下使用以下命令:

pip install pdf2image

我們將使用以下代碼將 PDF 轉換為 .jpg 文件:

from pdf2image import convert_from_path
pdf = convert_from_path('May20 Bank Statement.pdf',poppler_path='C:\\Users\\sagar\\Downloads\\soft\\Release-21.02.0\\poppler-21.02.0\\Library\\bin')
for i in range(len(pdf)):
      # Save pages as images in the pdf
    pdf[i].save('page'+ str(i) +'.jpg''JPEG')

圖像預處理

導入我們下一部分需要的庫。

import cv2 as cv
import imutils

第一步是使用 OpenCV 讀取圖像并將其存儲在變量中。

img = cv.imread('page0.jpg')

下一步是將RGB圖像轉換為灰度圖像。我們將使用 OpenCV 中的 cv2.cvtColor 函數(shù)進行此轉換。我們需要為這個函數(shù)提供兩個參數(shù),圖像和轉換類型。對于灰度圖像,我們需要提供 cv2.COLOR_BGR2GRAY 作為轉換類型。轉換類型還有其他選項可供探索。

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

一旦我們有了灰度圖像,我們將對它應用閾值處理。為此,我們將使用 cv.threshold 函數(shù)。它有四個參數(shù),灰度圖像、閾值像素值、最大像素值和閾值類型。

閾值化背后的主要思想是,如果輸入圖像中的像素強度大于閾值,則該像素將變?yōu)榘咨绻袼貜姸刃∮陂撝担瑒t將其標記為黑色。在簡單的閾值化中,我們必須手動提供閾值,如果你的圖像包含大量噪聲,這將變得乏味,因此我們將在我們的案例中使用 Otsu 的技術。

ret, thresh1 = cv.threshold(gray, 0255, cv.THRESH_OTSU | cv.THRESH_BINARY_INV)

在 Otsu 的技術中,閾值是使用來自輸入圖像的像素的直方圖自動計算的。這種技術在雙峰圖像上效果更好,因為在這種情況下,我們將得到兩個不同的峰值,并且閾值將通過最小化這兩個類別的方差來計算。

在我們的例子中,閾值為 156。當你在 python 中執(zhí)行閾值處理時,你將得到兩個輸出,閾值和閾值處理后的輸出圖像。

圖片

接下來,我們將使用特定用途的結構元素或內(nèi)核來執(zhí)行膨脹。請記住,由于閾值化,我們的輸入圖像現(xiàn)在具有白色前景和黑色背景。在膨脹中,我們剛剛指定的內(nèi)核在圖像中滑動(就像卷積一樣),如果內(nèi)核下至少有一個像素為 1,則輸入的像素為 1。

所以基本上,我們將增加白色前景的大小,在我們的例子中,它是銀行對賬單上的文本。這些顏色轉換、閾值化和膨脹的步驟都是圖像預處理的一部分。

rect_kernel = cv.getStructuringElement(cv.MORPH_RECT, (1818)) 
dilation = cv.dilate(thresh1, rect_kernel, iterations = 1)

提取裁剪圖像

完成圖像預處理后,下一步是提取圖像的相關部分,在我們的例子中是提到賬戶月度交易級別信息的表。我們將使用輪廓方法來做到這一點。

根據(jù) OpenCV 文檔上的定義,輪廓是一條連接沿邊界具有相同強度的所有連續(xù)點的曲線。輪廓在二值圖像上效果最好,這也解釋了我們現(xiàn)在的預處理步驟。cv.findContours() 需要3個輸入,即圖像、輪廓檢索模式和輪廓逼近方法。我們正在使用以下代碼片段。

contours, hierarchy = cv.findContours(dilation, cv.RETR_EXTERNAL,                                                  cv.CHAIN_APPROX_NONE)

上述代碼片段的輸出是圖像和層次結構中所有輪廓的 Python 列表。Python 輪廓列表基本上包含輪廓邊界點的 (x,y) 坐標。假設你的圖像僅包含一個簡單的正方形,那么它的輪廓將包含正方形所有邊界點的 (x,y) 坐標。輪廓近似法讓你決定是要包含所有邊界點的坐標還是只包含重要的坐標。

例如,在方形示例中,你將需要四個點的坐標來確定其在圖像上的位置。我們正在使用近似方法,它將存儲所有邊界點。

層次結構和輪廓檢索模式是相互關聯(lián)的?;旧?,當輪廓內(nèi)有輪廓時,它很有用,例如正方形中有正方形的情況。輪廓檢索模式可讓你決定是要檢索所有輪廓還是僅在一個輪廓之外,并將此輸出存儲在層次結構中。對于我們的情況,我們不會使用它們。

現(xiàn)在,我們將所有輪廓的所有邊界點的 (x,y) 坐標存儲為 Numpy 數(shù)組。但是我們不需要所有輪廓,因為我們只需要一個帶有期末余額列的輪廓,它只是列表中最大的輪廓。所以我們按它們的面積對這些輪廓進行排序并選擇第一個。

im2 = img.copy()
cnts = sorted(contours, key = cv.contourArea, reverse = True)[:10]
screenCnt = None
screenCnt = cnts[0]

接下來,我們將使用 cv. boundingRect() 函數(shù)獲取矩形左上角的 (x,y) 坐標, (w,h) 是它的寬度和高度。

x, y, w, h = cv.boundingRect(screenCnt)

所以現(xiàn)在我們有了圖像上的點,可以根據(jù) (x,y,w,h) 裁剪圖像的特定部分。

## Cropping the text block for giving input to OCR 
cropped = im2[y:y + h, x:x + w]

現(xiàn)在,我們將使用 pytesseract 從裁剪后的圖像中提取文本。

import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
text = pytesseract.image_to_string(cropped)

該文本顯然不是一個干凈的形式,因為它將包含所有文本詳細信息,例如交易詳細信息、日期、交易 ID 等,因此下一步是使用 Python 從期末余額列中提取數(shù)字。

我們的銀行對賬單有Date, Narration, chq./Ref no., Value Dt, Withdrawal amt, Deposit amt, Closing balance等列。一旦我們在 '\n' 上拆分文本,我們將得到一個 Python 列表,該列表將表中的一行作為列表中的一個元素。

由于我們的興趣在于最后一列,我們只需要拆分列表元素,然后提取拆分后的最后一個元素。

接下來,我們將使用正則表達式從列表中刪除所有字母和空白字符串,以便其中只有期末余額值。

最后一步是將這些字符串轉換為浮點數(shù),然后取平均值,這將是我們的平均銀行余額。

li = text.split('\n')
li2 = []

for i in li:
    a=i.split(' ')
    li2.append(a[-1])
import re

for i in li2:
    a = re.findall('[a-zA-Z]', i)
    if len(a)>0 or len(i)==0:
        li2.remove(i)
li3 = []

for i in li2:
    j=i.replace(',','')
    li3.append(j)
li4 = []

for i in li3:
    try:
        li4.append(float(i))
    except:
        None
        
import numpy as np
int(np.mean(li4))

尾注

輪廓法是從圖像中進行目標檢測的最簡單的方法之一。由于銀行對賬單是相當簡潔的圖像,因此此方法適用于此目的,正如我們在開始時討論的那樣,平均銀行余額是金融機構的重要變量之一。

此代碼特定于特定銀行的對帳單,但我們可以輕松調(diào)整它以使其也適用于其他銀行的對帳單。


☆ END ☆

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    中文久久乱码一区二区| 日韩欧美中文字幕人妻| 国产毛片不卡视频在线| 美女黄片大全在线观看| 中文精品人妻一区二区| 亚洲精品深夜福利视频| 91精品视频全国免费| 精品少妇一区二区三区四区| 麻豆视频传媒入口在线看| 欧美人妻少妇精品久久性色| 欧美胖熟妇一区二区三区| 精品一区二区三区人妻视频| 国产午夜精品在线免费看| 亚洲精品蜜桃在线观看| 日本欧美一区二区三区就| 91久久精品国产一区蜜臀| 亚洲精品av少妇在线观看| 大香蕉精品视频一区二区| 五月天丁香婷婷一区二区| 日韩av亚洲一区二区三区| 国产精品久久女同磨豆腐| 婷婷基地五月激情五月| 国产传媒高清视频在线| 中文字幕五月婷婷免费| 91天堂素人精品系列全集| 最近中文字幕高清中文字幕无| 亚洲高清亚洲欧美一区二区| 国产传媒精品视频一区| 日韩成人中文字幕在线一区| 麻豆一区二区三区在线免费| 久久综合九色综合欧美| 成人午夜免费观看视频| 欧美不卡高清一区二区三区| 日韩熟妇人妻一区二区三区| 亚洲中文在线中文字幕91| 欧美日韩国产另类一区二区| 亚洲一区二区三在线播放| 精品国产91亚洲一区二区三区 | 国产午夜精品美女露脸视频 | 最新69国产精品视频| 国产av精品一区二区|