如何在 OpenCV 中计算 Mat 的最大像素值 [重复]

Posted

技术标签:

【中文标题】如何在 OpenCV 中计算 Mat 的最大像素值 [重复]【英文标题】:How to compute maximum pixel value of Mat in OpenCV [duplicate] 【发布时间】:2012-09-20 22:33:18 【问题描述】:

这应该是显而易见的,我想。但是我找不到在 OpenCV Mat 的所有像素中找到最大值的简单方法。当然,我可以对每种像素类型进行以下操作。但是一般的 max 函数仍然有用。

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;

【问题讨论】:

【参考方案1】:

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

【讨论】:

这是我的首选,因为它允许使用更高效的低级代码,而不是通用迭代器。【参考方案2】:

您始终可以将 std max_element 函数与来自 opencv 的迭代器一起使用

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

【讨论】:

可能值得一提的是 max_element 返回一个迭代器。 一个注意事项:我希望 Mat 迭代器会很慢,因为在每次增量时,它都必须检查是否到达行尾(矩阵可能是不连续的,并且可能还有填充字节)【参考方案3】:

您还可以使用 cv::minMaxLoc 内置函数。不过,在您的情况下, std::max_element 更简单。

【讨论】:

以上是关于如何在 OpenCV 中计算 Mat 的最大像素值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

opencv如何计算图像中物体的像素值

如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值

opencv中16位的矩阵保存成图像,最大灰度值只有32768

如何访问二进制 Mat 图像中的像素值?

在 OpenCV 中计算 3D 梯度方向

如何将OpenCV Mat的所有像素设置为特定值?