10. opencv-python画像処理のトップレベル操作(2) - コーナー検出

ハリスとシ・トーマスのアルゴリズム

学習目標

Harris アルゴリズムと Shi-Tomasi アルゴリズムの原理を理解する

コーナー検出にハリスとシトマシを利用する機能

1. ハリスコーナー検出

1. 原則

Harris コーナー ポイント検出のアイデアは、画像の小さなローカル ウィンドウを通して画像を観察することです。コーナー ポイントの特徴は、次の図に示すように、ウィンドウを任意の方向に移動すると、グレースケールに明らかな変化が生じることです。 : 上記のアイデアを数学的形式、つまり
ここに画像の説明を挿入します
ローカルに変換します ウィンドウは (u, v) を全方向に移動し、すべてのグレースケールの差の合計が計算されます。式は次のとおりです: ここで、
ここに画像の説明を挿入します
I(x, y) はローカル ウィンドウの画像グレースケール、I(x+u, y+v) は変換です。画像のグレースケールの後の w(x, y) はウィンドウ関数であり、長方形ウィンドウまたはガウス ウィンドウにすることができます。以下の図に示すように、各ピクセルに異なる重みを割り当てます。 コーナー検出では、
ここに画像の説明を挿入します
一次テイラー展開を使用して、E(u, v ) が最大値になります。
ここに画像の説明を挿入します
ここで、Ix と Iy は、x と y に沿った導関数です。方向。sobel 演算子を使用して計算できます。
導出は次のとおりです:
ここに画像の説明を挿入します
M 行列は E(u, v) の値を決定します。以下ではコーナー ポイントを見つけるために M を使用します。M は Ix と Iy の二次項関数であり、次の形で表現できます。楕円の長半軸と短半軸は M λ 1 \lambda_1の固有値によって与えられます。1λ 2 \lambda_22以下の図に示すように、固有ベクトルによって方向が決まります。
ここに画像の説明を挿入します
楕円関数の固有値と画像内の角点、直線(エッジ)、面との関係は下図のようになります。
ここに画像の説明を挿入します
上の図からわかるように、次の 3 つの状況に分けられます。

  • 画像内の直線、1 つの固有値は大きく、1 つの固有値は小さい、λ 1 \lambda_11>> λ 2 \lambda_22またはλ 1 \lambda_11<< λ 2 \lambda_22楕円関数の値は一方向では大きく、他の方向では小さくなります。
  • 画像の飛行機。両方の固有値は小さく、ほぼ等しいため、楕円関数の値はどの方向でも小さくなります。
  • 画像内のコーナーポイント。両方の固有値は大きくほぼ等しく、すべての画像で楕円関数値が増加します。

Harris によって与えられたコーナー点計算方法は、特定の特徴量の計算を必要とせず、コーナー応答値 R を計算してコーナー点を決定します。R の計算式は次のとおりです:
ここに画像の説明を挿入します
ここで、detM は行列 M の行列式、traceM は行列 M のトレース、α は値の範囲が 0.04 ~ 0.06 の定数です。実際、この特性は detM とtraceM に暗黙的に含まれています。なぜなら、
ここに画像の説明を挿入します
次のようにコーナー点であるかどうかを判断します。
ここに画像の説明を挿入します

  • R が大きな正の数の場合のコーナーポイント。
  • R が大きな負の数の場合の境界。
  • R が小数の場合、平坦領域とみなされます。

2. 具体的な実装

OpenCV で Harris 検出を実装するために使用される API は次のとおりです。

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

パラメータ

  • img: データ型 float32 の入力画像。
  • blockSize: コーナー検出で考慮される近傍のサイズ。
  • ksize: ソーベル導出に使用されるカーネル サイズ。
  • k: コーナー検出式の自由パラメーター。値パラメーターは [0.04, 0.06] です。
    コード例:
import cv2 as cv
import numpy as np 
import matplotlib.pyplot as plt
# 1 读取图像,并转换成灰度图像
img = cv.imread('./image/chessboard.jpg')
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 设置阈值,将角点绘制出来,阈值根据图像进行选择
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. シトーマスコーナー検出

1. 原則

Shi-Tomasi アルゴリズムは Harris コーナー検出アルゴリズムを改良したもので、一般に Harris アルゴリズムよりも優れたコーナー ポイントを生成します。Harris アルゴリズムのコーナー応答関数は、行列 M のトレースから行列 M の値を減算し、その差を使用してそれがコーナー点であるかどうかを判断します。その後、Shi と Tomasi は改善された方法を提案しました。行列 M の 2 つの固有値のうち小さい方がしきい値より大きい場合、それはコーナー点とみなされます。つまり、次の図に
ここに画像の説明を挿入します
示すようになります。図を見ると、 λ 1 \lambda_1
ここに画像の説明を挿入します
のみであることがわかります。1λ 2 \lambda_22両方が最小値より大きい場合、それはコーナーポイントとみなされます。

2. 実現する

API を使用して OpenCV に Shi-Tomasi コーナー検出を実装します。

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

パラメータ

  • 画像: 入​​力グレースケール画像
  • maxCorners: コーナーポイントの数を取得します。
  • qualityLevel: このパラメータは、許容可能な最低のコーナー品質レベルを 0 ~ 1 の範囲で示します。
  • minDistance: 隣接する特徴点を避けるためのコーナー点間の最小ユークリッド距離。
    戻る:
  • コーナー: 検索されたコーナー ポイント。品質レベルを下回るすべてのコーナー ポイントが除外され、適格なコーナー ポイントが品質によって並べ替えられ、より良い品質 (最小ユークリッド距離未満) のコーナーに近いコーナー ポイントが削除されます。 、そして最後に 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()

結果として処理された画像は次のようになります。
ここに画像の説明を挿入します

要約する

ハリスアルゴリズム

アイデア: 画像の小さなローカル ウィンドウを通して画像を観察します。コーナー ポイントの特徴は、ウィンドウを任意の方向に移動すると、画像のグレースケールに明らかな変化が生じることです。
API:

cv2.cornerHarris()

Shi-Tomasi算法

Harris アルゴリズムの改良により、コーナーポイントをより適切に検出できるようになりました。
API:

cv2.goodFeatureToTrack()

おすすめ

転載: blog.csdn.net/weixin_44463519/article/details/126167013