快速跨平台的C/C++图像处理库

31

有哪些跨平台且高性能的图像库可用于图像处理(调整大小和查找颜色/色调直方图),不需要 GUI。这是为 C/C++ 编写的。

到目前为止,我已经研究了以下库:

  • OpenCV
  • Boost 的 GIL
  • DevIL
  • CImg

我的问题:

  • 我列出的这些库的性能如何?
  • 还有哪些其他库可供选择?

非常感谢您的意见。


2
我个人认为,这个问题不够准确。你是否希望得到关于库与库之间性能分析的结果?如果没有提出更具体的问题,几乎是不可能的。相比之下,更合理的做法是询问那些你感兴趣的库中特定算法实现的比较情况。 - mloskot
11个回答

13

OpenCV 的性能相当不错,对于大多数情况来说应该足够了。

为了提高性能,你还可以将 OpenCV 与Intel IPP一起使用,但这是一个非免费商业产品。如果 OpenCV 检测到安装有 IPP,则会在可能的情况下使用它。

第三个选项是直接使用 IPP。IPP 的设计目标是具有高性能(在 Intel 架构上),它经过优化以使用 Intel SIMD 指令。


如果我们在Photoshop中制作了一个滤镜,那么我们能否在OpenCV中使用它的RGB值来制作相同的滤镜? - AHF
很抱歉,我不太熟悉Photoshop,无法回答这个问题。也许你可以将其发布为一个问题? - Dani van der Meer

10

4

我协助维护libvips,这是一个免费的、跨平台的 C/C++ 科学图像处理库。它速度快,在处理非常大的图像时表现良好。

我进行了一个非常简单的基准测试:加载一个 10,000 x 10,000 像素的 RGB tif 图像,从每个边缘裁剪 100 像素,缩小 10%,锐化并再次保存。至少在这个微不足道的测试中,vips 的速度比我尝试过的其他任何东西都快两倍以上。

C++ API 文档在此。例如:

#include <vips/vips8>

using namespace vips;

int
main( int argc, char **argv )
{
        // startup, load plugins, init support libraries, etc.
        if (VIPS_INIT(argv[0]))
                vips_error_exit(NULL);  

        // the "sequential" access hint means we plan to only read this image
        // top-to-bottom (eg. no 90 degree rotates) ... this means libvips can 
        // stream the image and run decode and processing in 
        // parallel on separate threads
        VImage image = VImage::new_from_file(argv[1],
                VImage::option()->set("access", "sequential")); 

        // shrink to 20% and find the histogram
        VImage hist = image.resize(0.2).hist_find(); 

        hist.write_to_file(argv[2]);

        return 0;
}

你可以使用任意输入和输出图像格式来运行此程序,例如:
$ g++ -g -Wall resize.cpp `pkg-config vips-cpp --cflags --libs`
$ ./a.out ~/pics/wtc.jpg x.csv

它将读取JPG输入并将直方图写入CSV文件。


你的库中,warpPerspective 的更快替代方案是什么?vips_quadratic?为了了解 warpPerspective,请看这里:http://imgur.com/a/yiF55,查看 logo_warped 图像。这就是它利用变换矩阵从一个角落到另一个角落(单应性矩阵)所做的事情。谢谢。 - bad_keypoints
没错,vips_quadratic() 可以进行透视变换。我会为您制作一个示例程序。 - jcupitt
哦,我想vips_quadratic()还没有完成和可用,至少对于你的使用是这样,因此缺乏文档。抱歉。我会在待办事项中添加一条注释,说明它需要解决。 - jcupitt

4
我认为从MVTec的HALCON中,没有比它更好的功能和性能。它提供了各种计算机视觉和图像处理算法,并且有大量真实生活的示例。该库尽可能地使用多线程和GPU,以提高算法运行效率。它非常跨平台,并提供了一个极好的IDE,可以将您的原型代码(算法)导出到包括C、C ++、C#等多种语言中。
该库最好的特点之一是它如何处理区域对象。无论是对于存储还是掩模处理,它都非常智能和高效。不幸的是,OpenCV还有很多需要学习的地方。
这个软件包的主要问题是价格(非常高),但如果您正在开发一个不需要部署运行时许可证(例如SaaS)的项目,那么这是您应该选择的方式。如果您需要进行严肃的图像处理和计算机视觉,则不需要再寻找其他软件。

4

别忘了看看CxImage - 我在全球部署的图形密集型手机应用程序中专业使用过它,它表现完美,功能丰富。一定要看看!


1
这个库看起来相当稳定,但是开发似乎已经失踪了。最后更新于2008年2月。 - The Unknown
@TheUnknown:后续生命迹象:“版本7.01,2011年1月7日”。 - Johann Gerell

3

有一个简单且免费的开源跨平台图像处理库Simd。根据其描述:

它提供了许多用于图像处理的有用高性能算法,例如:像素格式转换,图像缩放和过滤,从图像中提取统计信息,运动检测。

这些算法使用不同的SIMD CPU扩展进行优化:x86/x64的SSE、SSE2、SSSE3、SSE4.1、SSE4.2、AVX、AVX2和AVX-512,PowerPC的VMX(Altivec)和VSX(Power7),ARM的NEON。


2
你可以考虑查看IM。它支持多个平台,支持(模块化)图像文件格式、各种图像表示形式以及广泛的转换和操作。此外,还提供了一个名为IMLab的GUI工具,用于演示基于IM库的图像处理操作。

2

还有VTKITK,它们拥有大量的多样化图像处理算法。


VTK和ITK是非常可靠的库,但在我的经验中,我发现这些高度模板化的库有点繁琐。800多页的手册一开始也有点令人生畏,但其中包含的算法通常来自研究中心,因此往往是最先进的。我无法在性能上进行比较,因为我没有使用过其他库。但我认为它还可以。 - binarycreations

1

1

ExactImage 是一个快速的 C++ 图像处理库。与许多其他库框架不同,它允许在多个颜色空间和位深度中本地操作,从而实现低内存和计算要求。


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