OpenCV:如何计算最大值(R,G,B)

Posted

技术标签:

【中文标题】OpenCV:如何计算最大值(R,G,B)【英文标题】:OpenCV: How to calculate max(R,G,B) 【发布时间】:2014-07-10 21:51:04 【问题描述】:

遗憾的是,OpenCV 文档仅为数学家或已经知道如何使用 OpenCV 的人编写。

我想做一个简单的事情,比如为每个像素获取 R、G、B 的最高值并将其写入新的灰度图像。我尝试了merge()split() 等,但没有成功。

下面的函数正是我想要的,但我想知道 OpenCV 是否可以更简单。

Mat CalcRGBmax(Mat i_RGB)

    if (i_RGB.channels() != 3)
        throw "24 bit color image expected.";

    Mat i_Gray(i_RGB.rows, i_RGB.cols, CV_8UC1);

    for (int Y=0; Y<i_RGB.rows; Y++)
    
        BYTE* pu8_Src = i_RGB. ptr<BYTE>(Y);
        BYTE* pu8_Dst = i_Gray.ptr<BYTE>(Y);

        int P = 0;
        for (int X=0; X<i_RGB.cols; X++)
                 
            BYTE B = pu8_Src[P++];
            BYTE G = pu8_Src[P++];
            BYTE R = pu8_Src[P++];

            pu8_Dst[X] = max(R, max(G,B));
        
    
    return i_Gray;

【问题讨论】:

您的代码实际上对我来说似乎很简单。不过,我对 OpenCV 的了解还不够,无法回答。 顺便问一下,你需要这个做什么?把图片转成HSL,用L作为灰度不是更好吗? 计算 HSL 得到灰度图太复杂了。使用 cvtColor(..., CV_RGB2GRAY) 可以更轻松地完成此操作。但这不是我想要的。灰度值是根据人眼的敏感度计算得出的:灰度 = 59% 绿色 + 30% 红色 + 11% 蓝色。我想要的是 max(R,G,B) 【参考方案1】:

您的代码会比这快得多,但这是使用 split() 和 max() 的方法:

Mat CalcRGBmax(Mat i_RGB)

    std::vector<cv::Mat> planes(3);
    cv::split(i_RGB, planes);
    return cv::Mat(cv::max(planes[2], cv::max(planes[1], planes[0])));

【讨论】:

太棒了!这就是我所期待的答案。我测量了速度,非常惊讶。在我的 AMD Sempron 2300 上,我调用了这两个函数(我的和你的)300 次。结果是:我的代码= 9 秒。您的代码 = 10 秒!似乎 OpenCV 的人尽其所能来优化速度。 OpenCV的速度非常好。

以上是关于OpenCV:如何计算最大值(R,G,B)的主要内容,如果未能解决你的问题,请参考以下文章

数学问题——最大公约数和最小公倍数

在RGB到HSV的转换中,V=max(R,G,B),V不是RGB中的最大值吗?范围应该是在0~255之间,怎么会在0~1之间?

怎么用opencv和python,只保留深蓝色部分,其他区域变为黑色

opencv学习——轨迹栏作为调色板

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

OpenCV - 如何计算垫子的对数?