blog

ハリス特徴点検出器

画像処理の分野では、特徴点は、通常、回転不変性、光不変性、視点不変性などの利点を持ち、画像の重要な特徴の1つであり、ターゲットマッチング、ターゲット追跡、3D再構成などのアプリケーションでよく使用され...

Dec 12, 2020 · 10 min. read
シェア

はじめに

イメージ処理の分野では、特徴点は、通常、回転不変性、光不変性、視点不変性などの利点を持ち、イメージの重要な特徴の一つであり、ターゲットマッチング、ターゲット追跡、三次元再構成などのアプリケーションでよく使用されます。点特徴とは、主にイメージ中の目立つ角の点、エッジの端点、極端な点などを指します。点特徴抽出に用いられる演算子は、注目点抽出演算子と呼ばれ、一般的に用いられるものとしては、ハリス角検出、FAST特徴検出、SIFT特徴検出、SURF特徴検出などがあります。

このブログでは、より一般的で基本的なHarris Corner Point Detectionアルゴリズムについて説明します。Harris Corner Point Detectionアルゴリズムの考え方と数学的理論は、注目点検出に関わる原理を理解する上で非常に役立ちます。

内容

基本

1.コーナーのポイントスライドウィンドウを使って下の3つの図をスライドさせ、以下の結論を導き出しましょう:

  • 左のイメージは、ウィンドウ内のピクセル値があまり変化せずに、あらゆる方向に移動する平坦な領域を表しています;
  • 真ん中の図は、水平方向に動かすと画素値がジャンプするエッジの特徴を表し、エッジに沿って動かすと画素値は変わりません;
  • 右のイメージは、どの方向に動かしてもピクセル値が大きく変化するコーナーを表しています。

つまり、右の写真はコーナーポイントです。

2.コーナーポイントの種類コーナーポイントの種類を下図に示しますが、コーナーポイントを中心としてイメージ上をスライディングウィンドウでスライドさせると、複数の方向に移動することでその領域の画素値が大きく変化する現象が見られます。

3.イメージグラデーション

  1. イメージのグラデーションは、次に説明しようとするように、離散的な2次元関数であるというイメージの特徴から、数学のグラデーションとは形式的に異なりますが、イメージのグレースケールの変化率を表すという意味では同じです。
  2. 微積分学では、一次元関数の一階微分の基本的な定義は次のとおりです:

二次元の関数の一階微分の基本的な定義は次の通りです:

イメージの2次元配列のようなグレースケール・マップの場合、それは実際には離散的な2ビット関数です。離散的と言われるのは、グレースケールの各値が10進数ではなく整数の値を取るためで、L_3F5は無限に小さくなることはなく、L_3F5の最小単位は1ピクセルです。したがって、?が最小の値1をとるとき、グレースケールマップの一階微分の基本的な定義は次のようになります:

その点におけるx方向とy方向のイメージの勾配は、隣接する2つのピクセルの差に相当することがわかります。一般に、両方向のグラデーションの絶対値が使用されます。なぜなら、イメージのグレイ値の変化の大きさだけが注目され、グラデーションの方向は水平か垂直かだけわかればよく、特に左か右か、下か上かはわからないからです。

  1. イメージのある点での勾配の計算上記では、イメージのある点における水平方向の勾配gxと垂直方向の勾配gyの計算について説明しましたが、この2つの組み合わせにより、イメージのその点における勾配の大きさと方向が得られます。a. グラデーションの大きさを計算するには、数学的には、この組み合わせの公式は次のようになります:

しかし、イメージ処理では計算量を減らすために、次のような方法がよく使われます。

さらに拡大すると、イメージのグラデーションは、ウィンドウ領域が平坦か、エッジか、コーナーポイントかを判断するためにも一般的に使用されます。エッジ検出では、イメージのある点でのグラデーションの方向はエッジの方向と垂直なので、グラデーションの方向が分かればエッジの方向が分かることになり、将来的にはエッジ検出や輪郭検出などの知識として使われることになります。また、グラデーションは領域ではなく、各ピクセル点を中心として計算されることを覚えておいていただければと思います。

画素値の変化が大きい」という現象は、イメージグラデーションで表現できます。イメージの局所領域内では、イメージ勾配が大きいほど、その局所領域内の画素値の変化が大きくなります。 イメージのグラデーションは、微分または微分として数学的に表現できます。デジタルイメージの場合、勾配を2次元の離散関数として求め、微分を用いて微分を近似することと同じです: 実際には、イメージの勾配は通常、イメージの各画素のある近傍領域におけるグレースケールの変化を考慮して計算されます。そのため、勾配演算子は通常、元イメージの画素のある近傍領域に設定され、それを計算するための畳み込みに小領域のテンプレートが使われます。よく使われるのは、Prewittの演算子、Sobelの演算子、Robinsonの演算子、Laplaceの演算子などです。

Sobel演算子の紹介

  1. ソーベル演算子は、被写体間のエッジの特徴を検出するために使用され、その効果はガウシアンフィルタリングにやや似ており、中心点に近い画素ほど重要度が高くなります。

  2. ある点Aにおけるイメージの勾配は、X方向とY方向の勾配を得るために隣接する2つのピクセルの差を計算するだけでよいことを説明する必要があります。しかし、ある点における勾配の大きさをより合理的に決定するためには、点Aをksize×ksize領域の中心として演算子を使用し、エッジ検出効果を高めるために、差を拡大するために重みを追加する必要があります。また、アプリケーションでは、ある点の勾配の計算は、周囲にある複数の点のグレー値に依存する必要があるため、イメージ中のノイズの影響を受けやすく、計算のためのコールソーベル法では、ノイズを低減するために、元のイメージにガウシアンフィルタなどのフィルタを使用して平滑化する必要があります。そこで、完全なソーベル勾配の計算プロセスは次のとおりです。 1.元のイメージにガウシアンフィルタ平滑化ノイズ低減GaussianBlur 2.グレーマップcvtColorを回す 3.勾配のXとY方向Sobel。

  3. sobel演算子の形式

  1. OpenCV - Python では, cv2.Sobel メソッドを呼び出します.一般的な sobel 演算子とは,右から左,下から上,を引いたもので,イメージ中のある点における x 方向または y 方向の勾配を求めます.また,引き算の演算は必ずしも正の値とは限らず,負の値でも構いませんが, uint8 は負の値の存在を許さないので,負の値の存在に対応するために ddepth = cv2.CV_64F を指定すると,今回のイメージの表示では,配列の最初の負の値は 0 とみなされます.負の値が正の値に変換され、完全な特徴マップが得られます。

  2. ソーベル演算子の勾配を計算する際、エッジ点の勾配については、一般的に塗り潰し処理が行われます。つまり、演算子のカーネルサイズが3の場合、画素値0の点の層がイメージの4つの境界に塗り潰されます。

  3. 不明:この投稿は、実際にはCornerHarrisのパラメータについてのものでした。Sobel演算子はHarrisのコーナー検出処理で使用される演算子ですが、CornerHarrisのパラメータで指定できるのはSobel演算子のサイズ、つまりksizeだけで、正確なカーネルが何であるかは指定できないようです。勾配を計算し、それを特定のメソッドに割り当てるために使用することもできます。

フィルタ

  1. 主にイメージ平滑化ノイズ除去ガウシアンフィルタの記事をお勧めしたいと思います。特定のフィルタの内容は、より広範な、読者が自分で学ぶことです。

  2. ガウシアンフィルタの形式。ガウシアンフィルタは本質的に加重平均フィルタなので、カーネルは平均を得るために係数も持ちます。これらの係数は、行列のすべての値の和の逆数に等しくなります。対照的に、ソーベル演算子のカーネルは単純な重み付き和として計算されます。

  1. ガウシアンフィルタリングの特徴。ガウシアンフィルタリングは空間距離で重みの大きさを決定しますが、色の距離を考慮して重みを決定しないため、ガウシアンフィルタリングでノイズを除去する一方で、境界がある程度ぼやけてしまいます。

1.2.4 ハリスコーナーポイント検出アルゴリズムの原理

1.アルゴリズムのアイデアアルゴリズムの核心は、ローカルウィンドウを使用してイメージの周りを移動し、グレースケールに大きな変化があるかどうかを判断することです。ウィンドウ内のすべてのグレースケール値に大きな変化がある場合、このウィンドウが位置する領域にコーナーポイントが存在します。

これにより、ハリスのコーナー検出アルゴリズムは以下の3つのステップに分けることができます:

  • ウィンドウをxとyの両方向に移動させると、ウィンドウ内のピクセル値の変化は次のように計算されます。 .;
  • 各ウィンドウについて、対応するコーナーポイント応答関数の1つが計算されます。 .;
  • この関数は の場合、この関数は閾値化されます。

2.最初のステップ - 数学的モデリング

最初のステップは、数学的モデルを構築することによって、どのウィンドウがグレイスケール値の大きな変化を引き起こすかを決定することです。 ウィンドウの中心がグレイスケールイメージ内のある位置にあるとするとこの位置のピクセルのグレー値は このウィンドウを そして に移動させると この位置のピクセルのグレー値は

窓の動きによるグレーの値の変化の値です。

設定における窓関数を設定します.における窓関数は、窓内の各ピクセルの重みを表し、窓内のすべてのピクセルの重みを1に設定するのが最も簡単です。

もちろん をウィンドウの中心を原点とするガウス分布、つまりガウスカーネルに設定することも可能です。ウィンドウの中心にあるピクセルがコーナーポイントである場合、ウィンドウの移動前後で中心ポイントのグレイ値は非常に強く変化するので、そのポイントの重み係数は大きく設定されるべきで、これはそのポイントがグレイ変化に大きく寄与していることを示します。

次に、ウィンドウを各方向に動かすことによって生じる画素のグレー値の変化量 画素のグレー値の変化量を表す式は以下の通りです:

ウィンドウがコーナーポイントの場合計算結果が大きくなります。

計算効率を向上させるため、上式を簡略化し、テイラー級数展開により近似式を求めています:

二次元の場合、テイラー展開式は次のようになります:

では のために

そのうちを微分すると 方向の勾配マップ:

代入を代入するとが得られます:

u と v を提案し、最終的な2次式の近似形を求めます:

ここで行列Mは

最後に、実対称行列を対角化した結果は、直交する2方向の変化成分には影響を与えない、Rの回転因子と見なすことができます。

そして cを定数と考えれば、これは2次方程式であり、2次元像の2次方程式は角柱円です。そして、定数の正確な値はプラム円の形には影響しません。プラム円の形は、**まさにその短軸と長軸が求めたい固有値と密接に関係しているので、**研究の主眼となります。**したがって、ここではとりあえず二次方程式を考えます:

第一に、なぜ固有値を求めるのに行列が必要なのですか? 固有値を求めること自体に行列演算が必要なのですから。次に、固有値というか固有行列は何を意味するのでしょうか?まず、行列は運動を表し、行列の次元が変わらない場合、行列は回転と伸張という2つの運動を含んでいます。この2つの運動を分解したい場合、行列の直交化演算と固有値分解を行えば、直交行列と対角行列の2つの行列ができます。

ここでは、線形代数における実対称行列の対角化の知識が活用されており、興味のある学生はさらに関連情報を確認することができます。

3.ステップ2 - コーナー応答関数Rは最終形になりました。 最終的な形は、グレーの値のより大きな変化を引き起こすウィンドウを見つけることが目的であることを忘れないでください。

グレー値の変化の大きさは、勾配の共分散行列である行列Mに依存します。実際には、より良いプログラミングを適用できるように、コーナーポイント応答関数Rが定義されます。

各ウィンドウに対応するスコアを計算します:

ここで は行列の行列式で は行列のトレース。

そして は行列の固有値は行列の固有値、そして

の値はのコーナー点の固有値の値が非常に大きいとの固有値は非常に大きく、平坦領域は非常に小さく、エッジは負。

4.ステップ 3 - コーナーポイントの決定Rの値によって、このウィンドウが位置する領域は、平面、エッジ、コーナーポイントに分類されます。最適なコーナーポイントを得るために、非最大値抑制を使用することもできます。

注:ハリス検出器は回転不変ですが、スケール不変ではありません。つまり、スケールが変わるとコーナーがエッジになることがあります。スケール不変特性が必要な場合は、SIFT特徴量に注目することができます。

固有値λ1とλ2がRの値を決定するので、固有値を使ってウィンドウが平面か、エッジか、コーナーポイントかを決定することができます:

Flat:: このウィンドウは平らな領域をスライドし、ウィンドウ内のグレーの値は基本的に変化しません。 値は非常に小さく、変化量は水平方向、垂直方向ともに小さい、つまり が小さければ、λ1 も λ2 も小さくなります;

エッジ:値は負で、水平または垂直方向にのみ大きな変動があります。 片方だけが大きい、すなわちλ1>>λ2またはλ2>>λ1;

角度点: 水平方向と垂直方向の両方で大きな値を持ち、大きな変動を持つ点。 がともに大きい、すなわちλ1とλ2がともに大きい点。

次の図に示すように、ハリスのコーナー検出は、これらのスコアRを持つグレースケールイメージになります。

OpenCVベースの実装

1.opencvのAPIは、ハリスコーナー検出関数cv2.cornerHarrisの実装を提供し、直接呼び出すことができ、非常に便利です。

近傍の各ピクセルについて、勾配マップの共分散行列が計算されます。 そして、上記ステップ2のコーナーポイント応答関数によって結果マップが得られます。イメージ内のコーナーポイントは、この結果マップの局所最大値となります。

つまり、出力マップの局所的な極大値を得ることができ、これらの値はイメージのコーナーポイントに対応します。

パラメータの説明:

src - 入力グレイスケールイメージ, float32 型
blockSize - コーナーポイント検出に使われる近傍領域のサイズは、上述のウィンドウのサイズである
ksize - 勾配マップの計算に使われるソーベル演算子の次元
k - コーナーポイント応答関数を計算するために使われるパラメータkは、多くの場合、範囲0.04~0.06 
import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np
# detector parameters
block_size = 3
sobel_size = 3
k = 0.06
image = cv.imread('E:/python-project/deep-learning/picture/test1.jpg')
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("width: %s height: %s channels: %s"%(width, height, channels))
 
gray_img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# modify the data type setting to 32-bit floating point 
gray_img = np.float32(gray_img)
# detect the corners with appropriate values as input parameters
corners_img = cv.cornerHarris(gray_img, block_size, sobel_size, k)
# result is dilated for marking the corners, not necessary
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3, 3))
dst = cv.dilate(corners_img, kernel)
# Threshold for an optimal value, marking the corners in Green
#image[corners_img>0.01*corners_img.max()] = [0,0,255]
for r in range(height):
 for c in range(width):
 pix=dst[r,c]
 if pix>0.05*dst.max():
 cv2.circle(image,(c,r),5,(0,0,255),0)
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()

結果

要約:ハリスのコーナー検出演算子はスケール不変ではありません。

ハリスのコーナーポイント検出の特徴は、次のように要約できます:

  • しきい値はコーナーポイントの数を決定します
  • 輝度とコントラストの変化に鈍感なハリス・コーナーポイント検出演算子 ハリス・コーナーポイント検出を行う際、差分演算子を用いてイメージを離散化しますが、この演算子はイメージ濃度の引き上げや縮小、輝度の引き上げや引き下げに鈍感です。言い換えれば、輝度とコントラストのアフィン変換は、ハリス応答の極端な点が現れる位置を変えませんが、閾値の選択により、コーナー点の検出数に影響を与える可能性があります。
  • 回転不変性を持つハリスコーナーポイント検出演算子 ハリスコーナーポイント検出演算子は、コーナーポイント近傍領域のグレーレベルの2次モーメント行列を使用します。2次モーメント行列は楕円として表すことができ、楕円の長軸と短軸は2次モーメント行列の固有値の平方根のちょうど逆数になります。特性楕円が回転しても固有値は変化しないので、コーナーポイントの応答値も変化しないと判断され、ハリスコーナーポイント検出演算器は回転不変であることがわかります。
  • Harris Corner Point Detection Operator is not Scale Invariant(ハリス・コーナーポイント検出演算器はスケール不変ではない) スケールの変化により、コーナーポイントがエッジに、エッジがコーナーポイントに変化し、ハリスの理論的基礎はスケール不変ではありません。

Read next