图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法
1 Harris角點(diǎn)檢測
1.1 原理
Harris角點(diǎn)檢測的思想是通過圖像的局部的小窗口觀察圖像,角點(diǎn)的特征是窗口沿任意方向移動(dòng)都會(huì)導(dǎo)致圖像灰度的明顯變化,如下圖所示:
?將上述思想轉(zhuǎn)換為數(shù)學(xué)形式,即將局部窗口向各個(gè)方向移動(dòng)(u,v)并計(jì)算所有灰度差異的總和,表達(dá)式如下:
??其中I(x,y)是局部窗口的圖像灰度,I(x+u,y+v)是平移后的圖像灰度,w(x,y)是窗口函數(shù),該可以是矩形窗口,也可以是對(duì)每一個(gè)像素賦予不同權(quán)重的高斯窗口,如下所示:
角點(diǎn)檢測中使E(u,v)的值最大。利用一階泰勒展開有:
其中I_xI?x??和?I_yI?y???是沿x和y方向的導(dǎo)數(shù),可用sobel算子計(jì)算。
推導(dǎo)如下:
?M矩陣決定了E(u,v)的取值,下面我們利用M來求角點(diǎn),M是I?x??和I?y??的二次項(xiàng)函數(shù),可以表示成橢圓的形狀,橢圓的長短半軸由M的特征值λ?1??和λ?2??決定,方向由特征矢量決定,如下圖所示:
?橢圓函數(shù)特征值與圖像中的角點(diǎn)、直線(邊緣)和平面之間的關(guān)系如下圖所示。
?共可分為三種情況:
- 圖像中的直線。一個(gè)特征值大,另一個(gè)特征值小,λ1>>λ2或 λ2>>λ1。橢圓函數(shù)值在某一方向上大,在其他方向上小。
- 圖像中的平面。兩個(gè)特征值都小,且近似相等;橢圓函數(shù)數(shù)值在各個(gè)方向上都小。
- 圖像中的角點(diǎn)。兩個(gè)特征值都大,且近似相等,橢圓函數(shù)在所有方向都增大
Harris給出的角點(diǎn)計(jì)算方法并不需要計(jì)算具體的特征值,而是計(jì)算一個(gè)角點(diǎn)響應(yīng)值RR來判斷角點(diǎn)。RR的計(jì)算公式為:
式中,detM為矩陣M的行列式;traceM為矩陣M的跡;α為常數(shù),取值范圍為0.04~0.06。事實(shí)上,特征是隱含在detM和traceM中,因?yàn)?
?那我們怎么判斷角點(diǎn)呢?如下圖所示:
- 當(dāng)R為大數(shù)值的正數(shù)時(shí)是角點(diǎn)
- 當(dāng)R為大數(shù)值的負(fù)數(shù)時(shí)是邊界
- 當(dāng)R為小數(shù)是認(rèn)為是平坦區(qū)域
1.2 實(shí)現(xiàn)
在OpenCV中實(shí)現(xiàn)Hariis檢測使用的API是:
dst=cv.cornerHarris(src, blockSize, ksize, k)參數(shù):
-
img:數(shù)據(jù)類型為 ?oat32 的輸入圖像。
-
blockSize:角點(diǎn)檢測中要考慮的鄰域大小。
-
ksize:sobel求導(dǎo)使用的核大小
-
k :角點(diǎn)檢測方程中的自由參數(shù),取值參數(shù)為 [0.04,0.06].
示例:
import cv2 as cv import numpy as np import matplotlib.pyplot as plt# 1 讀取圖像,并轉(zhuǎn)換成灰度圖像 img = cv.imread('img/qipan.png') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 2 角點(diǎn)檢測 # 2.1 輸入圖像必須是 float32 gray = np.float32(gray)# 2.2 最后一個(gè)參數(shù)在 0.04 到 0.05 之間 dst = cv.cornerHarris(gray, 2, 3, 0.04)# 3 設(shè)置閾值,將角點(diǎn)繪制出來,閾值根據(jù)圖像進(jìn)行選擇 # dst > 0.001 * dst.max() 返回一個(gè)img大小的Flase和True矩陣 img[dst > 0.001 * dst.max()] = [0, 0, 255]# 4 圖像顯示 plt.figure(figsize=(10, 8), dpi=100) plt.imshow(img[:, :, ::-1]), plt.title('Harris角點(diǎn)檢測') plt.xticks([]), plt.yticks([]) plt.show()結(jié)果如下:
?Harris角點(diǎn)檢測的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
- 旋轉(zhuǎn)不變性,橢圓轉(zhuǎn)過一定角度但是其形狀保持不變(特征值保持不變)
- 對(duì)于圖像灰度的仿射變化具有部分的不變性,由于僅僅使用了圖像的一介導(dǎo)數(shù),對(duì)于圖像灰度平移變化不變;對(duì)于圖像灰度尺度變化不變
缺點(diǎn):
- 對(duì)尺度很敏感,不具備幾何尺度不變性。
- 提取的角點(diǎn)是像素級(jí)的
2 Shi-Tomasi角點(diǎn)檢測
2.1 原理
Shi-Tomasi算法是對(duì)Harris角點(diǎn)檢測算法的改進(jìn),一般會(huì)比Harris算法得到更好的角點(diǎn)。Harris 算法的角點(diǎn)響應(yīng)函數(shù)是將矩陣 M 的行列式值與 M 的跡相減,利用差值判斷是否為角點(diǎn)。后來Shi 和Tomasi 提出改進(jìn)的方法是,若矩陣M的兩個(gè)特征值中較小的一個(gè)大于閾值,則認(rèn)為他是角點(diǎn),即:
如下圖所示:
?從這幅圖中,可以看出來只有當(dāng) λ1 和 λ2 都大于最小值時(shí),才被認(rèn)為是角點(diǎn)。
2.2 實(shí)現(xiàn)
在OpenCV中實(shí)現(xiàn)Shi-Tomasi角點(diǎn)檢測使用API:
corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )參數(shù):
- Image: 輸入灰度圖像
- maxCorners : 獲取角點(diǎn)數(shù)的數(shù)目。
- qualityLevel:該參數(shù)指出最低可接受的角點(diǎn)質(zhì)量水平,在0-1之間。
- minDistance:角點(diǎn)之間最小的歐式距離,避免得到相鄰特征點(diǎn)。
返回:
- Corners: 搜索到的角點(diǎn),在這里所有低于質(zhì)量水平的角點(diǎn)被排除掉,然后把合格的角點(diǎn)按質(zhì)量排序,然后將質(zhì)量較好的角點(diǎn)附近(小于最小歐式距離)的角點(diǎn)刪掉,最后找到maxCorners個(gè)角點(diǎn)返回。
示例:
import numpy as np import cv2 as cv import matplotlib.pyplot as plt # 1 讀取圖像 img = cv.imread('./image/tv.jpg') gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) # 2 角點(diǎn)檢測 corners = cv.goodFeaturesToTrack(gray,1000,0.01,10) # 3 繪制角點(diǎn) for i in corners:x,y = i.ravel()cv.circle(img,(x,y),2,(0,0,255),-1) # 4 圖像展示 plt.figure(figsize=(10,8),dpi=100) plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角點(diǎn)檢測') plt.xticks([]), plt.yticks([]) plt.show()結(jié)果如下:
總結(jié)
Harris算法
思想:通過圖像的局部的小窗口觀察圖像,角點(diǎn)的特征是窗口沿任意方向移動(dòng)都會(huì)導(dǎo)致圖像灰度的明顯變化。
API: cv.cornerHarris()
Shi-Tomasi算法
對(duì)Harris算法的改進(jìn),能夠更好地檢測角點(diǎn)
API: cv2.goodFeatureToTrack()
總結(jié)
以上是生活随笔為你收集整理的图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Pytorch神经网络实战案例】25
- 下一篇: linux 安装mysql5.7.12_