web-dev-qa-db-fra.com

Convertir la couleur de l'image de l'échelle de gris en RVB OpenCV C ++

Fondamentalement, j'essaie de convertir l'image de sortie ci-dessous en couleur (RVB). L'image que ce code produit actuellement est en niveaux de gris, cependant, pour mon application, je voudrais qu'il soit sorti en couleur. Veuillez me faire savoir où je dois convertir l'image.

De plus, le code ci-dessous est C++ et utilise une fonction openCV. Veuillez garder à l'esprit que j'utilise un wrapper pour utiliser ce code dans mon application 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;
}
17
Joey Tawadrous

Ceci est actuellement configuré pour attendre une image en niveaux de gris en entrée. Je pense que vous demandez comment l'adapter pour accepter une image d'entrée en couleur et retourner une image de sortie en couleur. Vous n'avez pas besoin de beaucoup changer:

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);
  }

le reste reste tel quel.

Si votre image d'entrée est en couleur, vous la convertissez en gris pour le traitement par HoughCircles et appliquez les cercles trouvés à l'image couleur d'origine pour la sortie.

21
foundry

La routine cvtImage copiera simplement votre élément gris dans chacun des trois éléments R, G et B pour chaque pixel. En d'autres termes, si la valeur de gris de pixel est 26, alors la nouvelle image aura R = 26, G = 26, B = 26.

L'image présentée aura toujours l'air de niveaux de gris même si elle contient les 3 composantes de couleur, tout ce que vous avez essentiellement fait est de tripler l'espace nécessaire pour stocker la même image.

Si en effet vous voulez que la couleur apparaisse dans l'image (lorsque vous la visualisez), il est vraiment impossible de revenir du niveau de gris aux couleurs ORIGINALES. Il existe cependant des moyens de pseudo-coloration ou de fausse coloration de l'image.

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

0
trumpetlicks

Le code que vous avez collé renvoie une image colorée.

Vous faites déjà cvtColor (img, cimg, CV_GRAY2RGB), puis je ne vois pas cimg converti en niveaux de gris n'importe où!, Pour le vérifier, essayez de l'afficher avant de revenir de cette fonction:

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