[转]七大图像库

http://zhengzhaohui520.blog.163.com/blog/static/280536492010109505867/

七大图像库的使用感受:OpenCV/FreeImage/LeadTools/ImageStone/GIMP/CImg/CxImage

OpenCV的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法;然后将图像格式和矩阵运算,然后将各个算法的实现函数。我用它来做了一个Harris角点检测器和Canny边缘检测器,总共就花了一个小时(第一次用OpenCV)。而且该库显示图像极其方便,两句话就可以。但该库似乎不大稳定,对32F和16S、8U的图像数据支持上 bug重重。我用cvFilter2D函数进行线性滤波,屡屡出错,后来一查原来是大bug。后来用cvmGet来取矩阵元素也是频繁出错,仔细检查了N 遍确保程序没问题之后在yahoogroup上找到答案:仍然是bug。。。但好歹该库是开放的,所以自己可以修改;而且支持CVS。另外该库用的是 IPL矩阵库,速度奇快~~

CxImage考察的印象:该开发包完全开放源代码,图像封装为一个类,功能极为强大,与Windows、MFC支持极好,支持图像的多种操作(线性滤波、中值滤波、直方图操作、旋转缩放、区域选取、阈值处理、膨胀腐蚀、alpha混合等等),支持从文件、内存或者win32api定义的位图图像格式中读取图像,支持将图像显示在任意窗口,功能可谓很强大了,而且对像素的操作很方便,另外还有一个界面很强的demo,可以直接在上面进行二次开发,推荐使用!
缺点:里面的子库很多,用起来可能较麻烦;而且感觉速度稍慢,不如后面提到的freeimage,但功能真的十分强大啊!

使用方法:

//加载图像 实现转换成BMP图像进行处理 参数为图片路径和类型 0代表BMP 1代表JPG
BOOL Load(LPCTSTR ImagePath DWORD dwType);

//保存图像 参数为图片路径和类型 0代表BMP 1代表JPG
BOOL Save(LPCTSTR ImagePath DWORD dwType);

//获取图像的宽度
DWORD GetWidth(); www.200it.com

//获取图像的高度
DWORD GetHeight();

//获取图像的存储行字节数
DWORD GetLineBytes();

//获取每像素的位数
short GetBpp();

//位图是否为空
BOOL IsEmpty();

//获取图像数据首地址
void *GetImageAddress();

//获取图像数据大小
DWORD GetImageDataSize();

//位图信息骰
BITMAPINFOHEADER GetBitMapInfoHeader();

//位图调色板
RGBQUAD* GetPalette() const;
RGBQUAD GetPaletteColor(BYTE index);
BOOL GetPaletteColor(BYTE i BYTE* r BYTE* g BYTE* b);
DWORD GetPaletteSize();
      //更新位图数据 在对位图数据进行更改后必须调用此函数 http://www.200it.com 
BOOL UpdateData(DWORD dwWidth DWORD dwHeight short dwBpp DWORD dwSize BYTE *lpData);

//位图分割 输入左上角及右下角坐标即可实现保存
BOOL SaveRectImage(LPCTSTR strSaveName DWORD lPos DWORD uPos DWORD rPos DWORD dPos DWORD dwType);
BOOL SaveRectImage(LPCTSTR strSaveName CRect rect DWORD dwType);


 BOOL GetImage(BYTE *lpBuffer DWORD &dwSize CRect rect);
BOOL GetImage(BYTE *lpBuffer DWORD &dwSize DWORD lPos DWORD uPos DWORD rPos DWORD dPos);
      //返回位图类型 0代表bmp 1代表jpg
int GetImageType();

 

//图像显示
       //传入参数为显示区域左上顶点及显示尺寸 原图起点及尺寸
void Draw(CDC *pDC CPoint ptDest CSize szDest CPoint ptSource CSize szSource);
       //传入参数为放大倍数及显示区域左上顶点 对副图像进行放缩
void Draw(CDC *pDC CPoint ptOrigin float m_fZoom = 1.0f);

CImg:就一个.h文件所以用起来很简明,但感觉功能上不如CxImage。可以与CxImage配合使用,因为CImg提供了基于lapack 的矩阵运算函数和完善的线性滤波卷积函数,同时CImg做像素运算还是很方便的。另外,独有Display类可以方便的实现各种显示,包括显示图像、打字、画线等等。还有,该库有个基于光流的多尺度图像配准例子,很好。

LEADTOOLS:LEAD Technologies 是一个拥有九年多开发数字图形技术历史的公司,他专为程序开发者提供软件开发工具包。他已经为微软等公司提供了很多图形图象技术。这个软件包是该公司开发的开发工具的集合,包括占线帮助,Lead API、C++ 类库、ActiveX 控件、VCLs 和一些实例原代码等。这个软件包是开发工具的集合包括占线帮助,Lead API、C++ 类库、ActiveX 控件、VCLs 和一些实例原代码等。

ImageStone:是一套功能强大的C++图像处理库,它可以在多个平台之间移植。功能包括:读写图像文件(JPG,GIF,PNG,TIFF,TGA...),显示,柱状图分析,undo/redo支持,超过100种预定义的特效等。      下载地址:http://www.codeguru.com/cpp/g-m/bitmap/viewers/article.php/c12577/

GIMP:The GIMP是一个免费的、分布式的图片润饰、图象制作和处理软件,内含几乎所有图象处理所需的功能,号称Linux下的PhotoShop。GIMP在Linux系统推出时就风靡了许多绘图爱好者的喜爱,它的接口相当轻巧,但其功能却不输于专业的绘图软件;它提供了各种的影像处理工具、滤镜,还有许多的组件模块,对于要制作一个又酷又炫的网页按钮或网站Logo来说是一个非常方便好用的绘图软件,因为它也提供了许多的组件模块,你只要稍加修改一下,便可制作出一个属于你的网页按钮或网站Logo。 如今推出了For Windows版本,还不赶快试试... 注:需要安装GTK+环境包才能正常安装.              下载地址:http://dlc2.pconline.com.cn/filedown.jsp?dlid=10351&linkid=6361451

FreeImage:C语言的体系,大量使用指针运算速度可以保证,内含先进的多种插值算法。另外独有的支持meta exif信息的读取。该库最大的特点就是比较简练,只把重点放在对各种格式图像的读取写入支持上,没有显示部分,实际编程的时候还是需要调用API函数进行显示

通用图像类算法扩充库。这是一个比较另类的图像库,它本身并不提供对图像对象的封装,只以类似插件的形式为您提供图像处理算法的封装和进度显示,而图像对象的封装则需由用户来提供。本图像库平台无关,理论上它可以应用于任何已有的C++图像类上。

使用方法:

为了使用本图像库,您必须对手头的图像类做一些简单的修改(考虑到效率的因素,我并没有提供一个虚接口供大家继承,而是通过让用户自己修改代码来实现之。):

  1.从现有图像类(如CxImage、CDib...)派生出FCObjImage(我想您的类也叫这个名字的概率应该比火星有水的概率要低^-^)。

  2.您必须在FCObjImage类中实现以下函数(大多是很简单的取属性操作):
原型
 
功能说明
FCObjImage ()  默认构造函数
FCObjImage (const FCObjImage & img)  拷贝构造函数
FCObjImage & operator= (const FCObjImage & imgSrc)  赋值操作
BOOL IsValidImage () const  本图像对象是否有效
UINT16 ColorBits () const  图像的颜色位数(1,4,8,16,24,32)
DWORD GetPitch () const  图像每行字节数
BYTE * GetBits (int iLine = 0) const  取得第 iLine 行指针, 左上角为(0,0), 自上而下
BYTE * GetBits (int x, int y) const  取得 (x,y) 点的指针, 左上角为(0,0), 自上而下,自左而右
bool IsInside (int x, int y) const  坐标(x,y)是否在图像内部
int Width () const  
int Height () const  
BOOL Create (int iWidth, int iHeight, WORD wColorBit)  创建一副空图像
static void fooCopyPalette (FCObjImage & DibDest, const FCObjImage & DibSrc)  <=8bit图像拷贝调色板


  3.现在,进入最重要的一环,在FCObjImage类中添加方法:
  void SinglePixelProcessProc (FCSinglePixelProcessBase & PixelProcessor, FCObjProgress * progress = NULL)
  并把下面的实现代码拷到FCObjImage类中:

//================================================================void  FCObjImage::SinglePixelProcessProc (FCSinglePixelProcessBase & PixelProcessor, FCObjProgress * progress)
{
    if (!PixelProcessor.ValidateColorBits (this))
        return ;
    
    // 计算处理区域
    RECT  rcImg = {0,0,Width(),Height()}, rcBlock, rcDest ;
    if (PixelProcessor.GetProcessRect() == NULL)
        ::CopyRect (&rcBlock, &rcImg) ;
    else
        ::CopyRect (&rcBlock, PixelProcessor.GetProcessRect()) ;
    if (::IntersectRect (&rcDest, &rcImg, &rcBlock) == 0)
        return ; // 处理区域为空
    
    // 处理前准备工作
    int     nSpan = ColorBits() / 8 ; // 每象素字节数1, 2, 3, 4
    PixelProcessor.OnEnterProcess (this, rcDest) ;
    
    // 遍历处理区域像素
    for (int y=rcDest.top ; y < rcDest.bottom ; y++)
    {
        BYTE * pPixel = GetBits (rcDest.left, y) ;
        for (int x=rcDest.left ; x < rcDest.right ; x++, pPixel += nSpan)
        {
            PixelProcessor.ProcessPixel (this, x, y, pPixel) ;
        }
        if (progress != NULL)
            progress->SetProgress (y * 100 / Height()) ;
    }
    
    // 收尾工作
    PixelProcessor.OnLeaveProcess (this) ;
}//================================================================

  4.修改库里的PixelProcessor.cpp文件,把FCObjImage所在的.h文件包含进去。

  现在,您就可以通过如下方法调用本库
  imgTest.SinglePixelProcessProc (FCPixelGrayscale()) ;
  imgTest.SinglePixelProcessProc (FCPixelInvert()) ;
  ......

 

附加:MVTec HALCON 是世界上最全能的机器视觉软件 (配套教材:机器视觉算法与应用)

posted on 2013-05-29 15:11  龙猫先生  阅读(414)  评论(0编辑  收藏  举报

导航