图像处理图片库bmp - CSDN
  • 几种图像处理库的研究

    千次阅读 2015-04-27 23:17:07
    目前比较出名的图像处理库有很多,比如LEADTOOLS,这...开源的图像库也有不少,比如:ImageStone、GIMP、CxImage等,虽然它们的功能没有LEADTOOLS强大,但是一般的图像处理是可以应付的。 下面分别介绍这几种图像处理


    http://blog.csdn.net/byxdaz/article/details/3972293

    目前比较出名的图像处理库有很多,比如LEADTOOLS,这个是功能非常强大的图像多媒体库,但是这个是收费注册的。开源的图像库也有不少,比如:ImageStone、GIMP、CxImage等,虽然它们的功能没有LEADTOOLS强大,但是一般的图像处理是可以应付的。

    下面分别介绍这几种图像处理库的使用方法。

    LEADTOOLS

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

    (1)对显示设备的全面支持:在显示时,你的程序中无需考虑是哪种显示模式,如16色还是真彩色。LeadTools为你做了所有的事。当然你也可以通过设置参数获得对显示设备更多的控制。你还可以实现自己的调色板。

    (2)支持多种文件格式:表10.1是LeadTools所支持的常用文件格式,其中读表示用LeadTools能打开的文件格式,写表示LeatTools能存成的文件格式:

    (3)图象处理:如二值化、平滑、加噪声、增加对比度、色调、饱和度、亮度、Gamma校正、中值滤波、半影调、抖动、橡皮筋、滚动、填充、反色、镜象、马赛克、浮雕、打印、扫描、拷贝、粘贴、裁剪、缩放、截屏、调色板、直方图、有关数据库的操作、还有制作幻灯的功能,如淡入、淡出、卷帘等等、真的很爽。表10.2是Version5.1的所有属性、事件、和方法列表,看看有没有你所需要的功能。以字母顺序排列,其中标[P]的表示只有专业级(Professional)和特殊级(Express)用户才能使用。

    (4) 新增功能:

    Vector的新功能

    Annotations的新对象和新功能

    OCR Module 更新

    新增模块:ICR Module

    新增模块:OMR Module (Forms 处理)

    新增的公共图象对话框

    100余种图象处理功能

    DjVu® KDC和其他的新格式支持

    Medical Imaging 更新

    Multimedia 更新

    C++ Class Lib 更新

    COM Object 更新,包含新的.NET 示例

    相关包的破解地址:http://www.greatcracks.com/cracked_software/l4

    相关开发包介绍:

    LEADTOOLS Medical Imaging SDK

    LEADTOOLS Medical Imaging包含了一些精心挑选的、经过优化的特性,可以满足医疗成像应用程序开发的特殊需要,比如,完全的DICOM数据集支持,可以支持8-16位灰度级,以及12和16位的图像处理,窗位(Window Leveling)显示,还包含LUT处理。

    特征综述

    支持8、10、12、16灰度级和24位图像,包括JPEG(8、10、12、16位无损灰度级,8、12位有损灰度级,24位无损和有损色彩),JPEG2000(包括有损和无损8-16位灰度级图像和24位色彩)行程,无压缩,光学表示(单色1、单色2、调色板、RGB、ARGB、CMYK、YBR 全422、YBR全、YBR_RCT、YBR_ICT),以及单框架和多框架图像。

    完全支持DICOM 3(2003文件规范),包括所有标准的IOD类和形态(CR、CT、MR、NM、US、RF、SC、VL等),还包含VR’s。

    为DICOM的基本目录提供简单的执行操作和完全技术支持。只需要几行代码就可以使用高级COM对象来创建DICOMDIR。

    通过调用一个函数,可以将一种转移语法变为另一种转移语法。自动识别DICOM文件(Little-Endian/Big-Endian,隐藏/显示VR等等)。并具有高级和低级函数,可用于数据集的简单导航和操作(插入、删除、修改)。

    单框架或多框架的图像(压缩的或未压缩的)。

    对大量不同厂商的硬件支持。

    包含了可使用的源代码和可执行代码。

    对DICOM有4个不同的编程接口-API、COM、VCL、C++类库。支持DICOM2003标准中所有的VR’s,包括“其它浮动字符串”。

    具有高级和低级函数,可用于数据集的简单导航和操作(插入、删除、修改)。

    LEADTOOLS自动加入了项定界项和序列定界项以简化数据集的嵌套(VR of “SQ”)。

    易于对项进行顺序定位(FFFE,E000)。

    简化了重组处理(多重覆盖和曲线数据)。

    支持对单框架或多框架压缩或未压缩图像的像素数据的封装或本机编码。 
    DICOM LUT/Overlay/Palette支持。在LEADTOOLS Medical Imaging中,对于Modality

    LUT,VOI LUT,Palette色彩图像的高级支持意味着开发人员可以毫不费力地在一个应用程序中实现DICOM表示状态。LEADTOOLS还可以将Modality LUT应用于图像数据,以进一步简化图像处理和统计计算。

    DICOM注释对象支持。可以从数据集内存储/获取DICOM注释,并且将它们转换为LEAD注释对象,反之亦然。为了附加的统计计算和存储为DICOM表示状态,注释也可以被转换为Region of interest。
    Cookie剪切工具:可以从一个放射性图像扫描文件中提取出单独的薄片(对于识别一个扫描MRI或CT系列内的每个薄片很有帮助)。

    MRI大脑分析工具:可以用于计算胼胝体(大脑中部的白色物质,就像字母X)和脑球体之间的比率。

    LEADTOOLS Multimedia

    您可以使用LEADTOOLS Multimedia SDK创建具有专业水准的高品质的多媒体应用程序。该控件中加入了诸如捕获、播放和编辑等多媒体功能以及对最新的DirectShow过滤和许多多媒体文件格式的支持,即可以加载和转换多种文件格式(包括WAV、AVI、ASF、WMA、WMV、MPEG-1、OGG等等)。可以编程控制多媒体处理、压缩,视频和音频输入;还增加了摄像控制(亮度、对比度、缩放等等);以及更灵活的捕获选项等等更多功能。

    特征综述 About Feature

    多媒体捕获
    能够从WDM、本地DirectShow包括DV、Windows视频捕获设备中捕获视频图像,还可以控制DV设备等。

    多媒体播放
    能够播放所有DirectShow所支持的文件。可以支持DVD导航,还可以将播放设置保存到文件或二进制流中等等。

    多媒体转换
    利用控件包提供的功能,您的用户可以将多媒体文件在AVI,Windows Media content,WAVE和MPEG1 Audio(MP3)格式之间互相转换,还可以选择DV设备输出等等功能。

    多媒体文件格式
    支持大部分流行的多媒体格式(AVI、ASF、WMV、WAV、OGG、MPEG-2、MPG)。点击此处可以得到一个所支持格式的列表。

    多媒体压缩
    通过可用的DirectShow过滤器压缩多媒体文件(内存中进行)。(Windows Media)

    多媒体处理
    具有处理AVI、Windows Media content、WAVE和MPEG1Audio(MP3)格式或DirectShow过滤器捕获到的数据的能力。在电影回放、转换或被捕获时可以使用LEAD Video callback DirectShow过滤器中的200种像处理功能来处理电影。

    DirectShow过滤器
    LEADTOOLS Multimedia包含了一个多媒体过滤器包的测试版,这个多媒体过滤器包具有强大的多媒体处理功能。

    产品演示
    LEADTOOLS Multimedia具有一些演示程序,可以帮助您开发您的项目。其中有音频、视频检测demo,音频更换demo,Mediainfo demo等等。

    LEADTOOLS Raster Imaging SDK

    LEADTOOLS Raster Imaging SDK是为开发者提供的用于创建功能强大的图像应用程序工具;采用LEADTOOLS的色彩转换、显示、压缩(JPEGTIFFCCITT G4 以及LEADCMP属性)、图象处理、TWAIN扫描、特效(超过2000种)、图像格式支持(超过150种图像文件格式)、打印、Internet/intranet 图像、数据库图像、图像公共对话框和屏幕捕获等特性,使用它,由此为你节省大量的时间与费用。

    特征综述 About Feature

    文件格式支持
    采用工业标准和专有压缩技术,可同时支持150多种图像文件格式以及sub-格式的加载、保存和转换。另外,采用LEADTOOLS能添加更多的格式支持,例如采用LEADTOOLS PDF插件,即能实现对PDF文件的加载、保存和转换支持。

    压缩支持
    支持多种工业标准的压缩技术,包括JPEG、CCITT、LZW (使用于GIF及某些TIFF文件)、ZIPLIB (使用于PNG文件)、Huffman算法、RLE及紧缩位压缩算法(Packbits)。另外,采用LEADTOOLS JPEG2000 插件和 LEADTOOLS CMW 插件可添加JPEG2000 及先进的CMW压缩技术。

    TWAIN扫描支持
    TWAIN 驱动几乎包含在所有的扫描仪及其它图像采集设备中,同时随着最新的发展技术,TWAIN 也是性能良好与高可靠性驱动的最佳选择。当前LEADTOOLS 的光栅图像产品支持所有包括在TWAIN v1.9 规范中的功能。

    屏幕捕获
    具有强大的屏幕捕获功能,能从文件、菜单、窗口、不同形状的屏幕客户区域等捕获资源。屏幕捕获工具是极其有用的,特别是在文档编辑及需提供其它图像输入方式的时显得更为重要。

    数据库支持
    同时提供高端或低端的数据库支持,其中包括绑定VB数据控件功能、OLEDB 接口、ODBC 接口以及低端加载和保存图像到内存的功能。

    Internet 支持
    提供几种不同级别Internet支持,包括:可封装到CAB文件的对象、能在web服务器端构造的对象、从URL或存储器装载图像的功能、支持HTTP 和FTP的控件、解析并加载到web服务器端的文件控件,以及用来构造功能强大、通过TCP/IP发送远程过程调用的客户服务器应用程序控件。

    显示与显示效果
    对图像如何被显示进行完全地控制,包括缩放、展开、图像显示的区域控制以及超过2000种的特效效果。LEADTOOLS 甚至包含了一个平铺窗口,这样你能方便地显示图像概要及选用适合最终用户的卷起、平铺方案。

    打印支持
    由于能使用与显示图像同样的代码来进行打印,所以打印图像与显示图像同样容易。你能控制图像打印的尺寸和位置;另外,能结合Windows GDI函数同LEADTOOLS打印一起使用,提供在同一页上打印文本和多个图像的灵活性。

    图像处理
    超过200种图象处理功能,分为四个基本类别:过滤、变换、色彩转换及绘图。在LEADTOOLS中的大多数图像处理功能支持不同着重区域,允许图像的某一部份被处理。通过添加更多用于数字绘图的功能,LEAD在LEADTOOLS Raster Imaging Pro中提供了包含大量用于数字绘图功能,包括笔刷、形状、纹理的创建与使用以及更多。

    色彩转换
    为确保你能把图像从一种格式转换到另一种格式,或是在任何其它显示设备上显示图象,LEADTOOLS 包含了强大的色彩转换功能。该色彩转换功能包括:支持8 种以上色彩平滑过渡算法、多种调色板选项以及把图像数据从任何支持的每个像素所占用的位转换到其他支持的每个像素所占用的位功能。支持的数值有1-8位色或灰度、16位色、24 位色和32 位色。如果你需要12或16位灰度或48与64位色支持。

    图像公共对话框
    LEADTOOLS 图像公共对话框通过扩展Windows公共对话框以提供具体的图像处理功能,节省了大量的繁琐编程时间,同时能给最终用户提供一个一致的外观和感觉。这个公共对话框针对图像处理、变换及特效提供专业的图像公共对话框功能。

    LEADTOOLS Vector Imaging Pro

    LEADTOOLS Vector Imaging Pro控件包含了创建功能强大的,支持矢量和光栅图像格式的2-D3-D浏览器、编辑器、转换器的一切所需要求。通过创建这样的应用程序,您不需要安装或注册一些更昂贵的用于创建矢量文件的原始程序,您只需添加您所需要的功能。如果您在为矢量成像寻找具有最丰富特色的软件开发工具包时,LEADTOOLS Vector Imaging Pro也许是您最好的选择。

    特征综述 About Feature

    支持矢量图像格式
    矢量图像可以被加载、保存、转换和输出为光栅图像格式,包括CGM、DGN、DRW、DWF、DXF、EMF、WMF、PLT、Gerber、PCL、PCT、SVG、VWPG、CMX和SHP。

    支持原始对象
    支持原始对象,包括圆弧、位图、笔刷、照相机、圆、复制、椭圆、椭圆弧、字体、组、层、线、笔、饼、弦、Poly Draw、多边形、多边线、Poly Bezier、光栅、长方形、文本、顶点和Clipping对象。

    支持浏览和编辑
    具有低级和高级函数,可以控制矢量图像的浏览,包括缩放(统一的或围绕任何轴线)、移动镜头、旋转(围绕任何轴线)和抗失真。矢量图形可以以任何希望的方式编辑,包括添加、修改、删除和将对象复制到粘贴板或者复制到各个不同的矢量图形中。

    支持打印
    可以把矢量图形缩小到任何分辨率而不会使图形出现扭曲,这样就可以确保在打印时,图形细节不会丢失。

    支持矢量转换
    不需要创建文件的原始程序就可以将矢量文件转换为另一种格式。

    支持光栅图像
    矢量文件可以被转换为任何分辨率的光栅图像,并且可以被保存为LEADTOOLS Raster Imaging 产品支持的任何150种图像文件格式。

    LEADTOOLS 软件开发工具包也包括了常见的光栅成像特色包括图像处理(转换、过滤、绘制、Region of Internet),色彩转换,显示,特效(从2000多种效果中选出的),压缩,图像格式(导入/导出),打印,Internet/Intranet成像,数据库成像,成像对话框和屏幕捕获。

    LEADTOOLS现在还支持Unicode编码
    为了向大量的开发人员提供矢量成像功能,控件包提供了5个编程接口:低层次的API、C++类库,以及易于使用但功能强大的ActiveX、COM、VCL控件。LEADTOOLS Vector Imaging Pro带有示例源代码,适用于Visual Basic, C/C++, Visual C++ (MFC), C++ Builder, Visual J++, Visual FoxPro, Access, Delphi, and VB and JavaScript,并且支持Visual Studio 6.0数据库连接(Oracle, SQL, OLE DB, ODBC和JET)。

    LEADTOOLS Barcode Module

    LEADTOOLS Barcode Module产品允许程序员很容易地在应用软件中加入编码,这样就可以读写Linear1D)、DataMatrix (2D)PDF417(2D)QR编码的条形码——包括对41种不同子类型的支持。LEADTOOLS Barcode Modules还加入了LEADTOOLS文档和医学图像工具包。

    特征综述 About Feature

    Barcode Modules :
    设计Linear (1D), DataMatrix (2D), PDF 417 (2D)和QR Code (2D) 条形码样式

    可以在任何方向上读出多个条形码。

    可以将条形码写入任何超过150种图像文件格式或者写入任何服从窗口的打印机。

    利用2D条形码技术,每个条形码符号可用数以千计的字符来编码。

    可以从选定目标区域内读出或写入条形码。

    可以读出指定颜色的条形码。

    可以写入指定颜色的条形码。

    使LEADTOOLS的广泛的图像处理技术一体化,以便完全控制用户的条形码识别过程。

    下表列出了每个模块的特点:

    读取/写入1D Symbols条形码

    高级的/标准的

    自动条形码类型检测。

    从目标区域读出或者写入条形码。

    可以从不同的方向读出,比如从左到右,从右到上,对角线方向等等。

    读取倾斜的条形码符号。

    可以读出多个条形码符号。

    可以读出混合的条形码类型,并以x/y的形式来返回报告。

    可以写入条形码符号,条形码符号带有大小和位置参数。

    可以检验字符处理。

    读取/写入2D DataMatrix条形码
    包括差错检测码(ECC),能够修复被破坏的条形码符号。

    读出或者写入彩色和灰色的条形码。

    可以在一个条形码符号中存储多达2218个ASCII字符,还可以把符号串接起来,用多达33225个字符对其编码。

    (读取模块)可以读出条形码,条形码是独立于歪斜失真、方向和取向改变之外的。从目标区域读出条形码,条形码包含在任何支持的图像文件格式中(支持类型超过150种),并可从扫描仪或者数字照相机获取。

    (写入模块)可以写入任何支持的光栅格式(超过150种)到目标区域,也可以打印到任何支持Windows的打印机上。

    读出/写入2D PDF 417 条形码
    可以在一个条形码符号种存储多达1815个ASCII字符。

    包括了差错检测码(ECC),能够修复被破坏的条形码符号。

    (读取模块)可以读出条形码,条形码是独立于歪斜失真、方向和取向改变之外的。从目标区域读出条形码,条形码包含于任何支持的图像文件格式中(支持类型超过150种),并可从扫描仪或者数字照相机获取。

    (写入模块)可以写入任何支持的光栅格式(超过150种)到目标区域,也可以打印到任何支持Windows的打印机上。

    读出/写入2D QR Code Modules
    可以从ALPHA或者数字文本中创建QR编码的条形码符号。

    包含差错检测码(ECC),它可以排除可能出现的被破坏的读出数据。

    可以在一个条形码符号中存储多达2335个ASCII字符。

    可以使用差错检测码(ECC)来修复被破坏的条形码符号。

    可以读出独立于歪斜的、定位的、取向改变和反射之外的条形码。

    可以将QR编码条形码符号输出到任何支持的Windows打印机上。

    ADTOOLS Document Imaging SDK

    LEADTOOLS Document Imaging 是一套可以扫描多种语言文档的COM和VCL控件。它可以执行光学字符识别,并且将扫描出的文本以四十多种不同的格式输出,包括MS Word,MS Excel,Dbase和WordPerfect等等。当它用于格式识别和处理应用时,可以加快光符识别处理速度。

    注释
    本产品具有强大的注释功能,可以添加文本、高亮、附注、音频、椭圆、圆、方形、按钮、线条、箭头、长方形、多边形、修订(中断信息)、热点、手写字、指针、图像、图章、标尺和超级链接,以上所有对于文档、色彩和灰度图像都具有多层安全特性。文档成像(Document Imaging)和文档成像套装(Document Imaging Suite)产品都具有此注释功能。

    显示,处理以及内存优化
    本产品不仅包含了光栅成像产品的所有显示功能,还拥有被称为双色缩放比例的专业化显示选项,此功能能够大大的提高成像图像的质量以及屏幕上黑白图像的可读性。

    图像获取 – TWAIN捕获
    TWAIN驱动是几乎所有扫描器和其它图像获取设备的标准,再加上技术的进一步完善,因此我们的LEADTOOLS Fast TWAIN产品绝对是您在性能和可靠性方面的最佳选择。目前LEADTOOLS 文档成像(LEADTOOLS Document Imaging)产品支持TWAIN 1.9规范中的所有功能。

    图像增强功能
    扫描和传真过程中,噪声和失真不可避免,而它们会导致光符字符识别的精度下降并影响人类阅读。要克服这些缺点,用户只需使用LEADTOOLS文档成像产品中名为Doc-Clean的功能,此功能可以消除成像图像中的噪声、边界、线条和装订孔,平滑文本,反转白色文本为黑色文本,还包含可延伸的倾斜图像(抗扭斜),粗化线条和文本(膨胀)以及腐蚀过厚的文本的其它功能(腐蚀)。

    专用存储和压缩功能
    Mixed Raster Content(MRC)使用一种技术将图像划分为图像和文本,然后使用一种适合于此类型图像的压缩技术来获取最高的压缩率以及最佳的图像质量。

    光学字符识别(OCR)
    光学字符识别功能能够将图像转换成编码形式的字符串,或将其内容以各种文档、数据库以及表单的格式保存(更多有关内容,请参考LEADTOOLS OCR功能)。文档成像套装(Document Imaging Suite)产品包含有此功能,如果您使用的是文档成像(Document Imaging)产品,则可以购买一个OCR插件来获取此功能。

    条形码
    条形码应用于文档成像领域已有多年的历史,它主要用来帮助识别文档,能够包含文档信息以及用于其它用途的各种信息。鉴于条形码在文档成像应用程序中的强大功能,LEAD公司推出了多种强大的条形码扩展功能,您可以购买这些功能来满足您的应用程序的特定需求。

    全面成像特征功能
    为使LEADTOOLS图像成像系列产品成为用途最广泛和最强大的图像成像产品,LEAD公司开发了全面的(双色、灰度以及彩色)成像特征功能包括图像处理(变换、过滤、绘制),颜色转换、显示、特效(精选自两千多种特效),压缩、(导入/导出的)图像格式,打印、国际互联网/企业内部互联网成像、数据库成像、成像通用对话框以及屏幕抓拍等等。

    ImageStone

    ImageStone是一套功能强大的C++图像处理库,它可以在多个平台之间移植。  
      功能包括:读写图像文件(JPG,GIF,PNG,TIFF,TGA...),显示,柱状图分析,undo/redo支持,超过100种预定义的特效等。  
    下载地址:http://www.codeguru.com/cpp/g-m/bitmap/viewers/article.php/c12577/
      
      里面有全部的源码和详细的帮助文档加9个例子程序,其中example  008是一个比较完善的图像处理程序。
    Introduction

    ImageStone is a powerful C++ class library for image manipulation. It is written in pure C++ and is easy to port. Its features include load/save (supports BMP, GIF, JPG, PNG, TIF, ICO, TGA, PCX, PSD...), display, histogram, undo/redo, and image transformation with over 100 predefined effects.

    License

    ImageStone is free. You can use the code however you want (free or commercial), as long as you don't claim it as your own. (If you use it in your product, I hope I could be notified.)

    Using ImageStone

    It's extremely easy. All you need to do is add #include "ImageStone.h" at the beginning of your source code. If you are using ImageStone in a MFC project, just add this include line at the end of the StdAfx.h file.

    The most basic and most important class is FCObjImage. Learn how to use it.

    ... load/save image file under any OS

    // for Windows : ImageStone uses GDI+ to load/save image,
    //               Jpg/Png/Gif/Bmp/Tga/Tif be supported
    // for Linux : Only Bmp/Tga are supported, but you can set
    //             FreeImage handler to support more.
    FCObjImage   img ;
    img.Load ("test.jpg") ;
    if (!img.IsValidImage())
    {
    assert(false) ;
    returnfalse ;
    }
    
    
    // print image's information : width, height, bit per pixel
    printf ("image's width : %d",  img.Width()) ;
    printf ("image's height : %d", img.Height()) ;
    printf ("image's bpp : %d",    img.ColorBits()) ;
    
    
    // Load/Save function determine image's format by file's ext name
    // save image as jpeg file, its quality set 90 (ranges from 1 to 99)
    img.Save ("save.jpg", 90) ;
    img.Save ("save.png") ;
    img.Save ("save.tif") ;
    
    
    // Another way to set quality
    FCImageProperty   prop ;
    prop.SetPropertyValue (IMAGE_TAG_JPEG_QUALITY, "90") ;
    img.Save ("save.jpg", prop) ;

    ... load image from memory under any OS

    // Load image into memory
    char* p = 0 ;
    intn = 0 ;
    FCOXOHelper::LoadFileToBuffer ("test.jpg", p, n) ;
    
    
    FCObjImage   img ;
    img.Load (p, n, IMG_JPG) ;
    
    
    delete[] p ;
    
    
    // this line demonstrates how to determine the image's format by
    // the file's ext name
    IMAGE_TYPE  t = FCObjImage::GetImageHandleFactory()->
    QueryImageFileType("test.jpg");

    ... load image from DIB stream under any OS

    // Load image into memory
    char* p = 0 ;
    intn = 0 ;
    FCOXOHelper::LoadFileToBuffer ("test.bmp", p, n) ;
    p += sizeof(BITMAPFILEHEADER) ;
    
    
    // now p points to a DIB stream
    FCObjImage   img ;
    img.LoadDIBStream (p, n) ;
    
    
    delete[] p ;

    ... load image from a resource under Windows

    // Load image from local exe file
    FCObjImage   img ;
    FCWin32::LoadImageRes (img, MAKEINTRESOURCE(nID), TEXT("JPG"),
    IMG_JPG) ;
    
    
    // Load image from DLL's resource
    HMODULE   hDll = LoadLibrary (TEXT("ResDll.dll")) ;
    FCWin32::LoadImageRes (img, MAKEINTRESOURCE(nID), TEXT("JPG"),
    IMG_JPG, hDll) ;
    
    
    // Load image from standard BITMAP resource
    FCWin32::LoadImageBitmapRes (img, MAKEINTRESOURCE(nID)) ;

    ... load/save image via FreeImage library

    // change to FreeImage library to load/save image
    // for more detail, refer to example 005
    FCObjImage::SetImageHandleFactory (new FCImageHandleFactory_FreeImage) ;
    img.Load ("test.jpg") ;
    
    
    // change to GDI+ load/save image
    FCObjImage::SetImageHandleFactory (new FCImageHandleFactory_Gdiplus) ;
    img.Load ("test.jpg") ;

    ... combine ImageHandleFactory

    // use FreeImage to load/save PSD/PCX image
    class CMyImageFactory : public FCImageHandleFactory
    {
    protected:
    virtual FCImageHandleBase* CreateImageHandle (IMAGE_TYPE imgType)
    {
    switch (imgType)
    {
    case IMG_BMP : returnnew FCImageHandle_Bmp ;
    case IMG_TGA : returnnew FCImageHandle_Tga ;
    case IMG_JPG : returnnew FCImageHandle_Gdiplus ;
    case IMG_GIF : returnnew FCImageHandle_Gdiplus ;
    case IMG_TIF : returnnew FCImageHandle_Gdiplus ;
    case IMG_PNG : returnnew FCImageHandle_Gdiplus ;
    case IMG_PCX : returnnew FCImageHandle_FreeImage ;
    case IMG_PSD : returnnew FCImageHandle_FreeImage ;
    }
    return 0 ;
    }
    // protected avoid user delete object.
    virtual ~CMyImageFactory() {}
    };
    
    
    // use our custom factory to read/write image
    FCObjImage::SetImageHandleFactory (new CMyImageFactory) ;
    FCObjImage   img ;
    img.Load ("test.jpg") ;

    ... load multi-frame GIF

    FCObjMultiFrame   img ;
    img.Load ("test.gif") ;
    img.GetFrame(0)->Save ("001.jpg") ;
    img.GetFrame(1)->Save ("001.jpg") ;
    ...

    ... Load a jpeg's EXIF information

    FCObjImage        img ;
    FCImageProperty   prop ;
    img.Load ("test.jpg", &prop) ;
    
    
    // get camera's ISO speed
    std::stringm = prop.QueryPropertyValue (IMAGE_TAG_EXIF_ISOSpeed) ;
    // get camera's equip model
    std::stringn = prop.QueryPropertyValue (IMAGE_TAG_EquipModel) ;

    ... draw image object under Windows

    FCObjImage   img ;
    // capture current screen
    RECT         rc = {0, 0, GetSystemMetrics(SM_CXSCREEN),
                 GetSystemMetrics(SM_CYSCREEN)} ;
    FCWin32::CaptureScreen (img, rc) ;
    
    
    // Draw image (no stretch) where top-left at (0,0) of hdc
    FCWin32::DrawImage (img, hdc, 0, 0) ;
    
    
    // Stretch image on region of hdc
    RECT     rcOnDC = {100, 100, 200, 200} ;
    FCWin32::DrawImage (img, hdc, rcOnDC) ;
    
    
    // Stretch image on central of hdc's region and keep image's aspect
    FCWin32::DrawImageAspect (img, hdc, rcOnDC) ;
    
    
    // Stretch region of image on region of hdc
    RECT     rcImg = {20, 20, 50, 50} ;
    FCWin32::DrawImage (img, hdc, rcOnDC, rcImg) ;

    ... copy/paste image to/from Clipboard

    FCObjImage   img ;
    img.Load ("test.jpg") ;
    
    
    // copy image to Clipboard
    FCWin32::CopyToClipboard (img) ;
    
    
    // get image on Clipboard
    FCWin32::GetClipboardImage (img) ;

    ... convert between GDI HBITMAP and FCObjImage

    // create HBITMAP from FCObjImage object
    FCObjImage   img ;
    img.Load ("test.jpg") ;
    HBITMAP   h = FCWin32::CreateDDBHandle (img) ;
    
    
    // create FCObjImage object from HBITMAP
    FCWin32::CreateImageFromDDB (h, img) ;

    ... convert between GDI+ bitmap and FCObjImage

    // create GDI+ Bitmap from FCObjImage object
    FCObjImage   img ;
    img.Load ("test.jpg") ;
    Gdiplus::Bitmap   * pBmp = FCWin32::GDIPlus_CreateBitmap(img) ;
    delete pBmp ;
    
    
    // create FCObjImage object from GDI+ Bitmap
    FCWin32::GDIPlus_LoadBitmap (*pBmp, img) ;

    ... process image

    FCObjImage   img ;
    img.Load ("test.jpg") ;
    
    
    // resize (smooth) image
    img.Stretch (nWidth, nHeight) ;
    img.Stretch_Smooth (nWidth, nHeight) ;
    
    
    // Use SinglePixelProcessProc interface to process image.
    // There are over 100 pre-implemented effects;
    // please refer to class derived from FCInterface_PixelProcess
    FCPixelRotate   aCmd (37) ;
    img.SinglePixelProcessProc (aCmd) ;
    
    
    FCPixelBrightness   aCmd (150) ;    // 150%
    img.SinglePixelProcessProc (aCmd) ;
    
    
    FCPixelMosaic   aCmd(5) ;
    img.SinglePixelProcessProc (aCmd) ;
    
    
    FCPixelOilPaint   aCmd (3) ;
    img.SinglePixelProcessProc (aCmd) ;

    ... custom image processing

    // our processor : change pixel's RGB value
    class CMyPixelProcessor : public FCSinglePixelProcessBase
    {
    public:
    CMyPixelProcessor (int nR, int nG, int nB) : m_R(nR), m_G(nG),
    m_B(nB) {}
    private:
    virtualvoid ProcessPixel (FCObjImage* pImg, int x, int y,
    BYTE* pPixel)
    {
    PCL_B(pPixel) = FClamp0255 (PCL_B(pPixel) + m_B) ;
    PCL_G(pPixel) = FClamp0255 (PCL_G(pPixel) + m_G) ;
    PCL_R(pPixel) = FClamp0255 (PCL_R(pPixel) + m_R) ;
    }
    intm_R, m_G, m_B ;
    };
    
    
    // this class has the same function to upper class,
    // but implements other class
    class CMyImageProcessor : public FCPixelWholeImageBase
    {
    public:
    CMyPixelProcessor (int nR, int nG, int nB) : m_R(nR), m_G(nG),
    m_B(nB) {}
    private:
    virtualvoid ProcessWholeImage (FCObjImage* pImg,
    FCObjProgress* pProgress)
    {
    for (int y=0 ; y < pImg->Height() ; y++)
    {
    for (int x=0 ; x < pImg->Width() ; x++)
    {
    BYTE   * p = pImg->GetBits(x,y) ;
    PCL_B(p)   = FClamp0255 (PCL_B(p) + m_B) ;
    PCL_G(p)   = FClamp0255 (PCL_G(p) + m_G) ;
    PCL_R(p)   = FClamp0255 (PCL_R(p) + m_R) ;
    }
    if (pProgress)
    pProgress->SetProgress (100 * y / pImg->Height()) ;
    }
    }
    intm_R, m_G, m_B ;
    };
    
    
    // use our custom processor
    FCObjImage   img ;
    img.Load ("test.jpg") ;
    
    
    CMyPixelProcessor   aCmd (20, 20, 20) ;
    img.SinglePixelProcessProc (aCmd) ;
    
    
    CMyImageProcessor   aCmd (20, 20, 20) ;
    img.SinglePixelProcessProc (aCmd) ;

    ... add text on image

    FCObjImage   img ;
    img.Load ("c://test.jpg") ;
    
    
    // now we create text layer
    FCObjTextLayer   imgT ;
    PACK_TextLayer   tp ;
    tp.m_bAddShadow   = false ;
    tp.m_bAntiAliased = true ;
    tp.m_bBold        = true ;
    tp.m_bItalic      = true ;
    tp.m_crFont       = PCL_RGBA(0,0,255) ;
    tp.m_nFontSize    = 128 ;
    tp.m_strFace      = "Arial" ;
    tp.m_strText      = "Hello" ;
    FCWin32::CreateTextLayer_GDIPlus (imgT, tp) ;
    
    
    // Now we have created a text image. Additionaly,
    // we can add some affect to it, such as gradient color
    POINT                 pt1={0,0}, pt2={0,50} ;
    FCPixelGradientLine   aCmd (pt1, pt2, PCL_RGBA(0,0,255),
    FCColor::crWhite()) ;
    imgT.SinglePixelProcessProc (aCmd) ;
    
    
    // blend text layer on image
    RECT   rc = {0, 0, imgT.Width(), imgT.Height()} ;
    img.AlphaBlend (imgT, rc, rc, 100) ;

    GIMP

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

    下载地址:http://dlc2.pconline.com.cn/filedown.jsp?dlid=10351&linkid=6361451

    CxImage

    CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚。在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆德编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。如果想下载CxImage,可以http://www.codeproject.com上下载。 CxImage类库的结构:

    一个CxImage对象是一个扩展了的位图。作者只是在位图结构上添加了一些起存储信息作用的成员变量。一个CxImage对象(同时)也是一组层。每个层只有在需要时才会分配相应的缓冲区。CxImage::pDib代表着背景图像,CxImage::pAlpha代表着透明层,CxImage::pSelection代表着被选中的层,被用来创建图像处理时让用户感兴趣的区域。在这三个特殊层面的基础上,你可以增加一些额外的层,这些层可以存储在CxImage::pLayers中。一般说来,层是一个完整的CxImage对象。因此,你可以构造很复杂的嵌套层。下面是CxImage的一些成员变量:

    class CxImage
    {
    ...
    protected:
    void* pDib;            //包含文件头,调色板等等
    BITMAPINFOHEADER head; //标准的文件头(位图)
    CXIMAGEINFO info;      //扩展了的信息
    BYTE* pSelection;      //用户选中的区域
    BYTE* pAlpha;          //alpha通道
    CxImage** pLayers;     //通用层
    }
    typedef struct tagCxImageInfo {
    DWORD   dwEffWidth;       //DWORD 扫描线宽
    BYTE*   pImage;           //图像位数
    void*   pGhost;           //if this is a ghost, pGhost point to the body
    DWORD   dwType;           //原图像的格式
    char    szLastError[256]; //出错信息
    long    nProgress;        //监视循环的次数
    long    nEscape;          //跳出标志
    long    nBkgndIndex;      //GIF, PNG, MNG格式使用
    RGBQUAD nBkgndColor;      //RGB三原色透明度
    BYTE    nQuality;         //JPEG格式使用
    long    nFrame;           //TIF, GIF, MNG使用 :实际的帧数
    long    nNumFrames;       //TIF, GIF, MNG使用 :帧总数
    DWORD   dwFrameDelay;     //GIF, MNG使用
    long    xDPI;             //水平分辨率
    long    yDPI;             //垂直分辨率
    RECT    rSelectionBox;    //选中的矩形区
    BYTE    nAlphaMax;        //阴影的最大不透明度
    bool    bAlphaPaletteEnabled;  //如果调色板中有Alpha通道则为真
    bool    bEnabled;         //打开绘图函数
    long    xOffset;
    long    yOffset;
    DWORD   dwEncodeOption;   //一些编码选项
    RGBQUAD last_c;           //一些优化选项
    BYTE    last_c_index;
    bool    last_c_isvalid;
    long    nNumLayers;
    DWORD   dwFlags;
    } CXIMAGEINFO;
    要在picture box中显示一个png格式的文件,只需:
    CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);
    HBITMAP m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);
    m_picture.SetBitmap(m_bitmap);
    其它格式则类推。
    Examples: how to ...
    ... convert from a format to another
    CxImage  image;
    // bmp -> jpg
    image.Load("image.bmp", CXIMAGE_FORMAT_BMP);
    if (image.IsValid()){
    if(!image.IsGrayScale()) image.IncreaseBpp(24);
    image.SetJpegQuality(99);
    image.Save("image.jpg",CXIMAGE_FORMAT_JPG);
    }
    // png -> tif
    image.Load("image.png", CXIMAGE_FORMAT_PNG);
    if (image.IsValid()){
    image.Save("image.tif",CXIMAGE_FORMAT_TIF);
    }
    ... load an image resource
    //Load the resource IDR_PNG1 from the PNG resource type
    CxImage* newImage = new CxImage();
    newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
    "PNG"),CXIMAGE_FORMAT_PNG);
    or//Load the resource IDR_JPG1 from DLL
    CxImage* newImage = new CxImage();
    HINSTANCE hdll=LoadLibrary("imagelib.dll");
    if (hdll){
    HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG");
    newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);
    FreeLibrary(hdll);
    }
    or//Load a bitmap resource;
    HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDB_BITMAP1)));
    CxImage *newImage = new CxImage();
    newImage->CreateFromHBITMAP(bitmap);
    ... decode an image from memory
    CxImage image((BYTE*)buffer,size,image_type);
    orCxMemFile memfile((BYTE*)buffer,size);
    CxImage image(&memfile,image_type);
    orCxMemFile memfile((BYTE*)buffer,size);
    CxImage* image = new CxImage();
    image->Decode(&memfile,type);
    ... encode an image in memory
    long size=0;
    BYTE* buffer=0;
    image.Encode(buffer,size,image_type);
    ...
    free(buffer);
    orCxMemFile memfile;
    memfile.Open();
    image.Encode(&memfile,image_type);
    BYTE* buffer = memfile.GetBuffer();
    long size = memfile.Size();
    ...
    free(buffer);
    ... create a multipage TIFF
    CxImage *pimage[3];
    pimage[0]=&image1;
    pimage[1]=&image2;
    pimage[2]=&image3;
    FILE* hFile;
    hFile = fopen("multipage.tif","w+b");
    CxImageTIF multiimage;
    multiimage.Encode(hFile,pimage,3);
    fclose(hFile);
    orFILE* hFile;
    hFile = fopen("c://multi.tif","w+b");
    CxImageTIF image;
    image.Load("c://1.tif",CXIMAGE_FORMAT_TIF);
    image.Encode(hFile,true);
    image.Load("c://2.bmp",CXIMAGE_FORMAT_BMP);
    image.Encode(hFile,true);
    image.Load("c://3.png",CXIMAGE_FORMAT_PNG);
    image.Encode(hFile);
    fclose(hFile);
    ... copy/paste an image
    //copy
    HANDLE hDIB = image->CopyToHandle();
    if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) {
    if(::EmptyClipboard()) {
    if (::SetClipboardData(CF_DIB,hDIB) == NULL ) {
    AfxMessageBox( "Unable to set Clipboard data" );
    }    }    }
    CloseClipboard();
    //paste
    HANDLE hBitmap=NULL;
    CxImage *newima = new CxImage();
    if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB);
    if (hBitmap) newima->CreateFromHANDLE(hBitmap);
    CloseClipboard();

    需要大家注意的是:整个CxImage类库非常大。如果你只需要能处理其中的几种格式,你可以在主要的头文件ximage.h中找到一些开关选项来关闭一些图像库。JPG、PNG、TIFF中的每一个库,都会向最终程序增加约100KB的内容。而CxImage类库压缩后只有约60KB。所以,你需要谨慎挑选一些你真正需要的类库。作者提供的示例工程在编译后,你会发现如下一些文件: ·CxImage : cximage.lib - static library ·CxImageCrtDll : cximagecrt.dll - DLL not using mfc ·CxImageMfcDll : cximage.dll - DLL using mfc ·Demo : demo.exe - program linked with cximage.lib and the C libraries ·DemoDll : demodll.exe - program linked with cximagecrt.dll ·j2k,jasper,jbig,jpeg,png,tiff,zlib : static C libraries 构建这些工程需要耗费几分钟的时间(中间文件可达60MB)。下面则是使用CxImage类库前必须设置的一些参数:

    Project Settings
    |- C/C++
    |   |- Code Generation
    |   |   |- Use run-time library : Multithreaded DLL (must be the same for
    |   |   |  all the linked libraries)
    |   |   |- Struct member alignment : must be the same for all the linked
    |   |   |  libraries
    |   |- Precompiled headers : not using precompiled headers
    |   |- Preprocessor
    |       |- Additional Include Directories:  ../cximage
    |- Link
    |- General
    |- Object/library modules: ../png/Debug/png.lib
    ../jpeg/Debug/jpeg.lib
    ../zlib/Debug/zlib.lib
    ../tiff/Debug/tiff.lib
    ../cximage/Debug/cximage.lib  ..
    展开全文
  • C语言实现BMP图像处理(细化)

    千次阅读 2018-12-25 09:01:00
    我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 256 级灰度图,不过只用到了调色板中 0 和 255 两项。  所谓细化,就是从原来的图中去掉一些点,但仍要保持原来的形状。实际上,是保持原图的...

            细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 256 级灰度图,不过只用到了调色板中 0 和 255 两项。

            所谓细化,就是从原来的图中去掉一些点,但仍要保持原来的形状。实际上,是保持原图的骨架。所谓骨架,可以理解为图象的中轴,例如一个长方形的骨架是它的长方向上的中轴线;正方形的骨架是它的中心点;圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。那么怎样判断一个点是否能去掉呢?显然,要根据它的八个相邻点的情况来判断,我们给几个例子(如图 6.22 所示)。

                                                       

             图 6.22 中,(1)不能删,因为它是个内部点,我们要求的是骨架,如果连内部点也删了,骨架也会被掏空的;(2)不能删,和(1)是同样的道理;(3)可以删,这样的点不是骨架;(4)不能删,因为删掉后,原来相连的部分断开了;(5)可以删,这样的点不是骨架;(6)不能删,因为它是直线的端点,如果这样的点删了,那么最后整个直线也被删了,剩不下什么。总结一下,有如下的判据:(1)内部点不能删除;(2)孤立点不能删除;(3)直线端点不能删除;(4)如果 P 是边界点,去掉 P 后,如果连通分量不增加,则 P 可以删除。

             我们可以根据上述的判据,事先做出一张表,从 0 到 255 共有 256 个元素,每个元素要么是0,要么是 1。我们根据某点(当然是要处理的黑色点了)的八个相邻点的情况查表,若表中的元素是 1,则表示该点可删,否则保留。

    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    
    int main(int* argc, char** argv)
    {
    	FILE* fp = fopen("./threshold.bmp", "rb");
    	if (fp == 0)
    		return 0;
    	BITMAPFILEHEADER fileHead;
    	fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
    
    	BITMAPINFOHEADER infoHead;
    	fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
    	int width = infoHead.biWidth;
    	int height = infoHead.biHeight;
    	int biCount = infoHead.biBitCount;
    
    	int lineByte = (biCount*width / 8 + 3) / 4 * 4;
    	RGBQUAD* pColorTable;
    	pColorTable = new RGBQUAD[256];
    	fread(pColorTable, sizeof(RGBQUAD), 256, fp);
    
    	unsigned char* pBmpBuf,*pBmpBuf2;
    	pBmpBuf = new unsigned char[lineByte*height];
    	fread(pBmpBuf, lineByte*height, 1, fp);
    	fclose(fp);
    
    	// 新图
    	FILE* fop = fopen("thinging.bmp", "wb");
    	if (fop == 0)
    		return 0;
    
    	pBmpBuf2 = new unsigned char[lineByte*height];
    	for (int i = 0; i < height; ++i){
    		for (int j = 0; j < width; ++j){
    			*(pBmpBuf2 + i*lineByte + j) = *(pBmpBuf + i*lineByte + j);
    		}
    	}
    
    	// 比较矩阵,0为黑,1为白; 
    	// 1:不能;2:不能;3:能;4:不能;5:能;6:不能
    	char str[6][8] = { { 0, 0, 0, 0, 0, 0, 0, 0, }, { 255, 0, 255, 0, 0, 255, 0, 0 },
    	{ 255, 0, 255, 255, 0, 255, 0, 255 }, { 255, 255, 255, 0, 0, 255, 255, 255 },
    	{ 255, 0, 255, 255, 0, 255, 255, 255 }, { 0, 255, 255, 255, 255, 255, 255, 255 } };
    	int temp, k;
    	char strTemp[8];
    	for (int i = 1; i < height-1; ++i){
    		for (int j = 1; j < width - 1; ++j){
    			k = 0;
    			for (int m = -1; m <= 1; ++m){
    				for (int n = -1; n <= 1; ++n){
    					temp = *(pBmpBuf + (i - m)*lineByte + (j + n));
    					strTemp[k] = temp;
    					k++;
    				}
    			}
    			for (int k = 0; k < 6; ++k){
    				if (strcmp(strTemp, str[k])==0){
    					if (k == 3 || k == 5){
    						*(pBmpBuf2 + i*lineByte + j) = 255;
    					}
    				}
    			}
    		}
    	}
    
    
    	fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);
    	fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop);
    	fwrite(pColorTable, sizeof(RGBQUAD), 255, fop);
    	fwrite(pBmpBuf2, lineByte*height, 1, fop);
    	fclose(fop);
    
    	system("pause");
    	return 0;
    }

     

    实验结果:

                   原图                     效果图

           

    展开全文
  • 几种常用的图像处理函数

    千次阅读 2018-09-20 13:12:17
    from:... 几种常用的图像处理函数 OpenCV OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉,可以运行在Linux、Windows和Mac OS操...

    from:http://www.wtoutiao.com/p/18a4MqP.html

    几种常用的图像处理函数库

    OpenCV

    OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

    OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#,Ch, Ruby的支持。

    所有新的开发和算法都是用C++接口。一个使用CUDA的GPU接口也于2010年9月开始实现。


    点评:

    功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法;然后将图像格式和矩阵运算,然后将各个算法的实现函数。该库显示图像极其方便,但该库似乎不大稳定,对32F和16S、8U的图像数据支持上bug重重。好处是该库是开放的,所以自己可以修改;而且支持CVS。另外该库用的是IPL矩阵库,速度很快。

    CxImage

    CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等。


    点评:

    该开发包完全开放源代码,图像封装为一个类,功能极为强大,与Windows、MFC支持极好,支持图像的多种操作(线性滤波、中值滤波、直方图操作、旋转缩放、区域选取、阈值处理、膨胀腐蚀、alpha混合等等),支持从文件、内存或者win32api定义的位图图像格式中读取图像,支持将图像显示在任意窗口,功能可谓很强大了,而且对像素的操作很方便,另外还有一个界面很强的demo,可以直接在上面进行二次开发,推荐使用!

    缺点:里面的子库很多,用起来可能较麻烦;而且感觉速度稍慢,不如后面提到的freeimage,但功能真的十分强大啊!

    CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚。在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆德编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。还有让我最看好的,就是作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。

    CImg

    CImg 库是一个免费、开源的图像处理C++库,名称原意是 Cool Image,正如其名,CImg是一个非常优秀、功能强大、代码简洁、使用方便的C++ 图像处理库。它不仅非常适合科学家、研究生做科研时使用,也适合在工业应用工程开发中使用,更适合的是,对于有志于开发简洁、高效、功能强大的图像处理库的人而言,CImg的源码是不可多得的学习和参考资料。


    点评:

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

    FreeImage

    FreeImage [1] 是一款免费的、开源的、跨平台(Windows 、Linux 和Mac OS X )的,支持20 多种图像类型的(如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。其最大优点就是采用插件驱动型架构,具有快速、灵活、简单易用的特点,得到了广泛使用。

    FreeImage 的主要功能有多格式位图的读写;方便的位图信息获取;位深度转换;位图页面访问;基本的几何变换和点处理;通道合并与混合等。FreeImage 暂时不支持矢量图形和高级图像处理,位图绘制需要由用户来完成。

    FreeImage 中的所有函数都以FreeImage_ 开头,如图像文件的读写函数分别为FreeImage_Load 和FreeImage_Save 。FIBITMAP 数据结构保存着位图信息和像素数据,是FreeImage 的核心。


    点评:

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



    展开全文
  • 这是一个基于C语言的小型图像处理库(VC++6.0工程),可以用来读取BMP,JPG格式的文件,第一次运行过程中间会报错出现断言,是正常现象,点击重试即可运行完成
  • 数字图像处理图片库

    热门讨论 2020-07-30 23:32:37
    最全的数字图处理相关图片 最典型的图片bmp gray color 等标准图片
  • Python图像处理库PIL中图像格式转换(一)

    万次阅读 多人点赞 2016-03-10 08:16:10
    本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”...

    在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。

    对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

    通过之前的博客对Image模块的介绍,对于PNGBMPJPG彩色图像格式之间的互相转换都可以通过Image模块的open()save()函数来完成。具体说就是,在打开这些图像时,PIL会将它们解码为三通道的“RGB”图像。用户可以基于这个“RGB”图像,对其进行处理。处理完毕,使用函数save(),可以将处理结果保存成PNGBMPJPG中任何格式。这样也就完成了几种格式之间的转换。同理,其他格式的彩色图像也可以通过这种方式完成转换。当然,对于不同格式的灰度图像,也可通过类似途径完成,只是PIL解码后是模式为“L”的图像。

    这里,我想详细介绍一下Image模块的convert()函数,用于不同模式图像之间的转换。

    Convert()函数有三种形式的定义,它们定义形式如下:

    im.convert(mode) image

    im.convert(“P”, **options) image

    im.convert(mode, matrix) image

    使用不同的参数,将当前的图像转换为新的模式,并产生新的图像作为返回值。

    通过博客“Python图像处理库PIL的基本概念介绍”,我们知道PIL中有九种不同模式。分别为1LPRGBRGBACMYKYCbCrIF

    本文我采用的示例图像是图像处理中经典的lena照片。分辨率为512x512lena图片如下:

    一、模式“RGB”转换为其他不同模式

    1、 模式“1

    模式“1”为二值图像,非黑即白。但是它每个像素用8bit表示,0表示黑,255表示白。下面我们将lena图像转换为“1”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena.mode
    
    'RGB'
    
    >>> lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>> lena_1 = lena.convert("1")
    
    >>> lena_1.mode
    
    '1'
    
    >>> lena_1.size
    
    (512, 512)
    
    >>>lena_1.getpixel((0,0))
    
    255
    
    >>> lena_1.getpixel((10,10))
    
    255
    
    >>>lena_1.getpixel((10,120))
    
    0
    
    >>>lena_1.getpixel((130,120))
    
    255

     

    图像lena_1的模式为“1”,分辨率为512x512,如下:

    2、 模式“L

    模式“L”为灰色图像,它的每个像素用8bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

    L = R * 299/1000 + G * 587/1000+ B * 114/1000

    下面我们将lena图像转换为“L”图像。

    例子:

    >>> from PIL importImage
    
    >>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena.mode
    
    'RGB'
    
    >>> lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>> lena_L =lena.convert("L")
    
    >>> lena_L.mode
    
    'L'
    
    >>> lena_L.size
    
    (512, 512)
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>>lena_L.getpixel((0,0))
    
    132

    对于第一个像素点,原始图像lena(197, 111, 78),其转换为灰色值为:

    197 *299/1000 + 111 * 587/1000 + 78 * 114/1000 = 132.952PIL中只取了整数部分,即为132

    转换后的图像lena_L如下:

    3、 模式“P

    模式“P”为8位彩色图像,它的每个像素用8bit表示,其对应的彩色值是按照调色板查询出来的。

    下面我们使用默认的调色板将lena图像转换为“P”图像。

    例子:

    
    >>> from PIL importImage
    
    >>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena.mode
    
    'RGB'
    
    >>> lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>> lena_P =lena.convert("P")
    
    >>> lena_P.mode
    
    'P'
    
    >>>lena_P.getpixel((0,0))
    
    62

     

    转换后的图像lena_P如下:

    4、 模式“RGBA

    模式“RGBA”为32位彩色图像,它的每个像素用32bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。

    下面我们将模式为“RGB”的lena图像转换为“RGBA”图像。

    例子: 

                                                                                                                                  
    
    >>> from PIL import Image
    
    >>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>>lena.mode
    
    'RGB'
    
    >>>lena.getpixel((0,0))
    
    (197,111, 78)
    
    >>>lena_rgba = lena.convert("RGBA")
    
    >>>lena_rgba.mode
    
    'RGBA'
    
    >>>lena_rgba.getpixel((0,0))
    
    (197,111, 78, 255)
    
    >>>lena_rgba.getpixel((0,1))
    
    (196,110, 77, 255)
    
    >>>lena.getpixel((0,0))
    
    (197,111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196,110, 77)

     

    从实例中可以看到,使用当前这个方式将“RGB”图像转为“RGBA”图像时,alpha通道全部设置为255,即完全不透明。

    转换后的图像lena_rgba如下:

    5、 模式“CMYK

    模式“CMYK”为32位彩色图像,它的每个像素用32bit表示。模式CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。

    四种标准颜色是:CCyan = 青色,又称为‘天蓝色’或是‘湛蓝’MMagenta = 品红色,又称为‘洋红色’;YYellow = 黄色;KKey Plate(blacK) = 定位套版色(黑色)。

    下面我们将模式为“RGB”的lena图像转换为“CMYK”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena_cmyk =lena.convert("CMYK")
    
    >>> lena_cmyk.mode
    
    'CMYK'
    
    >>>lena_cmyk.getpixel((0,0))
    
    (58, 144, 177, 0)
    
    >>> lena_cmyk.getpixel((0,1))
    
    (59, 145, 178, 0)
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196, 110, 77)

     

    从实例中可以得知PIL中“RGB”转换为“CMYK”的公式如下:

    C = 255 - R
    M = 255 - G
    Y = 255 - B
    K = 0

    由于该转换公式比较简单,转换后的图像颜色有些失真。

    转换后的图像lena_cmyk如下:

    6、 模式“YCbCr

    模式“YCbCr”为24位彩色图像,它的每个像素用24bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。

    模式“RGB”转换为“YCbCr”的公式如下:

    Y= 0.257*R+0.504*G+0.098*B+16
    Cb = -0.148*R-0.291*G+0.439*B+128
    Cr = 0.439*R-0.368*G-0.071*B+128

    下面我们将模式为“RGB”的lena图像转换为“YCbCr”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>> lena_ycbcr =lena.convert("YCbCr")
    
    >>>lena_ycbcr.mode
    
    'YCbCr'
    
    >>>lena_ycbcr.getpixel((0,0))
    
    (132, 97, 173)
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)

     

    按照公式,Y = 0.257*197+0.564*111+0.098*78+16= 136.877

    Cb= -0.148*197-0.291*111+0.439*78+128= 100.785
    Cr = 0.439*197-0.368*111-0.071*78+128 = 168.097

    由此可见,PIL中并非按照这个公式进行“RGB”到“YCbCr”的转换。

    转换后的图像lena_ycbcr如下:

    7、 模式“I

    模式“I”为32位整型灰色图像,它的每个像素用32bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的:

    I = R * 299/1000 + G * 587/1000 + B * 114/1000

    下面我们将模式为“RGB”的lena图像转换为“I”图像。

    例子:

    
    >>> from PIL import Image
    
    >>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>>lena.getpixel((0,0))
    
    (197,111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196,110, 77)
    
    >>> lena_I =lena.convert("I")
    
    >>> lena_I.mode
    
    'I'
    
    >>>lena_I.getpixel((0,0))
    
    132
    
    >>>lena_I.getpixel((0,1))
    
    131
    
    >>> lena_L =lena.convert("L")
    
    >>>lena_L.getpixel((0,0))
    
    132
    
    >>>lena_L.getpixel((0,1))
    
    131

     

    从实验的结果看,模式“I”与模式“L”的结果是完全一样,只是模式“L”的像素是8bit,而模式“I”的像素是32bit

    8、 模式“F

    模式“F”为32位浮点灰色图像,它的每个像素用32bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的:

    F = R * 299/1000+ G * 587/1000 + B * 114/1000

    下面我们将模式为“RGB”的lena图像转换为“F”图像。

    例子:

    
    >>>from PIL import Image
    
    >>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
    
    >>>lena.getpixel((0,0))
    
    (197, 111, 78)
    
    >>>lena.getpixel((0,1))
    
    (196, 110, 77)
    
    >>> lena_F =lena.convert("F")
    
    >>> lena_F.mode
    
    'F'
    
    >>>lena_F.getpixel((0,0))
    
    132.95199584960938
    
    >>>lena_F.getpixel((0,1))
    
    131.95199584960938

     

    模式“F”与模式“L”的转换公式是一样的,都是RGB转换为灰色值的公式,但模式“F”会保留小数部分,如实验中的数据。

    (未完待续)

    展开全文
  • 开源自己写的图像处理库
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化...[数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分割窗...
  • 用Python做图像处理(PIL的使用)

    千次阅读 2016-10-19 16:12:14
    用Python做图像处理  最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能。...在 Python 中,比较常用的图像处理库是 PIL(Python Image Library),当前版本是 1.1.6 ,用起来非常方便。大家可
  • 数字图像处理常用的标准测试图片包含lenna barbara baboon pepper等经典图片.全部无压缩bmp格式
  • python图像处理库In my previous article on time-saving tips for Pythonists, I mentioned that Python is a language that can inspire love in its users. 在我以前关于Python 节省时间技巧的文章中 ,我提到...
  • 最好用图像处理库CxImage入门

    万次阅读 2014-01-26 14:45:04
    CxImage是一款免费的、开源的、功能强大的图形处理。跨平台,支持windows、linux等;支持BMP、GIF、ICO、TGA、JPEG、PCX、PNG、TIFF、MNG、RAS等...支持格式转换、图像处理、几何变换等;最重要的是使用非常简单。
  • 原文发布于微信公众号 - 智能算法(AI_Algorithm) OpenCV 简介:OpenCV全称是:Open Source Computer Vision Library。...它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面...
  • Java图像处理方面的工具和开发包

    万次阅读 2017-02-06 10:59:39
    Java图像处理类库Java Image Filters Java Image Filters 是由 Jhlabs 开发的一组用来处理 Java 图像的类库,提供各种常用的图像处理效果,例如反转色、扭曲、水波纹、凹凸、黑白效果等等数十种效果,如...
  • 背景: 本专栏“DICOM医学图像处理”受众较窄,起初只想作为自己学习积累和工作经验的简单整理。前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在“关于BMP(JPG)与DCM格式转换”和“DICOM 通讯协议”,...
  • C++ 图像处理常用

    2020-04-26 12:36:17
    滤波Filter(low-pass, high-pass and band-pass FIR filter): ... 绘制线图Plot matplotlib-cpp works by wrapping the...
  • 图像处理库(FreeImage)

    千次阅读 2014-03-05 11:42:49
    、Linux 和Mac OS X )的,支持20 多种图像类型的(如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。其最大优点就是采用插件驱动型架构,具有快速、灵活、简单易用的特点,得到了广泛使用。 FreeImage 的主要...
1 2 3 4 5 ... 20
收藏数 13,837
精华内容 5,534
热门标签
关键字:

图像处理图片库bmp