ハリスコーナ検出器
大まかな手順
- 画像の平滑化
- 各画素の微分を計算する
- 行列M(後述)を計算する
- コーナネスC(後述)を計算する
- コーナネスCの値が閾値より大きければ、コーナと判定する
行列Mは次のように設定する。
$$M = \sum \omega (x,y) \begin{pmatrix} I_x^2 & I_xI_y \\ I_xI_y & I_y^2 \end{pmatrix}$$
コーナネスCは次のように設定する。
$$C = \mathrm{ det }(M) – k(\mathrm{ Tr } (M))^2$$
kはパラメータである。
kは、0.04~0.06の数値がよく用いられる。
$$\mathrm{ det }(M) = \lambda_1 \lambda_2$$
$$\mathrm{ Tr } (M) = \lambda_1 + \lambda_2$$
λは、行列Mの固有値
Python+OpenCV
OpenCVの関数cornerHarris()を使用する。
引数が、
- 入力画像
- コーナー検出の際に考慮する隣接領域のサイズ
- Sobelの勾配オペレータのカーネルサイズ
- k-パラメータ
kパラメータは、0.04から0.06の数値がよく使われる。
import cv2 import numpy as np img = cv2.imread('haruna_kankore.png') gray = cv2.imread('haruna_kankore.png', 0) gray = np.float32(gray) dst = cv2.cornerHarris(gray,2,3,0.06) dst = cv2.dilate(dst,None) #閾値の設定 img[dst>0.01*dst.max()]=[0,0,255] cv2.imwrite('Harris.png', dst) cv2.imwrite('Harris_corner.png',img)
出力画像
元画像
ハリスコーナ検出
参考
Harrisコーナー検出 — OpenCV-Python Tutorials 1 documentation