



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PythonOpencv圖?識別表格:線條信息計(jì)算(投影算法)PythonOpencv圖?識別表格:線條信息計(jì)算(投影算法)通過OpenCV算法識別出圖?中的框線后,?臨?個(gè)問題:線條變換為絕對?平和垂直線條并?絕對的?平或垂直,需要變換為絕對的?平線或垂直線。簡單的算法是可以選擇線條的起點(diǎn)或終點(diǎn)作為坐標(biāo),但最好是可以選擇線條的中?的坐標(biāo)。這?設(shè)計(jì)了?種軸?投影法,通過線條在垂直軸上的投影得到中?點(diǎn)的坐標(biāo)。以橫線條為例,將線條的cv矩陣傳?,計(jì)算在數(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軸上投影可以得到絕對橫線的長度。那我們是否需要寫?個(gè)i軸投影算法和?個(gè)j軸投影算法呢?其實(shí)投影原理都?樣,只是投影的軸不同。如果將橫線轉(zhuǎn)置,向i軸投影,是不是就得到了絕對橫線的長度呢?這樣我們就可以?同?套投影算法了。如果是豎線怎么辦呢?豎線剛好相反,向j軸投影得到寬度,向i軸投影得到長度。如何?同?套線段信息計(jì)算代碼呢?沒錯(cuò),將豎線轉(zhuǎn)置后就變成橫線了,算法?致了!完成了以上思路的梳理,我們就可以寫出對應(yīng)的投影算法了。線條的斷裂另?個(gè)問題是線條的斷裂,由于?擾因素導(dǎo)致?根線條中間出現(xiàn)了斷裂,為了應(yīng)對這種問題,我們在投影計(jì)算時(shí)?持了break,即允許在投影截?上出現(xiàn)?個(gè)像素的斷裂。線條被分割為多條線段不是所有的表格框線都是?直連續(xù)的,看下?這個(gè)例?,紅框中的表格框線被兩個(gè)合并單元格分割成了三段。在線條信息計(jì)算時(shí),需要精確的計(jì)算出每條線段起?坐標(biāo)信息。為什么呢?這是因?yàn)樯院笪覀冞M(jìn)?單元格重建算法的時(shí)候,需要知道表格中每?個(gè)橫縱交叉點(diǎn)的完整情況,來決定每個(gè)單元格到底有???列。這個(gè)問題在表格結(jié)構(gòu)分析算法會詳細(xì)談到的。完整算法根據(jù)以上的分析,我們寫出了下?完整的算法,實(shí)現(xiàn)了線條的投影計(jì)算、寬度計(jì)算、長度計(jì)算、線條中的線段信息的計(jì)算,?持了?擾造成的斷裂等情況。'''計(jì)算線條的完整信息,包括線條的軸?位置、線條起?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)的斷裂(像素?cái)?shù)量)輸出:線段信息listline_info={'axis':0,#線條軸?'wide':0,#線條粗細(xì)'len':0,#線條總長度(線段長度之和)'segment':[],#線條內(nèi)部的線段信息[[線段長度,線段start,線段end],...]?持?根線條被分割為多條線段(中間跨域?個(gè)或多個(gè)合并單元格)'segment':[],#線條內(nèi)部的線段信息[[線段長度,線段start,線段end],...]?持?根線條被分割為多條線段(中間跨域?個(gè)或多個(gè)合并單元格)}輸??例:lines_matrixi0------------------------->ji1------------------------->ji2------------------------->ji3------------------------->j'''defcalc_line_info(lines_matrix,max_break,debug=False):#計(jì)算i軸每個(gè)位置的投影是否有像素值project_i=[any(x)forxinlines_matrix]#對每個(gè)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個(gè)像素的斷裂)pos_group_i=[]temp_group=[pos_i[0]]#第?個(gè)pos默認(rèn)滿?要求,放?臨時(shí)結(jié)果中#可調(diào)參數(shù)線段斷層截?像素點(diǎn)foriinrange(1,len(pos_i)):#從第?個(gè)pos開始計(jì)算ifpos_i[i]-pos_i[i-1]<=5:#連續(xù)像素計(jì)為?組,?持截?斷層temp_group.append(pos_i[i])else:pos_group_i.append(temp_group)#上?組結(jié)束,放?結(jié)果中temp_group=[pos_i[i]]#新?組第?個(gè)pos默認(rèn)滿?要求,放?臨時(shí)結(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],...]?持?根線條被分割為多條線段(中間跨域?個(gè)或多個(gè)合并單元格)}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ì)算圖像中線段的長度(即在j軸像素點(diǎn)的個(gè)數(shù))注意有可能?條線段被分割成了多個(gè)分段(中間出現(xiàn)了合并單元格),因此該算法需要返回線段長度同時(shí)要?持?擾造成的線段中間出現(xiàn)的斷裂list[]'''#獲取該條線所在的矩陣并轉(zhuǎn)置area=np.transpose(lines_matrix[poses[0]:poses[-1]+1])#取得每個(gè)投影點(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國RCA母頭項(xiàng)目投資可行性研究報(bào)告
- 電腦橫機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年信號鏈模擬芯片市場分析報(bào)告
- 住宅照明現(xiàn)狀分析報(bào)告范文
- 2025-2030年中國茶黃素行業(yè)市場現(xiàn)狀調(diào)查及發(fā)展前景研判報(bào)告
- 商業(yè)體工程可行性研究報(bào)告
- 2025年中國精密交流測試電源行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 靜電抹布行業(yè)市場發(fā)展及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 房東租客合同范本
- 基于船舶發(fā)電機(jī)典型故障的診斷技術(shù)研究
- 高教版2023年中職教科書《語文》(基礎(chǔ)模塊)上冊教案全冊
- 存款代持協(xié)議書范文模板
- 2023年部編人教版三年級《道德與法治》下冊全冊課件【全套】
- 光伏項(xiàng)目施工總進(jìn)度計(jì)劃表(含三級)
- DB32-T 4757-2024 連棟塑料薄膜溫室建造技術(shù)規(guī)范
- 部編版小學(xué)語文四年級下冊教師教學(xué)用書(教學(xué)參考)完整版
- 卡通風(fēng)寒假生活PPT模板課件
- 教學(xué)課件:物流營銷
- 小兒泄瀉(小兒腹瀉病)診療方案
- 種子內(nèi)部構(gòu)造圖片集
- 羊水栓塞的處理)
評論
0/150
提交評論