灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的。用于显示的灰度图像通常用每个采样像素8 bits的非线性尺度来保存,这样可以有256种灰度(8bits就是2的8次方=256)。这种精度刚刚能够避免可见的条带失真,并且非常易于编程。在医学图像与遥感图像这些技术应用中经常采用更多的级数以充分利用每个采样10或12 bits的传感器精度,并且避免计算时的近似误差。在这样的应用领域流行使用16 bits即65536个组合(或65536种颜色)。
2.1.3 二值图像
二值图像是每个像素只有两个可能值的数字图像。人们经常用黑白、B&W、单色图像表示二值图像,但是也可以用来表示每个像素只有一个采样值的任何图像,例如灰度图像等。
二值图像经常出现在数字图像处理中作为图像掩码或者在图像分割、二值化和dithering的结果中出现。一些输入输出设备,如激光打印机、传真机、单色计算机显示器等都可以处理二值图像。二值图像经常使用位图格式存储。
2.2 相关原理、算法 2.2.1 彩色转灰度方法一
任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为 RGB(R,G,B),那么,我们可以通过下面几种方法将其转换为灰度:
浮点算法: Gray=R*0.3+G*0.59+B*0.11
整数方法: Gray=(R*30+G*59+B*11)/100
移位方法: Gray =(R*28+G*151+B*77)>>8;
平均值法: Gray=(R+G+B)/3;
仅取绿色: Gray=G;
通过上述任一种方法求得 Gray 后,将原来的 RGB(R,G,B)中的R,G,B 统一用 Gray 替换,形成新的颜色 RGB(Gray,Gray,Gray),用它替换原来的 RGB(R,G,B)就是灰度图。
2.2.2 彩色转灰度方法二
改变象素矩阵的 RGB 值,来达到彩色图转变为灰度图加权平均值算法: 根据光的亮度特性, 其实正确的灰度公式应当是
R=G=B=R*0.299+G*0.587+B0.144
为了提高速度我们做一个完全可以接受的近似,公式变形如下:
R=G=B=(R*3+G*6+B)/10
2.2.3 彩色转二值图像
二值图只有两个颜色,黑和白,而灰度有256种颜色,将灰度转化为二值是选取一个阈值,将灰度值大于这个阈值的置成白色,反之为黑色。
关于阈值的选取有固定值法、双峰法、P参数发、大津法(0tsu法或最大类间方差法)、最大熵阈值法、迭代法(最佳阈值法)等方法。
2.3 设计思路
需求分析,按照选题要求,将采用读取文件,选择功能,执行操作的思路完成程序,具体逻辑结构如图2.2。即目标程序的逻辑为主函数开始执行,让用户输入待处理文件(源文件)和目标文件绝对路径,判断是否正确,正确进行下一步让用户选择功能,根据用户选择功能调用相应的函数执行相应的操作,即为目标设计程序工作流程。
图2.2 目标程序工作流程
流程设计,为实现上述目标程序,将采用程序准备、读入文件路径、功能函数设计、功能整合的设计思路完成目标程序。
2.3.1 程序准备
1)根据2.1.1,定义位图文件头
这部分数据块位于文件开头,用于进行文件的识别。典型的应用程序会首先普通读取这部分数据以确保的确是位图文件并且没有损坏。所有的整数值都以小端序存放(即最低有效位前置)。
图2.3 位图文件头
2)定义文件信息头(DIB头)
这部分告诉应用程序图像的详细信息,在屏幕上显示图像将会使用这些信息,它从文件的第15个字节开始。这部分数据块对应了Windows和OS/2中的内部使用的头结构以及其它一些版本的变体。但所有版本均以一个DWORD位(32位)开始,用以说明该数据块的大小,使得应用程序能够根据这个大小来区分该图像实际使用了哪种版本的DIB头结构。
存在多种版本的头结构的原因是微软对DIB格式进行过多次扩展。图2.4即为所有不同版本的DIB头:
图2.4 不同版本的DIB头
BITMAPCOREHEADER之后的版本都只是在前一版本结构末尾追加字段。