资源描述
任课教师:马文娟
《数字图像分析与艺术化处理》
(2012-2013学年第2学期)
实
验
报
告
学号:2011329700132
姓名:
班级:数字媒体与技术11(1)
实验二 图像的空间域增强
实验项目名称:图像的空间域增强
实验项目性质:设计性实验
所属课程名称:数字图像分析与艺术化处理
实验计划学时:2
一. 实验目的
(1) 进一步理解图像的灰度均衡、图像平滑和图像锐化等空间域增强方法的原理。
(2) 了解图像灰度均衡、图像平滑和图像锐化的效果和作用。
(3) 掌握图像模板运算的流程。
二. 实验内容和要求
编程实现图像的灰度均衡、一种平滑处理和梯度锐化。
三. 实验主要仪器设备和材料
计算机,VS2012
四. 实验原理
1、 图像的灰度均衡
为了改变图像整体偏暗,或整体偏亮,或灰度层次不丰富的情况,可以将原图像的直方图通过变换函数修正为均匀的直方图,使直方图不再偏于低端,也不再偏于高端,而是变成比较均匀的分布,这种技术叫直方图均衡化。
直方图是用来表达一幅图像灰度级分布情况的统计图表。直方图的横坐标是灰度,一般用r表示,纵坐标是灰度值为ri的像素个数或出现这个灰度值的概率pr(ri)。其中
式中k为一幅图像对应的灰度级数,k=0,1,2,…,L-1,这里,L为灰度级的数目。
对数字图像来说,灰度级看成是离散的,第i个灰度级ri出现的频数用ni表示,该灰度级像素对应的概率值pr(ri)为:
n是帧内像素总数。可写出数字图像的变换函数表达式:
式中,k为灰度级数。此时,Si是[0,1]区间内的值,将其变换到[0,255]区间,然后将ri对应的像素的灰度值变为Si。
2、图像平滑
众所周知,实际获得的图像在形成、传输、接收和处理的过程中,不可避免地存在着外部和内部的噪声干扰。噪声恶化了图像质量,使图像模糊,给分析带来困难。因此,去除噪声,恢复原始图像时图像处理中的一个重要内容。消除图像噪声的工作称之为图像平滑或滤波。
图像平滑方法包括空域法和频域法两大类。在空域法中,图像平滑常用的方法是采用均值滤波或中值滤波。对于均值滤波,它是采用一个有奇数点的滑动窗口在图像上滑动,将窗口中心点对应的图像像素点的灰度值用窗口内的各个点的灰度值的平均值代替,在取均值过程中,如果窗口规定了各个像素点所占的权重,也就是各个像素点的系数,则称为加权均值滤波。对于中值滤波,窗口中心点所对应像素的灰度值用窗口内所有像素的中间值代替。实现均值或中值滤波时,为了简便编程工作,可以定义一个n*n的模板数组。另外,读者需要注意一点,在用窗口扫描图像过程中,对于图像四个边缘的像素点,可以不处理;也可以用灰度值为"0"的像素点扩展图像的边缘。
3、图象锐化
锐化处理的主要目的是突出图像中的细节或者增强被模糊了的细节,这种模糊不是由于错误操作,就是特殊图像获取方法的固有影响。图像均值滤波器可以使图像变模糊,是因为均值处理与积分相类似,因此可以对其进行逆运算(如微分运算)就可以使图像变得清晰。
常常采用基于一阶或二阶微分的锐化滤波器实现图像的锐化处理。一阶微分是通过梯度法来实现的。对于图像f(i,j),它在点(i,j)处的梯度是一个矢量,定义为:
利用差分法近似上述公式,得到:
为了便于编程和提高运算,可进一步简化为:
利用差分运算时,图像的第一行和第一列的像素的梯度无法求得,一般用后一行或后一列的梯度值近似代替。微分运算可以增强图像高频分量(边缘等细节),但是仅仅微分处理后的图像非常暗,效果不理想,因此既要增强图像边缘,又要保持目标物体的内部灰度不变,常采用给边缘规定一个特定的灰度级的方法来完成梯度锐化处理。公式为:
La为一指定的灰度值,它将边界的灰度值统一化,这样可以使其边界更加清晰明显。该方法基本上不破坏图像的背景,又可找到边缘,并根据需要增强边缘。
基于二阶微分的锐化滤波器,即拉普拉斯增强算子。一个二元图像函数f(x, y)的拉普拉斯变换定义为:
由于拉普拉斯是一种微分算子,它的应用强调图像中灰度的突变及降低灰度慢变化的区域,这将产生一幅把图像中的浅灰色边线和突变点叠加到暗背景中的图像。将原始图像和拉普拉斯图像叠加在一起的简单方法可以保护拉普拉斯锐化处理的效果,同时又能复原背景信息。这种方法可表示为:
。
五. 实验设计步骤
1、 图像的灰度均衡
步骤一、按照实验一中的方法在“图像操作”菜单栏中新建“灰度均衡”菜单项。
步骤二、添加“灰度均衡”的响应函数。
步骤三、在响应函数中添加实现图像灰度均衡的功能代码。
(1) 统计直方图数组,用一个数组p记录p[i];
(2) i从1开始,令S[i]=S[i-1]+p[i],S[0]=p[0];
(3) 一个数组L记录新的S索引值,即令L[i]=S[i]*(256-1);
(4) 依次循环每一个像素,取原图的像素值作为数组L的下标值,取该下标对应的数组值为均衡化之后的像素值。
步骤四、调试运行。
2、 平滑处理
步骤一、按照实验一中的方法在“图像操作”菜单栏中新建“平滑处理”菜单项。
步骤二、添加“平滑处理”的响应函数。
步骤三、在响应函数中添加实现图像平滑的功能代码,要求采用3×3的均值滤波器进行平滑,图像边界可不处理。
步骤四、调试运行。
3、锐化处理 — 梯度法
步骤一、按照实验一中的方法在“图像操作”菜单栏中新建“锐化处理”菜单项。
步骤二、添加“锐化处理”的响应函数。
步骤三、在响应函数中添加实现图像锐化的功能代码。
(1) 获得原图像的首地址及图像的高和宽;
(2) 开辟一块内存缓冲区,并初始化为255;
(3) 计算图像的像素的梯度,将结果保存在内存缓冲区;
(4) 比较像素的梯度是否大于30,是则将梯度值加100,否则恢复该像素原来的灰度值,如果梯度加100大于255,将其置为255;
(5) 将内存中的数据复制到图像数据区。
步骤四、调试运行。
六. 实验代码
1.灰度均衡
void CDIB::ZhiFangTu(float *tongji){
int i; // 循环变量
int j;
int huidu[256]; // 灰度计数
int wide,height; //原图长、宽
wide=this->GetDIBWidth();
height=this->GetDIBHeight();
memset(huidu,0,sizeof(huidu)); // 变量初始化
LPBYTE temp1=new BYTE[wide*height]; //新图像缓冲区
memcpy(temp1,m_pDIBData,wide*height ); //拷贝原图像到缓存图像
for (j = 0; j < height; j ++){ // 对各像素进行灰度统计
for (i = 0; i <wide; i ++){
auto temp = temp1[wide* j + i] ;
huidu[temp]++; // 灰度统计计数
}
}
for(i=0;i<256;i++) // 计算灰度分布密度
tongji[i] = huidu[i] / (height * wide *1.0f);
delete temp1;
}
void CDIB::HuiDuJunHeng(){
LONG i; // 循环变量
LONG j;
LONG wide; //图像的宽和高
LONG height;
float fPs[256]; // 灰度分布密度
float temp[256]; //中间变量
int nNs[256];
memset(temp, 0, sizeof(temp)); //初始化
LPBYTE p_data; // 指向DIB象素指针
p_data = m_pdata; // 找到DIB图像象素起始位置
wide=this->GetDIBWidth(); //DIB的宽度
height=this->GetDIBHeight(); // DIB的高度
if(bih.biBitCount<9){ //灰度图像
ZhiFangTu(fPs); // 获取图像的灰度分布密度
for(i = 0; i < 256; i++){ // 进行均衡化处理
if(i == 0) temp[0] = fPs[0];
else temp[i] = temp[i - 1] + fPs[i];
nNs[i] = (int)(255.0f * temp[i] + 0.5f);
}
for (j = 0; j < height; j ++){
for (i = 0; i < wide; i ++){
// 将转换后的灰度分布写入DIB图像
auto temp = m_pDIBData[wide* j + i];
p_data[wide* j + i] = nNs[temp];
}
}
memcpy(this->m_pDIBData, p_data, height*wide);
}
}
2.图像平滑
void CDIB::ThreeThreeAver()
{
BYTE *p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data = this->m_pDIBData;//取得原图的数据区指针
wide = this->GetDIBWidth(); //取得原图的数据区宽
height = this->GetDIBHeight(); //取得原图的数据区高
BYTE* p_temp = new BYTE[wide*height];
int size = wide*height;
memset(p_temp, 255, size);
//用3*3屏蔽窗口的8近邻均值进行滤波
for(int j = 1; j < height-1; j++){
for(int i = 1;i < wide-1; i++){
int temp = 0;
for(int p = j-1 ;p < j+2; p++)
for(int q = i -1; q < i+2; q++)
temp += p_data[wide* p + q];
temp = temp / 9;
p_temp[wide* j + i] = temp;
}
}
memcpy(this->m_pDIBData, p_temp, wide*height);
delete p_temp;
}
3.图像锐化
void CDIB::RuiHuaChuLi()
{
BYTE *p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data = this->m_pDIBData;//取得原图的数据区指针
wide = this->GetDIBWidth();
height = this->GetDIBHeight();
LPBYTE p_temp = new BYTE [wide*height]; //开辟图像一缓冲区
memset(p_temp, 255, wide*height); //初始化为255
int temp;
for(int j = 1; j < height - 1; j++)
for(int i = 1; i < wide - 1; i++){ //根据双向一次微分公式计算当前像素的灰度值
temp = sqrt((float)(p_data[wide*j+i]-p_data[wide*j+(i-1)])*
(p_data[wide*j+i]-p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i])*
(p_data[wide*j+i]-p_data[wide*(j-1)+i]));
if (temp>=30){
if((temp+100)>255) p_temp[wide*j+i]=255;
else p_temp[wide*j+i]=temp+100;
}
if (temp<30){
p_temp[wide*j+i]=p_data[wide*j+i];
}
}
memcpy(this->m_pDIBData,p_temp,wide*height); //将缓冲区中的图像复制回原图数据区
delete p_temp; //删除缓冲区
}
七. 实验结果
原始图像:
灰度均衡:
图像模糊:
图像锐化:
八. 实验心得:
展开阅读全文