DSP课设数字图像处理二值化Word格式文档下载.docx
《DSP课设数字图像处理二值化Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DSP课设数字图像处理二值化Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
1、掌握CCStudio3.3的安装和配置;
2、掌握数字图像处理的原理、基本算法和各种图像处理技术;
3、掌握图像的灰度化、二值化和灰度直方图的原理及编程思路;
4、掌握图像滤波(图像锐化、中值滤波、边缘检测、特征识别等)的基本
原理及编程方法及编程思路;
要求:
1、能够根据设计题目要求查阅检索有关的文献资料,结合题目选学有关参
考书。
查询相关资料,初步制定设计方案。
2、用CCS软件进行C语言设计相关算法,实现对图像的采集及处理。
3、编写相应的C语言程序实现各种图像处理。
二、设计所需的软件介绍:
英文全称:
CodeComposerStudio中文译名:
代码调试器,代码设
计套件。
CCS的全称是CodeComposerStudio,它是美国德州仪器公司(TexasInstrument,TI)出品的代码开发和调试套件。
TI公司的产品线中有一大块业务是数字信号处理器(DSP)和微处理器(MCU),CCS便是供用户开发和调试DSP和MCU程序的集成开发软件。
CodeComposerStudiov3.3(CCStudiov3.3)是用于TIDSP、微处理
器和应用处理器的集成开发环境。
CodeComposerStudio包含一整套用于开
发和调试嵌入式应用的工具。
它包含适用于每个TI器件系列的编译器、源
码编辑器、项目构建环境、调试器、描述器、仿真器以及多种其它功能。
CodeComposerStudioIDE提供了单个用户界面,可帮助您完成应用开发
流程的每个步骤。
借助于精密的高效工具,用户能够利用熟悉的工具和界面快速上手并将功能添加至他们的应用。
产品版本:
CCS有多个版本可供选择。
各版本支持的处理器不同。
但所有v3.3均使用以下各项:
主机:
PC
操作系统:
MicrosoftWindowsVista、XP和2000
支持的内核
白金版:
TMS320C6000、TMS320C5000、TMS320C2000、TMS470、TMS570、ARM7、ARM9、ARM11、ARMCortexM3、ARMCortexR4、ARMCortexA8和MSP430
C2000版:
TMS320F28x和TMS320F24x
三、设计原理:
1、图像的二值化原理:
图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。
为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。
所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。
如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。
如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。
动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。
实现二值化有如下几种方法:
方法一:
该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于127的像素值设为255(白色)。
该方法的好处是计算量少速度快。
缺点更多首先阈值为127没有任何理由可以解释,其次完全不考虑图像的像素分布情况与像素值特征。
可以说该方法是史最弱智的二值处理方法一点也不为过。
方法二:
最常见的二值处理方法是计算像素的平均值K,扫描图像的每个像素值如像素值大于K像素值设为255(白色),值小于等于K像素值设为0(黑色)。
该方法相比方法一,阈值的选取稍微有点胜出之处。
但是可能导致部分对象像素或者背景像素丢失。
二值化结果不能真实反映源图像信息。
方法三:
使用直方图方法来寻找二值化阈值,直方图是图像的重要特质,直方图方法选择二值
化阈值主要是发现图像的两个最高的峰,然后在阈值取值在两个峰之间的峰谷最低处。
该方法相对前面两种方法而言稍微精准一点点。
结果也更让人可以接受。
方法四:
使用近似一维Means方法寻找二值化阈值,该方法的大致步骤如下:
(1).一个初始化阈值T,可以自己设置或者根据随机方法生成。
(2).根据阈值图每个像素数据P(n,m)分为对象像素数据G1与背景像素数据G2。
(n为行,m为列)
(3).G1的平均值是m1,G2的平均值是m2
(4).一个新的阈值T’=(m1+m2)/2
(5).回到第二步,用新的阈值继续分像素数据为对象与北京像素数据,继续
2~4步,直到计算出来的新阈值等于上一次阈值。
2、数字图像边缘检测基本原理:
边缘是图像局部特征不连续性(灰度突变、颜色突变和纹理结构突变等)的反映,它标志着一个区域的终结和另外一个区域的开始。
边缘提取首先检测出图像局部特性的不连续性,然后再将这些不连续的边缘像素连成完备的边界。
边缘的特征是边沿走向的像素变化平缓,而垂直于边缘方向的像素变化剧烈,所以,提取边缘的算法就是检测出符合边缘特性的边缘像素的算子。
两个具有不同灰度值的相邻区域之间总存在边缘,边缘是灰度值不连续的结果,这种不连续性通常可以利用求导数的方法检测到。
边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。
一阶微分图像的峰值处对应着图像的边缘点;
二阶微分图像的过零点处对应着图像的边缘点。
根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,由于具有固定的方向性,只能检测特定方向的边缘,所以不具有普遍性。
为了克服一阶导数的缺点,我们定义图像的梯度为梯度算子,它是图像处理中最常用的一阶微分算法。
图像梯度的最重要性质是梯度的方向是在图像灰度最大变化率上,它恰好可以反映出图像边缘上的灰度变化
边缘检测的基本思想是首先利用边缘增强算子,突出图像中的局部边缘,然后定义像素的“边缘强度”,通过设置门限的方法提取边缘点集。
常用的边缘检测一阶导数算子有Robert算子、Sobel算子、Prewitt算子、LOG算子和Canny算子,常用的边缘检测二阶导数算子是拉普拉斯算子。
4.设计流程图:
五.设计程序:
/***************************main.c文件*****************************/
#defineIMAGEWIDTH80
#defineIMAGEHEIGHT80
#defineMODEPHOTO11
#defineMODEPHOTO22
#defineMODEPHOTO33
#defineMODEPHOTO44
externvoidInitImage(unsignedintNmode,unsignedchar*pImage,intnWidth,intnHeight);
externvoidbinarization(intnWidth,intnHeight);
unsignedchardbImage[IMAGEWIDTH*IMAGEHEIGHT];
unsignedchardbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];
voidmain()
{
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
binarization(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
binarization(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO3,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO4,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
while
(1);
}
/*************************InitImage.c文件**************************/
#include<
stdio.h>
#defineGARYBARLECEL16
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;
j<
nHeight;
j++,pWork-=nWidth)
fread(pWork,nWidth,1,fp);
fclose(fp);
}
voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight)
switch(nMode)
caseMODEPHOTO1:
ReadImage(pImage,"
D:
\\CCStudio_v3.3\\MyProjects\\middle_filter\\
1.bmp"
nWidth,nHeight);
break;
caseMODEPHOTO2:
2.bmp"
caseMODEPHOTO3:
3.bmp"
caseMODEPHOTO4:
4.bmp"
default:
/************************binarization.c文件************************/
#definethreshold_val80
externunsignedchardbImage[IMAGEWIDTH*IMAGEHEIGHT];
//原始
externunsignedchardbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];
//目标
intmi,mij,m_nWork2;
unsignedintm_nWork,*pWork;
unsignedchar*pImg1,*pImg2,*pImg3,*pImg;
unsignedintx1,x2,x3,x4,x5,x6,x7,x8,x9,temp;
unsignedinttab[9];
voidbinarization(intnWidth,intnHeight)
{inti,j,k;
pImg=dbTargetImage;
for(i=0;
i<
IMAGEWIDTH;
i++,pImg++)
(*pImg)=0;
pImg1=dbImage;
pImg2=pImg1+IMAGEWIDTH;
pImg3=pImg2+IMAGEWIDTH;
for(i=2;
i++)
{pImg++;
x1=(*pImg1);
pImg1++;
x2=(*pImg1);
x4=(*pImg2);
pImg2++;
x5=(*pImg2);
x7=(*pImg3);
pImg3++;
x8=(*pImg3);
for(mi=2;
mi<
nWidth;
mi++,pImg++,pImg1++,pImg2++,pImg3++)
x3=(*pImg1);
x6=(*pImg2);
x9=(*pImg3);
tab[0]=x1;
tab[1]=x2;
tab[2]=x3;
tab[3]=x4;
tab[4]=x5;
tab[5]=x6;
tab[6]=x7;
tab[7]=x8;
tab[8]=x9;
8;
j++)
for(k=j+1;
k<
9;
k++)
{if(tab[j]<
tab[k])
{temp=tab[j];
tab[j]=tab[k];
tab[k]=temp;
m_nWork2=tab[4];
if(m_nWork2>
=threshold_val&
&
m_nWork2<
=255)m_nWork2=255;
elseif(m_nWork2<
threshold_val&
m_nWork2>
=0)m_nWork2=0;
(*pImg)=m_nWork2;
x1=x2;
x2=x3;
x4=x5;
x5=x6;
x7=x8;
x8=x9;
pImg++;
6、处理后的效果展示:
8、设计心得:
一晃十多天的课程设计已匆匆而过,在这两周的课设中我巩固了相关知识,并通过这次实践我更加熟练的掌握了CCStudiov3.3软件的操作技能,更是通过自我学习掌握了图像二值化的知识和对图像的几项简单的处理。
从而也认识到了自己的不足之处,在今后的学习生活中还得继续充实自己。
通过这十多天的课程设计让我加深了解了更多图像处理的工作原理及编程方法,如:
图像的二值化、中值滤波、灰度直方图的编程等等。
我还学会了如何在资料中快速的获得有用的信息从而寻找编程方向,和从几方面了解哪种方法更加简便,优异。
记得刚开始第一天听到课设题目及要求时,一下子就懵了,不知从何下手,好多知识都不知道,之前并没有更多的涉及到课设中所用到的知识,后来经过查资料和到图书馆借了许多有关的书籍,小组成员一起研究,忙绿了两三天终于有了一点小小的进展,初步知道了在完成课设时需要涉及的几方面知识的具体内容。
但是我们却不敢放松,因为我们还需要编程,这也是我的弱项。
经老师的提示,我们又开始恶补涉及到几个知识点,让它更细腻化,以便获得更多的思路。
往后的几天开始我们的进度就开始慢下来了。
后来我们通过老师给的资料再加上反复的看资料我们才有了思路,大致编出了程序,但是初编时我们遇到了一些困难,。
例如:
编的程序中有语法错误,出现重复定义或未定义的现象。
理解了原理怎么样才能把它转化为程序等一系列问题。
通过课设,我认识到了自己身上的深深不足之处。
我学习的知识太表面化了,没有往深里去探究,知识掌握不扎实,不能做到举一反三。
通过此次的自主完成课程设计我知道了自己对软件的掌握还不是太熟悉,对程序设计方面还需要在平时多加练习积累。
当时编程时我的脑海里有大体的框图,根据之前的资料内容和同组成员间的研究、我输出了我的部分程序,但是运行时出现了几处错误,没有达到我预想的效果。
又经我们多次的修改终于完成了程序编写。
虽然,过程有点曲折,但是最终的结果还是比较满意的。
这次的课程设计给了我很多感触,在今后的学习生活中我会更加的努力学习,在研究中耐得住寂寞,顶得住困难,多听取他人意见,取长补短。
对知识要抓得紧,要做到真正的学进去,学明白,懂得举一反三。
时刻提高自己的综合能力从而可以做的更好、更快的融入到新的环境中去。
更是要在平时积累编程经验,多加练习。
让自己今后编程中更加的细腻化。
最后,感谢老师的指点和我们组员在实习过程中给予我的帮助!
此次,组员间的团结合作也是加快我们完成课设速度的一个重要因素。
9、参考文献:
1、董胜、刘柏生.DSP技术及应用.北京:
北京大学出版社.2013.3
2、冯象初、王卫卫.图像处理的变分和偏微分方程方法.北京:
科学出版社.2009
3、黄爱民、安向京.数字图像处理与分析基础.北京:
中国水利水电出版社.2005
4、姜阳、周锡青.DSP原理与应用实验.西安:
西安电子科技大学出版社.2008.9
5.姚敏.数字图像处理.北京:
机械工业出版社.2006.1
6.何明一、卫保国.数字图像处理.北京:
科学出版社.2008
7、李实英、杨高波.特征提取与图像处理(第二版)北京:
电子工业出版社.2010.10
8.何东健.数字图像处理(第二版)西安:
西安电子科技大学出版社.2012.4