如何在OpenCV中计算Mat的最大像素值

10

我觉得这个应该很明显,但我找不到一种简单的方法来找到OpenCV的Mat中所有像素的最大值。当然,我可以为每种像素类型执行以下操作。但通用的最大函数仍然很有用。

double cvMax(cv::Mat& mat)
{
float max=0;
float* pData=(float*)mat.data;
for(int i=0;i<mat.rows;i++) 
{
    for(int j=0;j<mat.cols;j++)
    {
        float value = pData[j+i*mat.cols];
        if(value>max) 
        {
            max=value;
        }
    }
}
return max;
}
3个回答

22

cv::minMaxIdx非常易于使用。虽然在文档中看起来很复杂,但您可以省略大部分参数:

Mat m = ...;

double min, max;
minMaxIdx(m, &min, &max);

printf("min: %f, max: %f\n", min, max);
此外,cv::minMaxIdxstd::max_element 快10倍以上。 这是因为 cv::minMaxIdx 经过了针对处理 cv::Mat 数据的优化,并且在可能的情况下使用多个线程。
如果您还需要知道图像中最小值和最大值的位置,则可以使用cv::minMaxLoc

这是我的首选,因为它允许使用更高效的低级代码,而不是通用的迭代器。 - Josh Vander Hook

16

你可以始终使用std max_element函数,使用来自OpenCV的迭代器

std::max_element(Mat.begin<double>(),Mat.end<double>());

4
值得一提的是,max_element返回一个迭代器。 - twerdster
1
一个注意事项:我预计Mat迭代器会非常慢,因为每次增加时都必须检查是否达到了一行的末尾(矩阵可能是不连续的,并且可能还有填充字节)。 - Antonio

9

你也可以使用cv::minMaxLoc内置函数。然而,在你的情况下,std::max_element更简单易用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接