Подтвердить что ты не робот

Преобразование цвета изображения из оттенков серого в RGB OpenCV С++

В основном я пытаюсь преобразовать нижеследующее выходное изображение в цвет (RGB). Изображение, которое этот код в настоящее время выводит, имеет оттенки серого, однако для моего приложения я хотел бы, чтобы он выводился как цвет. Пожалуйста, дайте мне знать, где я должен преобразовать изображение.

Также приведен код ниже С++ и он использует функцию 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;
}
4b9b3361

Ответ 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 и применяете найденные круги к исходному цветному изображению для вывода.

Ответ 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 цветовых компонента, все, что вы делаете, состоит в том, чтобы утроить пространство, необходимое для хранения одного и того же изображения.

Если вы хотите, чтобы цвет отображался на изображении (когда вы его просматриваете), это действительно невозможно перейти от оттенков серого к цветам ORIGINAL. Однако есть средства псевдо-раскраски или ложного окрашивания изображения.

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