1、数字图像处理理工要点第10章 数字图像处理初步实验10.1 数字图像直方图统计10.1.1实验目的 掌握直方图统计的原理和程序设计方法 了解各种图像的直方图统计意义及其在实际中的运用。10.1.2 实验设备 PC兼容机一台;操作系统为Windows2000 (或WindowsNT、Windows98、WindowsXP) 计算机安装CCS 5000或CCS 3.1。10.1.3实验内容输入一幅图像,使用MATLAB统计其直方图。然后编写DSP程序,输入同一幅图像,使用所编写的程序统计直方图,比较两个直方图的差异。10.1.4实验原理灰度直方图是数字图像处理中一个最简单、最有用的工具,它描述了一
2、幅图像的灰度级内容。任何一幅图像的直方图都包括了可观的信息,给出了一幅图像概貌的描述,某些类型的图像可由其直方图完全描述。在数字图像(m,n)情况下,灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素个数,其横坐标表示像素的灰度级别,纵坐标是该灰度出现的频率(像素个数与图像像素总数之比)。设图像像素的灰度值为r0,r1,rL-1,则概率(ri)为: (i=0,1,L-1) (10.1)且有尽管灰度直方图不能表示出某灰度值在什么位置,更不能直接显示图像内容,但是具有统计特性的直方图却能描述该图像的灰度分布特性,使人们从中得到诸如总体明亮程度、对比度和对象物的可分性等与图像质量有关的灰度分
3、布概况,成为一些处理方法的重要依据。 在MATLAB中,imhist函数可以用来计算和绘制图像的直方图。对于lena图像,要想显示其直方图可以用下面的程序来完成,其结果见图10-2。I = imread(lena.bmp); /输入图像imshow(I)figure,imhist(I,64) /直方图统计 图10-1 原始图像及其灰度直方图10.1.5实验步骤1实验准备设置软件仿真模式,启动CCS。2建立工程建立两个C语言源文件、建立一个命令文件,然后把这三个文件添加到工程。在每个文件中输入参考程序中的相应内容,就得到工程界面如图10-2所示。图10-2 工程界面3编译并装载程序4设置原始图像
4、观察窗口选择菜单ViewGraphImage,作如下设置如图10-3所示。图10-3 设置原始图像观察窗口5设置直方图观察窗口选择菜单“ViewGraphTime/Frequency”,作如下设置如图10-4所示。图10-4 设置直方图观察窗口6设置断点在程序Hist.c中,有注释断点的语句上设置软件断点。7运行程序全速运行到各个断点,观察图像和直方图统计结果,如图10-5所示。图10-5 原始图像及直方图统计所得的图像10.1.6程序清单参考1. 主程序Hist.c #define IMAGEWIDTH 80 /图像的宽度#define IMAGEHEIGHT 80 /图像的高度#defin
5、e MODEPHOTO1 1#define MODEPHOTO2 2void InitImage(unsigned int nMode,unsigned char *pImage,int nWidth,int nHeight);void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto256);unsigned char dbImageIMAGEWIDTH*IMAGEHEIGHT;float fHistogram256;int main()InitImage(MODEPHOTO1,dbImage,IMAGEW
6、IDTH,IMAGEHEIGHT); /断点Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram); InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT); /断点Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);while (1); /断点 /*以下是直方图统计子程序*/void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto256)int i,j;
7、unsigned int uWork;unsigned char *pWork;for ( i=0;i256;i+ ) fHistoi=0.0f;pWork=pImage; for ( i=0;inHeight;i+ ) for ( j=0;jnWidth;j+,pWork+ ) uWork=(unsigned int)(*pWork); fHistouWork+; uWork=nWidth*nHeight;for ( i=0;i256;i+ )fHistoi/=uWork;fHistoi*=100;2. 初始化和读图像子程序Initimage.c #include#define MODEPH
8、OTO1 1#define MODEPHOTO2 2#define GRAYBARLEVEL 16void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight);void InitImage(unsigned int nMode,unsigned char *pImage,int nWidth,int nHeight)switch ( nMode )case MODEPHOTO1:ReadImage(pImage,.lina.bmp,nWidth,nHeight);break;case MODEPHOTO
9、2:ReadImage(pImage,.Couple.bmp,nWidth,nHeight);break;default:break; void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight)int j;unsigned char *pWork;FILE *fp;if ( fp=fopen(cFileName,rb ) )fseek(fp,1078L,SEEK_SET);pWork=pImage+(nHeight-1)*nWidth;for ( j=0;j IRAM fill = 0.stack I
10、RAM fill = 0.bss IRAM fill = 0.cinit IRAM fill = 0.const IRAM fill = 0.data IRAM fill = 0.far IRAM fill = 0.switch IRAM fill = 0.sysmem IRAM fill = 0.tables IRAM fill = 0.cio IRAM fill = 0 10.2 数字图像直方图均衡化增强10.2.1实验目的 掌握直方图均衡化增强的原理和程序设计方法; 观察对图像进行直方图均衡化增强的效果。10.2.2 实验设备 PC兼容机一台;操作系统为Windows2000 (或Win
11、dowsNT、Windows98、WindowsXP) 计算机安装CCS 5000或CCS 3.1。10.2.3实验内容一幅图像,其动态范围较小而且较暗,反映在直方图上就是其直方图所占据的灰度值范围比较窄,而且集中在低灰度值一边。为了使图像更清晰,我们采用直方图均衡化的方法来增加图像灰度动态范围,增强对比度。首先根据流程图进行编程,其次输入一幅图像, 将其通过所设计的图像处理系统,再次用CCS的虚拟示波器和频谱仪观察输入/输出图像的变化,以达到对输入图像进行直方图均衡化增强的效果。10.2.4实验原理图像增强处理技术一直是图像处理领域中一类非常重要的基本处理技术。通过采取适当的增强处理技术,可
12、以将原本模糊不清甚至根本无法分辨的原始图片,处理成清楚、明晰的富含大量有用信息的可使用图像,因此此类图像处理技术在医学、遥感、微生物、刑侦以及军事等诸多领域得到广泛应用。直方图均衡化的基本思想是把原始图像的直方图变换成均匀分布的形式,这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。具体方法是:1给出原始图像的所有灰度级Sk,k=0,1,2,L-1;2统计原始图像各灰度级的像素数 nk;3利用直方图计算公式 P(Sk)= nk/n ,(k=0,1,L-1),计算原始图像的直方图。Sk 代表图像的第k级灰度值,nk 是图像中具有灰度值Sk的像素个数,n是图像像素的总数;4.计算
13、原始图像的累计直方图:(si) 0Sk1 , k=0,1,2,L-1;5取整计算: Uk =int(N-1)tk+k/N;6确定映射关系:;7统计新直方图各灰度级Uk的像素数目nk ;8计算新的直方图: pl(tk)=。 其程序流程图如图10-6所示:图10-6 直方图均衡化程序流程图原始图像如图10-7所示,其动态范围较小而且较暗,其直方图如图10-8所示,直方图所占据的灰度值范围比较窄,而且集中在低灰度值一边。为了使图像更清晰,我们采用直方图均衡化的方法来增加图像灰度动态范围,增强对比度。在MATLAB中,可以直接调用J=histeq(I,n)函数来完成这项工作,其中I是原始图像矩阵,J是
14、变换后所得的图像矩阵。用户可以指定均衡后的级数n,默认值为64。I = imread(tire.tif);J = histeq(I);imshow(I)figure, imshow(J)figure,imhist(I,64)figure,imhist(J,64) 处理后的图像和直方图分别如图10-9和图10-10所示。 图10-7 原始图像 图10-8 原始直方图 图10-9 直方图均衡化所得的图像 图10-10 直方图均衡化所得的直方图从处理前后的图像可以看出,许多在原始图像中看不清的细节,在直方图均衡化处理后所得的图像中都变得十分清晰。10.2.5实验步骤1实验准备设置软件仿真模式,启动C
15、CS。2建立工程建立两个C语言源文件、建立一个命令文件,然后把这三个文件添加到工程。在每个文件中输入参考程序中的相应内容,就得到工程界面如图10-12所示。 图10-11 工程界面3编译并装载程序4设置原始图像观察窗口 选择菜单View-Graph-Image,作如下设置如图10-13所示。 图10-12 设置原始图像观察窗口5设置处理后图像观察窗口选择菜单View-Graph-Image,作如下设置如图10-13所示。 图10-13 设置处理后图像观察窗口:6设置直方图观察窗口选择菜单View-Graph-Time/Frequency,作如下设置如图10-14。 图10-14 设置直方图观察
16、窗口7设置断点在程序Hist.c中,有注释断点的语句上设置软件断点。8运行程序全速运行到各个断点,观察图像和直方图均衡化结果,分别如图10-15、图10-16、图10-17和图10-18所示。图10-15 原始图像及直方图均衡化所得的图像 图10-16 处理前(下半部分)、后(上半部分)的直方图 图10-17 原始图像及直方图均衡化所得的图像图10-18 处理前(下半部分)、后(上半部分)的直方图10.2.6程序清单参考1主程序hist.c #define IMAGEWIDTH 80 /图像的宽度#define IMAGEHEIGHT 80 /图像的高度#define MODEPHOTO1 1
17、#define MODEPHOTO2 2void InitImage(unsigned int nMode,unsigned char *pImage,int nWidth,int nHeight);void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto256);void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto256,float fHisto1256);unsigned
18、 char dbImageIMAGEWIDTH*IMAGEHEIGHT;unsigned char dbTargetImageIMAGEWIDTH*IMAGEHEIGHT;float fHistogram256,fHistogram1256;unsigned char lut256;int main() InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT); /断点 Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram); Enhance(dbImage,dbTargetImage,IMAGE
19、WIDTH,IMAGEHEIGHT,fHistogram,fHistogram1); Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1); InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT); /断点 Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram); Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1); Histog
20、ram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1); while (1); /断点 /直方图统计子程序void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto256) int i,j; unsigned int uWork; unsigned char *pWork; for ( i=0;i256;i+ ) fHistoi=0.0f; pWork=pImage; for ( i=0;inHeight;i+ ) for ( j=0;jnWidth;j+,
21、pWork+ ) uWork=(unsigned int)(*pWork); fHistouWork+; uWork=nWidth*nHeight; for ( i=0;i256;i+ ) fHistoi/=uWork; fHistoi*=100; /图像增强子程序void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto256,float fHisto1256) int i,j; unsigned char *pWork,*pWork1; for ( i=0;i25
22、6;i+ ) fHisto1i=fHistoi/100; for ( i=1;i256;i+ ) fHisto1i+=fHisto1i-1; for ( i=0;i256;i+ ) luti=fHisto1i*256; for ( i=0;i=256 ) luti=255; pWork=pImage; pWork1=pImage1; for ( i=0;inHeight;i+ ) for ( j=0;jnWidth;j+,pWork+,pWork1+ ) (*pWork1)=lut(*pWork);2初始化和读取图像Initimage.c #include#define MODEPHOTO1
23、1#define MODEPHOTO2 2#define GRAYBARLEVEL 16void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight);void InitImage(unsigned int nMode,unsigned char *pImage,int nWidth,int nHeight) switch ( nMode ) case MODEPHOTO1: ReadImage(pImage,.DSP.bmp,nWidth,nHeight); break; case MODEPHOTO2
24、: ReadImage(pImage,.1.bmp,nWidth,nHeight); break; default: break; void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight) int j; unsigned char *pWork; FILE *fp; if ( fp=fopen(cFileName,rb ) ) fseek(fp,1078L,SEEK_SET); pWork=pImage+(nHeight-1)*nWidth; for ( j=0;j IRAM fill = 0 .s
25、tack IRAM fill = 0 .bss IRAM fill = 0 .cinit IRAM fill = 0 .const IRAM fill = 0 .data IRAM fill = 0 .far IRAM fill = 0 .switch IRAM fill = 0 .sysmem IRAM fill = 0 .tables IRAM fill = 0 .cio IRAM fill = 0 10.3数字图像边缘检测(Sobel 算子)10.3.1实验目的 了解边缘检测的算法和用途; 学习利用Sobel算子进行边缘检测的程序设计方法;理解边缘检测在图像分割中的应用;10.3.2 实
26、验设备 PC兼容机一台;操作系统为Windows2000 (或WindowsNT、Windows98、WindowsXP) 计算机安装CCS 5000或CCS 3.1。10.3.3实验内容首先根据流程图进行编程,其次输入一幅图像, 将其通过所设计图像处理系统,再次用CCS的虚拟示波器和频谱仪观察输入/输出图像的变化,以达到对输入图像进行边缘检测的效果。10.3.4实验原理边缘检测在图像处理与计算机视觉中占有特殊的位置,它是底层视觉处理中最重要的环节之一。边缘能勾划出目标物体,使观察者一目了然;边缘蕴含丰富的内在信息(方向、阶跃性质和形状等)。从本质上说,图像边缘是图像局部特征不连续性(灰度突变
27、、颜色突变和纹理结构突变等)的放映,它标志着一个区域的终结和另一个区域的开始。边缘提取首先检测出图像局部特征的不连续性,然后再将这些不连续的边缘像素连成完备的边界。边缘的特征是沿边沿走向的像素变化平缓,而垂直于边缘方向的像素变化剧烈。所以,从这个意义上说,提取边缘的算法就是检测出符合边缘特性的边缘像素的算子。目前提取边缘常采用边缘算子法、曲面拟合法和模板匹配法等方法。两个具有不同灰度值的相邻区域之间总存在边缘,边缘是灰度值不连续的结果,这种不连续性通常可以利用求导数的方法方便地检测到。一般常用一阶导数和二阶导数来检测边缘。边缘检测的基本思想是首先利用边缘增强算子,突出图像中的局部边缘,然后定义
28、像素的“边缘强度”,通过设置门限的方法提取边缘点集。常用的边缘检测算于有Robert算子、Sobel算子、Prewitt以算子、LOG算子和Canny算子,下面以Sobel算子进行介绍。Robert算子Robert算于是一种利用局部差分算子寻找边缘的算子,其模板如图10-19所示。Robert算子对具有陡峭的低噪声的图像效果较好。图10-19 Robert算子在MATLAB 中可以由edge函数实现,语法格式如下: Bwedge(I,robert) Bw=edge(I,robert,thresh) BW,thresh=edge(I,toberts,)BWedge(I,robert)自动选择阈值用Robert算子进行边缘检测。BWedge(I.robert,thre
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2