【发布时间】:2026-01-29 17:30:01
【问题描述】:
遗憾的是,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)