教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Harris角點(diǎn)檢測(cè)原理【OpenCV教程】

更新時(shí)間:2021年06月03日17時(shí)50分 來源:傳智教育 瀏覽次數(shù):

1. 原理

Harris角點(diǎn)檢測(cè)的思想是通過圖像的局部的小窗口觀察圖像,角點(diǎn)的特征是窗口沿任意方向移動(dòng)都會(huì)導(dǎo)致圖像灰度的明顯變化,如下圖所示:

Harris角點(diǎn)檢測(cè)原理

將上述思想轉(zhuǎn)換為數(shù)學(xué)形式,即將局部窗口向各個(gè)方向移動(dòng)(u,v)(u,v)并計(jì)算所有灰度差異的總和,表達(dá)式如下:

E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2 E(u,v)=\sum_{x,y}w(x,y)[I(x+u,y+v)-I(x,y)]^2

其中I(x,y)I(x,y)是局部窗口的圖像灰度,I(x+u,y+v)I(x+u,y+v)是平移后的圖像灰度,w(x,y)w(x,y)是窗口函數(shù),該可以是矩形窗口,也可以是對(duì)每一個(gè)像素賦予不同權(quán)重的高斯窗口,如下所示:

Harris角點(diǎn)檢測(cè)02

角點(diǎn)檢測(cè)中使E(u,v)E(u,v)的值最大。利用一階泰勒展開有:
I(x+u,y+v)=I(x,y)+Ixu+Iyv I(x+u,y+v)=I(x,y)+I_xu+I_yv
其中IxI_x IyI_y 是沿x和y方向的導(dǎo)數(shù),可用sobel算子計(jì)算。

推導(dǎo)如下:

Harris角點(diǎn)檢測(cè)03

MM矩陣決定了E(u,v)E(u,v)的取值,下面我們利用MM來求角點(diǎn),MMIxI_x Iy I_y的二次項(xiàng)函數(shù),可以表示成橢圓的形狀,橢圓的長(zhǎng)短半軸由MM的特征值λ1\lambda_1λ2\lambda_2決定,方向由特征矢量決定,如下圖所示:

Harris角點(diǎn)檢測(cè)04

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

Harris角點(diǎn)檢測(cè)08

共可分為三種情況:

  • 圖像中的直線。一個(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ì)算公式為:
R=detMα(traceM)2 R =detM-\alpha(traceM)^2
式中,detM為矩陣M的行列式;traceM為矩陣M的跡;α為常數(shù),取值范圍為0.04~0.06。事實(shí)上,特征是隱含在detM和traceM中,因?yàn)?

Harris角點(diǎn)檢測(cè)09

那我們?cè)趺磁袛嘟屈c(diǎn)呢?如下圖所示:

Harris角點(diǎn)檢測(cè)10

  • 當(dāng)R為大數(shù)值的正數(shù)時(shí)是角點(diǎn)
  • 當(dāng)R為大數(shù)值的負(fù)數(shù)時(shí)是邊界
  • 當(dāng)R為小數(shù)是認(rèn)為是平坦區(qū)域

2. 實(shí)現(xiàn)

在OpenCV中實(shí)現(xiàn)Hariis檢測(cè)使用的API是:

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

參數(shù):

  • img:數(shù)據(jù)類型為 ?oat32 的輸入圖像。

  • blockSize:角點(diǎn)檢測(cè)中要考慮的鄰域大小。

  • ksize:sobel求導(dǎo)使用的核大小

  • k :角點(diǎn)檢測(cè)方程中的自由參數(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('./image/chessboard.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角點(diǎn)檢測(cè)
# 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)行選擇
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)檢測(cè)')
plt.xticks([]), plt.yticks([])
plt.show()

結(jié)果如下:

Harris角點(diǎn)檢測(cè)10

Harris角點(diǎn)檢測(cè)的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

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

缺點(diǎn):

  • 對(duì)尺度很敏感,不具備幾何尺度不變性。
  • 提取的角點(diǎn)是像素級(jí)的
0 分享到:
和我們?cè)诰€交談!