如何为16位灰度数据制作OpenCV IplImage?

时间:2014-01-13 06:48:29

标签: opencv iplimage

此代码用于制作灰度IplImage的8位数据。

    IplImage* img_gray_resize = NULL;
    img_gray_resize = cvCreateImage(cvSize(320, 256), IPL_DEPTH_8U, 1);
    DWORD   dwCount;
    LVDS_SetDataMode(0); // o for 8 bit mode and 1 for 16 bit mode
    dwCount = (LONG)320 * (LONG)256;
    unsigned char* m_pImage = NULL;
    m_pImage = new unsigned char[320 * 256]; 
    for (int i=0; i<320 * 256; i++) m_pImage[i] = NULL;
    LVDS_GetFrame(&dwCount, m_pImage);
    int width = 320;
    int height = 256;
    int nn = 0;
    int ii = 0;
    for (int y=0; y<height; y++) 
    {
        for (int x=0; x<width; x++)  
        {
            ii = y * width + x;
            if(nn < (height*width))
                img_gray_resize->imageData[ii] = m_pImage[nn++];
        }
    }
    delete [] m_pImage;

我需要显示16位灰度图像。如果我显示8位数据,则​​图像中缺少某些信息。但是,LVDS_SetDataMode()可以提供两种类型的数据。我正在使用图书馆的图像采集设备。请帮帮我。

3 个答案:

答案 0 :(得分:2)

16位图像应以IPL_DEPTH_16U(或CV_16U)模式存储。这是正确的内存布局。

但是,显示取决于您的显示硬件 大多数常规显示API,例如OpenCV的highgui,只能显示8位图像 要实际显示图像,您必须将图像转换为8位以进行显示。

您需要决定如何执行此操作。根据您的应用和复杂程度,有很多方法可以做到这一点。一些选项是:

  • 显示MSB =将图像右移8个像素。
  • 显示LSB =使255以上的任何内容饱和。
  • 实际上,右移0到8位之间的任何值,再加上cv::saturate_cast以避免值回绕。
  • HDR-&gt; LDR =应用动态范围压缩算法。

答案 1 :(得分:0)

据我所知,只能显示8位数据,您需要找到将16位转换为8位的最佳方法,以最大限度地减少丢失的信息。可以应用直方图均衡来实现此目的。

答案 2 :(得分:0)

最后,我通过以下方式解决了问题:

 dwCount = (LONG)320 * (LONG)256 * 2;
 LVDS_SetDataMode(1);
 img_gray_resize->imageData[ii] = m_pImage[nn++] >> 6;

只需将位移到右边(2,3,4,5,6 ......),你可以得到好的结果,使用该值。