2014-01-13 49 views
0

此代碼用於8位數據製作灰度IplImage。如何使16位灰度數據的OpenCV IplImage?

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()可以提供這兩種類型的數據。我正在使用圖像採集卡設備庫。請幫幫我。

回答

0

據我所知,只能顯示8位數據,您需要找到將16位轉換爲8位的最佳方式,以最大限度地減少丟失的信息。直方圖均衡可以應用於此。

+0

如何將16位數據轉換爲8位數據?請給我一些信息。 – IRFAN

+0

1.計算對16位圖像的hisgram尊重2.將它規範化爲prob並轉換爲cdf 3.將具有值cdf的索引映射到256 * cdf – michaeltang

2

16位圖像應存儲在IPL_DEPTH_16U(或CV_16U)模式下。這是正確的內存佈局。

但是,顯示它們取決於您的顯示硬件。大多數常規顯示API,例如OpenCV的highgui,只能顯示8位圖像。
要實際顯示圖像,您必須將圖像轉換爲8位才能顯示。

您需要決定如何做到這一點。有很多方法可以做到這一點,這取決於您的應用程序和複雜性。一些選項是:

  • 顯示MSB =右移圖像8個像素。
  • 顯示LSB =飽和任何高於255的值。
  • 實際上,右移0-8位之間的任何值,並結合cv::saturate_cast以避免值繞回。
  • HDR-> LDR =應用動態範圍壓縮算法。
0

最後,我通過以下方式解決了這個問題:

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

位只是右移(2,3,4,5,6,...),在那裏你會得到很好的效果,使用該值。

+0

是的,在0-8位之間的任何位置之間移動將顯示不同的強度帶。但是,您必須確保實際*飽和*您的8位值,否則您的強度值將圍繞mod(1 << 8)。看到我的答案。 –