16色图像、256色图像这些索引图像,图像数据存贮的实际上是 
调色板的索引。那么使用OpenCV库打开bmp图像后,如何获取图像的调色板从而获取像素的真正的RGB颜色呢?

解决方案 »

  1.   

    从IplImage结构中得到的不是真正的RGB值么?OpenCV的CvvIamge里面有这么一个函数:void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
    {
        assert( bmi && width >= 0 && height >= 0 && ( bpp == 8 || bpp == 24 || bpp == 32 ) );

        BITMAPINFOHEADER* bmih = &( bmi->bmiHeader );

        memset( bmih, 0, sizeof( *bmih ) );
        bmih->biSize = sizeof( BITMAPINFOHEADER );
        bmih->biWidth = width;
        bmih->biHeight = origin ? abs( height ) : -abs( height );
        bmih->biPlanes = 1;
        bmih->biBitCount = ( unsigned short )bpp;
        bmih->biCompression = BI_RGB;

        if( bpp == 8 )
        {
            RGBQUAD* palette = bmi->bmiColors;
            int i;
            for( i = 0; i < 256; i++ )
            {
                palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = ( BYTE )i;  
                //从这里可以看到OpenCV使用的全调色板 并没有对调色板进行删减,应该不会存在RGB值被改动的问题吧。
                palette[i].rgbReserved = 0;
            }
        }
    }