繁体   English   中英

在OpenCV中将灰度图像转换为单色

[英]Convert grayscale image to single color in OpenCV

我想知道是否有一种方法可以将灰度图像转换为彩色图像? 就像我有灰度图像,而是想将其转换为蓝色阴影一样? 在OpenCV中有可能吗?

非常感谢你!

灰度图像通常只是一维。 通常,如果我想将灰度图像传递到接受RGB(3维)的函数中,该怎么做,我将矩阵复制3次以创建MxNx3矩阵。 如果只希望使用“蓝色”通道,则只需在第一维和第二维上合并零的MxN,而将原始灰度值放入第三维。

根据opencv社区的答案 ,您应该自己创建一个3通道图像。

   Mat empty_image = Mat::zeros(src.rows, src.cols, CV_8UC1);//initial empty layer
   Mat result_blue(src.rows, src.cols, CV_8UC3);                 //initial blue result

   Mat in1[] = { ***GRAYINPUT***, empty_image, empty_image };    //construct 3 layer Matrix
   int from_to1[] = { 0,0, 1,1, 2,2 };
   mixChannels( in1, 3, &result_blue, 1, from_to1, 3 );          //combine image

之后,您可以获取蓝色通道图像。 通常,opencv中彩色图像的蓝色通道是第一层(因为他们将3个通道作为BGR)。

顺便说一句,如果您想使用复制每个像素的方法,则可以初始化一个空白图像

   Mat result_blue(src.rows, src.cols, CV_8UC3); //blue result
   for (int i =0; i<src.rows; i++)
        for (int j=0; j<src.cols; j++){
               Vec3b temp = result_blue.at<Vec3b>(Point(i,j));//get each pixel
               temp[0] = gray.at<uchar>(i,j);                 //give value to blue channel
               result_blue.at<Vec3b>(Point(x,y)) = temp;      //copy back to img
        }

但是,由于存在两个循环,因此需要更长的时间!

为此,您基本上只需要遍历灰度图像中的所有像素并将值映射到颜色范围即可。 这是伪代码:

grayImage:imageObject;
tintedImage:imageObject;

//Define your color tint here
myColorR:Int = 115;
myColorG:Int = 186;
myColorB:Int = 241;

for(int i=0; i<imagePixelArray.length; i++){
   float pixelBrightness = grayImage.getPixelValueAt(i)/255;
   int pixelColorR = myColorR*pixelBrightness;
   int pixelColorG = myColorG*pixelBrightness;
   int pixelColorB = myColorB*pixelBrightness;
   tintedImage.setPixelColorAt(i, pixelColorR, pixelColorG, pixelColorB);
}

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM