Opencv color mapping with direct pixel access

后端 未结 2 1967
佛祖请我去吃肉
佛祖请我去吃肉 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: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(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 >(y,x) = Point3_(b, g, r);     
    
            }
            }
    }
    

    For an input image which looks like this:

    enter image description here

    Output of this code is:

    enter image description here

提交回复
热议问题