Matlab

1

でgradient()を使用せずにガウス関数(dx、dy)の1次導関数を計算する私のガウス関数はfspecial('gaussian', 4, 1)として開始しましたが、gradient()は最初の導関数を得るのにとても便利です。とにかく、gradient()を使わずに一次導関数を計算することはできますか?教科書の最初のステップとして示されているように、私は、ハリスコーナー検出器を作成するためにそれを使用しています:Matlab

  • 計算ガウス
  • の誘導体と原画像を畳み込むことによって画像IXおよびIyのの水平および垂直の誘導体

答えて

1

ハリスコーナー検出器を実装する予定の場合は、gradientを使用しないでください。伝統的には、派生カーネルを使用し、このカーネルで画像をフィルタリングすることが行われています。あなたは様々なカーネルを使うことができますが、私が実際に行ったことは、水平カーネルdx[-1 0 1]であり、垂直カーネルdyがこれの転置か[-1;0;1]であるように、センタリングされた差分を使用することです。したがって、これらのカーネルで画像をフィルタリングして、画像の水平および垂直グラデーションであるIxおよびIyを取得し、これらの画像の平方バージョンで平滑化を実行します。Ix.^2,Iy.^2およびその製品Ix.*Iy 。次に、相関行列を作成し、行列式と痕跡を見つけ、コーナー応答を決定します。このしきい値を超える値は、潜在的なコーナーです。微分画像上でガウス平滑化を実行すると、当初の質問に記載されているガウス分布の微分で原画像が効果的にフィルタリングされます。

は、したがって、あなたは、単に行う、あなたのイメージがimに保存されていると仮定すると:

im = double(im); % Cast to double precision to ensure accuracy 
dx = [-1 0 1]; 
dy = dx.'; 
Ix = conv2(im, dx, 'same'); 
Iy = conv2(im, dy, 'same'); 

あなたは最終的にはハリスコーナーレスポンスを計算するためにIxIyを使用します。イメージ処理ツールボックスをお持ちの場合は、代わりにimfilterを使用することをお勧めします。それは速く、それはIntel Integrated Performance Primitives (IIPP)を使用します。正しく計算する方法の詳細については、私の以前の投稿をご覧ください:Trying to find/understand correct implementation of Harris Corners