【问题标题】:Fast accessing pixel values of jpeg images快速访问 jpeg 图像的像素值
【发布时间】:2011-04-29 21:32:36
【问题描述】:

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

【问题讨论】:

  • 如果您只是解码 JPEG 比特流中 MCU 的 DC 值,您甚至不需要执行(非常)昂贵的 iDCT 来计算像素值 - DC 是平均 YCbCr整个 MCU 的值,您可以对图像而不是每个像素求和/平均。

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


【解决方案1】:

我总是推荐OpenCV

这是一个简单的代码 sn-p 帮助您入门:

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] << " "; 
}

【讨论】:

  • 我无法使用 OpenCV。坦率地说,我不想使用它。对于我正在谈论的任务来说,这太沉重而且太复杂了。
  • @Anton 你本可以在你的问题上说你不喜欢 OpenCV。即使在 iPhone 上也使用 OpenCV,所以我不知道沉重对你来说究竟意味着什么。正如我上面的代码所示,OpenCV 一点也不复杂。但我认为这是经验问题。祝你好运。
【解决方案2】:

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

【讨论】:

  • 我相信这是解决我的问题的最好方法,我想要的只是程序员一直在使用的库的确切名称,并且可以建议:)
【解决方案3】:

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

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

【讨论】:

  • 该死,我就知道一定有比GetPixel更好的东西!谢谢。现在我必须找到一个使用这种方法的工作示例,因为整个网络都充满了来自像我这样的菜鸟的消息,他们问为什么他们的 sn-ps 不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2017-08-01
  • 2018-03-26
  • 1970-01-01
相关资源
最近更新 更多