1

私はminMaxLocを使用して、グレースケール画像に対してラプラシアンフィルターを実行して得られたデータの最大値を計算しています。私の単純な意図は、シャープネスを大まかに見積もることです。ここで説明した混乱した状況に遭遇しました。

minMaxLoc関数から取得された最大値は、一連の画像に対して1360、1456、450などでした。

    Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta,BORDER_DEFAULT);
    minMaxLoc(dst,&min,&estimate,&minLoc,&maxLoc,noArray());//Estimate is the max value

ここで、平均を計算して、画像のシャープネスの広がりをよりよく理解しようとしました。DSTは、ラプラシアンからのデータを保持するMat変数であることに注意してください。

    Size s = dst.size();
    rows = s.height;
    cols = s.width;
    total = 0;
    max =  0;
    for(int k=0;k<rows;k++)
    {
      for(int l=0;l<cols;l++)
      {
        total = total + abs(dst.at<int>(k,l));
      }
    }
    average = total/(rows*cols);

私が得た2つの不可解な結果があります。私が取得した平均値は、minMaxLocから取得した最大値よりも大きいだけでなく、一連の画像を試してみると、負の値になることもありました。サンプル平均値22567、場合によっては-25678。

負の値の発生は、abs()を使用してラプラシアン結果の絶対値を取得しているため、さらに厄介でした。

正しく理解するために、私は自分で最大値を計算し、次に平均値を計算しました:

    Size s = dst.size();
    rows = s.height;
    cols = s.width;
    total = 0;
    max =  0;
    for(int k=0;k<rows;k++)
    {
      for(int l=0;l<cols;l++)
      {
        if(abs(dst.at<int>(k,l))>max)
        {
           max = abs(dst.at<int>(k,l));
        }
        total = total + abs(dst.at<int>(k,l));
       }
    }
    average = total/(rows*cols);

驚いたことに、最大値は8桁であることがわかりました。

これが私が混乱した理由です。minMaxLoc関数から与えられる最大値はいくつですか?そして、なぜabs()が機能していないのか、そしてなぜ-ve平均値を取得しているのですか?

コードに何かが欠けている場合はご容赦ください。ただし、これは少し混乱します。よろしくお願いします。

4

2 に答える 2

3

intの代わりに.at<uchar>を使用する必要があると思います(画像をグレースケールと見なします)。そうしないと、値がオーバーフローします。

于 2013-01-11T18:54:30.717 に答える
1

通常、画像には8ビットの画像があります。したがって、間違った方法を使用して画像のピクセルにアクセスしている可能性があります。そしてこの場合、あなたがマトリックスから読んだ値は間違っています。

単一チャネル整数行列を使用しているかどうかを確認するには、次を使用します

dst.type() == CV_32SC1 .

8ビットマトリックスをチェックするには、

dst.type() == CV_8SC1 .

実際にそのような8ビット整数行列を使用している場合は、を使用.at<uchar>してピクセルにアクセスする必要があります。

正の値のみを追加したにもかかわらず、合計変数が負である理由は、おそらく整数のオーバーフローが原因です。long intfor totalを使用すると、これを回避できます。

于 2013-01-11T21:31:25.207 に答える