阈值分割 数字图像处理实验Word文档下载推荐.docx
《阈值分割 数字图像处理实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《阈值分割 数字图像处理实验Word文档下载推荐.docx(70页珍藏版)》请在冰豆网上搜索。
例如,可以对图像的灰度级设置门限的方法分割。
值得提出的是,没有唯一的标准的分割方法。
许多不同种类的图像或景物都可作为待分割的图像数据,不同类型的图像,已经有相对应的分割方法对其分割,同时,某些分割方法也只是适合于某些特殊类型的图像分割。
分割结果的好坏需要根据具体的场合及要求衡量。
图像分割是从图像处理到图像分析的关键步骤,可以说,图像分割结果的好坏直接影响对图像的理解。
而阈值分割是其中常用的一种。
1.1.2阈值分割的实现方法
阈值分割法分为全局阈值法和局部阈值分割法。
局部阈值分割法是将原始图像划分成较小的图像,并对每个子图像选取相应的阈值。
全局阈值分割方法在图像处理中应用比较多,它在整幅图像内采用固定的阈值分割图像。
经典的阈值选取以灰度直方图为处理对象。
根据阈值选择方法的不同,可以分为模态方法、迭代式阈值选择等方法。
这些方法都是以图像的直方图为研究对象来确定分割的阈值的。
另外还有类间方差阈值分割法、二维最大熵分割法、模糊阈值分割法、共生矩阵分割法、区域生长法等等。
本实验以采用全局阈值分割,将一幅灰度图像转换成黑白二值图像。
操作过程是先由用户规定一个阈值,如果图像中像素的灰度值小于该阈值,则将该像素的灰度值设置为0,否则将灰度值设置为255。
灰度的阈值变换的变换函数表达式如下:
,其中T为规定的阈值。
1.2论文的主要工作与结构安排
论文的主要工作是利用DSPC语言编写并建立MPEG-4简单类框架视频编码的工程,在TMS320DM642芯片上实现对摄像头采集来的视频信号进行压缩,并将形成的压缩码流文件在PC机上进行解码,观察其解码后的效果,同时验证压缩码流的正确性。
论文的结构安排如下:
第一章绪论介绍了阈值分割的背景知识,及阈值分割的实现方法,阐述论文的主要工作。
第二章视频采集与显示相关概念介绍了视频采集与显示相关概念。
第三章DSP平台及软件开发介绍了DSP的发展,硬件平台SEED-VPM642和软件开发平台CCS。
第四章阈值分割在MATLAB中的实现介绍阈值分割在matlab中的程序实现。
第五章阈值分割在DSP上的实现介绍阈值分割的系统流程与实现方案,工程中的主要库和文件,程序运行及结果验证。
附录各源程序代码及其详细分析
第二章视频采集与显示相关概念
2.1帧和场
一个视频信号可以通过对一系列帧(渐进采样)或一个序列的隔行扫描的场(隔行扫描采样)来进行采样。
在一个隔行扫描采样的视频序列里,一帧的一半的数据是在每个时间采样间隔进行采样的。
一个场由奇数个或偶数个扫描线组成,而一个隔行扫描的视频序列包括一系列的视频帧。
这种采样方式的优点在于与有相同帧数的同样码率的渐进序列相比,可以在一秒中传输两倍多的场,这样就可以形成更加平滑的运动。
比如,一个PAL视频序列由50场/秒的码率组成,在回放过程中,运动可以比与之相同的25帧每秒的用渐进视频序列形成的运动显得更加的平滑。
2.2YCbCr及其采样格式
YCbCr人类视觉系统(HVS)相比亮度来说对于颜色就不是那么敏感。
在RGB颜色空间中,三种颜色被平等的看待,并用相同的分辨率存放起来。
但是通过把亮度与颜色信息分离,并对亮度值取更高的分辨率可以更有效地表示一个颜色图像。
YCbCr颜色空间和它的变换(通常写为YUV)就是一种流行而高效的表示一个颜色图像的方法。
Y是亮度值信号,Cb、Cr是色差信号。
在YCbCr空间中,只有Y和Cb、Cr值被传输和存储,而且Cb和Cr的分辨率可以比Y低,因为人类视觉系统对于亮度更加敏感。
这就减少了表示图像的数据量。
通常的观察情况下,RGB和YCbCr表示的图像看上去没有什么不同。
对于色度采用比亮度低的分辨率进行采样是一种简单而有效的压缩办法。
4:
4采样就是三种元素Y、Cb、Cr有同样的分辨率,这样的话,在每一个像素点上都对这三种元素进行采样。
数字4是指在水平方向上对于各种元素的采样率,比如说,每四个亮度采样点就有四个Cb和Cr采样值。
4采样完整地保留了所有的信息值。
2:
2采样中(记为YUY2),色度元素在纵向与亮度值有同样的分辨率,而在横向则是亮度分辨率的一半(4:
2表示每四个亮度值就有两个Cb和Cr采样)。
2视频用来构造高品质的视频彩色信号。
0采样中(记为YV12),Cb和Cr在水平和垂直方向上均为Y分辨率的一半。
因为每个色差分量中包含了1/4的Y分量,4:
0的YCbCr视频采样刚好4:
4的一半。
0采样有时被描述是一个“每像素12位”的方法,原因可以从对四个像素的采样中看出。
使用4:
4采样,一共要进行12次采样,对每一个Y、Cb和Cr,需要12×
8=96位,平均下来要96/4=24位。
0需要6×
8=48位,平均每个像素48/4=12位。
在一个4:
0隔行扫描视频序列中,一个完整的视频帧的YCbCr采样分配到两个场中。
可以得到,隔行扫描的总采样数跟渐进式扫描的采样数是相同的。
图2-1为YCbCr3种采样格式的比较。
图2-1YCbCr3种采样格式的比较
第三章DSP平台及软件开发
3.1DSP平台
3.1.1DSP发展简介
DSP发展历程大致分为70年代的理论先行、80年代的产品普及、90年代的突飞猛进三个阶段。
DSP出现之前数字信号处理只能依靠微处理器来完成。
由于MPU较低的处理速度无法满足信息量的高速实时要求,因此高效的信号处理成了日渐迫切的社会需求。
70年代有人提出DSP的理论和算法基础,但那时的DSP仅仅停留在教科书上,即使是研制出来的DSP系统也是由分立元件组成,其应用领域仅局限于军事、航空航天部门。
随着大规模集成电路技术的发展,1982年世界上诞生了首枚DSP芯片。
这种DSP器件采用微米工艺NMOS制作,虽功耗和尺寸稍大,运算速度却比MPU快几十倍,尤其在语音合成和编解码器中得到广泛应用。
DSP芯片的问世是个里程碑,它标志着DSP应用系统由大型向小型化迈进一大步。
80年代中期,随着CMOS技术的进步与发展,第二代基于CMOS工艺的DSP芯片应运而生,其存储容量和运算速度都成倍提高,成为语音处理、图像硬件处理技术的基础。
80年代后期,第三代DSP芯片问世,运算速度进一步提高,应用于范围逐步扩大到通信、计算机领域。
90年代DSP发展最快,相继出现第四代和第五代DSP器件。
现在的DSP属于第五代产品,将DSP内核及外围元件集成在单一芯片上。
这种集成度极高的DSP芯片不仅在通信、计算机领域大显身手,而且逐渐渗透到人们日常消费领域。
经过20多年的发展,DSP产品的应用已扩大到人们日常生活的各个方面,并成为电子产品更新换代的决定因素。
3.1.2TMS320DM642DSP芯片简介
TMS320DM642是美国德州仪器公司(TI)推出的一款面向数字多媒体应用的DSP,它在TI的C64x内核基础上进一步集成完备的视频/音频输入/输出接口、以太网接口、PCI-66总线等片上外设,不仅使用户方便地对音/视频等复杂运算高速处理,还能方便、无缝地接口视/音频编码器件和以太网/PCI总线等数据传输接口,非常适于VoIP、多通道数字视频录像机(DVR)、多通道数字视频监控等应用。
其功能框图如图3-1所示:
图3-1TMS320DM642功能框图
3.1.3硬件平台SEED-VPM642
SEED-VPM642是一款专为各种视频应用而开发的PCI插卡或带10/100M以太网接口的嵌入式硬件平台。
原理框图如图3-2所示。
包括:
❒专用于数字媒体应用的高性能32位定点DSPTMS320DM642,其工作主频高达720MHZ,处理性能可达5760MIPS,可实时实现多路数字视频/音频的编码运算,如MPEG-4、H.264、G.729等;
❒4路PAL/NTSC制标准复合或Y/C模拟视频输入,1路PAL/NTSC制标准复合或Y/C模拟视频输出,4路标准的Microphone输入或AudioLineIn立体声输入,4路标准的AudioLineOut立体声输出;
❒大容量的本地存储和高速数据传输接口;
❒标准的32位、33MHZ支持主/从模式的PCI2.2总线;
❒实时时钟,为数字视频/音频提供实时时基信息等。
图3-2SEED-VPM642原理框图
3.2C6000DSP软件开发
3.2.1C6000软件开发平台CCS
CodeComposerSudio(CCS)是TI公司推出的一个集成性DSPs软件开发平台。
CCS内部集成了以下软件工具:
❒代码产生工具(包括C6000编译器、汇编优化器、汇编器和连接器)
❒软件模拟器(Simulator)
❒实时基础软件DSP/BIOS
❒主机与目标系统之间的实时数据交换软件RTDX
❒实时分析和数据可视化软件
图3-3是CCS开发环境的构成及与主机和目标系统的接口。
图3-3CCS的构成和接口
在CCS下,开发者可以对软件进行编辑、编译、调试、代码性能测试和项目管理等所有工作。
3.2.2C6000DSP软件开发流程
图3-4是一个典型的C6000软件开发流程图。
图3-4软件开发流程
C6000软件开发流程中用到的主要工具如下:
❒C编译器
C编译器对符合ANSI标准的C代码进行编译,生成汇编代码。
❒汇编优化器
汇编优化器接受用户编写的线性汇编代码作为输入,产生一个标准汇编代码的中间文件,作为汇编器的输入。
❒汇编器
汇编器输出可重新分配地址的机器语言目标文件(COFF文件)。
它所输入的汇编语言文件可以是C编译器产生的汇编文件、汇编优化器输出的汇编文件、或是由文档管理器管理的宏库内的宏。
❒连接器
连接器的作用是接受可重新分配地址的目标文件作为输入,生成可执行的目标文件。
连接器根据用户说明的程序和数据存放地址,把汇编器产生的浮动地址代码和数据映射到实际地址空间。
❒运行支持库
C6000运行支持库包括C编译器所支持的ANSI标准运行支持函数、编译器公用程序函数、浮点运算函数和C编译器支持的I/O函数。
第四章阈值分割在MATLAB上的实现
根据公式,编写一个简单的灰度处理的Matlab程序。
程序如下。
I=imread('
lena.bmp'
);
%读取原图像
figure
(1);
imshow(I);
title('
原始图像'
%显示原图像
[ROW,COL]=size(I);
T=125;
%设置阈值
I=double(I);
fori=1:
ROW
forj=1:
COL
if(I(i,j)>
T)
I(i,j)=255;
else
I(i,j)=0;
endendend
figure
(2);
%显示经阈值分割的图像
经阈值分割的图像'
在Matlab中运行该程序,生成图像如下图所示。
(a)原始图像(b)经阈值分割的图像
第五章阈值分割在DSP上的实现
5.1系统流程与实现方案
整个系统采用模块化设计,用C语言编程实现。
系统工作流程如图5-1所示。
图5-1系统工作流程图
下面结合程序介绍主要功能模块。
5.1.1视频采集模块
视频采集模块主要由DSP芯片DM642、视频A/D转换芯片TVP5150和同步动态存储器芯片SDRAM等组成,如图4-2所示。
来自摄像头的模拟视频信号通过TVP5150进行数字化处理,输出的数字视频信号经过视频端口VP的内部FIFO缓冲后,通过EDMA将数据传送到片外SDRAM中,以便供视频应用程序使用。
各部分的说明如下:
图4-2视频采集模块的硬件结构
❒视频端口VideoPort
DM642有三个视频端口,分别为VP0、VP1和VP2,每个VP口又有A、B两路,因而三个VP口最多支持6路8位BT.656数字视频接口。
但是在SEED-VPM642平台上配置其中的四路(VP0A、VP1A、VP2A和VP2B)来支持视频输入,余下的两路(VP0B、VP1B)选择McASP功能。
每个VP口内部都有FIFO缓冲区,FIFO映射到DM642的存储空间中,用来暂时存储采集到BT.656数字信号。
在本设计中,用VP1A接口一路BT.656标准数字视频输入,采集来的视频信号存放到VP1A的FIFO中。
FIFO为Y、Cb、Cr三个分量分配了一定的字节。
❒TVP5150A/D转换芯片
TVP5150是一款高性能视频解码器,可将NTSC、PAL格式的模拟视频信号转换成数字色差信号(YCbCr),输出为BT.656数字信号。
CPU通过标准的IIC总线来完成对TVP5150的配置。
由于DM642的VP口支持BT.656格式标准视频输入,因而能与TVP5150的视频数据流实现无缝连接。
SEED-VPM642平台上有四个TVP5150,用于解码四个通路的BT.656数字信号到各VP口。
本设计中,将VP1A与第2通路的TVP5150连接。
❒片外SDRAM
片外SDRAM是在SEED-VPM642平台上通过外部存储器接口扩展的片外存储资源,它的大小是32M。
由于采集的图像数据非常大,片内存储空间根本放不下,因此需要放到片外SDRAM中进行处理。
本设计中,需要把采集来的YCbCr格式数据从VP1A内部的FIFO搬运到片外SDRAM中,然后等待进一步处理。
❒EDMA传输机制
EDMA即扩展的直接存储器访问,它可以在没有CPU参与的情况下完成映射存储空间中的数据传输。
这些数据传输可以是在片内存储器、片内外设或是外部存储器之间,而且是在CPU后台进行的,从而让CPU有更多的时间完成其它工作。
EDMA进行数据传输时有两种启动方式,一种是CPU启动,一种是事件触发启动。
由事件触发EDMA传输时,这些事件可以来自外设、外部器件的中断,或是一个EDMA通道的结束。
在DM642中,有64个EDMA通道,分别需要特定的64个事件来启动通道的传输。
本设计中,涉及的EDMA事件有三个:
EDMA_CHA_VP1EVTYA、EDMA_CHA_VP1EVTUA和EDMA_CHA_VP1EVTUA,分别对应VP1A的FIFO捕获Y、Cb、Cr信号完成事件。
当FIFO被捕获的Y、Cb、Cr信号填满时,就触发了相应的三个EDMA事件,于是启动EDMA数据传输。
传输时,源地址就是VP1A的FIFO为Y、Cb、Cr分配字节的首地址,目的地址就是SDRAM中定义的Y、Cb、Cr三个存储空间的首地址。
EDMA传输完成时,产生中断,通知CPU执行相应的中断服务例程。
5.1.2初始化模块
❒初始化CSL芯片支持库
CSL_init();
❒初始化EMIFA
EMIFA_config(&
Seeddm642ConfigA);
将CE0设为SDRAM空间。
注意DM642支持EFIFA,而非EMIF。
❒设置中断
IRQ_setVecs(vectors);
指向asm中定义的中断向量表
IRQ_map(IRQ_EVT_VINT1,11);
映射采集事件到物理中断号INT11
IRQ_reset(IRQ_EVT_VINT1);
采集事件中断使能
IRQ_nmiEnable();
不可屏蔽中断使能
IRQ_globalEnable();
全局中断使能
❒打开一个数据拷贝的数据通路
DAT_open(DAT_CHAANY,DAT_PRI_LOW,DAT_OPEN_2D);
❒初始化IIC
hSeeddm642i2c=I2C_open(I2C_PORT0,I2C_OPEN_RESET);
I2C_config(hSeeddm642i2c,&
SEEDDM642IIC_Config);
❒初始化TVP5150
GPIO_RSET(GPGC,0x0);
将GPIO0不作为GPINT使用
GPIO_RSET(GPDIR,0x1);
将GPIO0作为输出
GPIO_RSET(GPVAL,0x0);
GPIO0输出为高,选择IIC1总线,配置TVP5150第二通路U21
_IIC_read(hSeeddm642i2c,addrI2C,0x8c,&
vFromat);
回读采集设备的格式
vFromat=vFromat&
0xff;
Switch(vFromat)
{
caseTVP51XX_NTSCM:
caseTVP51XX_NTSC443:
NTSCorPAL=1;
设备为NTSC格式
break;
caseTVP51XX_PALBGHIN:
caseTVP51XX_PALM:
NTSCorPAL=0;
设备为PAL格式
Default:
NTSCorPAL=2;
系统为不支持的模式
}
❒初始化VideoPort1
portNumber=1;
vpHchannel1=bt656_8bit_ncfc(portNumber);
将VP1A设为采集输入
5.1.3图像阈值处理及输出模块
/*启动显示模块*/
bt656_display_start(vpHchannel0);
/*建立显示的实时循环*/
for(;
;
)
{
/*当采集区的数据已经采集好,而显示缓冲区的数据已空*/
if((capNewFrame==1)&
&
(disNewFrame==1))
{
/*将数据装入显示缓冲区,并清采集完成的标志*/
capNewFrame=0;
disNewFrame=0;
threshold();
//阈值处理
for(i=0;
i<
numLines;
i++)
{
/*传送Y缓冲区*/
DAT_copy((void*)(capYbuffer+i*numPixels),
(void*)(disYbuffer+i*numPixels),
numPixels);
/*传送Cb缓冲区*/
DAT_copy((void*)(capCbbuffer+i*(numPixels>
>
1)),
(void*)(disCbbuffer+i*(numPixels>
1)),
numPixels>
1);
/*传送Cr缓冲区*/
DAT_copy((void*)(capCrbuffer+i*(numPixels>
(void*)(disCrbuffer+i*(numPixels>
}
}
}
5.2工程中的主要库和文件(详见附录)
5.2.1工程中的库(.lib)
❒CSL芯片支持库(ChipSupportLibrary)
CSL中包含很多TI公司封装好的API和宏。
设计CSL的目的是为了提供标准的方法访问和控制特定处理器类型对应的片上外设,免除用户编写配置和访问片上外设所必需的定义和代码。
本设计的处理器类型是DM642,因此用到的CSL是cslDM642.lib。
❒C语言运行支持库(Run-timeSupportLibrary)
一些C/C++程序完成的任务(例如I/O、动态存储器分配、字符串操作和三角函数)并不是C/C++语言本身的一部分,然而ISOC标准定义了一组运行时支持库函数来完成这些任务。
利用ISO标准库可以保证代码的兼容性,便于程序移植。
TMS320C6000提供的运行支持库还包括了与处理器类型相关的命令和实现I/O请求的C语言程序。
本设计的处理器类型是C6400系列,用到的运行支持库是rts6400.lib。
在程序中调用以上两种类型的库函数,首先要添加这些库。
方法是:
在工程名处点右键,选择“AddFiletoProject”,然后添加三种库的路径,其中cslDM642.lib的路径是“C:
\ti\c6000\bios\lib”,rts6400.lib的路径是“C:
\ti\c6000\cgtools\lib”。
5.2.2工程中的主要文件(详细见附录)
❒.c文件
每一个.c文件都是特定函数的具体实现,而main()函数便是程序的入口地址。
main()通常包含大量的函数调用,这样就可以把一个大的文件截成多个小文件以便阅读和管理。
本设计中,main()函数出现在dm642main.c文件里。
在main()中调用的函数就是如4.1节所述主程序流程中的函数。
而这些函数的具体定义是在相关文件中。
比如_tvp51xx.c文件定义了配置TVP5150解码芯片的函数,vportcap.c文件定义了用EDMA方式采集图像的设置、中断以及数据传输的函数,iic.c文件定义了IIC的设置结构和通过IIC总线进行读/写操作的函数。
❒.h文件
.h文件不是函数的具体实现和调用,而是函数的声明和一些数据类型的定义。
.h文件还有一个作用是当开发者需要调用某个库时,告知库包含的函数和调用格式,而实际上真正的目标代码已经存在于库文件中了。
本设计中,包含着几种基于特定应用的.h文件:
_tvp51xx.h定义了配置TVP5150相关的数据结构,vportcap.h是EDMA方式采集图像相关的函数声明,此外还有一些CSL头文件,包含了调用cslDM642.lib库时跟CSL的API函数有关的函数及其调用格式(详细见附录)。
❒.cmd文件
.cmd文件使开发者可以通过自己定义的存储器模块来配置系统存储器。
它包含了两个功能强大的伪指令MEMORY和SECTIONS。
MEMORY定义一个目标系统的存储器