图像增强实验报告.docx
《图像增强实验报告.docx》由会员分享,可在线阅读,更多相关《图像增强实验报告.docx(12页珍藏版)》请在冰点文库上搜索。
![图像增强实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/afacb42f-f063-4a07-bcea-ad50e6716ee9/afacb42f-f063-4a07-bcea-ad50e6716ee91.gif)
图像增强实验报告
深圳大学实验报告
课程名称:
数字图像处理
实验项目名称:
图像增强
学院:
深圳大学信息工程学院
专业:
电子信息工程
指导教师:
******
报告人:
****学号:
******班级:
电子1班
实验时间:
2010-10-29
实验报告提交时间:
2010-11-5
教务处制
[1]简述直方图均衡化原理
答:
直方图均衡化的基本思想是对原始图像中的像素灰度做某种映射变换,使变换后的图像灰度的概率密度是均匀分布的,即变换后图像是一幅灰度均匀分布的图像,这意味着图像灰度的动态范围得到了增加,从而可提高图像的对比度。
[2]对给定的两幅灰度数字图像(可以用MATLAB自带的图像文件)进行如下处理:
a.对原图像进行直方图均衡化处理,同屏显示处理前后图像及其直方图,比较异同,并回答为什么数字图像均衡化后其直方图并非完全均匀分布。
答:
⑴、①彩色图像经过灰值化后如下所示:
原始图像的直方图(含均值和方差)如下所示:
②原始灰度图像经过灰度均衡化后如下所示:
其直方图如下所示:
由上面的图像比较可知,灰度图像经过均衡化后,图像的灰度分布更加均匀,对比度也增加了,因而可以观察到更多的细节了。
⑵、进行灰度均衡化的公式有很多,只要满足两个关键的条件就行了。
在这里,我们使用公式:
Sk=T(rk)*255=
*255=
*255进行灰度图像均衡化处理,因而输出图像的灰度值是根据原图像的灰度值概率进行映射的。
首先它只能实现多对一的映射,从而导致有些灰度值为空,使图像颜色减少甚至失真,其次由于进行概率统计过程中出现了浮点小数,而灰度值是整数,于是便出现了舍入得情况,导致映射后的灰度值不准确。
总之,灰度均衡化只适合处理前景和背景不太亮或者太暗的图像,使图像局部的对比度增加。
b.对原图像加入点噪声,用8-邻域平均法平滑加噪声图像(图像四周边界不处理,下同),同屏显示原图像、加噪声图像和处理后的图像。
答:
在a的原始图像的基础上,对图像添加噪声后如下所示:
由上面的图像可以看出,图像中出现了一些黑点(灰度值为0,像胡椒)和一些白点(灰度值为255,像盐),这些黑点和白点均有程序随机产生。
图像的不加权平滑处理模板选择界面如下所示:
选择3*3不加权平滑处理模板处理结果如下所示:
选择9*9不加权平滑处理模板结果如下所示:
图像效果如下所示:
由上面两个处理结果可以得出,选择的模板过小,还留有椒盐噪声的痕迹,模板选择过大虽然没有看到椒盐噪声的痕迹了,但是整个图像都模糊了。
我们应该合理选取模板的大小,这里还可以选择5*5和7*7模板,同时为了平滑后的图像效果更好,还可以对模板上的每个因子按与中心的距离不同而给模板加权。
c.对平滑后的图像加门限进行二值化,门限T如下计算
答:
因为在a中画灰度图像的直方图要对图像的像素进行统计,我们可以借助图像的像素统计结果方便得出图像的灰度均值,以该均值为阀值遍历整个灰度图像,对图像进行二值化,灰度大于阀值的统一赋值255,灰度小于或等于阀值的统一赋值为0,处理图像的效果如下所示:
可以看出,上面图像的内容很模糊。
在实际应用中,我们一般不会像上面那样以固定阀值来二值化图像,通过动态调节阀值可以得到轮廓更为清晰的图像。
灰度图像的各个核心算法如下所示:
(其中m_pImgDataOut指向输出图像的数据缓冲区,m_pImgData指向输入图像数据缓冲区)
①24位真彩图像转8位灰度图像:
//根据灰值化公式为输出图像赋值
for(i=0;ifor(j=0;j}
②统计各个灰度级的像素个数:
//循环变量
inti,j;
//直方图数组清0
for(i=0;i<256;i++)
m_histArray[i]=0;
//每行像素所占字节数
intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;
//中间变量
inttemp;
//统计灰度直方图
for(i=0;ifor(j=0;jtemp=*(m_pImgData+i*lineByte+j);
m_histArray[temp]++;
}
}
③画灰度图像的直方图:
for(i=clientRect.left+5;i<=clientRect.right-5;i++){
dc.MoveTo(i,clientRect.bottom-1);
dc.LineTo(i,clientRect.bottom-bufTemp[i-clientRect.left-5]-1);
}//共256根竖线
④灰度图像均衡化;
//循环变量
inti,j;
//映射表
doublemap[256];
//中间变量
intsum,tmp;
//统计灰度直方图
computeHistGray();//注:
上面的步骤②的函数
//计算映射表
sum=0;
for(i=0;i<256;i++){
sum+=m_histArray[i];
map[i]=(double)sum*255/(m_imgWidth*m_imgHeight)+0.5;
}
//输出数据赋值
for(i=0;i{
for(j=0;j{
tmp=*(m_pImgData+i*lineByteOut+j);
*(m_pImgDataOut+i*lineByteOut+j)=(int)map[tmp];
}
}
⑤为灰度图像添加椒盐噪声:
pDIB=m_pImgData;//图像指针
if(m_nBitCount==8)
{
bytecount=m_imgWidth*m_imgHeight*m_nBitCount/8;//获取位图大小
}
else
{
AfxMessageBox("只能处理8位灰度图像!
");
return;
}
if(m_nBitCount==8)//处理灰度图像
{
for(i=0;i{
if(rand()>32650)pDIB[i]=0;//注:
#defineRAND_MAX0x7fff//(32767)
if(rand()<100)pDIB[i]=255;
}
}
⑥计算灰度图像的平均灰度值(二值化的阀值):
intsum=0;//注:
2^32=(2^8)*(2^12)*(2^12)=256*4096*4096
inttemp;
inti,j;
intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;
//统计灰度直方图
for(i=0;i{
for(j=0;j{
temp=*(m_pImgData+i*lineByte+j);
m_histArray[temp]++;
}
}
for(i=0;i<256;i++)
sum+=i*m_histArray[i];
m_average=(float)sum/(m_imgWidth*m_imgHeight);//结果为浮点型
⑦灰度图像的二值化:
Histogram:
:
computeAverage();//注:
统计平均灰度值,步骤⑥
intaverage=(int)m_average;//均值转化为整型变量
//循环变量
inti,j;
//输出数据赋值
for(i=0;i{
for(j=0;j{
if(*(m_pImgData+i*lineByteOut+j)>average)
*(m_pImgDataOut+i*lineByteOut+j)=255;
else
*(m_pImgDataOut+i*lineByteOut+j)=0;
}
}
本次图像处理是基于C++的MFC界面上实现的,操作起来非常方便,同时也能锻炼自己的编程能力。
至于算法的其它部分在这里就不详细说明了,详细代码和图像处理效果可参考工程文件和可执行文件。
实验结论
本次灰值图像处理,我采用C++的MFC编程来实现,涉及到了BMP图像的读取、生成和对图像的一些基本处理等算法,由于对算法进行了封装,可以对任意BMP位图进行图像处理并观看处理效果,操作很方便。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。