Opencv color mapping with direct pixel access

后端 未结 2 1966
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-30 14:39

I have a gray scale image that I want to display in color by mapping the gray scale values with a color palette (like colormap in Matlab).

I managed to do it by usin

相关标签:
2条回答
  • 2020-12-30 15:31

    I'm posting this to close the question like asked in the comments of my question.

    The answer was:

    I found out my error... In fact it's RGB but that wasn't the problem, I had color values at 256 instead of 255... Really sorry... I guess asking the question helped me found the answer

    Thank you

    0 讨论(0)
  • 2020-12-30 15:34

    I have done something similar for coloring depth maps from Microsoft Kinect Sensor. The code I used for converting a grayscale depth map into color image will work for what you are trying to do. You may require slight modifications as in my case the depth values were in the range 500 to 2000, and I had to rescale them.

    The function for colouring a grayscale image into colour image is:

    void colorizeDepth( const Mat& gray, Mat& rgb)
    {
            double maxDisp= 255;
            float S=1.f;
            float V=1.f ;
    
            rgb.create( gray.size(), CV_8UC3 );
            rgb = Scalar::all(0);
    
        if( maxDisp < 1 )
                return;
    
        for( int y = 0; y < gray.rows; y++ )
            {
                for( int x = 0; x < gray.cols; x++ )
                {
                    uchar d = gray.at<uchar>(y,x);
                    unsigned int H = 255 - ((uchar)maxDisp - d) * 280/ (uchar)maxDisp;    
                unsigned int hi = (H/60) % 6;
    
                float f = H/60.f - H/60;
                    float p = V * (1 - S);
                    float q = V * (1 - f * S);
                    float t = V * (1 - (1 - f) * S);
    
                Point3f res;
    
                    if( hi == 0 ) //R = V,  G = t,  B = p
                        res = Point3f( p, t, V );
                    if( hi == 1 ) // R = q, G = V,  B = p
                        res = Point3f( p, V, q );
                    if( hi == 2 ) // R = p, G = V,  B = t
                        res = Point3f( t, V, p );
                    if( hi == 3 ) // R = p, G = q,  B = V
                        res = Point3f( V, q, p );
                    if( hi == 4 ) // R = t, G = p,  B = V
                        res = Point3f( V, p, t );
                    if( hi == 5 ) // R = V, G = p,  B = q
                        res = Point3f( q, p, V );
    
                    uchar b = (uchar)(std::max(0.f, std::min (res.x, 1.f)) * 255.f);
                    uchar g = (uchar)(std::max(0.f, std::min (res.y, 1.f)) * 255.f);
                    uchar r = (uchar)(std::max(0.f, std::min (res.z, 1.f)) * 255.f);
    
                    rgb.at<Point3_<uchar> >(y,x) = Point3_<uchar>(b, g, r);     
    
            }
            }
    }
    

    For an input image which looks like this:

    enter image description here

    Output of this code is:

    enter image description here

    0 讨论(0)
提交回复
热议问题