PythonOpencv圖片識別表格:線條信息計算(投影算法)_第1頁
PythonOpencv圖片識別表格:線條信息計算(投影算法)_第2頁
PythonOpencv圖片識別表格:線條信息計算(投影算法)_第3頁
PythonOpencv圖片識別表格:線條信息計算(投影算法)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PythonOpencv圖?識別表格:線條信息計算(投影算法)PythonOpencv圖?識別表格:線條信息計算(投影算法)通過OpenCV算法識別出圖?中的框線后,?臨?個問題:線條變換為絕對?平和垂直線條并?絕對的?平或垂直,需要變換為絕對的?平線或垂直線。簡單的算法是可以選擇線條的起點(diǎn)或終點(diǎn)作為坐標(biāo),但最好是可以選擇線條的中?的坐標(biāo)。這?設(shè)計了?種軸?投影法,通過線條在垂直軸上的投影得到中?點(diǎn)的坐標(biāo)。以橫線條為例,將線條的cv矩陣傳?,計算在數(shù)據(jù)i軸上的投影,得到中?的i位置,即為絕對?平線的y軸坐標(biāo)。這??定要注意數(shù)據(jù)矩陣中的i、j分別對應(yīng)著cv坐標(biāo)軸的y和x。通過投影算法,可以得到線條垂直坐標(biāo)軸的軸?,同理,將線條在j軸上進(jìn)?投影就可以得到線條的絕對?平或垂直的長度。仔細(xì)分析后我們會發(fā)現(xiàn),在i軸上進(jìn)?投影算法能得到絕對橫線的寬度,在j軸上投影可以得到絕對橫線的長度。那我們是否需要寫?個i軸投影算法和?個j軸投影算法呢?其實(shí)投影原理都?樣,只是投影的軸不同。如果將橫線轉(zhuǎn)置,向i軸投影,是不是就得到了絕對橫線的長度呢?這樣我們就可以?同?套投影算法了。如果是豎線怎么辦呢?豎線剛好相反,向j軸投影得到寬度,向i軸投影得到長度。如何?同?套線段信息計算代碼呢?沒錯,將豎線轉(zhuǎn)置后就變成橫線了,算法?致了!完成了以上思路的梳理,我們就可以寫出對應(yīng)的投影算法了。線條的斷裂另?個問題是線條的斷裂,由于?擾因素導(dǎo)致?根線條中間出現(xiàn)了斷裂,為了應(yīng)對這種問題,我們在投影計算時?持了break,即允許在投影截?上出現(xiàn)?個像素的斷裂。線條被分割為多條線段不是所有的表格框線都是?直連續(xù)的,看下?這個例?,紅框中的表格框線被兩個合并單元格分割成了三段。在線條信息計算時,需要精確的計算出每條線段起?坐標(biāo)信息。為什么呢?這是因?yàn)樯院笪覀冞M(jìn)?單元格重建算法的時候,需要知道表格中每?個橫縱交叉點(diǎn)的完整情況,來決定每個單元格到底有???列。這個問題在表格結(jié)構(gòu)分析算法會詳細(xì)談到的。完整算法根據(jù)以上的分析,我們寫出了下?完整的算法,實(shí)現(xiàn)了線條的投影計算、寬度計算、長度計算、線條中的線段信息的計算,?持了?擾造成的斷裂等情況。'''計算線條的完整信息,包括線條的軸?位置、線條起?pos、內(nèi)部線段的信息原理:通過坐標(biāo)軸投影算法,獲取垂直于該坐標(biāo)軸的線段在該軸上的中?位置前提:輸?的lines_matrix必須是i,j?維數(shù)組,且i為要投影的坐標(biāo)軸(相當(dāng)于cv圖像的y軸,若要投影x軸請先轉(zhuǎn)置后傳?)輸?:lines_matrix-線段的?值變反矩陣;max_break-最??持線段中間出現(xiàn)的斷裂(像素數(shù)量)輸出:線段信息listline_info={'axis':0,#線條軸?'wide':0,#線條粗細(xì)'len':0,#線條總長度(線段長度之和)'segment':[],#線條內(nèi)部的線段信息[[線段長度,線段start,線段end],...]?持?根線條被分割為多條線段(中間跨域?個或多個合并單元格)'segment':[],#線條內(nèi)部的線段信息[[線段長度,線段start,線段end],...]?持?根線條被分割為多條線段(中間跨域?個或多個合并單元格)}輸??例:lines_matrixi0------------------------->ji1------------------------->ji2------------------------->ji3------------------------->j'''defcalc_line_info(lines_matrix,max_break,debug=False):#計算i軸每個位置的投影是否有像素值project_i=[any(x)forxinlines_matrix]#對每個i對應(yīng)的list進(jìn)?any操作,求出i軸上該位置是否出現(xiàn)像素點(diǎn)#取出有像素值的i軸pospos_i=[ifori,xinenumerate(project_i)ifx==True]#異常檢測:若只檢測到?條線或沒有線則返回空iflen(pos_i)<=1:return[]#將連續(xù)的pos分組(?持連續(xù)pos出現(xiàn)10個像素的斷裂)pos_group_i=[]temp_group=[pos_i[0]]#第?個pos默認(rèn)滿?要求,放?臨時結(jié)果中#可調(diào)參數(shù)線段斷層截?像素點(diǎn)foriinrange(1,len(pos_i)):#從第?個pos開始計算ifpos_i[i]-pos_i[i-1]<=5:#連續(xù)像素計為?組,?持截?斷層temp_group.append(pos_i[i])else:pos_group_i.append(temp_group)#上?組結(jié)束,放?結(jié)果中temp_group=[pos_i[i]]#新?組第?個pos默認(rèn)滿?要求,放?臨時結(jié)果中#最后?組pos放?結(jié)果中pos_group_i.append(temp_group)'''線條信息數(shù)據(jù)結(jié)構(gòu)'''line_info={'axis':0,#線條軸?'wide':0,#線條粗細(xì)'len':0,#線條總長度(線段長度之和)'segment':[],#線條內(nèi)部的線段信息[[線段長度,線段start,線段end],...]?持?根線條被分割為多條線段(中間跨域?個或多個合并單元格)}lines_info=[]for(i,poses)inenumerate(pos_group_i):info=line_info.copy()info['axis']=int(np.median(poses))info['wide']=poses[-1]-poses[0]+1'''計算圖像中線段的長度(即在j軸像素點(diǎn)的個數(shù))注意有可能?條線段被分割成了多個分段(中間出現(xiàn)了合并單元格),因此該算法需要返回線段長度同時要?持?擾造成的線段中間出現(xiàn)的斷裂list[]'''#獲取該條線所在的矩陣并轉(zhuǎn)置area=np.transpose(lines_matrix[poses[0]:poses[-1]+1])#取得每個投影點(diǎn)的像素情況mask=[str(any(x)+0)forxinarea]#any(x)+0可以將TrueFalse轉(zhuǎn)為10#將mask中連續(xù)的1分割出來,每段連續(xù)的1即為?條線段s=''.join(mask).split('0')segs=[[i,len(v)]for(i,v)inenumerate(s)iflen(v)>0](#調(diào)整每條線段在原始list中正確的中的i只是s數(shù)組中的位置,并?mask中的位置)possegsforiinrange(1,len(segs)):#每條線段的pos=segs中的i+之前線段的總長度segs[i][0]=segs[i][0]+sum([x[1]-1for(j,x)inenumerate(segs)ifj<i])segments=[segs[0]]#初始化為第?條線段#10若有多條線段,進(jìn)?智能線段分析:因?擾造成的像素內(nèi)的斷裂?動連在?起MAX_LEN_BREAK=max_break#最??持線段斷裂長度iflen(segs)>1:#從第?條線段開始判斷與上?條線段之間是斷裂還是間隔foriinrange(1,len(segs)):delta=segs[i][0]-segs[i-1][0]-segs[i-1][1]ifdelta<MAX_LEN_BREAK:#?于斷裂長度,應(yīng)連接線段segments[-1]=[segments[-1][0],segs[i][0]-segments[-1][0]+segs[i][1]]else:#為間隔,是不同的線段segments.append(segs[i])#[線段數(shù)據(jù)重組為:線段長度,線段start,線段end]segments=[[x[1],x[0],x[0]+x[1]]forxinsegments]info['segment']=segmentsinfo['len']=s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論