数字图像处理理工要点.docx
《数字图像处理理工要点.docx》由会员分享,可在线阅读,更多相关《数字图像处理理工要点.docx(34页珍藏版)》请在冰点文库上搜索。
![数字图像处理理工要点.docx](https://file1.bingdoc.com/fileroot1/2023-5/16/2802b8ec-998c-4aaf-beca-360742b4e7c6/2802b8ec-998c-4aaf-beca-360742b4e7c61.gif)
数字图像处理理工要点
第10章数字图像处理初步实验
10.1数字图像直方图统计
10.1.1实验目的
⏹掌握直方图统计的原理和程序设计方法
⏹了解各种图像的直方图统计意义及其在实际中的运用。
10.1.2实验设备
⏹PC兼容机一台;操作系统为Windows2000(或WindowsNT、Windows98、WindowsXP)
⏹计算机安装CCS5000或CCS3.1。
10.1.3实验内容
输入一幅图像,使用MATLAB统计其直方图。
然后编写DSP程序,输入同一幅图像,使用所编写的程序统计直方图,比较两个直方图的差异。
10.1.4实验原理
灰度直方图是数字图像处理中一个最简单、最有用的工具,它描述了一幅图像的灰度级内容。
任何一幅图像的直方图都包括了可观的信息,给出了一幅图像概貌的描述,某些类型的图像可由其直方图完全描述。
在数字图像ƒ(m,n)情况下,灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素个数,其横坐标表示像素的灰度级别,纵坐标是该灰度出现的频率(像素个数与图像像素总数之比)。
设图像像素的灰度值为r0,r1,…,rL-1,则概率Ρ(ri)为:
(i=0,1,…,L-1)(10.1)
且有
尽管灰度直方图不能表示出某灰度值在什么位置,更不能直接显示图像内容,但是具有统计特性的直方图却能描述该图像的灰度分布特性,使人们从中得到诸如总体明亮程度、对比度和对象物的可分性等与图像质量有关的灰度分布概况,成为一些处理方法的重要依据。
在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.设置原始图像观察窗口
选择菜单View→Graph→Image,作如下设置如图10-3所示。
图10-3设置原始图像观察窗口
5.设置直方图观察窗口
选择菜单“View→Graph→Time/Frequency”,作如下设置如图10-4所示。
图10-4设置直方图观察窗口
6.设置断点
在程序Hist.c中,有注释断点的语句上设置软件断点。
7.运行程序
全速运行到各个断点,观察图像和直方图统计结果,如图10-5所示。
图10-5原始图像及直方图统计所得的图像
10.1.6程序清单参考
1.主程序Hist.c
#defineIMAGEWIDTH80//图像的宽度
#defineIMAGEHEIGHT80//图像的高度
#defineMODEPHOTO11
#defineMODEPHOTO22
voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight);
voidHistogram(unsignedchar*pImage,intnWidth,intnHeight,floatfHisto[256]);
unsignedchardbImage[IMAGEWIDTH*IMAGEHEIGHT];
floatfHistogram[256];
intmain()
{
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//断点
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//断点
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
while
(1);//断点
}
/*以下是直方图统计子程序*/
voidHistogram(unsignedchar*pImage,intnWidth,intnHeight,floatfHisto[256])
{
inti,j;
unsignedintuWork;
unsignedchar*pWork;
for(i=0;i<256;i++)fHisto[i]=0.0f;
pWork=pImage;
for(i=0;i{
for(j=0;j{
uWork=(unsignedint)(*pWork);
fHisto[uWork]++;
}
}
uWork=nWidth*nHeight;
for(i=0;i<256;i++)
{
fHisto[i]/=uWork;
fHisto[i]*=100;
}
}
2.初始化和读图像子程序Initimage.c
#include
#defineMODEPHOTO11
#defineMODEPHOTO22
#defineGRAYBARLEVEL16
voidReadImage(unsignedchar*pImage,char*cFileName,intnWidth,intnHeight);
voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight)
{
switch(nMode)
{
caseMODEPHOTO1:
ReadImage(pImage,"..\\lina.bmp",nWidth,nHeight);
break;
caseMODEPHOTO2:
ReadImage(pImage,"..\\Couple.bmp",nWidth,nHeight);
break;
default:
break;
}
}
voidReadImage(unsignedchar*pImage,char*cFileName,intnWidth,intnHeight)
{
intj;
unsignedchar*pWork;
FILE*fp;
if(fp=fopen(cFileName,"rb"))
{
fseek(fp,1078L,SEEK_SET);
pWork=pImage+(nHeight-1)*nWidth;
for(j=0;jfread(pWork,nWidth,1,fp);
fclose(fp);
}
}
3.Vc5509.asm
-heap0x1000
-stack0x1000
-c
-lrts55.lib
MEMORY
{
IRAM:
o=000000c0hl=00040000h
}
SECTIONS
{
.text>IRAMfill=0
.stack>IRAMfill=0
.bss>IRAMfill=0
.cinit>IRAMfill=0
.const>IRAMfill=0
.data>IRAMfill=0
.far>IRAMfill=0
.switch>IRAMfill=0
.sysmem>IRAMfill=0
.tables>IRAMfill=0
.cio>IRAMfill=0
}
10.2数字图像直方图均衡化增强
10.2.1实验目的
⏹掌握直方图均衡化增强的原理和程序设计方法;
⏹观察对图像进行直方图均衡化增强的效果。
10.2.2实验设备
⏹PC兼容机一台;操作系统为Windows2000(或WindowsNT、Windows98、WindowsXP)
⏹计算机安装CCS5000或CCS3.1。
10.2.3实验内容
一幅图像,其动态范围较小而且较暗,反映在直方图上就是其直方图所占据的灰度值范围比较窄,而且集中在低灰度值一边。
为了使图像更清晰,我们采用直方图均衡化的方法来增加图像灰度动态范围,增强对比度。
首先根据流程图进行编程,其次输入一幅图像,将其通过所设计的图像处理系统,再次用CCS的虚拟示波器和频谱仪观察输入/输出图像的变化,以达到对输入图像进行直方图均衡化增强的效果。
10.2.4实验原理
图像增强处理技术一直是图像处理领域中一类非常重要的基本处理技术。
通过采取适当的增强处理技术,可以将原本模糊不清甚至根本无法分辨的原始图片,处理成清楚、明晰的富含大量有用信息的可使用图像,因此此类图像处理技术在医学、遥感、微生物、刑侦以及军事等诸多领域得到广泛应用。
直方图均衡化的基本思想是把原始图像的直方图变换成均匀分布的形式,这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。
具体方法是:
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.计算原始图像的累计直方图:
(si)0≤Sk≤1,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是变换后所得的图像矩阵。
用户可以指定均衡后的级数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.实验准备
设置软件仿真模式,启动CCS。
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设置直方图观察窗口
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
#defineIMAGEWIDTH80//图像的宽度
#defineIMAGEHEIGHT80//图像的高度
#defineMODEPHOTO11
#defineMODEPHOTO22
voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight);
voidHistogram(unsignedchar*pImage,intnWidth,intnHeight,floatfHisto[256]);
voidEnhance(unsignedchar*pImage,unsignedchar*pImage1,intnWidth,intnHeight,floatfHisto[256],floatfHisto1[256]);
unsignedchardbImage[IMAGEWIDTH*IMAGEHEIGHT];
unsignedchardbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];
floatfHistogram[256],fHistogram1[256];
unsignedcharlut[256];
intmain()
{
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//断点
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,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);
Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1);
while
(1);//断点
}
//直方图统计子程序
voidHistogram(unsignedchar*pImage,intnWidth,intnHeight,floatfHisto[256])
{
inti,j;
unsignedintuWork;
unsignedchar*pWork;
for(i=0;i<256;i++)fHisto[i]=0.0f;
pWork=pImage;
for(i=0;i{
for(j=0;j{
uWork=(unsignedint)(*pWork);
fHisto[uWork]++;
}
}
uWork=nWidth*nHeight;
for(i=0;i<256;i++)
{
fHisto[i]/=uWork;
fHisto[i]*=100;
}
}
//图像增强子程序
voidEnhance(unsignedchar*pImage,unsignedchar*pImage1,intnWidth,intnHeight,floatfHisto[256],floatfHisto1[256])
{
inti,j;
unsignedchar*pWork,*pWork1;
for(i=0;i<256;i++)
fHisto1[i]=fHisto[i]/100;
for(i=1;i<256;i++)
fHisto1[i]+=fHisto1[i-1];
for(i=0;i<256;i++)
lut[i]=fHisto1[i]*256;
for(i=0;i<256;i++)
if(lut[i]>=256)
lut[i]=255;
pWork=pImage;pWork1=pImage1;
for(i=0;ifor(j=0;j(*pWork1)=lut[(*pWork)];
}
2.初始化和读取图像Initimage.c
#include
#defineMODEPHOTO11
#defineMODEPHOTO22
#defineGRAYBARLEVEL16
voidReadImage(unsignedchar*pImage,char*cFileName,intnWidth,intnHeight);
voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight)
{
switch(nMode)
{
caseMODEPHOTO1:
ReadImage(pImage,"..\\DSP.bmp",nWidth,nHeight);
break;
caseMODEPHOTO2:
ReadImage(pImage,"..\\1.bmp",nWidth,nHeight);
break;
default:
break;
}
}
voidReadImage(unsignedchar*pImage,char*cFileName,intnWidth,intnHeight)
{
intj;
unsignedchar*pWork;
FILE*fp;
if(fp=fopen(cFileName,"rb"))
{
fseek(fp,1078L,SEEK_SET);
pWork=pImage+(nHeight-1)*nWidth;
for(j=0;jfread(pWork,nWidth,1,fp);
fclose(fp);
}
}
3.Vc5509.asm
-heap0x1000
-stack0x1000
-c
-lrts55.lib
MEMORY
{
IRAM:
o=000000c0hl=00040000h
}
SECTIONS
{
.text>IRAMfill=0
.stack>IRAMfill=0
.bss>IRAMfill=0
.cinit>IRAMfill=0
.const>IRAMfill=0
.data>IRAMfill=0
.far>IRAMfill=0
.switch>IRAMfill=0
.sysmem>IRAMfill=0
.tables>IRAMfill=0
.cio>IRAMfill=0
}
10.3数字图像边缘检测(Sobel算子)
10.3.1实验目的
⏹了解边缘检测的算法和用途;
⏹学习利用Sobel算子进行边缘检测的程序设计方法;
理解边缘检测在图像分割中的应用;
10.3.2实验设备
⏹PC兼容机一台;操作系统为Windows2000(或WindowsNT、Windows98、WindowsXP)
⏹计算机安装CCS5000或CCS3.1。
10.3.3实验内容
首先根据流程图进行编程,其次输入一幅图像,将其通过所设计图像处理系统,再次用CCS的虚拟示波器和频谱仪观察输入/输出图像的变化,以达到对输入图像进行边缘检测的效果。
10.3.4实验原理
边缘检测在图像处理与计算机视觉中占有特殊的位置,它是底层视觉处理中最重要的环节之一。
边缘能勾划出目标物体,使观察者一目了然;边缘蕴含丰富的内在信息(方向、阶跃性质和形状等)。
从本质上说,图像边缘是图像局部特征不连续性(灰度突变、颜色突变和纹理结构突变等)的放映,它标志着一个区域的终结和另一个区域的开始。
边缘提取首先检测出图像局部特征的不连续性,然后再将这些不连续的边缘像素连成完备的边界。
边缘的特征是沿边沿走向的像素变化平缓,而垂直于边缘方向的像素变化剧烈。
所以,从这个意义上说,提取边缘的算法就是检测出符合边缘特性的边缘像素的算子。
目前提取边缘常采用边缘算子法、曲面拟合法和模板匹配法等方法。
两个具有不同灰度值的相邻区域之间总存在边缘,边缘是灰度值不连续的结果,这种不连续性通常可以利用求导数的方法方便地检测到。
一般常用一阶导数和二阶导数来检测边缘。
边缘检测的基本思想是首先利用边缘增强算子,突出图像中的局部边缘,然后定义像素的“边缘强度”,通过设置门限的方法提取边缘点集。
常用的边缘检测算于有Robert算子、Sobel算子、Prewitt以算子、LOG算子和Canny算子,下面以Sobel算子进行介绍。
1.Robert算子
Robert算于是一种利用局部差分算子寻找边缘的算子,其模板如图10-19所示。
Robert算子对具有陡峭的低噪声的图像效果较好。
图10-19Robert算子
在MATLAB中可以由edge函数实现,语法格式如下:
Bw=edge(I,‘robert’)
Bw=edge(I,‘robert’,thresh)
[BW,thresh]=edge(I,‘toberts’,…)
BW=edge(I,'robert')自动选择阈值用Robert算子进行边缘检测。
BW=edge(I.'robert',thre