我一直在使用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);
我获得了两个令人困惑的结果。我获得的平均值不仅大于从minMaxLoc获得的最大值,而且在尝试一组图像时也有时是负的。 sample平均值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平均值。?
如果我在代码中遗漏了某些内容,请原谅我,但这让我感到有些困惑。感谢您的帮助。
答案 0 :(得分:3)
我认为你应该使用.at&lt; uchar&gt;而不是int(考虑图像为灰度)否则值将溢出!
答案 1 :(得分:1)
通常,图像具有8位图像。很可能,您使用错误的方法访问图像的像素。在这种情况下,您从矩阵中读取的值是错误的。
要检查您是否使用单通道整数矩阵,请使用
dst.type() == CV_32SC1 .
要检查8位矩阵使用
dst.type() == CV_8SC1 .
如果您实际拥有这样的8位整数矩阵,则需要使用.at<uchar>
来访问像素。
即使您只向其中添加正值,您的总变量为负数的原因可能是integer overflow。您可以使用long int
总计来避免这种情况。