天天看點

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

原标題:中文履歷表格提取,手寫漢字識别(Python+OpenCV)

所有代碼擷取:

履歷

網上對表格框的提取的相關資料較少,尤其是Python+OpenCV的實作方面。

整體流程

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

如今OpenCV官方的Document裡都包含了各API的Python版用法,從C++轉換到Python用起來意外的順手。這裡附上官方的線上Document位址,記得選對應版本:https://docs.opencv.org/

該部分的編譯環境如下:

(1)Ubuntu16.04 64位 支援utf-8編碼

(2)Python2.7

(3)OpenCV3.4.3 (與Python2.7編譯通)

(4)Python2.7 numpy子產品、PIL子產品、logging子產品、pickle子產品、os子產品、random子產品、time子產品、matplotlib子產品、math子產品、csv子產品

讀取表格圖檔檔案

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

這段即将test_data檔案中的所有檔案進行周遊讀取,也可注釋最下方的兩行,并去除docu_num一行的注釋,即可對一張圖檔檔案進行反複的讀取、處理。

統計圖中長橫線的斜率來判斷整體需要旋轉矯正的角度

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

這段做的是旋轉校正操作,先把表格圖檔轉換為灰階圖,再用Canny算子提取邊緣(灰階+Canny是提取邊緣的标準操作)得到如下這張圖檔edges_whole.jpg

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)
python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

之後便是用getRotationMatrix2D、warpAffine函數進行旋轉變換,此處筆者拷貝了一份不進行繪圖操作的圖檔(不然都塗花了,幹嘛為難自己)。旋轉後的表格圖檔如下image_Rotation.jpg:

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

通過對表格左下角直角進行識别,将其頂點統一平移矯正至(78,1581)

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

這段做的是平移校正操作,其中大部分是為了應對資料集中的各種意外情況,譬如表格形式不同。但對于Github中給出的三幅較為統一的圖檔,核心的操作隻有對旋轉校正後的表格左下角進行橫線、豎線用HoughLinesP進行提取,歸一後求二者的交點。将交點平移至設定好的坐标即可統籌處理所有表格圖檔。此處對霍夫變換求出的各條直線分别與設定好兩個等分點進行距離求解,選出最靠近等分點的橫線、豎線作為歸一結果。求得交點坐标後用np.array函數與cv.warpAffine函數即可完成平移操作。

橫線、豎線的交點求得後在旋轉後的表格圖像上作圖如下line_detect_possible_demo.jpg:

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

分别通過對二值化後的表格用長橫條、長豎條核心進行開操作,将表格分别化為全橫線與全豎線,疊加後提取交點,即可得到表格中每個矩形的四個頂點

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

此段是功能實作的核心操作:通過對校正圖像進行橫向、縱向的投影,并提取直線、直線交點,提取輪廓後通過所需表格框的尺寸資料對交點進行篩選、比對,即可得到表格中的各個框四個頂點的坐标。此處理對表格中的小框效果拔群,對大型框進行提取可能遇到一框中有多個小框的情況,需要後續加以限制(統計該框内是否有别的頂點)。具體操作是:

對未塗花的原始圖像進行灰階變化和自适應門檻值的二值化操作adaptiveThreshold,這樣能最大可能地保留表格中的直線,效果如下圖th2.jpg:

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

之後對圖像進行先腐蝕erode後膨脹dilate的閉操作,腐蝕與膨脹分别使用N*1與1*N的形态學操作中的核進行處理。該操作可以了解為把表格中所有的像素進行橫向、縱向的投影,且投影會往原先已存在直線上偏移,而文字狀的不構成直線的像素則會在腐蝕操作中被抹消。就像從長條形的橫、縱栅格中看表格圖檔一般。将橫向、縱向投影好的圖檔進行疊加即如下圖mask.jpg:

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

表格被神奇地提取出來了!這一步需要注意,一定要是旋轉校正過的圖像,因為對于一張傾斜的圖像,投影操作會讓圖像變“正”了,實際上圖像并沒有被旋轉過來,這對後續的坐标提取是緻命的。既然已經提取出了表格框,那我們就可以通過bitwise_and函數提取出表格框中的各個交點,如下圖joints.jpg:

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

接下來即通過findContours函數尋找圖像輪廓,并用contourArea函數求出各個輪廓的面積,以對過小的輪廓進行排除。通過approxPolyDP與boundingRect函數用矩形去包圍各個輪廓,即可得到該表格圖檔中各個矩形框的位置資料。之後通過再次使用findContours函數周遊圖像輪廓,用尺寸資料對矩形框進行篩選即可得到表格中所需的框的集合。在校正圖像上畫出這個集合裡的所有框,如下圖table_out.jpg:

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

矯正後的表格中資訊的大緻位置各在一定範圍内,根據大緻位置的坐标點篩選出該表中該資訊對應的矩形框具體坐标

python手寫漢字識别_中文履歷表格提取,手寫漢字識别(Python+OpenCV)

既然框都已經被提取出來了,那不是大功告成了嗎?

并沒有。因為我們還需要對所需要的位置的框進行提取,先前提取出的框又不附帶标簽。是以我們此處需要做兩步:

首先是選擇标準圖像中所需的框位置的中心點作為這個框的“ID”,标準圖像即先前所說的坐标(78,1581)所在的那張圖檔。上文代碼裡即選擇(700,370)作為“性别”資料的所在框的大緻位置。

其次是通過周遊的方式篩選出這個中心點坐标所處在的矩形框的坐标。因為框較大,是以即使校正的不夠精準,這種方法一樣可以将目标框精準地框出,隻要标準圖像中的那個大緻位置不偏移得太過嚴重。傳回搜狐,檢視更多

責任編輯: