1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        實(shí)戰(zhàn):使用 OpenCV 和 PyTesseract 對文檔進(jìn)行OCR

        共 5131字,需瀏覽 11分鐘

         ·

        2021-08-01 12:24

        點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

        重磅干貨,第一時(shí)間送達(dá)

        隨著世界各地的組織都希望將其運(yùn)營數(shù)字化,將物理文檔轉(zhuǎn)換為數(shù)字格式是非常常見的。這通常通過光學(xué)字符識別 (OCR) 完成,其中文本圖像(掃描的物理文檔)通過幾種成熟的文本識別算法之一轉(zhuǎn)換為機(jī)器文本。當(dāng)在干凈的背景下處理打印文本時(shí),文檔 OCR 的性能最佳,具有一致的段落和字體大小。


        在實(shí)踐中,這種情況遠(yuǎn)非常態(tài)。發(fā)票、表格甚至身份證明文件的信息分散在整個(gè)文件空間中,這使得以數(shù)字方式提取相關(guān)數(shù)據(jù)的任務(wù)變得更加復(fù)雜。


        在本文中,我們將探索一種使用 Python 為 OCR 定義文檔圖像區(qū)域的簡單方法。我們將使用信息分散在整個(gè)文檔空間的文檔示例——護(hù)照。以下樣本護(hù)照放置在白色背景中,模擬復(fù)印的護(hù)照副本。


        從此護(hù)照圖像中,我們希望獲得以下字段:

        名字/名字姓氏中文名漢字的姓氏護(hù)照號碼

        首先,我們將導(dǎo)入所有必需的包。最重要的包是用于計(jì)算機(jī)視覺操作的OpenCV和PyTesseract,它是強(qiáng)大的 Tesseract OCR 引擎的 Python 包裝器。

        from cv2 import cv2import pytesseractimport pandas as pdimport numpy as npimport mathfrom matplotlib import pyplot as plt

        接下來,我們將使用 cv2.imread 讀取我們的護(hù)照圖像。我們的第一個(gè)任務(wù)是從這個(gè)偽掃描頁面中提取實(shí)際的護(hù)照文件區(qū)域。我們將通過檢測護(hù)照的邊緣并將其從圖像中裁剪出來來實(shí)現(xiàn)這一點(diǎn)。

        img = cv2.imread('images\Passport.png',0)img_copy = img.copy()img_canny = cv2.Canny(img_copy, 50, 100, apertureSize = 3)

        OpenCV 庫中包含的Canny 算法使用多階段過程來檢測圖像中的邊緣。使用的最后三個(gè)參數(shù)是較低閾值和較高閾值(分別為 minVal 和 maxVal),以及內(nèi)核大小。


        運(yùn)行 Canny 算法會產(chǎn)生以下輸出。請注意,由于選擇了低閾值,因此保留了最少的邊緣。

        img_hough = cv2.HoughLinesP(img_canny, 1, math.pi / 180, 100, minLineLength = 100, maxLineGap = 10)

        接下來,我們在邊緣檢測圖像上使用另一種稱為霍夫變換的算法,通過檢測線繪制出護(hù)照區(qū)域的形狀。minLineLength 參數(shù)定義了一個(gè)形狀必須包含多少像素才能被視為“線”,而 maxLineGap 參數(shù)表示像素序列中被視為相同形狀的最大允許間隙。

        (x, y, w, h) = (np.amin(img_hough, axis = 0)[0,0], np.amin(img_hough, axis = 0)[0,1], np.amax(img_hough, axis = 0)[0,0] - np.amin(img_hough, axis = 0)[0,0], np.amax(img_hough, axis = 0)[0,1] - np.amin(img_hough, axis = 0)[0,1])img_roi = img_copy[y:y+h,x:x+w]

        我們的護(hù)照四面都是直線——文件的邊緣。因此,有了我們的線條信息,我們可以選擇通過檢測到的線條的外邊緣來裁剪我們的護(hù)照區(qū)域:


        將護(hù)照豎直旋轉(zhuǎn)后,我們開始在圖像中選擇要捕獲數(shù)據(jù)的區(qū)域。幾乎所有國際護(hù)照都符合ICAO 標(biāo)準(zhǔn),該標(biāo)準(zhǔn)概述了護(hù)照頁的設(shè)計(jì)和布局規(guī)范。這些規(guī)范之一是機(jī)讀區(qū) (MRZ),即護(hù)照文件底部有趣的兩行。你們的文件的視覺檢查區(qū) (VIZ) 中的大部分關(guān)鍵信息也包含在機(jī)讀區(qū)中,機(jī)器可以讀取這些信息。在我們的練習(xí)中,那臺機(jī)器是我們值得信賴的 Tesseract 引擎。

        img_roi = cv2.rotate(img_roi, cv2.ROTATE_90_COUNTERCLOCKWISE)(height, width) = img_roi.shapeimg_roi_copy = img_roi.copy()dim_mrz = (x, y, w, h) = (1, round(height*0.9), width-3, round(height-(height*0.9))-2)img_roi_copy = cv2.rectangle(img_roi_copy, (x, y), (x + w ,y + h),(0,0,0),2)

        讓我們使用四個(gè)維度定義護(hù)照圖像中的 MRZ 區(qū)域:水平偏移(從左側(cè))、垂直偏移(從頂部)、寬度和高度。對于 MRZ,我們將假設(shè)它包含在我們護(hù)照的底部 10% 內(nèi)。因此,使用 OpenCV 的矩形函數(shù),我們可以在區(qū)域周圍繪制一個(gè)框來驗(yàn)證我們的尺寸選擇。

        img_mrz = img_roi[y:y+h, x:x+w]img_mrz =cv2.GaussianBlur(img_mrz, (3,3), 0)ret, img_mrz = cv2.threshold(img_mrz,127,255,cv2.THRESH_TOZERO)

        在新圖像中裁剪所選區(qū)域。我們將對裁剪后的圖像進(jìn)行一些基本的圖像預(yù)處理,以促進(jìn)更好的讀出——高斯模糊和簡單閾值。

        mrz = pytesseract.image_to_string(img_mrz, config = '--psm 12')

        我們現(xiàn)在準(zhǔn)備應(yīng)用 OCR 處理。在我們的 image_to_string 屬性中,我們配置了“帶有方向和腳本檢測(OSD)的稀疏文本”的頁面分割方法。這旨在捕獲我們圖像中的所有可用文本。

        將 Pytesseract 輸出與我們的原始護(hù)照圖像進(jìn)行比較,我們可以觀察到讀取特殊字符時(shí)的一些錯(cuò)誤。為了獲得更準(zhǔn)確的讀數(shù),可以使用 Pytesseract 的白名單配置進(jìn)行優(yōu)化;然而就我們的目的而言,電流讀數(shù)的準(zhǔn)確性就足夠了。

        mrz = [line for line in mrz.split('\n') if len(line)>10]if mrz[0][0:2] == 'P<':  lastname = mrz[0].split('<')[1][3:]else:  lastname = mrz[0].split('<')[0][5:]firstname = [i for i in mrz[0].split('<') if (i).isspace() == 0 and len(i) > 0][1]pp_no = mrz[1][:9]

        根據(jù) ICAO 關(guān)于 MRZ 代碼結(jié)構(gòu)的指導(dǎo)原則應(yīng)用一些字符串操作,我們可以提取護(hù)照持有人的姓氏、名字和護(hù)照號碼:

        不是英文的文本怎么辦?沒問題——Tesseract 引擎已經(jīng)為100 多種語言訓(xùn)練了模型(盡管每種支持的語言的 OCR 性能的穩(wěn)健性不同)。

        img_roi_copy = img_roi.copy()dim_lastname_chi = (x, y, w, h) = (455, 1210, 120, 70)img_lastname_chi = img_roi[y:y+h, x:x+w]img_lastname_chi = cv2.GaussianBlur(img_lastname_chi, (3,3), 0)ret, img_lastname_chi = cv2.threshold(img_lastname_chi,127,255,cv2.THRESH_TOZERO)dim_firstname_chi = (x, y, w, h) = (455, 1300, 120, 70)img_firstname_chi = img_roi[y:y+h, x:x+w]img_firstname_chi = cv2.GaussianBlur(img_firstname_chi, (3,3), 0)ret, img_firstname_chi = cv2.threshold(img_firstname_chi,127,255,cv2.THRESH_TOZERO)

        使用相同的區(qū)域選擇方法,我們再次為目標(biāo)數(shù)據(jù)字段定義維度(x、y、w、h),并對裁剪后的圖像提取應(yīng)用模糊和閾值處理。

        lastname_chi = pytesseract.image_to_string(img_lastname_chi, lang = 'chi_sim', config = '--psm 7')firstname_chi = pytesseract.image_to_string(img_firstname_chi, lang = 'chi_sim', config = '--psm 7')


        現(xiàn)在,在我們的 image_to_string 參數(shù)中,我們將添加輸入文本的語言腳本,簡體中文。

        要完成練習(xí),請將所有收集的字段傳遞給字典并輸出到表格以供實(shí)際使用。


        OCR 感興趣區(qū)域的顯式定義只是在OCR 中獲取所需數(shù)據(jù)的眾多方法之一。根據(jù)你們的用例,使用其他方法(例如輪廓分析或?qū)ο髾z測)可能最有效,正如我們的護(hù)照練習(xí)所示,在應(yīng)用 OCR 之前對圖像進(jìn)行適當(dāng)?shù)念A(yù)處理是關(guān)鍵。在處理具有不同圖像質(zhì)量的真實(shí)文檔時(shí),嘗試不同的預(yù)處理技術(shù)以找到最適合你們的文檔類型的方法非常重要。


        下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
        在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

        下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
        小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

        下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
        小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

        交流群


        歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


        瀏覽 53
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人女毛片免费观看 | 狠狠搞狠狠操 | 成人毛片18女人毛片免费看百度 | 日韩欧美大香蕉 | 一級免費网站 | 国产又粗又大又硬视频 | 女同久久久 | 91爽爽 | 内射学生妹在线 | 亚洲国产一区二区三区 |