使用opencv为灰度图像着色

时间:2012-05-21 17:03:46

标签: opencv colors kinect

我正在使用openNI进行一些带kinect传感器的项目。我想用深度图给出的用户像素颜色。现在我有从白色到黑色的像素,但我想从红色到黑色。我已尝试使用alpha混合,但我的结果只是我有从粉红色到黑色的像素,因为我添加(使用addWeight)红色+白色=粉红色。

这是我的实际代码:

layers = device.getDepth().clone();
cvtColor(layers, layers, CV_GRAY2BGR);

Mat red = Mat(240,320, CV_8UC3, Scalar(255,0,0));
Mat red_body; // = Mat::zeros(240,320, CV_8UC3);
red.copyTo(red_body, device.getUserMask());

addWeighted(red_body, 0.8, layers, 0.5, 0.0, layers);

其中device.getDepth()返回带有深度贴图的cv :: Mat,而device.getUserMask()返回带有用户像素的cv :: Mat(仅限白色像素)

一些建议?

编辑: 还有一件事: 感谢sammy answer我已经完成了。但实际上我没有完全从0到255的值,而是来自(例如)123-220。

我将通过简单的for循环找到最小值和最大值(有更好的方法吗?),如何将我的值从min-max映射到0-255?

2 个答案:

答案 0 :(得分:4)

首先,OpenCV的默认颜色格式是BGR而不是RGB。因此,您创建红色图像的代码应为

Mat red = Mat(240,320, CV_8UC3, Scalar(0,0,255));

对于红色到黑色的颜色贴图,您可以使用逐元素乘法而不是Alpha混合

Mat out = red_body.mul(layers, 1.0/255);

您可以使用

找到矩阵M的最小值和最大值
double minVal, maxVal;
minMaxLoc(M, &minVal, &maxVal, 0, 0);

然后您可以减去minValue并使用因子

进行缩放
double factor = 255.0/(maxVal - minVal);    
 M = factor*(M -minValue)

答案 1 :(得分:2)

有点笨拙和缓慢,但可能是分层,将red_body(使其成为一个通道Mat,而不是3)复制到红色通道,将它们合并回层?

获得相同的效果,但重塑得更快(到位):

layers = device.getDepth().clone();
cvtColor(layers, layers, CV_GRAY2BGR);

Mat red = Mat(240,320, CV_8UC1, Scalar(255)); // One channel
Mat red_body; 
red.copyTo(red_body, device.getUserMask());

Mat flatLayer = layers.reshape(1,240*320); // presumed dimensions of layer
red_body.reshape(0,240*320).copyTo(flatLayer.col(0));

// layers now has the red from red_body