【问题标题】:Convert Image Color from Grayscale to RGB OpenCV C++将图像颜色从灰度转换为 RGB OpenCV C++
【发布时间】:2013-01-12 08:48:57
【问题描述】:

基本上我正在尝试将下面的输出图像转换为颜色(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;
}

【问题讨论】:

  • ehmmm 这不是一件容易的事!基本上就像在给定 1+2+3 = 6 的情况下解决以下问题一样,您必须在给定 6 的情况下找到“1,2,3”。不可能有很多总和输出“6”作为数字。由于舍入误差可能会检测到某些颜色(因为每种颜色都有不同的最大亮度),然后使用“自相关”来扩展颜色区域,但最终图像仍然不会具有所有原始颜色并且无论如何都会具有较低的质量因为信息总是丢失。
  • 我试图理解灰度到 RGB 的含义。如果您只是指 3 色分量图像,那么您只需将灰度分量复制到 RGB 新创建图像的所有三个 R、G 和 B 分量。如果您真的想在图像中添加颜色,那么您将永远无法获得真正的彩色图像。您充其量只能想出图像的伪彩色版本。这与 IR(红外)图像获取颜色的方式相同。

标签: c++ image opencv rgb


【解决方案1】:

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

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 处理,并将找到的圆圈应用于原始彩色图像以供输出。

【讨论】:

  • 那是完美的。能否请您快点告诉我,如何找到检测到的圈数?就在这里,因为我需要你明天做这个,然后我会接受你的回答,如果需要的话,打开一个新的。但现在请快速回答。尽可能详细。
  • @Pluto - circles 是找到的圆的数组 - circles.size() 给出计数。这部分应该非常明显,因为您正在循环遍历 for 循环中找到的圆圈,以便将它们一一绘制到原始图像上。
  • @Pluto,它有用吗?也许您想知道如何将您的 circles.size() 作为返回值?
【解决方案2】:

您粘贴的代码正在返回彩色图像。

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

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

【讨论】:

    【解决方案3】:

    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

    【讨论】:

      【解决方案4】:

      您可以在输入的彩色图像上绘制圆圈。 检查openCV中给出的文档

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

      【讨论】:

        猜你喜欢
        • 2017-05-17
        • 2015-10-07
        • 2014-02-26
        • 2014-12-22
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多