web-dev-qa-db-ja.com

画像の分散を計算する背後にある理論は何ですか?

LaplacianFilterを使用して画像のぼやけを計算しようとしています。

この記事によると: https://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/ 出力画像の分散を計算する必要があります。問題は、画像の分散をどのように計算するかを概念的に理解していないことです。

すべてのピクセルにはすべてのカラーチャネルに対して4つの値があるため、すべてのチャネルの分散を計算できますが、分散共分散行列を計算すると4つの値、さらには16の値が得られますが、OpenCVの例によると1つの数値しかありません。

その数を計算した後、画像がぼやけているかどうかに関係なく、バイナリの決定を行うためにしきい値で遊んでいます。

PS。私はこのトピックの専門家ではないので、私の発言は意味がありません。もしそうなら、質問を編集してください。

8
denis631

まず最初に、あなたが与えたチュートリアルを見ると、彼らは画像をグレースケールに変換するので、1つのチャネルと1つの分散しかありません。チャネルごとにそれを実行して、より複雑な式を計算するか、すべての数値の分散を使用することができます...ただし、情報を融合するための優れた方法であるため、作成者もグレースケールに変換すると思います。そして、著者が提供する論文の1つで、実際には次のように述べています。

焦点の合った画像は、グレーレベルの変動が大きいと予想されます。

チュートリアルの作者は実際にそれを簡単な方法で説明しています。まず、ラプラシアンフィルターが何をするかを考えてください。ここでは、明確に定義されたエッジが表示されます。これは、彼が持っていた写真のグリッドを使用した例です。 (詳細を表示するには、クリックしてください)

enter image description here

ご覧のとおり、ぼやけた画像にはほとんどエッジがありませんが、焦点の合った画像には多くの応答があります。さて、分散を計算するとどうなるでしょうか。白が255で黒が0の場合を想像してみましょう。すべてが黒の場合...分散は低くなりますが(ぼやけた場合)、半分と半分程度の場合は分散が高くなります。

ただし、著者がすでに述べたように、このしきい値はドメインに依存します。焦点が合っていても空の写真を撮ると、非常によく似ており、エッジがあまり明確に定義されていないため、分散が小さい可能性があります。 。

私はこれがあなたの疑問に答えることを願っています:)

7
api55

文の説明について:

ぼやけた画像のエッジはsmoothedであるため、varianceは小さいです。


1。分散の計算方法

post のコア関数は次のとおりです。

_def variance_of_laplacian(image):
    # compute the Laplacian of the image and then return the focus
    # measure, which is simply the variance of the Laplacian
    return cv2.Laplacian(image, cv2.CV_64F).var()
_

Opencv-Pythonは_numpy.ndarray_を使用して画像を表すため、 _numpy.var_ を確認します。

_Help on function var in module numpy.core.fromnumeric:

var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<class 'numpy._globals$
    Compute the variance along the specified axis.

    Returns the variance of the array elements, a measure of the spread of a distribution.
    The variance is computed for the flattened array by default, otherwise over the specified axis.
_

2。画像に使用

つまり、varは、平坦化されたラプラシアン画像または平坦化された1次元配列で計算されます。

配列variancexを計算するには、次のようになります。

var = mean(abs(x - x.mean())**2)


例えば:

_>>> x = np.array([[1, 2], [3, 4]])
>>> x.var()
1.25
>>> np.mean(np.abs(x - x.mean())**2)
1.25
_

ラプラシアン画像の場合はedged画像です。 GaussianBlurと異なるrを使用して画像を作成し、それらに対して_laplacian filter_を実行して、変数を計算します。

enter image description here

ぼやけた画像のエッジはsmoothedであるため、varianceはほとんどありません。

9
Kinght 金