2010-10-24 72 views
1

CompVision再次,我正在與我的應用程序中的JPEG圖像。僅僅因爲我對MFCATL有點熟悉,我用CImage來訪問像素值。快速訪問jpeg圖像的像素值

爲了我的需要,我在初始化期間計算圖像的亮度矩陣。功能是這樣的(Image是我自己的類的名字,不重要的,光明是浮動[] []):

void Image::fillBrightnessMatrix(){ 
    COLORREF val; 
    for(int i=0;i<width;i++){ 
     for(int j=0; j<height;j++){ 
      val=src.GetPixel(i,j); 
       bright[i][j]=rgb_to_L(val); 
     } 
    } 
} 

如果src爲CImage類,rgb_to_L的實例 - 一些函數計算的亮度顏色。

檢查我的應用程序的性能,我發現GetPixel是最昂貴的操作,它顯著(真的,比任何其他操作慢〜700倍)減慢圖像的全部初始化。 問題是,您可以建議哪個庫快速訪問單個像素值?我不需要任何其他操作,但加載jpeg圖像和訪問單個像素。性能非常重要,因爲我的應用程序使用了大約3000張圖像,我不能等幾個小時才能得到結果。

+0

如果您只是在JPEG比特流中解碼MCU的DC值,則甚至不需要花費非常昂貴的iDCT來計算像素值--DC是平均值的YCbCr值整個MCU,您可以在圖像上求和/平均,而不是每個像素。 – matja 2010-11-03 11:04:06

回答

2

使用CBitmap :: GetBits()來獲取像素數據的原始指針。您現在可以直接在像素上進行派對,而無需通過昂貴的GetPixel()方法。有一些事情你必須要小心,當你這樣做有:

  • 你必須使用的CBitmap :: GetPitch()來計算偏移到行的開始。音高與寬度不一樣。
  • 位圖中的行存儲顛倒
  • 您必須自己處理像素格式。 24bpp圖像每像素存儲3個字節。索引格式如8bpp需要在顏色表中查找顏色。 32bpp是容易的,每個像素4字節,並且間距總是與寬度相同。
+0

該死的,我知道必須有比GetPixel更好的東西!謝謝。現在我必須找到一個使用這種方法的工作示例,因爲整個網絡充滿了像我這樣的noobs的消息,問他們爲什麼不用他們的片段工作。 – Anton 2010-10-24 18:16:00

1

我總是推薦OpenCV

這是一個不起眼的代碼片段,讓您開始:

IplImage* pRGBImg = cvLoadImage("c:\\test.jpg", CV_LOAD_IMAGE_UNCHANGED); 
if (!pRGBImg) 
{ 
    std::cout << "!!! cvLoadImage failed !!!" << std::endl; 
    exit(1); 
} 

int width = pRGBImg->width; 
int height = pRGBImg->height; 
int bpp = pRGBImg->nChannels; 
for (int i=0; i < width*height*bpp; i+=bpp) 
{ 
    if (!(i % (width*bpp))) // print empty line for better readability 
     std::cout << std::endl; 

    std::cout << std::dec << "R:" << (int) pRGBImg->imageData[i] << 
          " G:" << (int) pRGBImg->imageData[i+1] << 
          " B:" << (int) pRGBImg->imageData[i+2] << " "; 
} 
+0

我不能使用OpenCV。坦率地說,我不想用它。對於我正在談論的任務來說,這是沉重的和過於複雜的。 – Anton 2010-10-24 17:39:48

+1

@Anton你可能會說你不喜歡你的問題上的OpenCV。 OpenCV甚至可以在iPhone上使用,所以我不知道重量對你來說意味着什麼。正如我上面的代碼所示,OpenCV並不複雜。但我認爲這是一個經驗問題。祝你好運。 – karlphillip 2010-10-24 17:45:26

0

你或許應該提取JPEG原始數據,然後訪問,而不是GetPixel的原始數據。

+0

我相信它是解決我的問題的最好方法,我想要的是程序員一直在使用的庫的確切名稱,並且可以提供建議:) – Anton 2010-10-24 17:41:41