生活随笔
收集整理的這篇文章主要介紹了
Harris-Laplace角点检测初探+python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Harris-Laplace角點檢測初探+python代碼實現
- 數學學院外行入門,課程團隊作業,剛學的Markdown,版排得很隨意(丑),多多擔待
預備知識
角點
- 數字圖像特征之一,包含了大量的位置信息以及指向型信息
- 一般而言,就是物體邊緣的一些拐點,如下圖所示:
上圖中紅色點為角點 - 用途:圖像匹配、后期處理抵消圖像形變、三維重建
Harris算法檢測角點(重頭戲來了)
Harris核心思路(通過周邊區域來判斷角點)
一個窗口在一檢測點處上下、左右或者沿對角線移動:
平坦點flat:無論怎么移動,方框內的灰度值不變,則平平無奇和飛機場一樣,沒有什么點;邊緣點edge:方框內的灰度值只沿著一個方向改變,其余方向不變,則是邊緣點;角點corner:無論怎么移動,上下左右or斜向,灰度值變化都比較大,雨露均沾,則是角點。
Moravec算子
其實Harris是在Moravec基礎上改進而來的,所以在討論Harris之前,先來看一下Moravec
- 缺陷:Moravec只考慮了縱橫斜著四種方向,所以沒有旋轉不變性,當原圖旋轉一下可能原來檢測是角點的點現在檢測就不是了,算法對圖像的旋轉魯棒性差。
- 改進:那就考慮多一點方向唄,方向細化 =》 全微分 =》 泰勒展開
(這個想法太妙了,擺脫了對平移量[u,v]的依賴,僅依靠自身信息來判斷角點,而且還增強了旋轉不變性)
Harris算子
二次型,這里是不是有點橢圓曲線的意思,詳見下圖:
其實從線性代數的角度很好理解,就是要矩陣M的兩個特征值都很大,為了表示“兩個特征值都很大”這一層意思,給出下列角點響應公式,角點響應R大的話,則表明兩個特征值都很大,則該點判斷為角點。從數學的角度來看,這個角點響應取得真好,先是乘積打頭,讓兩個值都盡可能地大,同時減去矩陣跡(trace)的平方,排除出現一個遠大于另一個的情況(這種情況是邊緣點),太妙了~
- 注:這里的M矩陣省略了權重w(x,y)
- 前面關于Harris角點檢測說了這么多,所以。。。Laplace在哪,前面不都是一階梯度嗎???我是不是找錯資料了????
Harris-Laplace角點檢測(原來主角這才來啊,哭了)
前言
傳統的Harris角點檢測(由Harris等在1988年提出)雖然對旋轉改變有很好的檢測不變性,但是卻不具有尺度不變性及仿射不變性。為了獲得尺度不變性,就需要在傳統的Harris角點檢測中引入多尺度空間。Mikolajczyk和Schmid于2004年提出具有尺度不變性的Harris-Laplace檢測方法[1]。
算法流程
代碼實現
- 以下代碼雖然能夠正常運行,但是很多細節我也還沒搞明白,看看大致框架就行,想深究細節的話看最后參考文獻[1].
import cv2
import math
import numpy
as np
from scipy
import ndimage
as ndim
import matplotlib
.pyplot
as plt
%matplotlib inline
def odd(val
):if int(val
)%2 == 0:return int(val
)+1else:return int(val
)
def gauss_kernel(size
,sigma
):'''size表示高斯內核的大小,為正的奇數sigma表述隨機變量X和Y的標準差,此處假設X和Y具有相同的標準差'''xy
= range(-(size
-1)//2,(size
+1)//2)X
,Y
= np
.meshgrid
(xy
,xy
)G
= 1/(2*np
.pi
*sigma
**2)*np
.exp
(-0.5*(X
**2+Y
**2)/sigma
**2)return G
/np
.sum(G
)
def log_kernel(size
,sigma
):'''size表示高斯內核的大小,為正的奇數sigma表述隨機變量X和Y的標準差,此處假設X和Y具有相同的標準差'''xy
= range(-(size
-1)//2,(size
+1)//2)X
,Y
= np
.meshgrid
(xy
,xy
)LOG
= (X
**2+Y
**2-2*sigma
**2)/(sigma
**4)*np
.exp
(-0.5*(X
**2+Y
**2)/sigma
**2)return LOG
def find_local_maximum(val
):'''功能:查找領域極大值;輸入:val-矩陣輸出:row-領域極大值的行坐標 col-領域極大值的列坐標 max_local-領域極大值'''footprint
= np
.ones
((3,3))footprint
[1,1] = 0maxima_around
= ndim
.maximum_filter
(val
,footprint
= footprint
) mask
= val
> maxima_around points
= np
.argwhere
(mask
==1)return points
def Har_Lap_corners_detect(img
): '''功能:Harris Laplace角點檢測參數:img-輸入的圖像輸出:points = [l,c,radius] l,c-角點的橫縱坐標,radius-特征尺度值所對應的圓形區域的半徑'''height
,width
= img
.shape sigma_begin
= 1.5sigma_step
= 1.2sigma_nb
= 13sigma_array
= (sigma_step
**np
.arange
(sigma_nb
))*sigma_beginharris_pts
= np
.zeros
((0,3),dtype
= float)k
= 0.06 for i
in range(sigma_nb
):s_I
= sigma_array
[i
]ksize
= odd
(6*s_I
+1)s_D
= 0.7*s_Ix
= np
.array
([-1,0,1])g
= np
.array
([np
.exp
(-x
*x
/(2*s_D
**2))/(s_D
*(2*np
.pi
)**0.5)])g
= g
/np
.sum(g
) fx
= np
.array
([[-1,0,1]])dx
= cv2
.filter2D
(img
,cv2
.CV_32F
,g
*fx
)dy
= cv2
.filter2D
(img
,cv2
.CV_32F
,g
.T
*fx
.T
)g
= gauss_kernel
(max(1,ksize
),s_I
) dx2
= cv2
.filter2D
(dx
**2,cv2
.CV_32F
,g
)dy2
= cv2
.filter2D
(dy
**2,cv2
.CV_32F
,g
)dxy
= cv2
.filter2D
(dx
*dy
,cv2
.CV_32F
,g
)cim
= dx2
*dy2
-dxy
**2-k
*(dx2
+dy2
)**2tmp
= 0.01*np
.max(cim
)cim
[cim
<tmp
] = 0points
= find_local_maximum
(cim
)n
= points
.shape
[0]points
= np
.c_
[points
,i
*np
.ones
((n
,1))]harris_pts
= np
.r_
[harris_pts
,points
]log
= np
.zeros
((height
,width
,sigma_nb
))for i
in range(sigma_nb
):s_L
= sigma_array
[i
]log
[:,:,i
] = s_L
*s_L
*cv2
.Laplacian
(cv2
.GaussianBlur
(img
,(odd
(6*s_L
+1),odd
(6*s_L
+1)),s_L
,s_L
),cv2
.CV_32F
,ksize
= 3)n
= harris_pts
.shape
[0]cpt
= -1points_t
= np
.zeros
((n
,3))for i
in range(n
):l
= int(harris_pts
[i
,0])c
= int(harris_pts
[i
,1])s
= int(harris_pts
[i
,2])val
= log
[l
,c
,s
]if s
>0 and s
<sigma_nb
-1:if val
>log
[l
,c
,s
-1] and val
>log
[l
,c
,s
+1]:cpt
+= 1;points_t
[cpt
,:] = harris_pts
[i
,:]points_t
[cpt
,2] = 3*sigma_array
[s
]elif s
== 0:if val
> log
[l
,c
,1]:cpt
+= 1;points_t
[cpt
,:] = harris_pts
[i
,:]points_t
[cpt
,2] = 3*sigma_array
[s
]else:if val
> log
[l
,c
,s
-1]:cpt
+= 1;points_t
[cpt
,:] = harris_pts
[i
,:]points_t
[cpt
,2] = 3*sigma_array
[s
]points
= np
.zeros
((cpt
,3))for i
in range(cpt
):points
[i
,:] = points_t
[i
,:]return points
def draw(img
,points
):'''功能:在原圖上標注出角點并顯示輸入:img-圖像 points = [l,c,radius] l,c-角點的橫縱坐標,radius-特征尺度值所對應的圓形區域的半徑'''for i
in range(points
.shape
[0]):cv2
.circle
(img
,(int(points
[i
,1]),int(points
[i
,0])),int(points
[i
,2]),(255,0,0),2) plt
.figure
(figsize
=(7,7))plt
.imshow
(img
)plt
.axis
('off')plt
.show
Harris-Laplace角點檢測
使用上述代碼對檢測圖像角點,結果如下:
img
= cv2
.imread
('wujiaoxing.jpg')
img1
= cv2
.cvtColor
(img
,cv2
.COLOR_BGR2GRAY
)
img2
= cv2
.cvtColor
(img
,cv2
.COLOR_BGR2RGB
)draw
(img2
,Har_Lap_corners_detect
(img1
))
Perfect!!!這次大作業有底了,逃出生天,哈哈哈哈哈~
下面換一個難一點的圖試試看
img
= cv2
.imread
('door.jpg')
img1
= cv2
.cvtColor
(img
,cv2
.COLOR_BGR2GRAY
)
img2
= cv2
.cvtColor
(img
,cv2
.COLOR_BGR2RGB
)draw
(img2
,Har_Lap_corners_detect
(img1
))
。。。。這畫的什么鬼
此處是編程過程中的小發現,與主題無關可不看
* 破案了,其實在MATLAB中卷積計算conv2(A,G,‘same’)與圖像濾波fitler2(G,A)的計算差不多,就是相差了一個G矩陣旋轉180度。但是對于高斯核G而言,其旋轉180度不變,所以在這種情況下,此兩者等價。
* 矩陣的卷積運算和我想的差不多,矩陣對應元素的相乘之后求和。
* matlab中的filter2計算和CV2中的cv2.filter2D 差不多,除了CV2中會把小于0的點直接設置為0
Harris-Laplace和Harris角點檢測算法(勝利就在眼前了,加油!!!)
設計實驗,對圖像進行縮放和旋轉,比較Harris-Laplace和Harris角點檢測算法的穩定性
實驗數據
實驗數據來自圖像數據集網站,Affine Covariant Features,選擇6張存在旋轉和放縮的圖片,如下圖紅框所示:
實驗結果
- 分別采用Harris以及Harris-Laplace算法對這六張圖片進行角點檢測,統計出角點的數量,如下表所示:
可見,Harris-Laplace算法檢測出的角點數量要比Harris算法少得多。
- 可以用重復率來衡量角點檢測算法的穩定性,重復率定義如下:r=NbpreNbinir = \frac{{{N_{bpre}}}}{{{N_{bini}}}}r=Nbini?Nbpre??
式中,NbpreN_{bpre}Nbpre?表示圖像變化后檢測出的角點,NbiniN_{bini}Nbini?是的原始圖像檢測出的角點,本實驗中原始圖像選擇為img1.重復率表示圖像變化后檢測出來的角點與未發生變化時檢測出來的角點之比,因此重復率越高,表示角點檢測算子越穩定。實驗結果如下圖所示:
由上圖可見,在同樣的旋轉和縮放條件下,Harris-Laplace檢測算子的穩定性要高于Harris角點檢測算子。
總結
- 角點一般可以認為是物體邊緣的一些拐點,屬于圖像特征信息,在很多場景下有用
- Harris-Laplace算子是在傳統Harris算子基礎上引入尺度空間得到的,增強了傳統算子的尺度不變性
- 通過實驗發現,Harris-Laplace算子所檢測到的角點數目比傳統Harris算子少得多,而且在同樣的旋轉和縮放條件下更穩定。
- 代碼使人頭大,這也太頂了吧!!!不管了,我肝不動了,就這樣吧。
- 經驗教訓:這一次把大量的時間花在了代碼的實現上,導致之后的時間很少,實驗做得很水,很多場景以及參數的比較都沒有做,下一次代碼可能就沒有這么細致了,能調庫就調庫,給前期的算法賞析(“賞析”這個詞用得真好)以及后期的實驗環節多一點時間。
參考文獻
K. Mikolajczyk and C. Schmid. Scale & affine invariant interest point detectors. International Journal of Computer Vision, 2004matlab實現:《現代數字圖像處理技術提高及應用案例詳解(MATLAB版)》趙小川人工智能:harris角點檢測
總結
以上是生活随笔為你收集整理的Harris-Laplace角点检测初探+python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。