2010-10-24 49 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