源程序和說明文檔下載地址:
http://www.5941ts.com/EasyAnalysis/demo/角點檢測.rar
一組角點檢測的模板
說明:
通過EasyAnalysis庫中的CBmp讀出包含多個矩形和組合矩形的圖像數據,CBmp所讀出的圖像矩陣與行的排列順序與屏幕顯示順序相反,即圖像在屏幕上顯示的第一行爲使用CBmp讀出的圖像矩陣的最後一行。
像素值255代表最大亮度,即白色,值0代表最小亮度,即黑色。
一.角點的定義:
1. 外角:
形如下面形式像素點的集合:
I.
255,255
255, 0
II.
255,255
0,255
III.
0,255
255,255
IV.
255,0
255,255
2. 內角
形如下面形式像素點的集合:
I.
0, 0
0,255
II.
0, 0
255, 0
III.
255, 0
0, 0
IV.
0,255
0, 0
3. 角點
內角和外角統稱角點
二.原理:
利用角點間像素的梯度信息建立模板實現角點的識別。對外角(I)擴充一行一列,得到
255,255,255
255, 0, 0
255, 0, 0
可以看出該角點即屬於矩形孔的上邊界點,又屬於孔的左邊界點,由此可以首先確定角點檢測模板中用於檢查垂直左邊界和水平上邊界的值,即:
0,1, 0
1,0,-1
0,-1,0
通過對圖像應用該模板可以檢測出圖像中孔的左邊界和上邊界,由於使用CBmp讀出的圖像像素矩陣上下行反序,因此該檢測模板變爲
0,-1, 0
1, 0,-1
0, 1, 0
上面提過,角點既屬於垂直邊界又屬於水平邊界,同時還有一個重要的信息,就是在該點45,135,225,315度角的方向應存在較大梯度。以315度,即外角點(I)爲例,爲了利用該梯度信息,我們對模板作如下修改
1,1, 0
1,0,-1
0,-1,-1
在(0,0)和(2,2)位置添加的1和-1可以捕捉到從左上向右下方向上的梯度信息,將該模板上下反轉得到程序中應用的模板
0,-1, -1
1, 0, -1
1, 1, 0
對於外角(I)利用該模板對原始圖像進行卷積,由於垂直邊界上不是角點的像素最多存在水平梯度和315度角的梯度,水平邊界不是角點的像素最多存在垂直和315度角的梯度,而角點位置則三個方向梯度值都存在,因此如果模板中心元素爲角點,那麼卷積後改位置的值應該顯著大於不是角點的元素的卷積值。爲了避免卷積後模板中心元素的值大於255,又能夠保留區分角點和其他點的信息,將模板乘以係數1/3(因爲該模板對只包含矩形和組合矩形的二值圖像最大值<=255*3=765),得到檢測135度方向上角點的模板如下:
1/3, 1/3,0
1/3, 0,-1/3
0,-1/3,-1/3
程序中用到的模板
0,-1/3, -1/3
1/3, 0, -1/3
1/3,1/3, 0
如果使用上面模板卷積得到的結果顯著大於其它結果,則認爲該點爲角點。程序運行結果(爲了直觀將角點處周圍6*6共36個像素標爲紅色)
將上面得到的模板逆時針翻轉270度得到45度方向上的角點檢測模板:
1/3, 1/3,0
1/3, 0,-1/3
0,-1/3,-1/3
逆時針旋轉180度得到135度方向上角點檢測模板
0,-1/3,-1/3
1/3, 0,-1/3
1/3,1/3, 0
逆時針旋轉90度得到225度方向上角點檢測模板
-1/3,-1/3,0
-1/3, 0,1/3
0, 1/3,1/3
根據上面模板對角點進行檢測,得到如下結果(外角點用6*6藍色像素矩陣標註,內角點用6*6紅色矩陣標註)
三. 內角和外角的識別
觀察外角點(I)(II)(III)(IV)和內角點(I)(II)(III)(IV)可以看出,檢測外角的模板同樣對該方向上的內角有效,唯一區別內角與外角的標誌在於模板中心像素是白色還是黑色,顯然如果是黑色則該點位外角點(I),否則爲內角點(I)。因此,可以通過這一特點區分內角與外角。根據該思路設計程序,檢測結果如下(紅色矩形標註內角,天藍色矩形標註外角)
統計上述圖像中外角總數爲46,內角總數爲18個, 利用(外角數-內角數)/4 可以計算出圖形中孔的數量爲7個。