数字图像处理源程序及详解之灰度直方图
- 格式:doc
- 大小:189.00 KB
- 文档页数:21
图像的点运算
图像的点运算是图像处理中相对简单的技术,它主要用于改变一幅图像的灰度分布范围。点运算通过一个变换函数将图像的像素一
一转换,最终构成一幅新的图像。由于操作对象是图像的一个个像
素,故得名为“点运算”。点运算的最大特点是输出像素值只与当
前输入像素值有关。点运算的图像处理过程可以用以下公式表示:
g(x, y)=T[f(x, y)]
其中f(x, y)表示输入图像,g(x, y)表示处理后的图像。函数T 是对f的一种变换操作,在这里它表示灰度变换公式。可以看到,
对于点运算而言,最重要的是确定灰度变换公式。变换公式一旦确
定,点运算对于图像的处理效果就确定了。
本章研究的主要内容包括灰度直方图、线性变换、非线性变换、阈值变换、灰度拉伸及灰度均衡等。若无特别说明,本章的点运算
函数所针对的待处理对象即为8位灰度图。
■ 本章学习地图
◆ 学会利用灰度直方图查看图像信息
◆ 了解各种灰度变换公式
◆ 掌握各种灰度变换的实现方法
◆ 进一步了解各种点运算对于图像效果的影响
9.1 灰度直方图
本节介绍灰度直方图的相关概念和实现原理,它是提取图像信息的重要工具之一。
9.1.1 灰度直方图
任何一幅图像都包含着丰富的图像信息,对于图像处理而言,如何提取这些信息并找出其中的特征就显得十分关键。灰度直方图直观地显示了图像灰度分布的情况,这些信息在图像灰度变换等处理过程中显得十分重要。在本章随后的内容中,也会经常通过直方图来分析变换后的图像效果。
图9-1显示一幅灰度图及它所对应的灰度直方图。可以看到,灰度直方图是一个二维图。从数学上来说,它描绘了图像各灰度值的统计特性,显示了各个灰度级出现的次数或概率。从图形上来说,其横坐标表示图像的灰度值,取值范围是0到255。其纵坐标则通过高度来表示出现次数的多少或者概率的高低。在本章中,纵坐标表示像素出现的次数,最大值为该图像在0至 255阶灰度上分布像素出现次数的最大值。
图9-1 利用灰度直方图显示图像灰度分布
需要说明的是,如果没有特别指出,在本章后续内容中的所有变换都是基于图9-1中左侧的图像进行的。
接下来分析直方图的作用。图9-2所示的4幅图像都是根据同一幅图像进行基本灰度特征处理后获得的,分别是高亮度、低亮度、高对比度、低对比度4种类型的图像。每幅图像右侧都显示了对应的直方图。仔细观察可以发现如下特征。
图9-2 4种基本图像及对应的直方图
高亮度图像的直方图组成集中在灰度高的一侧。8位灰度图能表示256种灰度,也就是灰度取值范围为0至255。其中0表示黑色,255表示白色。对于高亮度图像,整个画面的颜色偏亮,故灰度直方图偏向灰度高的一侧。相反,低亮度图像的直方图则偏向灰度较低的一侧。
在高对比度的图像中,直方图的覆盖范围很广。图像在任意一段灰度范围中都有一定的像素数量。同时,高对比图像的灰度分布相比其他图像而言较为均匀,整个直方图显得比较平滑。而低对比度图像的灰度则主要分布在中间狭窄的区域中,图像就像被冲淡了一样。
9.1.2 基本原理
灰度直方图的基本思想是统计。对于拥有256种灰度的图像,灰度值为k的像素个数由一个离散函数确定:
其中n k表示当前图像灰度值为k的像素个数,则对应的出现概率可以使用如下公式表示:
,显然有成立。
其中n表示图像像素个数的总和,可以用图像宽度与高度的乘积来表示。
本章灰度直方图的坐标系为。横坐标表示输入灰度值k,而纵坐标表示对应灰度值的统计个数n k。可见,绘制直方图最重要的是确定灰度值为k的像素个数。直方图在绘制时采用相对高度,即纵坐标的最大值为
y
=max(n0,n1,n2……,n254,n255),如果y max的绘制高度为1,灰度值k的绘制高度max
为。
9.1.3 编程实现
1.效果预览
本节通过对话框实现灰度直方图的显示,其效果见图 9-3所示。
图9-3 灰度直方图对话框
灰度直方图对话框实现了如下功能。
l 灰度直方图的显示。
l 允许用户修改显示灰度的上限和下限。对于一些图像而言,可能某个像素值的计数远远大于其他像素的个数,这样往往看不
清其他灰度的分布。例如白色背景的图片,拥有灰度值255的像素个数
相对较多。该对话框提供了一个灰度区间显示的功能,如图9-4所示。
图9-4 灰度直方图的区间显示
可以看到,改变显示灰度的范围后,用户能够更加清楚地了解某一区域的灰度分布特征。
l 允许用户通过鼠标操作来改变显示灰度的上限和下限。方法很简单,只需要拖动对话框上两侧的蓝色虚线即可。
l 显示当前鼠标所在位置的灰度值及出现的几率。
2.构建MagicHouse
MagicHouse是贯穿本书第3篇的重点实例。它是一款以图像处理为主,综合图像浏览等多种功能的实用软件。MagicHouse支持多种常见图片格式,并实现了以下功能。
l 图像的浏览
l 图像的特效显示
l 图像的点运算
l 图像的几何变换
l 图像的增强
l 图像的滤镜效果
本章将完成MagicHouse框架的搭建工作并在其基础上添加点运算的功能,随后的3章内容都是在已有的MagicHouse框架上进行功能的完善和补充的。
MagicHouse框架是在第8章实例 GraphShower的基础上改进的,它继承了GraphShower的框架结构和图像浏览、特效显示等功能,并新增了如下功能。
1)运行模式
添加了“运行模式”菜单,提供两种运行模式:图片浏览模式,该模式功能与GraphShower完全相同,提供图像的浏览功能;编辑模式,这个模式允许对图像进行各种处理,本章及后面3章的功能都是在该模式下实现的。编辑模式下的图像会被锁定,不能进行图像的浏览。
2)JPEG解码器
MagicHouse使用了第4章编写的JPEG 解码器完成JPEG文件的解码工作。用户只需要将第4章的对应文件添加到MagicHouse的工程下即可。
3)Dib封装类
MagicHouse使用第5章介绍的MyDib 类获取Bmp文件的像素信息,MagicHouse 支持的图像为8位灰度图与24位、32位彩色图像。
4)预览对话框
预览对话框用于显示图像处理后的效果图。它与第5 章中介绍的CPreViewDlg 类很类似,不同的是这里采用GDI+显示图像。
5)统一的图像处理接口
MagicHouse的核心是 CMagicHouseView类,它不但提供了图像的显示和处理功能,还提供了图像的处理接口。下面是CMagicHouseView类中关于图像处理十分重要的成员变量。
public:
BYTE* m_pImageBuffer; // 编辑图像原始像素数组
BYTE* m_pImageTempBuffer; // 处理后的像素数组
UINT m_nPicWidth;
// 当前编辑图像宽度
UINT m_nPicHeight; // 当前编辑图像高度
UINT m_nTempWidth; // 处理后图像的宽度
UINT m_nTempHeight; // 处理后图像的高度