日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法

發布時間:2024/7/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 Harris角點檢測

1.1 原理

Harris角點檢測的思想是通過圖像的局部的小窗口觀察圖像,角點的特征是窗口沿任意方向移動都會導致圖像灰度的明顯變化,如下圖所示:

?將上述思想轉換為數學形式,即將局部窗口向各個方向移動(u,v)并計算所有灰度差異的總和,表達式如下:

??其中I(x,y)是局部窗口的圖像灰度,I(x+u,y+v)是平移后的圖像灰度,w(x,y)是窗口函數,該可以是矩形窗口,也可以是對每一個像素賦予不同權重的高斯窗口,如下所示:
角點檢測中使E(u,v)的值最大。利用一階泰勒展開有:

其中I_xI?x??和?I_yI?y???是沿x和y方向的導數,可用sobel算子計算。

推導如下:

?M矩陣決定了E(u,v)的取值,下面我們利用M來求角點,M是I?x??和I?y??的二次項函數,可以表示成橢圓的形狀,橢圓的長短半軸由M的特征值λ?1??和λ?2??決定,方向由特征矢量決定,如下圖所示:

?橢圓函數特征值與圖像中的角點、直線(邊緣)和平面之間的關系如下圖所示。

?共可分為三種情況:

  • 圖像中的直線。一個特征值大,另一個特征值小,λ1>>λ2或 λ2>>λ1。橢圓函數值在某一方向上大,在其他方向上小。
  • 圖像中的平面。兩個特征值都小,且近似相等;橢圓函數數值在各個方向上都小。
  • 圖像中的角點。兩個特征值都大,且近似相等,橢圓函數在所有方向都增大

Harris給出的角點計算方法并不需要計算具體的特征值,而是計算一個角點響應值RR來判斷角點。RR的計算公式為:

式中,detM為矩陣M的行列式;traceM為矩陣M的跡;α為常數,取值范圍為0.04~0.06。事實上,特征是隱含在detM和traceM中,因為:

?那我們怎么判斷角點呢?如下圖所示:

  • 當R為大數值的正數時是角點
  • 當R為大數值的負數時是邊界
  • 當R為小數是認為是平坦區域

1.2 實現

在OpenCV中實現Hariis檢測使用的API是:

dst=cv.cornerHarris(src, blockSize, ksize, k)

參數:

  • img:數據類型為 ?oat32 的輸入圖像。

  • blockSize:角點檢測中要考慮的鄰域大小。

  • ksize:sobel求導使用的核大小

  • k :角點檢測方程中的自由參數,取值參數為 [0.04,0.06].

示例:

import cv2 as cv import numpy as np import matplotlib.pyplot as plt# 1 讀取圖像,并轉換成灰度圖像 img = cv.imread('img/qipan.png') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 2 角點檢測 # 2.1 輸入圖像必須是 float32 gray = np.float32(gray)# 2.2 最后一個參數在 0.04 到 0.05 之間 dst = cv.cornerHarris(gray, 2, 3, 0.04)# 3 設置閾值,將角點繪制出來,閾值根據圖像進行選擇 # dst > 0.001 * dst.max() 返回一個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角點檢測') plt.xticks([]), plt.yticks([]) plt.show()

結果如下:

?Harris角點檢測的優缺點:

優點:

  • 旋轉不變性,橢圓轉過一定角度但是其形狀保持不變(特征值保持不變)
  • 對于圖像灰度的仿射變化具有部分的不變性,由于僅僅使用了圖像的一介導數,對于圖像灰度平移變化不變;對于圖像灰度尺度變化不變

缺點:

  • 對尺度很敏感,不具備幾何尺度不變性。
  • 提取的角點是像素級的

2 Shi-Tomasi角點檢測

2.1 原理

Shi-Tomasi算法是對Harris角點檢測算法的改進,一般會比Harris算法得到更好的角點。Harris 算法的角點響應函數是將矩陣 M 的行列式值與 M 的跡相減,利用差值判斷是否為角點。后來Shi 和Tomasi 提出改進的方法是,若矩陣M的兩個特征值中較小的一個大于閾值,則認為他是角點,即:

如下圖所示:

?從這幅圖中,可以看出來只有當 λ1 和 λ2 都大于最小值時,才被認為是角點。

2.2 實現

在OpenCV中實現Shi-Tomasi角點檢測使用API:

corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )

參數:

  • Image: 輸入灰度圖像
  • maxCorners : 獲取角點數的數目。
  • qualityLevel:該參數指出最低可接受的角點質量水平,在0-1之間。
  • minDistance:角點之間最小的歐式距離,避免得到相鄰特征點。

返回:

  • Corners: 搜索到的角點,在這里所有低于質量水平的角點被排除掉,然后把合格的角點按質量排序,然后將質量較好的角點附近(小于最小歐式距離)的角點刪掉,最后找到maxCorners個角點返回。

示例:

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 角點檢測 corners = cv.goodFeaturesToTrack(gray,1000,0.01,10) # 3 繪制角點 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角點檢測') plt.xticks([]), plt.yticks([]) plt.show()

結果如下:


總結

  • Harris算法

    思想:通過圖像的局部的小窗口觀察圖像,角點的特征是窗口沿任意方向移動都會導致圖像灰度的明顯變化。

    API: cv.cornerHarris()

  • Shi-Tomasi算法

    對Harris算法的改進,能夠更好地檢測角點

    API: cv2.goodFeatureToTrack()

  • 總結

    以上是生活随笔為你收集整理的图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。