web-dev-qa-db-ja.com

なぜソーベル演算子はそのように見えるのですか?

画像微分計算の場合、Sobel演算子は次のようになります。

[-1 0 1]
[-2 0 2]
[-1 0 1]

私はそれについて2つのことをよく理解していません、

1.中央のピクセルがである理由以下のような演算子だけを使用することはできません、

[-1 1]
[-1 1]
[-1 1]

2.中央の行が他の行の2倍になるのはなぜですか?

私は自分の質問をグーグルで検索しましたが、私を納得させることができる答えは見つかりませんでした。私を助けてください。

29
Alcott

コンピュータビジョンでは、何かを行うための完璧で普遍的な方法がないことがよくあります。ほとんどの場合、演算子を試し、その結果を確認して、ニーズに合っているかどうかを確認します。勾配計算にも当てはまります。Sobel演算子は、画像勾配を計算する多くの方法の1つであり、多くのユースケースでその有用性が証明されています。

実際、私たちが考えることができるより単純な勾配演算子は、上記で提案したものよりもさらに単純です。

[-1 1]

その単純さにもかかわらず、この演算子には最初の問題があります。これを使用する場合、勾配を計算しますbetween 2つの位置であり、at 1つの位置ではありません。 2ピクセル(x,y)(x+1,y)に適用する場合、位置(x,y)または(x+1,y)で勾配を計算しましたか?実際、計算したのは位置(x+0.5,y)での勾配であり、半分のピクセルでの作業はあまり便利ではありません。そのため、中央にゼロを追加します。

[-1 0 1]

これをピクセル(x-1,y)(x,y)、および(x+1,y)に適用すると、中央のピクセル(x,y)のグラデーションが明確に得られます。

これは、2つの[-1 1]フィルターの畳み込みとして見ることもできます。ピクセルの左側の位置[-1 1 0]で勾配を計算する(x-0.5,y)と、計算する[0 -1 1]です。ピクセルの右側のグラデーション。

現在、このフィルターにはまだ別の欠点があります。ノイズに非常に敏感です。そのため、ピクセルの1行ではなく、3行に適用することにしました。これにより、これら3行の平均勾配を取得でき、ノイズの可能性を和らげることができます。

[-1 0 1]
[-1 0 1]
[-1 0 1]

しかし、これは平均化する傾向があります。特定の1つの行に適用すると、この特定の行の詳細を構成する要素の多くが失われます。これを修正するために、中央の行にもう少し重みを付けます。これにより、前の行と次の行で発生することを考慮に入れながら、その行の特異性を維持することで、発生する可能性のあるノイズを取り除くことができます。これがSobelフィルターを提供するものです。

[-1 0 1]
[-2 0 2]
[-1 0 1]

係数を改ざんすると、Scharr演算子などの他の勾配演算子が発生する可能性があります。これにより、中央の行にもう少し重みが与えられます。

[-3  0 3 ]
[-10 0 10]
[-3  0 3 ]

これには、これらのフィルターの分離可能性などの数学的理由もあります...しかし、実験は私の意見であるため、興味深い数学的特性を持っていることが証明された実験的発見として見ることを好みます。コンピュータビジョンの心臓部。それがあなたのニーズに合う限り、あなたの想像力だけが新しいものを作成するための限界です...

56
mbrenon

[〜#〜] edit [〜#〜]Sobel演算子がそのように見える本当の理由は、 an Sobel自身による興味深い記事 。この記事をざっと読んだところ、Sobelのアイデアは、水平、垂直、および斜めの中央の差を平均することによって、勾配の推定を改善することであったことがわかります。これで、グラデーションを垂直成分と水平成分に分割すると、対角線の中心の違いが両方に含まれますが、垂直と水平の中心の違いは1つだけに含まれます。したがって、対角線の二重カウントを避けるために、垂直方向と水平方向の半分の重みを設定する必要があります。 1と2の実際の重みは、固定小数点演算に便利です(実際には16のスケール係数が含まれています)。

私は@mbrenonにほぼ同意しますが、コメントで述べるのが難しすぎる点がいくつかあります。

まず、コンピュータービジョンでは、「ほとんどの場合、オペレーターを試すだけです」というアプローチは、時間を浪費し、達成された可能性のあるものと比較して不十分な結果をもたらします。 (そうは言っても、私も実験するのが好きです。)

_[-1 0 1]_を使用する正当な理由は、微分推定値をピクセルの中心に置くことです。しかし、もう1つの正当な理由は、それが 中央の差 式であり、[-11]よりも真の導関数の推定値の誤差が小さいことを数学的に証明できることです。

_[1 2 1]_は、mbrenonとしてノイズをフィルタリングするために使用されます。これらの特定の数値がうまく機能する理由は、アーティファクトを導入しないonlyフィルターであるガウス分布の近似であるためです(Sobelの記事から、これは偶然のようです) 。ここで、ノイズを減らしたい場合で、水平方向の導関数を見つけたら、導関数の推定に与える影響を最小限に抑えるために、垂直方向にフィルタリングします。 transpose([1 2 1])を_[-1 0 1]_と畳み込むと、Sobel演算子が得られます。つまり:

_[1]            [-1 0 1]
[2]*[-1 0 1] = [-2 0 2]
[1]            [-1 0 1]
_
18
Bull

2D画像の場合、マスクが必要です。このマスクは次のとおりです。

[ a11 a12 a13; 
  a21 a22 a23;
  a31 a32 a33 ]

Df_x(xに沿ったグラデーション)は、Df_y(yに沿ったグラデーション)から90°回転して生成する必要があります。つまり、マスクは次のようになります。

[ a11 a12 a11; 
  a21 a22 a21;
  a31 a32 a31 ]

ここで、中央のピクセルの前の信号を減算する場合(つまり、離散-減算での微分)、減算の両側に同じ重みを割り当てます。つまり、マスクは次のようになります。

[  a11 a12 a11; 
   a21 a22 a21;
  -a11 -a12 -a11 ]

次に、重みの合計はゼロである必要があります。これは、滑らかな画像(たとえば、すべての255)がある場合、応答をゼロにしたいためです。つまり、次のようになります。

[  a11 a12 a11; 
   a21 -2a21 a21;
  -a31 -a12 -a31 ]

滑らかな画像の場合、X軸に沿った微分はゼロを生成すると予想されます。

[  a11 a12 a11; 
   0 0 0;
  -a31 -a12 -a31 ]

最後に、正規化すると次のようになります。

[  1 A 1; 
   0 0 0;
  -1 -A -1 ]

実験的にAを好きなように設定できます。係数2は、元のSobelフィルターになります。

3
staonas