南京理工大学数字图像处理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理
实验报告
课程:数字图像处理
教师:**
姓名:
学号:
实验一直方图线性变换及直方图均衡化一、实验目的
通过了解直方图的绘制、线性变换和均衡化的基本原理与实现方法,熟悉在计算机上进行直方图均衡化、线性变换的方法,来掌握简单的直方图均衡化和线性变换程序设计编写。
二、实验内容
编写直方图的显示、均衡化及线性变换的C++语言程序,同时显示线性变换后的直方图。
三、实验步骤
1、新建MFC工程;
2、分析程序流程;
3、编写程序;
4、运行调试;
5、显示结果;
6、分析结果。
四、实验原理及实现方案
(1)线性变换
原理:线性变换是灰度变换的一种,就是将一个灰度区间映射到另一个灰度区间的变换。
线性增强变换可使图像动态范围加大,图像对比度扩展,图像清晰,特征明显,是图像增强的重要手段。
此次实验采取的灰度变换公式是分段函数,如下图所示,
部分程序代码如下(详细见源文件):
for(i=1;i<height;i++)
{
for(j=0;j<width;j++)
{
int pos =width*i+j;
BYTE c = pData[pos];
pDC->SetPixel(j,260+height-i,RGB(c,c,c));
if(c<30){
pDC->SetPixel(j,height-i,RGB(0,0,0));}
else if(c>160){
pDC->SetPixel(j,height-i,RGB(255,255,255));}
else{
BYTE c2=BYTE(1.0*255/130*(c-30));
pDC->SetPixel(j,height-i,RGB(c2,c2,c2));
}
count[int(c)]++;
}
}
通过对不同区域的灰度值进行不同的线性变换,从而达到预期目的。
(2)直方图均衡化
原理:直方图均衡化主要用于修正那些灰度范围小,灰度集中的图像,通过修正使灰度拉开,灰度变丰富,从而起到增强图像视觉效果的作用。
实现方案:根据书本上所介绍的方法计算变换函数Sk和对应每个Sk的Nsk,,最后求得每个灰度级均衡化后所得的概率。
再根据所得的概率画出均衡化后的直方图,比较与均衡化前的直方图的区别,分析两者的差别。
算法实验步骤:
步骤1:原图像素点个数
步骤2:原图分布概率
步骤3:原图累计概率
步骤4:对累计概率四舍五入
步骤5:绘制直方图
部分程序代码如下(详细见源文件):
int ss[257];
for(i=0;i<257;i++){
ss[i]=0;
}
int pos =width*i+j;
for(i=0;i<256;i++){
count[i]=count[i]*10000/pos;
ss[i+1]=ss[i]+count[i];
}
for(i=1;i<256;i++)
{ for(int ii=0;ii<256;ii++)
{
if((ii*10000/256)>ss[i+1])
{
p[i+1]=ii;
break;
}
}
if(p[i+1]!=p[i])
{
kk++;
pp[kk]=i;
}
}
for(i=1;i<=kk;i++)
{
pDC->MoveTo(500+2*i,600);
pDC->LineTo(500+2*i,600-(ss[pp[i]]-ss[pp[i-1]]));
}
五、实验结果
1、线性变换
原图线性变换后2、直方图均衡化
均衡化后
均衡化前直方图
均衡化后直方图程序显示结果
实验二 图像增强(任选两模块) 模块一 图像锐化
一、实验目的
掌握图像锐化的基本原理,掌握拉普拉斯算子锐化的方法,熟悉计算机上进行图像锐化的方法。
二、实验内容
编写简单锐化及拉普拉斯算子锐化的C++MFC 程序,根据所显示的图像,和原图比较,分析锐化后的效果。
三、实验步骤
1、新建MFC 工程;
2、分析程序流程;
3、编写程序;
4、运行调试;
5、显示结果;
6、分析结果。
四、实验原理及实现方案
原理:拉普拉斯算子是与一个边缘方向无关的边缘点检测算子。
它对孤立像素的响应要比对边缘或线的响应更强烈, 因此使用该算子进行图像锐化之前需要对图像作平滑处理。
拉普拉斯算子是一种二阶微分算子一个连续的二元函数f (x , y ) , 其拉普拉斯运算定义为
22
222f f f x y ∇∂∂=+∂∂ 对于数字图像,拉普拉斯算子可以简化为
g(i,j)= 8f(i,j)- f(i+1,j)- f(i-1,j)- f(i,j+1)- f(i,j-1)
上面的表达式可以表示为卷积的形式。
即
(,)(,)(,)k i r k s i g i j f i r j s H r s =-=-=
--∑∑
表达式中的i ,j=0,1,2….N-1;k=1。
,i=1,H (r,s )取样如下式子
010111010H - ⎡⎤⎢⎥=- 5 -⎢⎥⎢⎥ - ⎣⎦
部分程序代码如下(详细见源文件):
五、实验结果
采用拉普拉斯增强算子锐化后
模块二 均值滤波
一、实验目的
掌握均值滤波的基本原理,掌握计算邻域均值的方法,熟悉计算机上进行均值滤波的方法。
二、实验内容
编写均值滤波及图像平滑化的C++MFC 程序,根据所显示的图像,和原图比较,分析均值滤波图像平滑化后的效果。
三、实验步骤
1、新建MFC 工程;
2、分析程序流程;
3、编写程序;
4、运行调试;
5、显示结果;
6、分析结果。
四、实验原理及实现方案
原理:最简单的局部平均法称为非加权邻域平均,它均等地对待邻域中的每个像素,即各个像素灰度值的平均值作为中心像素的输出值。
设有一副图像用均匀滤波所得的图像为g(x,y),则 ,1(,)(i,j)i j s g i j f M ∈=∑,M 表示集合s 里像素的总数。
部分程序如下(详细见源文件):
五、实验结果
均值滤波处理后
实验三:自动阈值迭代法及Otsu法
方法一自动阈值迭代法
一、实验原理
开始时选择一个阈值作为初始估计值,然后按照某种策略不断地改进这一估计值,直到满足给定的准则为止
二、实验算法
(1)估计一个阈值T(比如均值)
(2)用阈值T将灰度直方图分割成两个区域R1和R2
(3)分别计算两个区域R1和R2内的灰度平均值u1和u2;
(4)选择新阈值T=(u1+u2)/2;
(5)重复上述工作3-5次,直到前后两次的阈值不变
三、实验步骤
1、新建MFC工程;
2、分析程序流程;
3、编写程序;
4、运行调试;
5、显示结果;
6、分析结果。
部分程序如下(详细见源文件):
for(int i=0;i<height;i++) //求取灰度均值作为初始阈值Ta
for(int j=0;j<width;j++)
{c=dib.pData[i*height+j];
sum+=c;
}
Ta=sum/N;
Tb=Ta; //新阈值Tb,最佳阈值为Tc
if(Tb!=Tc)
{ Tc=Tb;
int suma=0,sumsa=0;
int sumb=0,sumsb=0;
for(int p=0;p<height;p++)
for(int q=0;q<width;q++)
{
c=dib.pData[p*width+q];
if(c<Tc)
{suma+=c;
sumsa++;
}
else
{
sumb+=c;
sumsb++;
}
}
ua=(float)suma/(float)sumsa;
ub=(float)sumb/(float)sumsb;
Tb=(int)(ua+ub)/2;
} //比较
for(int m=0;m<height;m++)
for(int n=0;n<width;n++)
{ c=dib.pData[m*width+n];
if(c>Tb)
dib.pData[m*width+n]=255;
else
dib.pData[m*width+n]=0;
}
dib.DrawByPixel(pDC);
四、实验结果
迭代法
方法二 Otsu法
一、实验原理
大津法:对图像Image,记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。
图像的总平均灰度为:u=w0*u0+w1*u1。
从最小灰度值到最大灰度值遍历t,当t使得值g=w0*(u0-u)2+w1*(u1-u)2 最大时t即为分割的最佳阈值。
对大津法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为 w0,背景取值u1,概率为w1,总均值为u,根据方差的定义即得该式。
因方差是灰度分布均匀性的一种度量,方差值越大,说明构
成图像的两部分差别越大, 当部分目标错分为背景或部分背景错分为目标都导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。
二、实验算法
自动阈值(Otsu法)步骤
(1)计算直方图
(2)设置初值:w(0)以及u(0)
(3)从1到最大值设置阈值T。
更新w (t)以及u(t)。
计算σb(t) * σb(t)。
(4)选取最大σb(t) * σb(t)对应的T
三、实验步骤
1、新建MFC工程;
2、分析程序流程;
3、编写程序;
4、运行调试;
5、显示结果;
6、分析结果。
部分程序如下(详细见源文件):
for(int T=1;T<256;T++) //从1到255设置阈值T,U为平均灰度,W为平均概率
{ int suma=0,sumsa=0;
int sumb=0,sumsb=0;
for(int d=0;d<height;d++)
for(int e=0;e<width;e++)
{ c=dib.pData[d*width+e];
if(c<T)
{
suma+=c;
sumsa++;
}
else
{
sumb+=c;
sumsb++;
}
}
ua=(float)suma/(float)sumsa;
wa=(float)sumwa/(float)N;
ub=(float)sumb/(float)sumsb;
wb=(float)sumwb/(float)N;
//求的最大化类间方差
D=wa*wb*(ua-ub)*(ua-ub);
if(D>Dmax)
{Dmax=D;
Tmax=T;
}
}
for(int f=0;f<height;f++)
for(int g=0;g<width;g++)
{c=dib.pData[f*width+g];
//灰度阀值化
if(c<Tmax)
dib.pData[f*width+g]=0;
else
dib.pData[f*width+g]=255;
}
dib.DrawByPixel(pDC);
四、实验结果
Otsu法。