快速访问jpeg图像的像素值

时间:2010-10-24 17:35:17

标签: c++ image-processing jpeg computer-vision

CompVision再一次,我在我的应用程序中使用jpeg图像。仅仅因为我对MFCATL有点熟悉,我使用CImage来访问像素值。

根据我的需要,我在初始化期间计算图像的亮度矩阵。函数是这样的(Image是我自己的类的名称,不重要,明亮是float [] []):

 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张图像,我不能等待数小时才能得到结果。

3 个答案:

答案 0 :(得分:2)

使用CBitmap :: GetBits()获取指向像素数据的原始指针。您现在可以直接在像素上聚会,而无需通过昂贵的GetPixel()方法。执行此操作时,您需要注意以下事项:

  • 您必须使用CBitmap :: GetPitch()来计算到行首的偏移量。音高与宽度不同。
  • 位图中的行以倒置方式存储
  • 您必须自己处理像素格式。 24bpp图像每像素存储3个字节。像8bpp这样的索引格式需要在颜色表中查找颜色。 32bpp很简单,每个像素4个字节,间距始终与宽度相同。

答案 1 :(得分: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] << " "; 
}

答案 2 :(得分:0)

您应该将jpeg提取为原始数据,然后访问原始数据而不是GetPixel。