南昌大学数字图像处理实验报告Word文件下载.docx
- 文档编号:17329918
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:428.56KB
南昌大学数字图像处理实验报告Word文件下载.docx
《南昌大学数字图像处理实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《南昌大学数字图像处理实验报告Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
:
OnFileOpen()
{
//TODO:
Addyourcommandhandlercodehere
CFileDialogdlg(TRUE,0,0,OFN_HIDEREADONLY,_T("
位图文件|*.bmp|所有文件|*.*||"
));
if(dlg.DoModal()==IDOK)
{
FileName=dlg.GetPathName();
if(fileheader)deletefileheader;
if(infoheader)deleteinfoheader;
if(pal)deletepal;
if(BMPData)deleteBMPData;
if(flag)flag=false;
if(!
file.Open(FileName,CFile:
modeRead))return;
fileheader=newBITMAPFILEHEADER[1];
infoheader=newBITMAPINFOHEADER[1];
file.Read(fileheader,sizeof(BITMAPFILEHEADER));
if(fileheader->
bfType!
=0x4D42)return;
file.Read(infoheader,sizeof(BITMAPINFOHEADER));
if(infoheader->
biCompression!
=0)return;
linebytes=WIDTHBYTES(infoheader->
biBitCount*infoheader->
biWidth);
biBitCount==8)
{
pal=newRGBQUAD[256];
BMPData=newBYTE[linebytes*infoheader->
biHeight];
file.Read(pal,256*4);
file.Read(BMPData,linebytes*infoheader->
biHeight);
flag=true;
}
elseif(infoheader->
biBitCount==24)
{
BMPData=new
BYTE[linebytes*infoheader->
elsereturn;
file.Close();
UpdateAllViews(NULL);
}
}
//结果截图
六.实验小结
BMP文件格式比一开始做的DAT文件复杂,有一个文件头来记录相关的图片信息,而且文件里图片的存储方式是和正常的扫描顺序相反的,也就是说输出的时候要倒过来输出,所以也需要注意。
---
(2)直方图均衡化图像增强
数媒101班
用C语言实现图像的直方图均衡化处理。
用C语言实现图像的直方图均衡化处理。
图像对比度增强的方法可以分成两类:
一类是直接对比度增强方法;
另一类是间接对比度增强方法。
直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。
直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;
直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
原理:
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。
设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。
在灰度直方图均衡化处理中对图像的映射函数可定义为:
g=EQ(f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):
(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。
这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。
累积分布函数(cumulativedistributionfunction,CDF)即可以满足上述两个条件,并且通过该函数可以完成将原图像f的分布转换成g的均匀分布。
此时的直方图均衡化映射函数为:
=EQ(
)=(ni/n)=pf(
),(k=0,1,2,……,L-1)
上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。
在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布求出
到
的灰度映射关系。
在重复上述步骤得到源图像所有灰度级到目标图像灰度级的映射关系后,按照这个映射关系对源图像各点像素进行灰度转换,即可完成对源图的直方图均衡化。
voidCImageDoc:
OnHistogram()
{
intx,y;
double*MResult;
double*MSource;
MResult=newdouble[256];
MSource=newdouble[256];
for(x=0;
x<
256;
x++)
MResult[x]=MSource[x]=0.0;
//统计直方图
for(y=0;
y<
Height;
y++)
for(x=0;
x<
Width;
x++)
{
MResult[Source[y*Width+x]]++;
}
for(x=0;
for(y=0;
y<
x;
y++)
MSource[x]+=MResult[y];
MSource[x]/=Height*Width;
//直方图变换
for(y=0;
for(x=0;
Result[y*Height+x]=(char)(255*MSource[Source[y*Height+x]]);
//灰度计算
for(y=0;
for(x=0;
{
PResult[3*y*Width+3*x]=Result[y*Width+x];
PResult[3*y*Width+3*x+1]=Result[y*Width+x];
PResult[3*y*Width+3*x+2]=Result[y*Width+x];
}
//更新显示
UpdateAllViews(NULL);
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布
---(3)图像高斯滤波算法的Vc实现
用C语言实现高斯滤波。
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:
用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。
最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。
高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,人们知道数字图像用于后期应用,其噪声是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。
与此相关的有Gauss-Lapplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>
空域卷积。
滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分。
若使用理想滤波器,会在图像中产生振铃现象。
采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。
高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与原图像做卷积运算,达到模糊图像的目的。
N维空间正态分布方程为:
其中,σ是正态分布的标准差,σ值越大,图像越模糊(平滑)。
r为模糊半径,模糊半径是指模板元素到模板中心的距离。
如二维模板大小为m*n,则模板上的元素(x,y)对应的高斯计算公式为:
在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。
分布不为零的像素组成的卷积矩阵与原始图像做变换。
每个像素的值都是周围相邻像素值的加权平均。
原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。
这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果。
理论上来讲,图像中每点的分布都不为零,这也就是说每个像素的计算都需要包含整幅图像。
在实际应用中,在计算高斯函数的离散近似时,在大概3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。
通常,图像处理程序只需要计算(6σ+1)*(6σ+1)的矩阵就可以保证相关像素影响。
Gaussfilter(unsignedchar*Source,unsignedchar*Result,intHeight,intWidth,intnR)
intk=(int)(3);
for(inty=0;
Height;
for(intx=0;
Width;
if(x<
k||y<
k||x>
Width-k-1||y>
Height-k-1)
Result[y*Width+x]=255;
else
Result[y*Width+x]=0;
doublesum=0;
for(inti=-k;
i<
k+1;
i++)
for(intj=-k;
j<
j++)
sum+=Source[(y+i)*Width+x+j]*(1/(2*3.14)*pow(2.718,(-1)*(pow(i-1,2)+pow(j-1,2))/2));
Result[y*Width+x]=(int)(sum);
OnGaussfilter()
Gaussfilter(Source,Result,Height,Width,1);
for(intx=0;
PResult[3*y*Width+3*x]=Result[y*Width+x];
PResult[3*y*Width+3*x+1]=Result[y*Width+x];
PResult[3*y*Width+3*x+2]=Result[y*Width+x];
UpdateAllViews(NULL);
高斯滤波实质上是一种信号的滤波器,其用途为信号的平滑处理,数字图像用于后期应用,其噪声是最大的问题,因为误差会累计传递等原因,大多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。
高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。
---(4)图像的梯度算子边缘提取
实现边缘提取。
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。
图像属性中的显著变化通常反映了属性的重要事件和变化。
这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。
边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
如果将边缘认为是一定数量点亮度发生变化的地方,那么边缘检测大体上就是计算这个亮度变化的导数。
为简化起见,我们可以先在一维空间分析边缘检测。
在这个例子中,我们的数据是一行不同点亮度的数据。
例如,在下面的1维数据中我们可以直观地说在第4与第5个点之间有一个边界:
除非场景中的物体非常简单并且照明条件得到了很好的控制,否则确定一个用来判断两个相邻点之间有多大的亮度变化才算是有边界的阈值,并不是一件容易的事。
实际上,这也是为什么边缘检测不是一个微不足道问题的原因之一。
检测方法:
有许多用于边缘检测的方法,他们大致可分为两类:
基于搜索和基于零交叉。
基于搜索的边缘检测方法首先计算边缘强度,通常用一阶导数表示,例如梯度模,然后,用计算估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值。
基于零交叉的方法找到由图像得到的二阶导数的零交叉点来定位边缘。
通常用拉普拉斯算子或非线性微分方程的零交叉点。
滤波做为边缘检测的预处理通常是必要的,通常采用高斯滤波。
已发表的边缘检测方法应用计算边界强度的度量,这与平滑滤波有本质的不同。
正如许多边缘检测方法依赖于图像梯度的计算,他们用不同种类的滤波器来估计x-方向和y-方向的梯度。
计算一阶导数:
许多边缘检测操作都是基于亮度的一阶导数——这样就得到了原始数据亮度的梯度。
使用这个信息我们能够在图像的亮度梯度中搜寻峰值。
如果I(x)表示点x的亮度,I′(x)表示点x的一阶导数(亮度梯度),这样我们就会发现:
对于更高性能的图像处理来说,一阶导数能够通过带有掩码的原始数据(1维)卷积计算得到。
计算二阶导数:
其它一些边缘检测操作是基于亮度的二阶导数。
这实质上是亮度梯度的变化率。
在理想的连续变化情况下,在二阶导数中检测过零点将得到梯度中的局部最大值。
另一方面,二阶导数中的峰值检测是边线检测,只要图像操作使用一个合适的尺度表示。
如上所述,边线是双重边缘,这样我们就可以在边线的一边看到一个亮度梯度,而在另一边看到相反的梯度。
这样如果图像中有边线出现的话我们就能在亮度梯度上看到非常大的变化。
为了找到这些边线,我们可以在图像亮度梯度的二阶导数中寻找过零点。
如果I(x)表示点x的亮度,I′′(x)表示点x亮度的二阶导数,那么:
同样许多算法也使用卷积掩码快速处理图像数据:
步骤:
①滤波:
边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。
需要指出,大多数滤波器在降低噪声的同时也导致了边缘强度的损失,因此,增强边缘和降低噪声之间需要折中。
②增强:
增强边缘的基础是确定图像各点邻域强度的变化值。
增强算法可以将邻域(或局部)强度值有显著变化的点突显出来。
边缘增强一般是通过计算梯度幅值来完成的。
③检测:
在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点。
最简单的边缘检测判据是梯度幅值阈值判据。
④定位:
如果某一应用场合要求确定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也可以被估计出来。
在边缘检测算法中,前三个步骤用得十分普遍。
这是因为大多数场合下,仅仅需要边缘检测器指出边缘出现在图像某一像素点的附近,而没有必要指出边缘的精确位置或方向。
边缘检测的实质是采用某种算法来提取出图像中对象与背景问的交界线。
我们将边缘定义为图像中灰度发生急剧变化的区域边界。
图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。
经典的边缘检测方法,是通过对原始图像中像素的某小邻域构造边缘检测算子来达到检测边缘这一目的的。
阈值确定:
一旦我们计算出导数之后,下一步要做的就是给出一个阈值来确定哪里是边缘位置。
阈值越低,能够检测出的边线越多,结果也就越容易受到图片噪声的影响,并且越容易从图像中挑出不相关的特性。
与此相反,一个高的阈值将会遗失细的或者短的线段。
一个常用的这种方法是带有滞后作用的阈值选择。
这个方法使用不同的阈值去寻找边缘。
首先使用一个阈值上限去寻找边线开始的地方。
一旦找到了一个开始点,我们在图像上逐点跟踪边缘路径,当大于门槛下限时一直纪录边缘位置,直到数值小于下限之后才停止纪录。
这种方法假设边缘是连续的界线,并且我们能够跟踪前面所看到的边缘的模糊部分,而不会将图像中的噪声点标记为边缘。
OnGard()
Grad(Source,Result,Height,Width);
Grad(unsignedchar*Source,unsignedchar*Result,intHeight,intWidth)
unsignedcharG;
1||y<
1||x>
Width-2||y>
Height-2)
Result[y*Width+x]=0;
{
G=abs(Source[y*Width+x]-Source[(y+1)*Width+(x+1)])+abs(Source[(y+1)*Width+(x)]-Source[(y)*Width+(x+1)]);
if(G>
=3)
Result[y*Width+x]=G;
else
Result[y*Width+x]=0;
所谓边缘(或边沿)是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。
边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间。
因此,它是图像分割所依赖的重要特征。
物体的边缘是由灰度不连续性所反映的。
经典的边缘提取方法是考察图像的每个像素在某个邻域内灰度的变化,利用边缘临近一阶或二阶方向导数变化规律,用简单的方法检测边缘。
这种方法称为边缘检测局部算子法。
提取图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南昌大学 数字图像 处理 实验 报告