将图像颜色从灰度转换为RGB OpenCV C ++

时间:2013-01-28 21:44:13

标签: c++ image opencv rgb

基本上我试图将下面的输出图像转换为彩色(RGB)。此代码当前输出的图像是灰度,但是,对于我的应用程序,我希望它作为颜色输出。请让我知道我应该在哪里转换图像。

下面的代码也是C ++,它使用的是openCV中的函数。请记住,我正在使用包装器在我的iphone应用程序中使用此代码。

cv::Mat CVCircles::detectedCirclesInImage(cv::Mat img, double dp, double minDist, double    param1, double param2, int min_radius, int max_radius) {
//(cv::Mat img, double minDist, int min_radius, int max_radius)


if(img.empty())
    {
    cout << "can not open image " << endl;
    return img;
    }
Mat cimg;
medianBlur(img, img, 5);

cvtColor(img, cimg, CV_GRAY2RGB);

vector<Vec3f> circles;
HoughCircles(  img      //InputArray 
             , circles  //OutputArray
             , CV_HOUGH_GRADIENT  //int method
             , 1//dp              //double       dp=1   1 ... 20
             , minDist         //double minDist=10 log 1...1000
             , 100//param1          //double  param1=100
             , 30//param2          //double  param2=30  10 ... 50
             , min_radius      //int  minRadius=1   1 ... 500
             , max_radius      //int  maxRadius=30  1 ... 500
             );

for( size_t i = 0; i < circles.size(); i++ )
    {
    Vec3i c = circles[i];
    circle( cimg, Point(c[0], c[1]), c[2], Scalar(255,0,0), 3, CV_AA);
    circle( cimg, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, CV_AA);
    }


return cimg;
}

4 个答案:

答案 0 :(得分:21)

目前设置为期望灰度图像作为输入。我认为您正在询问如何调整它以接受彩色输入图像并返回彩色输出图像。你不需要做太多改变:

cv::Mat CVCircles::detectedCirclesInImage(cv::Mat img, double dp, double minDist, double  param1, double param2, int min_radius, int max_radius) {

  if(img.empty())
        {
        cout << "can not open image " << endl;
        return img;
        }
  Mat img;

  if (img.type()==CV_8UC1) {
              //input image is grayscale
    cvtColor(img, cimg, CV_GRAY2RGB);

  } else {
              //input image is colour
    cimg = img;
    cvtColor(img, img, CV_RGB2GRAY);
  }

其余的保持不变。

如果输入图像是彩色的,则将其转换为灰色以供HoughCircles处理,并将找到的圆应用于原始彩色图像以进行输出。

答案 1 :(得分:0)

您粘贴的代码返回彩色图片。

你已经在做cvtColor(img,cimg,CV_GRAY2RGB),然后我没有看到cimg在任何地方都被转换为灰度!,要验证它在从此函数返回之前尝试显示它:

imshow("c",cimg);
waitKey(0);
return cimg;

答案 2 :(得分:0)

cvtImage例程将简单地将灰色元素复制到每个像素的三个元素R,G和B中的每一个。换句话说,如果像素灰度值是26,那么新图像将具有R = 26,G = 26,B = 26。

即使它包含所有3种颜色成分,所呈现的图像仍将呈现灰度级,您基本上所做的就是将存储相同图像所需的空间增加三倍。

如果您确实想要在图像中显示颜色(当您查看它时),则无法从灰度返回到原始颜色。然而,对图像进行伪着色或伪着色的方法。

http://en.wikipedia.org/wiki/False_color

http://blog.martinperis.com/2011/09/opencv-pseudocolor-and-chroma-depth.html

http://podeplace.blogspot.com/2012/11/opencv-pseudocolors.html

答案 3 :(得分:-1)

您可以在输入彩色图像上绘制圆圈。 查看openCV中提供的文档

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html