一滑臊,傳統(tǒng)方法
1.1
二值化后斜脂,用canny邊緣提取惭墓,然后用霍夫變換獲得直線為一般方法聋庵。比如在圖片中車道線提取上的應用祭玉。
1.2
二值化后春畔,用橫向和豎向的細長的條去腐蝕膨脹可以得到橫線和豎線,拼在一起就是完整的表格框架振峻。比如圖片中表格的提取择份。
總結
一開始我用傳統(tǒng)的第一個方法,python代碼實現(xiàn)后發(fā)現(xiàn)canny后是輪廓凤价,一條橫線和一條垂線有交點拔创,交點處就變成鏤空的十字架,導致線不連續(xù)慢逾。后來了解到膨脹腐蝕即可解決問題,效果更歐豪口注。如下python實例代碼為膨脹腐蝕方法胜卤。
二葛躏,深度學習方法(比如車道線識別)
Lanenet算法等學完深度學習再分析
三,傳統(tǒng)方法理論知識點說明
3.1 二值法
把圖片變成只有2個值的灰白圖败富。
3.2 canny方法
用于提取邊緣摩窃。基于查找的方法通過尋找圖像一階導數(shù)中的最大和最小值來檢測邊界鹦聪,通常是將邊界定位在梯度最大的方向蒂秘。因為邊緣和非邊緣的像素會有明顯突變」胬觯基于零穿越的方法通過尋找圖像二階導數(shù)零穿越來尋找邊界撇贺,通常是Laplacian過零點或者非線性差分表示的過零點松嘶。因為這是求駐點或極值的方法,也可以找到突變點缓升。
3.3 霍夫變換
利用同一直線上的點蕴轨,他們的斜率和截距相同,所以轉換為K,b坐標系中歧寺,則多個直線上的點,他們的K,b是相同的龙致,所以每個點會轉換為一條直線并且相交與k,b點顷链。但是x=1這類垂線無斜率,所以引入了r榛了,theta極坐標系煞抬。同理函數(shù)會相交某點革答。
相交的某點的函數(shù)線越多,說明極坐標函數(shù)對應的這些直線上的點越多途茫。
如下為笛卡爾坐標系的x,y溪食,取直線上的3個點,則會在極坐標系中轉換為3條函數(shù)边败,并且相交于一點捎废。
3.4 膨脹和腐蝕
膨脹是取像素值高的點登疗,腐蝕相反嫌蚤,是取像素值低的點脱吱。
膨脹的實現(xiàn)方法是在核區(qū)間內(nèi),取最大值续捂。腐蝕相反。所以若要堅持橫豎表格劫拗,則核區(qū)間大小一般就使用橫線或垂線矾克。
原圖如下:
腐蝕(erode)后可以明顯的看到圖像字母變細了
膨脹(dilate)后明顯的看到圖像字母變粗了
四胁附,傳統(tǒng)方法實實戰(zhàn)取表格框
4.1 python opencv代碼
此篇主要實現(xiàn)提取表格框,后續(xù)章節(jié)會實現(xiàn)提取單元格內(nèi)容欲逃。
import cv2
import numpy as np
image = cv2.imread('cell.jpg', 1)
#二值化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
binary = cv2.adaptiveThreshold(~gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, -10)
# cv2.imshow("cell", binary)
# cv2.waitKey(0)
rows,cols=binary.shape
scale = 20
#識別橫線
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(cols//scale,1))
eroded = cv2.erode(binary,kernel,iterations = 1)
#cv2.imshow("Eroded Image",eroded)
dilatedcol = cv2.dilate(eroded,kernel,iterations = 1)
cv2.imshow("Dilated Image",dilatedcol)
cv2.waitKey(0)
#識別豎線
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,rows//scale))
eroded = cv2.erode(binary,kernel,iterations = 1)
dilatedrow = cv2.dilate(eroded,kernel,iterations = 1)
cv2.imshow("Dilated Image",dilatedrow)
cv2.waitKey(0)
#標識交點
bitwiseAnd = cv2.bitwise_and(dilatedcol,dilatedrow)
cv2.imshow("bitwiseAnd Image",bitwiseAnd)
cv2.waitKey(0)
#標識表格
merge = cv2.add(dilatedcol,dilatedrow)
cv2.imshow("add Image",merge)
cv2.waitKey(0)
4.2 效果如下
原圖
過程中生成的圖