在C++或C中处理图像

5

首先,我是一个初学者。好吗?

我已经阅读了相关的答案和问题,但请帮助我解决以下问题:

如何在C++中打开一个JPEG图像文件,将其转换为灰度图像,获取其直方图,将其调整为较小的图像,裁剪其中的特定区域或显示其中的特定区域?

对于这些任务,一般来说,C或C++哪个更快?

哪些库最简单、最快?运行时间非常重要。

谢谢。

5个回答

12

这里有一个使用magick库的例子。

这个程序可以读取一张图片,将其裁剪并写入新文件(异常处理是可选的,但强烈建议):

#include <Magick++.h>
#include <iostream>
using namespace std;
using namespace Magick;
int main(int argc,char **argv)
{
  // Construct the image object. Seperating image construction from the
  // the read operation ensures that a failure to read the image file
  // doesn't render the image object useless.
  Image image;

  try {
    // Read a file into image object
    image.read( "girl.jpeg" );

    // Crop the image to specified size (width, height, xOffset, yOffset)
    image.crop( Geometry(100,100, 100, 100) );

    // Write the image to a file
    image.write( "x.jpeg" );
  }
  catch( Exception &error_ )
    {
      cout << "Caught exception: " << error_.what() << endl;
      return 1;
    }
  return 0;
}

点击此处查看更多示例


2
在C和C++中有很多优秀的处理图像的库,其中没有一个库是明显优于其他库的。OpenCV维基百科项目页面在某些任务上非常有用,而ImageMagick维基百科项目页面则在其他任务上表现良好。JPEG组还有自己的JPEG处理函数实现。这些都是出发点的好资源;API文档可以更具体地指导你如何使用它们。
至于C 或 C++库是否会更快,这两者之间没有明显的胜者。毕竟,你总是可以在C++中编译C库。话虽如此,由于语言复杂性,C++库可能会有点棘手,但是一旦你掌握了语言,使用起来就会容易得多(我对C++有点偏见,所以请考虑来源)。我建议你选择对你来说更容易完成任务的语言;如果性能很重要,两种语言都不是坏选择。
祝你的项目成功!

2

对于基本的图像操作,您也可以尝试使用Qt的QImage类(和其他类)。这为您提供了打开、缩放、调整大小、裁剪、像素操作和其他任务的基本功能。

否则,您可以如已经提到的使用ImageMagick或OpenCV。OpenCV为许多图像操作/图像识别任务提供了很多示例...

希望对您有所帮助...


1

libgd 是最简单、最轻量级的解决方案。

gdImageCreateFromJpeg
gdImageCopyMergeGray
gdImageCopyResized

哦,而且全部都是C语言。


1

OpenCV可以将处理任务卸载到GPU上进行加速处理。 - Pietro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接