Цветовое картирование Opencv с прямым доступом к пикселям - PullRequest
7 голосов
/ 14 июля 2011

У меня есть изображение серой шкалы, которое я хочу отобразить в цвете путем сопоставления значений серой шкалы с цветовой палитрой (как цветовая карта в Matlab).

Мне удалось сделать это с помощью OpenCV Функция cvSet2D , но я хотел бы получить доступ к пикселям напрямую из соображений производительности.

Но когда я это делаю, изображение имеет странные цвета.Я пытался установить цвета в разных порядках (RGB, BGR,…), но, похоже, не могу обойти его.

Вот мой код:

    IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), IPL_DEPTH_8U, 3 );
for (int y=0; y<temp->height; y++)
{
    uchar* ptr1 = (uchar*) ( temp->imageData + y * temp->widthStep );
    uchar* ptr2 = (uchar*) ( img->imageData + y * img->widthStep );

    for (int x=0; x<temp->width; x++)
    {
        CvScalar v1;

        int intensity = (int)ptr2[x];
        int b=0, g=0, r=0;
        r = colormap[intensity][0];
        g = colormap[intensity][1];
        b = colormap[intensity][2];

        if (true)
        {
            ptr1[3*x]   = b;
            ptr1[3*x+1] = g;
            ptr1[3*x+2] = r;
        }
        else
        {
            v1.val[0] = r;
            v1.val[1] = g;
            v1.val[2] = b;
            cvSet2D(temp, y, x, v1);
        }
    }
}

Измените if (true) to if (false) для доступа с различными пикселями.

Правильный результат с помощью cvSet2D:

enter code here

Неправильный результат с прямым доступом к памяти:

enter image description here

Спасибо за помощь

Ответы [ 2 ]

5 голосов
/ 13 сентября 2012

Я сделал нечто подобное для раскраски карт глубины из Microsoft Kinect Sensor. Код, который я использовал для преобразования карты глубины серого в цветное изображение, подойдет для того, что вы пытаетесь сделать. Вам могут потребоваться небольшие изменения, так как в моем случае значения глубины находились в диапазоне от 500 до 2000, и мне пришлось их масштабировать.

Функция раскраски изображения в градациях серого в цветное изображение:

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

        }
        }
}

Для входного изображения, которое выглядит следующим образом:

enter image description here

Вывод этого кода:

enter image description here

0 голосов
/ 14 октября 2013

Я публикую это, чтобы закрыть вопрос, как задано в комментариях к моему вопросу.

Ответ был:

Я обнаружил свою ошибку ... На самом деле это RGB, но это не было проблемой, у меня были значения цвета 256 вместо 255 ... Очень жаль ... Я думаю, что вопрос помог мне найти ответ

Спасибо

...