Coding by C++ - 190901 - DIP Series #003_使用C++进行数字图像处理的编程基础

二(2)、Visual C++图像处理编程基础

1、位图文件及其C++操作

  • DIB,device independent bitmap,设备无关位图
  • BMP图像文件数据结构
    • 位图文件头部数据结构 BITMAP FILE HEADER,包含BMP图像文件的类型、显示内容等信息
    • 位图信息头数据结构 BITMAP INFO HEADER,包含有BMP图像的宽、高、压缩方法以及定义颜色等信息
    • 调色板,即颜色索引表
    • 实际的位图数据

2、CImg类基础操作

  • CImg类拥有两个公有成员
  • BITMAPINFOHEADER *m_pBMIH 保存图像的信息头
  • LPBYTE *m_lpData 保存实际的图像数据
函数 功能 简例
AttachFromFile 从文件加载位图
SaveToFile 存储图像文件
GetHeight 获得图像高度
GetWidthPixel 获得图像宽度
GetWidthByte 获得每行字节数
IsValidate 检验图像的有效性
GetPixel 提取像素值
SetPixel 设置像素值
GetGray 提取灰度值
ImResize 改变图像大小
= 图像赋值
== 判断相同
& 按位与
l 按位或
+ 相加
- 相减
反色
Draw 绘制图像到屏幕上

3、新建图像的步骤

  • 构造空的CImg对象
    • 将图像信息头、图像数据区和颜色索引表的指针指向NULL
  • 构造位图信息头
    • 并设置图像的宽度和高度以及像素位数等信息
  • 分配图像数据存储区
    • 手动分配空间
  • 初始化图像数据
    • 用InitPixels函数将每个像素初始化为一个特定的值

4、图像类型判断与转化

  • 知识点:内联函数inline 函数在编译时被替换而不是在运行时被调用,以目标代码的增加为代价来换取时间的节省,提高程序运行效率
  • 介绍:
    • 引入内联函数的目的是为了解决程序中函数调用的效率问题。
    • 函数是一种更高级的抽象。它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现;函数的引入可以减少程序的目标代码,实现程序代码和数据的共享。但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。特别是对于一些函数体代码不是很大,但又频繁地被调用的函数来讲,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题。
    • 在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。显然,这种做法不会产生转去转回的问题,但是由于在编译时将函数休中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
    • 内联函数的定义方法
      定义内联函数的方法很简单,只要在函数定义的头前加上关键字inline即可。内联函数的定义方法与一般函数一样。
    • 如:
inline int add_int (int x, int y, int z)
{
return x+y+z;
}
在程序中,调用其函数时,该函数在编译时被替代,而不是像一般函数那样是在运行时被调用。
  • 常用函数
  • IsBinaryImg 判断是否为二值图像
  • IsIndexImg 判断是否为索引图像
  • Index2Gray 索引图像转灰度图像

5、CImg应用示例(重新细看)

  • 打开图像 考虑处理打开异常的问题
  • 清空图像
  • 保存图像

你可能感兴趣的:(DIP)