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

I think you should use .at< uchar > instead of int (considering image to be grayscale) otherwise the value will overflow!

于 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 回答