算法的實現方法:
通過對儀表的觀察決定算法采用傳統的檢測方法實現,對儀表特征的分析,發現儀表的指針特征較為明顯,且儀表形狀為圓形,故算法決定采用Hough直線檢測方法檢測指針的位置,采用Hough檢測圓的方法實現對儀表的檢測。
@
一、 算法實現步驟
1.1 流程圖說明:
1.1.1 標定表中刻度最大最小值:
目前對於刻度最大最小值的標定方式采用手動標定方式實現,標定表中最大最小值的目的是用於計算指針指向最大最小值之間的夾角,以此來計算儀表的讀數。下圖中綠色為手動標定最小值點,紅色為最大值點。
1.1.2 划定儀表所在ROI區域:
儀表位置的定位方式目前采用四個點坐標繪制矩形區域。這一步驟的意義在於減少周圍物體對儀表檢測的干涉和減少在檢測過程中的計算量,達到提升檢測速率和檢測精度的效果。
1.1.3 對ROI區域進行矯正:
未矯正圖像對檢測精度和檢測效果都有很大的影響,故我們需要對圖像進行矯正后再進行檢測。
目前該算法中采用的矯正算法為,通過手動標定四個點畫出一個正方形,然后將這四個點作為特征與,我們直接給出的一個正方形進行匹配,以此來求出矯正后的圖形。由於在標定這四個點時我們無法找到合適的對應點,所以該算法矯正效果並不理想。下圖為矯正標定圖像,紅色點為標定的點,圖為矯正后圖像。我們可以看到在矯正后圖像的刻度依舊出於畸變的形態,且表盤矯正效果好時應為圓形,此處矯正后表盤也並非圓形。
1.1.4 指針檢測:
對矯正后圖像進行預處理,預處理處理步驟如下圖所示
1.1.5 預處理說明
- 划分儀表所在圓形ROI區域:再次對儀表位置進行定位,增加檢測精度和提升檢測速率。
ROI區域如下圖所示,由於矯正后儀表並非圓形,所以我們通過表盤的顏色來區分表盤所在位置,並通過輪廓描繪方式描繪出輪廓,再通過求最小包圍圓的方式擬合出儀表所在圓。
- 灰度化:對圖像進行灰度化。灰度化的作用為:將原圖RGB(OpenCV通道表示為BGR)三通道轉換為單通道,灰度化的過程就是將每個像素點的RGB值統一成一個值,進而達到簡化運算的目的。
- 方圖均衡化:直方圖均衡化是圖像處理領域中利用直方圖對對比度進行調整的方法。該方法可以把原始圖像的直方圖變成均勻分布的形式,這樣就增加了像素灰度值的動態范圍,進而達到增強圖像整體對比度的效果,提高圖像質量。通過下圖我們可以看到通過直方圖均衡化后指針和刻度的特征更為明顯。
- 圖像取反:圖像取反的目的主要是將圖像中指針和刻度變成白色為接下來的指針檢測做准備。取反操作的結果如下圖所示
- 中值濾波:中值濾波的目的主要是為了去除圖像中文字和一些刻度對檢測的干擾,濾波后示意圖如下圖所示。
- 腐蝕:腐蝕操作可以理解為將圖像黑色部分放大,進而達到去除白色點的作用,我們利用腐蝕操作的這一特性來消除刻度和表盤中的文字對指針檢測造成的干擾。腐蝕后圖像如下圖所示。
- 開運算:開運算=先腐蝕后膨脹,開運算可以用於消除一些孤立的小點,毛刺和小橋。可進一步對圖像效果進行優化。開運算后圖像如下圖所示。
- 二值化:二值化的作用就是將整個圖像變成黑白效果,只存在黑白兩種顏色。
二值化后圖像如下圖所示。
- 細化操作:由於Hough檢測直線時需要先將圖像先進行邊緣檢測,邊緣檢測結果如圖14-1所示,我們可以看到在圖14-1中如果直接對指針進行直線檢測,檢測到的直線為指針的邊緣而非指針的中心,且由於我們計算刻度的方式指針所在直線進行判定,故采用邊緣檢測后直接對指針進行檢測存在很大的誤差。
針對指針的檢測方法,我查閱了許多的論文,最終在進行Hough檢測前旋轉采用細化的方法而非邊緣的方法。關於細化算法,后面單獨一章說明。
10. Hough直線檢測(檢測指針):
Hough檢測是一種利用圖像的全局特征將特定形狀的邊緣連接起來,形成一個連續平滑邊緣的一種方法。它通過將源圖像上的點影射到用於累加的參數空間,實現對已知解析式的直線或曲線的識別。
Hough指針檢測效果如下圖所示:
1.1.5. 求指針旋轉中心
求旋轉中心的方式:
一、第一種方式:起初想到的是通過檢測表盤的圓進而得到圓心,由於指針所在旋轉中心與表盤中心是同一個中心,故表盤的圓心就是指針的旋轉中心。但該方式有一個必要條件就是表盤的圓可以准確檢測出來,而由於表盤畸變嚴重,表盤所在的圓無法通過Hough變換檢測出,且表盤中心也無法准確求出。
二、第二種方式:通過三個點擬合圓,三個點擬合圓的方法存在幾個問題:
- 由於刻度無法檢測出,所以我們需要標定三個點,而既然已經標注三個點那為何不能夠直接將指針旋轉中心標定呢?
- 三個點擬合出來的圓並不准確,存在的一定程度的圓心偏差,會導致在后續的運算中的誤差。
介於這兩個問題,選擇放棄第二種方式。
三、第三種方式:通過刻度最小值和最大值的中垂線和指針求指針的旋轉中心。由於表盤是圓,故我們可以得到刻度值也都在一個圓上,而刻度的最大值和刻度的最小值都在這個圓上,故其中垂線必定經過圓心,且刻度所在圓的圓心與指針旋轉中心為為同一個中心。此時我們只需要求出指針與中垂線的交點便可以得到指針所在的旋轉中心坐標。原理如圖16所示,Line1為刻度最大最小值連線,Line2為Line1的中垂線,Line3為指針。計算公式如下所示。
Line3斜率:
k3 = (Line3.y2 -Line3.y1) / (Line3.x2 - Line3.x1)
Line2斜率:
K2 = (Line2.y2 - Line2.y1) / (Line2x2 - Line2.x1)
Line1斜率:
K1 = (Line1.y2 - Line1.y1) / (Line1.x2 - Line1.x1)
交點坐標為:
X0 = (Line1.x2 + Line1.x1) / 2
Y0 = (Line1.y2 - Line1.y1) / 2
聯立中垂線與指針的直線方程求交點坐標(X,Y)
X = (k2X0 - k3Line3.y2 - Y0 + line3.x2) / k2 - k3
Y = k3 * (x - line3.x2) + line3.y1
該這一種運算方式當求斜率的分子或分母為零時會無法求出直線斜率,進而導致圓心求不出。故我們需要對分子或分母為零的情況做判斷,當分子或分母為0時,中垂線的方程為X=(Line.X2+Line2.x1) / 2或Y =(Line.Y2+Line.Y1)/2,然后將中垂線方程與指針直線方程聯立得到圓心坐標。
1.1.6 通過旋轉中心求最大最小刻度的夾角
a,b,c三條邊長可通過三個點坐標求出,
Cosα = (c2+b2-a^2)/2bc
α為三個點組成三角形的內角,且由於該角度求出為三角形的內角,而刻度最大最小值的夾角為三角形的外角,所以
刻度最大最小值的夾角 = 360 - α
1.1.7 通過旋轉中心、刻度最小值、Hough檢測直線得到的指針的點求0刻度到指針刻度的夾角
夾角的求法與求最大最小值刻度夾角方法一致,但此處要對指針所在的點坐標位置進行判斷,采用向量法判斷點所在直線位置的方式進行判斷。
Point1為0刻度點,Center為指針旋轉中心點,Point2為指針所在直線的點。
Line1_x = Point1.x - Center.x Line1_y = Point1.y - Center.y
Line2_x = Point2.x - Center.x Line2_y = Point2.y - Center.y
D = Line1_xLine2_y - Line2_x Line1_y
當D<0時指針指向為刻度右下方,當D>0時指針指向左上方,D=0時點在線上。
當指針指向超180度是COS算出的角度為銳角故我們需要對超出180度的角度進行判斷,而超過180度的點都在刻度的右下方,故在右下方的點角度都需加上180度。
1.2 細化算法
經典的細化算法有:Hilditch算法、Deutch細化算法、Pavlidis細化算法、Zhang快速並行算法。
1.Hildich算法:該算法是一種串行處理方法的一種,最終得到的是8條近鄰連接線條。其主要原理是每次掃描並刪除圖像上滿足一定的條件的輪廓像素,直到圖像上不存在可刪除的輪廓像素為止。由於該算法在判斷一像素是否是邊緣點是否應該被刪除時,判斷依據太多,有些條件不夠簡潔,有效,判斷條件之間有重復,這樣造成處理速度慢、通用性差。
2.Deutch細化算法:Deutch細化算法采用的處理方式為並行處理方式,其算法也是采用兩層子循環。在開始的子循環中,目標像素P刪除的條件是:
- ∑Pk= 0(0≤k≤7);
- Nc=1;
- P0+P2+P4+P6≤3;若條件滿足,則該點P標記為可刪除像素。在接下來的子循環中,掃描整幅圖像,將所有這樣的像素刪除。該算法得到的骨架為不完全的8-連接,可以看作是具有可刪除點的8-連接圖形。
該算法經過測試發現存在當指針二值化過度或腐蝕過度時,存在丟失關鍵的特征點的問題。
3.Pavlidis細化算法:Pavlidis細化算法也是並行算法的一種,它通過與兩個模板進行匹配逐層剝掉邊界像素,所得到的骨架形態是 8- 連接的。Pavlidis異步細化算法是通過並行和串行算法混合處理來實現細化。采用比特運算進行特定模式的匹配,所得到的骨架形態是8- 連接的。
該算法與Hilditch算法類似,在考慮每個點周圍8個相鄰點的同時,考慮這些 點各自周圍點的情況,並根據點點之間關聯關系對Hilditch算法的刪除 條件進行了一些限定,從而能充分考慮圖像上的像素信息,在刪除點的 時候,可以根據新的判斷條件高效地去除圖像上多余的像素,而不丟失關鍵的特征點。
4.Zhang快速並行算法:Zhang快速算法所代表的基於數學形態學的細化方法是利用彼此相互獨立並列的結構元素進行二值圖象的細化,因此更易於實現且計算簡單。但同時,我們也應該看到 Zhang快速算法存在細化寬度不能保證為單像素寬的缺陷,原圖像會有很多毛刺,這對於以后的查找細化圖像的分差點帶來了很大的困難。
綜上所述,我們的細化算法選擇采用Pavlidis細化算法,該算法可以滿足我們對圖像處理速度和對細節檢測的要求,相對其他幾個算法而言較為適合我們的檢測。
二、刻度檢測算法
刻度檢測算法目前已嘗試方案:
- 通過輪廓方法抓取出刻度,並對刻度進行檢測,該方式由於,圖像中的文字和水紋對刻度有一定干擾,無法成功提取除刻度輪廓,無法成功檢測刻度。
- 擬合刻度所在的圓,然后通過刻度直接的間隙來擬合出刻度所在位置,該方式需要成功檢測到兩個相鄰刻度,且圖像不能存在畸變,該方式並不可行。
刻度檢測過程如下圖所示:
2.1算法說明
2.1.1 高斯濾波
高斯濾波的作用主要是過濾一些圖像中的噪點效果如下圖所示
2.1.2 黑帽處理
黑帽運算(img) = 閉運算圖像(img) - 原始圖像(img)
經過閉運算操作的圖像與原圖像的差值圖像,作用是突出原圖像中比周圍暗的區域。(比如閉運算本身可以填補物體內部的一些黑洞,這些黑洞就可以通過黑帽運算來凸顯)。
我們可以通過黑帽操作來去掉圖像中的指針和部分文字對我們刻度檢測的干擾。黑帽處理后圖像如下圖所示。
2.1.3 自適應二值化
自適應閾值可以看成一種局部性的閾值,通過規定一個區域大小,比較處理像素點與區域大小里面像素點的平均值—閾值(或者其他特征)的大小關系確定這個像素點是屬於黑或者白(如果是二值情況)。其目的就是將圖像轉換為只有黑白的二值化圖像,處理結果如下圖所示。我們可看到二值化過后圖像中依舊有許多干擾,而這些干擾與刻度極為相似,無法通過處理方式將其過濾掉,因此我們采取描繪輪廓檢測的方式嘗試過濾的方式處理。
2.1.4 輪廓檢測
該方式也為通過連通域的方式描繪輪廓點,其目的與邊緣檢測的方式相似。我們在描繪出輪廓后,由於二值化處理的效果並不理想,因此我們分析,刻度的形狀基本為一個長方形,那些干擾則為一些不規則圖形。所以我們能否通過刻度的面積和刻度的長度對圖像中的刻度和干擾進行區分?想到這便開始嘗試,過濾過后的圖像效過也並不理想,過濾無法將刻度之外的點全部過濾掉,依舊存在許多干擾,結果如下圖所示,圖中綠色的點為過濾后輪廓。
2.2 總結
由於圖像干擾過多,我們圖像處理並不能做到在對圖像進行處理時將其他噪點全部過濾掉而只保留刻度的情況,故此方法並不可行,因此我們決定嘗試新的解決方案,通過深度學習標定刻度最小值和刻度最大值兩個點,並通過角度法計算儀表刻度。
三、算法測試情況
圖23-1為夜間檢測結果,我們可以看到在檢測時存在一定的誤差,此處誤差為圖像畸變與零刻度標定時存在的誤差。
圖23-1為白天檢測結果,我們可以看到在檢測時存在一定的誤差,此處誤差與圖像畸變和零刻度標定時存在的誤差有關。
由於圖24-1檢測為p的圖,故可能存在P出來的效果與實際指針指向存在一定誤差,。且儀表本身畸變也會造成一定的誤差,而且在圖像處理過程中也會造成一些細微的誤差。
圖25-1為指針指向小於三十度刻度的結果,該圖也為ps圖,故在指向上可能會存在一定誤差,且該位置存在水紋干擾,也會造成一定的誤差。