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,只保留深蓝色部分,其他区域变为黑色