数字图像处理与机器视觉:Visual C++与Matlab实现(第2版)
上QQ阅读APP看书,第一时间看更新

2.2 认识CImg类

在Visual C++的早期版本(6.0之前)中,程序员只能通过API函数对位图进行访问和操作;高版本的Visual C++和Visual C#中,微软提供了CImage类封装了更多的绘图功能和图像操作功能,但仍然没有提供完整的图像处理能力。为此,本书在配套光盘DIPDemo工程中提供了CImg类以实现对位图的访问及其他一些基本操作,并在此基础上派生了能够胜任大多数图像处理任务的CImgProcess类。

下面介绍CImg类,借此来让读者了解一些算法的基础实现。如果尝试编写自己的图像处理类,本节内容也可以作为参考。有关CImgProcess类的相关知识,将在后面的章节中根据需要来阐述。

2.2.1 主要成员函数列表

CImg类的主要成员如表2.1所示。

表2.1 CImg类的主要成员函数

如果要在应用程序中使用CImg类,请在项目中包含Img.h头文件和Img.cpp源文件。这里将逐段给出CImg类的重要代码片断并加以说明。在此之前,先介绍CImg类的公有成员以及其所提供的常用的成员函数和重载的运算符。

在Visual C++的类视图中可以看到CImg类作为一个基类,提供了对位图图像的一些基础图像操作,如从文件打开图像、保存图像至文件、读取和设置某个位置像素的灰度值等,此外还重载了常用的图像操作运算符,如按位加(+)、按位减(-)、反色(!)、按位与(&)、按位或(|),赋值(=)和相等(==),等等。

下面对CImg类的代码的实现展开详细分析,读者可以根据需要选择性地阅读下面的内容,不一定非要将注意力都集中在这些方法的细节实现上,不妨先熟悉函数的功能和调用方法,这对于理解本书后面的图像处理算法是没有影响的。

2.2.2 公有成员

CImg类拥有如下两个公有成员。

        BITMAPINFOHEADER *m_pBMIH;
        LPBYTE  *m_lpData;

其中,m_pBMIH中保存的是图像的信息头,而m_lpData中保存实际的图像数据。在此,再次提示BITMAPINFOHEADER结构的定义如下。

      typedef struct tagBITMAPINFOHEADER{
        DWORD    biSize;                // 本结构体占用的大小,单位为字节
        LONG biWidth;                    // 位图图像的宽度,单位为像素
        LONG biHeight;                   // 位图图像的高度,单位为像素
        WORD biPlanes;                   // 设备上颜色平面数目,必须为1
        WORD biBitCount;                 // 存储每个像素所使用的二进制位数
        DWORD    biCompression;         // 是否压缩存储图像数据
        DWORD    biSizeImage;           // 指定图像的尺寸
        LONG biXPelsPerMeter;            // 图像的水平分辨率,单位是像素每米
        LONG biYPelsPerMeter;            // 图像的垂直分辨率,单位是像素每米
        DWORD    biClrUsed;             // 图像中实际使用了颜色索引表中的多少种颜色
        DWORD    biClrImportant;        // 图象中重要的颜色数,如果该值为0,则认为所有的颜色都是重要的
      } BITMAPINFOHEADER, *PBITMAPINFOHEADER;

可以很容易地从m_pBMIH结构中得到位图图像的基本信息。而图像数据存储变量m_lpData按照MFC规定的标准方式存储图像信息(按照4-byte整倍数的行长度和规定的顺序,以图像的左上角为坐标原点),因而也可以直接从图像文件中按顺序读取到内存。在后面的方法中,将常常使用这两个成员。而在CImg类的私有成员中,保存了颜色索引表的相关信息,以免这些信息被除了CImg类之外的代码错误修改。