opencv和magick两个图像处理库的使用心得

常见语言都有简单的图像处理库,我知道java、python等都有。这些库一般比较简单,方便在对应的语言下进行简单的图像处理。另外,一些需要图像处理的芯片也会实现自己独立的图像处理库。

在学习工作过程中,我一般使用matlab、magick、opencv进行图像处理(opengl一般进行图形处理)。

matlab是一个非常强大的软件,包含很多数学处理基础,图像处理,模式识别,信号处理等,和数学沾边的方方面面几乎在matlab中都有比较完美的实现。堪称数学界的神曲。但是它不太合适用于工程应用,着重于过程实现。它函数使用非常简单,如果有想法可以先在matlab下试试。

magick和opencv是在实际项目中比较常用的两个图像处理软件,在实际的应用中,他们各有优缺点。下面介绍一下这两个图像处理库。

magick的官方网站:http://www.imagemagick.org/script/index.php(imagemagick)

http://www.graphicsmagick.org/(graphicmagick)

opencv的官方网站:http://opencv.willowgarage.com/wiki/

  1. 语言版本
  • magick:         G2F(Ada), MagickCore(C), MagickWand(C), ChMagick(Ch), ImageMagickObject(COM+), Magick++(C++), JMagick(Java), L-Magick(Lisp), NMagick(Neko/haXe), MagickNet(.NET), PascalMagick(Pascal), PerlMagick(Perl), MagickWand for PHP(PHP), IMagick(PHP), PythonMagick(Python), RMagick(Ruby), or TclMagick(Tcl/TK):使用者可以根据自己习惯的语言来进行相应的编程,我在图像处理的过程中使用的是C++版本的。
  • opencv:       python版本和C版本(有10%代码是C++实现的):我使用的是C版本
  • 对比示例:
// magick中的图像读写
Image image("xxx.jpg");
// 或者
Image image; image.read("xxx.jpg"); image.write("xxxx.jpg");
// opencv中的图像读写
IplImage* image = cvLoadImage("xxx.jpg");
cvSaveImage("xxxx.jpg", image);

2. 实现

  • magick:magick主要是以应用的角度展示它的实现,比如图像切割,图像融合,图像模糊,图像锐化等。
  • opencv:opencv主要是以算法的角度来展示它的实现,也就是说,它实际提供的是各种图像处理算法,如果需要具体的应用,你需要组合它所提供的算法实现来实现某个功能。
  • 对比示例:
// magick中的图像切割

image.crop( Geometry(100,100, 100, 100) );(magick中的图像切割)

//opencv中的图像切割

CvRect crop_rect = cvRect(100,100, 100, 100)

IplImage* image_crop = cvCreateImage(cvSize(crop_rect.width, crop_rect.height), image->depth,  image->nChannels);

cvSetImageROI(image, crop_rect);
cvCopy(image, image_crop);
cvResetImageROI(image);
// magick中的图像缩放
image.zoom("200x200");//得到是最长边为200的图像
// opencv中的图像缩放
int max_size = 200;
int ori_width = image->width;
int ori_height = image->height;
CvSize dst_size;
if(width > height)
     dst_size = cvSize(max_size, int(max_size * height/(double)width));
else
     dst_size = cvSize(int(max_size * width / (double)height), max_size);
IplImage* image_zoom = cvCreateImage(dst_size, image->depth, image->nChannels);
cvResize(image, image_zoom, CV_INTER_LINEAR);

3.  opencv和magick的优缺点对比

  • opencv和magick都是开源代码,方便开发
  • magick最近更新不多,opencv近几年有Intel的支持更新比较及时,功能越加强大,bug修复也比较及时。
  • magick使用简便;opencv的使用稍微复杂,对使用者有一定的图像技术要求。同时,magick封装较好,使用灵活度稍低;opencv使用比较灵活。
  • magick功能实现较少,主要是一些常用的图像处理实现,很多比较复杂的图像处理没有实现。opencv的算法实现非常强大,而且从它最近版本更新的速度来看,它将更加强大,很多经典的图像处理算法都被它实现。作为一个图像开发者,这是一个很大的诱惑。
  • magick函数的运行时间较慢, opencv运行速度较快。常见的函数 ,比如图像读,图像压缩,图像写等等 ,opencv都要比magick快很多。感兴趣的同学可以自己测试一下,速度的提升会让你满意的。

4.   选择

  • 通过opencv和magick的优缺点对比,你也许已经有决断了。总之,opencv功能强大,代码运行速度快,更新速度快,对开发者有一定的要求。magick使用比较简单,对图像处理不太熟悉,又只是想实现简单的图像处理的同学可以选择magick。
  • opencv不能解析gif文件格式,听说是因为版权的原因。如果你要用opencv的功能,又需要解析gif文件格式,可以先用其他函数库将其读入再转化为IplImage。
  • magick有一个不错的sharpen函数,用于锐化图像,效果挺不错。opencv中没有锐化函数,没有相应的锐化算法实现。我自己尝试了几种锐化方法,但是都没有magick中的实现效果好。所以你确实想在opencv下用这个函数的话,可以将magick中对应的源代码实现。
  • 如果选择使用magick的同学,建议使用graphicsmagick。 graphicsmagick和imagemagick的函数调用方法相同,但是graphicsmagick在效率上优于imagemagick,特别是在windows下运行。

原文地址:http://www.udpwork.com/item/5810.html

你可能感兴趣的:(opencv和magick两个图像处理库的使用心得)