03点运算之直方图均衡化
实验报告单
院(系) 专业 班级 姓名 学号 同组人 实验室 组号 日期 课程 指导老师 成绩 实验项目编号试验项目名称 一、实验目的
1. 参照程序中“点运算->线性变换”函数,编写完成灰度均衡功能的函数OnPointEqua( )和InteEqualize( ),并加入到程序的相应位置。
2. 运行程序观察直方图均衡化的效果。
二、试验环境(仪器设备、软件等)
Windows XP PC 机
Microsoft Visual C++
三、实验原理(或要求)
直方图的均衡化是把原始图像的灰度直方图从比较集中的某个区域变成全部灰度范围内的均匀分布,实际上是对图像进行非线性拉伸。使一定灰度范围内的像素个数大致相同。这样就能增强图像的局部对比度,亮度可以更好的在直方图上分布。
四、实验步骤
灰度均衡功能函数InteEqualize() BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight) {
// 指向源图像的指针
unsigned char* lpSrc;
// 临时变量
LONG lTemp;
// 循环变量
LONG i;
LONG j;
// 灰度映射表
BYTE bMap[256];
// 灰度映射表
LONG lCount[256];
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 重置计数为0
for (i = 0; i
{
// 清零
lCount[i] = 0;
}
// 计算各个灰度值的计数
for (i = 0; i
{
for (j = 0; j
{
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;
// 计数加1
lCount[*(lpSrc)]++;
}
}
// 计算灰度映射表
for (i = 0; i
{
// 初始为0
lTemp = 0;
for (j = 0; j
{
lTemp += lCount[j];
}
} bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth); } // 每行 for(i = 0; i
灰度均衡函数OnPointEqua() void CCh1_1View::OnPointEqua()
{
// 灰度均衡
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB 的指针
LPSTR lpDIB;
// 指向DIB 象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB 图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp 位图(这里为了方便,只处理8-bpp 位图的直方图均衡,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状 BeginWaitCursor(); // 调用InteEqualize()函数进行直方图均衡 InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)); // 设置脏标记 pDoc->SetModifiedFlag(TRUE); // 更新视图 pDoc->UpdateAllViews(NULL); // 解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标 EndWaitCursor(); }
五、记录与处理(实验数据、误差分析、结果分析)
例子1
原图
原图 均衡化效果 均衡化效果
六、思考题
1. 图像对比度增强的方法可以分为哪两类?
2. 直方图均衡化有哪些优缺点?
3. 简述直方图均衡化的主要步骤。
4. 如何理解均衡化的中心思想和原理?
七、实验小结
直方图的均衡化是把原始图像的灰度直方图从比较集中的某个区域变成全部灰度范围内的均匀分布,实际上是对图像进行非线性拉伸。使一定灰度范围内的像素个数大致相同。这样就能增强图像的局部对比度,亮度可以更好的在直方图上分布。
通过本次试验,掌握了直方图均衡化处理的中心思想和使用编程实现的方法。也了解一些其他的图像对比度增强的方法。