基于ARM嵌入式图像处理系统设计与实现.docx

上传人:b****5 文档编号:6018696 上传时间:2023-01-03 格式:DOCX 页数:23 大小:194.26KB
下载 相关 举报
基于ARM嵌入式图像处理系统设计与实现.docx_第1页
第1页 / 共23页
基于ARM嵌入式图像处理系统设计与实现.docx_第2页
第2页 / 共23页
基于ARM嵌入式图像处理系统设计与实现.docx_第3页
第3页 / 共23页
基于ARM嵌入式图像处理系统设计与实现.docx_第4页
第4页 / 共23页
基于ARM嵌入式图像处理系统设计与实现.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

基于ARM嵌入式图像处理系统设计与实现.docx

《基于ARM嵌入式图像处理系统设计与实现.docx》由会员分享,可在线阅读,更多相关《基于ARM嵌入式图像处理系统设计与实现.docx(23页珍藏版)》请在冰豆网上搜索。

基于ARM嵌入式图像处理系统设计与实现.docx

基于ARM嵌入式图像处理系统设计与实现

目录

摘要2

1引言1

1.1课程设计的意义1

1.2课程设计的目的1

2系统设计原理2

2.1图像处理技术原理和成像原理2

2.2BMP文件格式简介2

2.3图像显示原理3

3开发环境简介及搭建5

3.1硬件平台5

3.2系统软件平台构建5

3.3LCD显示模块5

4系统设计的与具体实现7

4.1BMP文件的读入7

4.2图像增强算法设计7

4.3图像分割算法设计8

4.4图像平滑8

4.5图像缩放(平移以及转置)10

5程序主要源代码分析12

5.1图像数据存储的主程序如下:

12

5.3图像平移主要代码15

5.4图像缩放主要代码18

5.5转置图像主要代码21

6运行测试结果23

6.1图像平移效果23

6.2图像转置效果24

6.3图像的缩放效果24

7总结25

参考文献26

 

基于ARM嵌入式图像处理系统设计与实现

摘要针对现在的过程检测的实时需求,设计出一种成本低,功能始终的图像处理采集系统。

该系统以ARM7(S3C44BOX)为核心并配上外围电路实现图像处理功能,在加上多种通讯接口设计的图像传输通道,然后加入SD卡接口用于提取图像数据。

最后基于uC/OS-Ⅱ嵌入式操作系统设计了一种图像处理方法,在系统中实现了图像增强、图像分割和目标定个位。

实验表明,该系统能够很好地解决在线处理功能的实时问题,图像处理的准确率也满足了过程检测系统的要求,而且实现简单,成本比较低,特别适合对于功耗、体积要求较严格的过程检测系统。

关键词ARM;图像处理系统;图像增强;目标定位

1引言

1.1课程设计的意义

图像处理技术在工业自动化、仪表检测安全、以及安全、消费电子、医学中被越来越广泛的应用。

在现代战争中,利用图像进行精确制导、火控、无人飞机的电视导航等,在国防中也受到了高度的重视。

图像处理算法中常有大量的运算,特别是在实时图像处理方面,因此通常采用DSP[1]或FPGA[3]来实现。

但随着微处理器技术的突飞猛进,现代MPU[1]也可以完成高速的数字图像处理。

作为嵌入式图像处理技术,其主要技术包括两个方面,一个是图像处理技术,另一个则是嵌入式系统[4]应用技术。

本文主要研究图像处理技术在嵌入式系统中的应用。

1.2课程设计的目的

本课程设计的目的旨在研究一种能够进行高速图像处理[5]的嵌入式系统架构的设计与实现方法。

针对嵌入式系统本身的特点,设计出具有较强通用性的嵌入式图像处理平台。

利用嵌入式系统进行图像处理是对传统的图像处理硬件实现方法的挑战.它的完成将为图像处理的开辟新的实现途径,并且为嵌入式系统的应用再次打开一片新的领域,同时,由于图像处理的应用十分广泛,其本身也有广泛的应用前景。

图像数据是一种重要的信息资源,随着以计算机和计算机技术为核心的信息科学的发展,图像处理在通讯、管理、医学、地震、气象、航空航天以及教育等领域,发挥着愈来愈重要的作用。

但传统的图像处理技术主要依赖于大批量的电子计算设备,它们带来巨大的保养、增加行业成本。

嵌入式平台拥有小巧、价格低廉、功耗小及维护成本低等优点。

因此基于嵌入式平台构建图像处理系统可以降低其生产维护成本,提高其可靠性和可控件,具有较高的市场价值。

本文主要针对采集到的图像(bmp格式)实现平移、转置、缩放、平滑等处理。

2系统设计原理

2.1图像处理技术原理和成像原理

图像处理技术又称“机器视觉”[5],乃是将被测对象的图像作为信息的载体,从中提取有用的信息来达到测量的目的,具有非接触、高速、获得信息丰富等优点。

系统一般通过摄像头采集对象的图像信息,然后通过处理系统对采集到的图像进行数字化的处理和分析,根据检测要求可得到对象的特征信息,随后进一步对此进行判断并输出结果。

如图2.1所示,连杆的表面缺陷通过一个方形LED漫反射光源均匀照亮待检测的破口区域,光线照射到对象表面后,通过光学镜头成像在摄像头内的光电耦合CCD元件[3]上并转化成相应的数字图像信号,CCD元件可理解为一个由感光像素组成的点阵,每一个像素都一一对应了被测对象的二维图像特征。

数字图像信号经过图像处理系统对图像特征信息的提取和计算得到所需的测量值,随后通过RS232通讯接口把数据传输给PLC进行逻辑判断,判断的结果直接通过设备前面板上的指示灯输出。

CCD透镜LED

光源对象

 

CCD摄像机

图2.1摄像头采集对象的图像信息

2.2BMP文件格式简介

一个BMP文件包括以下四部分:

文件头,信息头,调色板数据和图像数据。

文件头长度为14个字节。

分别为:

bffype:

指定文件结构,必须是Ox424D,即字符串“BM";bfSize:

指定文件大小,包括这14个字节;bfReservedl,bfReserved2:

分别为2个字节,为保留字,不用考虑:

bfOffBits:

从文件头到实际的图像数据的偏移字节数。

信息头长度为40个字节,分别为:

biSize:

指定这个结构的长度,为40,单位字节:

biWidth,biHeight:

指定图像的宽度和高度,单位为像素;biPlanes:

必须为1;biBitCount:

指定表示颜色时要用到的位数;bi忽略pression:

指定是否压缩:

biSizelmage:

指定实际图像数据占用的字节数,注意,计算时图像宽度取大于等于biWidth的最小的4的整数倍数;biXPelsPerMeter,biYPelsPerMeter:

指定目标设备的水平和垂直分辨率;biClrUsed:

指定本图像实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次方:

biCIrImportant:

指定本图像中重要的颜色数,如果该值为零,则所有的颜色都是重要的。

第三部分为调色板,当然,这是对那些需要调色板的文件而言的。

在这里,所采集的图像数据是真彩色[6]〔24位)的,故不需要调色板。

调色板实际上是一个数组,共有biClrUsed个元素。

数组中每个元素占用4个字节,依次是一字节的蓝色分量,一字节的绿色分量,一字节的红色分量,以及一字节的保留值。

第四部分就是实际的图像数据了。

对于用到调色板的文件,图像数据是该像素值在调色板中的索引值。

这里需要注意的是:

每一行的字节数必须是4的整倍数,如果不是,则需要补齐,这在biSizelmage中有介绍。

一般来说,BMP文件的数据是从下到上,从左到右。

也就是说,从文件中最先读到的是图像最下面一行的左边第一个像素,然后是左边第二个像素一接下来是倒数第二行左边第一个像素⋯,以此类推,最后得到的是最上面一行的最右一个像素,这与采集出的图像数据顺序是不同的。

每像素的顺序为BGR[6].

2.3图像显示原理

本课程设计设计采用的是一个240X320分辨率的16位液晶屏幕,可以通过操作S3C2410内部的相关寄存器来直接控制显示,由于采用了ARM—Linux作为操作系统,可以直接操作“nux下的Framebuffer设备来完成图像的显示,帧缓冲(Framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

这种操作是抽象的、统一的。

用户不必关心物理显存的位置、换页机制等等具体细节。

这些都是由Framebuffer设备驱动来完成的。

在应用程序中首先要打开Framebuffer设备,在Linux系统中Framebuffer设备一般映射为/dev/fb,可以有多个设备。

然后调用ioctl提供的借口获取设备信息,主要是获得当Framebuffer设备的分辨率、色深、每一行数据占的字节数。

关键的一步是将屏幕缓冲区映射到用户空间,Framebuffer设备可以看成是显存的映像,但是Linux所有的设备驱动均在内核态工作,所以无法在当前进程空间中直接访问,通过映射机制可以直接把显存的起始地址映射到当前进程的地址空间,从而可以快速方便的实现显存,建立映射的方法如下:

Pfd=mmap(0,FBDraw_finfo,smem_len,PROT_READ|PROT_WRFTE,MAP_SHARED,df,0);//以read、write和share方式映射屏幕上左边为(x,y)的点在显存中的位置是:

Pfd+x*(fb_vinfo.bits_pixel)>>3)+y*fb_finfo.line_length,对这个位置赋相应的颜色值就可以再屏幕上显示出来。

需要注意的是当色深(fb_vinfo.bits_per_pixel)不同时,颜色值的格式也不一样。

把经过图像处理后的图像数据或者采集到的原始图像数据转化成Framebuffer设备的颜色数据格式(RGB565、RGB888等)后,将数据复制到从地址pfb开始的内存中,就可以事先图像的显示。

 

3开发环境简介及搭建

3.1硬件平台

数字图像处理系统是执行处理图像、分析理解图像信息任务的计算机系统.尽管图像处理技术应用广泛,图像处理系统种类很多,但他们的基本组成是相近的口它们主要含有:

图像输入设备、执行处理分析与控制的计算机图像处理机、输出设备、存储系统中的图像数据库、图像处理程序库与模型库。

其中,负责执行图像处理与分析的图像处理机是整个系统的核心部分,它关系着图像的处理效果,及系统的整体性能。

本系统选用的是韩国三星电子公司推出的一款基于ARM920T内核的S3C2410嵌入式微处理器。

S3C2410把外部复位信号作为一个中断处理,在系统复位时,程序指针(PC)被设置为0,程序跳转到0x00000000开始运行。

此空间对应BankO,系统的2MB的NORFIash和处理器的Bank0相连接。

在NORFlash中存储的是BootLoader,它负责配置处理器的结构、工作模式以及自动检测系统的各个硬件是否工作正常。

系统经过初始化和自检后,BootLoader负责把16MBNANDFlash的zlmage(即软件系统的镜像文件)复制到0xc0008000地址(此地址是系统64MBSDRAM的首地址)。

然后,引导程序把PC指向0xc0008000地址,系统开始运行。

3.2系统软件平台构建

结合S3C2410处理器的特点.基于该芯片构建嵌入式图像处理系统,设计者必须考虑其通用性、响应速度及对于硬件的可操控性。

正是基于这样的考虑,分三层构建嵌入式图像处理系统的软件体系:

ARMLinux的建立;图形用户界面(MiniGui)的移植;图像处理软件的设计编码。

其中ARMLinux的建立是构建嵌入式Linux系统的通用步骤.

3.3LCD显示模块

从S3C2410的LCD控制器出来的信号线包括24根数据线和若干根控制线。

这些信号线是经过74HC245隔离后接到LCD模块的,对于256色LCD只需要其中低8位数据线即可(如图所示)。

LCD模块除了需要控制信号和数据信号外,还需要一个22V左右的工作电压和上千伏的背光电压。

前者MAX629升压后得到,后者由一个逆变器模块提供。

图3.3S3C2410

 

4系统设计的与具体实现

基于上文的阐述,本软件系统的具体实现丁作主要包括:

图像文件的读入、图像处理的具体实现等。

下文将具体介绍实现工作。

4.1BMP文件的读入

在嵌入式平台上,并没有现成的BMP文件的库函数可以使用。

因此,如何把一个BMP文件读人到内存中进行图像处理算法移植的根本前提。

本系统中,主要处理的图像有两大块:

真彩图和256色的图像(包括256级厌度图),因此对应设计了两个BMP文件的读入函数,并将这两个函数放在Graphic.h和Graphic.c中,以备后续的开发使用。

两个函数为:

GetTruePixel(charbmpnameIl,U32color[24011320J,int*mapwidth.int*mapheight);

Get256Pixel(charbmpname[]。

U8cdorbutl240113201,U32pale[256].int4mapwidth,int*mapheight)。

函数l用于将一个名称为bmpnameH的真彩图像数据读入color[][]矩阵,同时获得图像的宽和高;函数2用于将一个名称为bmpname[]的256色图像数据读人colorbuf[]矩阵,同时,对应的调色板数据读入pale[]矩阵中并获得图像的宽和高。

4.2图像增强算法设计

在图像处理中,当光学系统成像时出现背景与目标灰度范围相对比较窄,即低对比度的情况,一般会采用对图像进行灰度的拉伸变换[5],从而加大特征目标与背景的灰度差,实现图像增强,以利于提取出特征目标来.灰度变换可分为线性灰度变换、分段线性变换、非线性变换.本研究采用线性灰度变换,该方法用于克服当图像由于成像时曝光不足或过度所产生的对比度不足的弊病.假设原图像八茗,y)的灰度范围为[a,b],希望变换后图像g(x,y)的灰度范围扩展到[c,d],其数学表达式为:

g(x,y)=c(0≤f(x,y≤)a)

g(x,y)=(d-c)/(b-a)+c(a≤f(x,y)≤b)

g(x,y)=d(b≤f(x,y)≤Mf)

式中:

Mf表示(x,y)的最大值.

4.3图像分割算法设计

经过图像增强后,要将一幅图像分解为若干互不交叠的、有意义的、具有相同性质的区域,并从中提取出所感兴趣的目标,即图像分割.图像分割有边缘检测和阈值分割,这里采用阈值分割方法.阈值分割是基于灰度阈值的分割方法,它通过设置阈值,把像素点按灰度级分若干类,从而实现图像分割.把一幅灰度图像转换成二值图像是阈值分割的最简单形式,设原始图像为f(x,y),首先就是按一定准则在f(x,y)中找出一个灰度值t作为阈值,将图像分割为两部分,即把大于等于该阈值的像素点的值置成1,小于阈值的像素点置为0.阈值运算后的图像为二值图像g(x,Y).

g(x,y)=1(f(x,y)≤t)

g(x,y)=0(f(x,y)>t)

上式中全局阈值t的选择直接影响到分割效果.通常可以通过分析灰度直方图来确定它的值,最常见的方法是利用灰度直方图来确定它的值,利用灰度直方图求双峰,选择两峰之间谷底处的灰度值作为阈值.

4.4图像平滑

图像在生成和传输过程中常受到各种嗓声的干扰和影响,使图像质量下降。

为了抑制噪声改善图像质量,必须对图像进行平滑处理。

通常,将数字图像的平滑技术[4]划分为两类。

一类是全局处理,即对噪声图像的整体或大的块进行校正得到平滑图像。

但这类方法需要知道信号和噪声的统计模型,且运算量较大。

另一类平滑技术是对噪声图像使用局部算子。

当对某一像素进行平滑处理时,仅对它的局部小邻域的一些像素加以运算,其优点是计算效率高,而且可以多个像素并行处理,因此可以实现实时或者准实时处理。

(1)平滑线性滤波器(均值滤波)

一般来说,假设MXN的图像(x,y)为给定的含有噪声的图像,用m*n大

小的滤波器掩模进行线性滤波结果为g(x,y),在数学上可以表现为:

其中,a=(m-1)/12,b=(n-1)/12,w(s,t)为滤波器系数。

为了得到一副完整的经过滤波处理的图像,必须对x=0,1,2,….M-1和y=0,工,2,...,N-1依次应用公式。

这样,就保证了对图像中的所有像素进行了处理。

一般可选取以下几种模板:

模版1模版2模版3

比较常用的是模板3,它又被称为高斯(Gauss)模板,它为了突出模板中心像素本身的重要性,对所有的模板系数,不是一视同仁,而是引入了加权系数,可以看出,离原点距离越近的点,加权系数越大。

空间均值处理的一个结果是,较大物体变得像“斑点”而易于检测,但那些较小物体的强度与背景混合在了一起。

为此,在滤波后可增加阀值处理,即将滤波后的图像与选定的阀值相比较,根据比较结果决定最后的灰度值。

该方法对抑

制椒盐噪声比较有效,对保护仅有微小灰度差的细节和纹理也有效。

(2)平滑非线性滤波器(统计排序滤波器)

统计排序滤波器是一种非线性的空间滤波器,它的响应基于图像滤波器包围的图像区域中像素的排序,然后由统计排序结果决定的值代替中心像素的值。

统计排序滤波器中最常见的例子就是中值滤波器,正如其名,它是将像素邻域内灰度的中值代替该像素的值。

中值滤波器的主要功能是使拥有不同灰度的点看起来更接近于它的临近值。

中值滤波器使用非常普遍,这是因为对于一定类型的随机噪声,它提供了一种优秀的去噪能力,比小尺寸的线性平滑滤波器的模糊程度明显要低。

中值滤波器对处理脉冲噪声(椒盐噪声)非常有效,因为这种噪声是以黑白点叠加在图像上的。

尽管在图像处理中,中值滤波器是用得最广泛的统计滤波器,但这并不是说它是唯一的。

所谓中值就是一系列像素值的第50%个值,当我们取100%个值,此时就是最大滤波器,相反,当取0%的值时就变成了最小滤波器。

4.5图像缩放(平移以及转置)

一般采用插值法,有如下几种插值算法:

最邻近插值(近邻取样法):

最临近插值的的思想很简单。

对于通过反向变换得到的的一个浮点坐标,对其进行简单的取整,得到一个整数型坐标,这个整数型坐标对应的像素值就是目的像素的像素值,也就是说,取浮点坐标最邻近的左上角点(对于DIB是右上角,因为它的扫描行是逆序存储的)对应的像素值。

可见,最邻近插值简单且直观,但得到的图像质量不高。

双线性内插值:

对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v),其中i、j均为非负整数,u、v为[0,1)区间的浮点数,则这个像素得值f(i+u,j+v)可由原图像中坐标为(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:

f(i+u,j+v)=(1-u)(1-v)f(i,j)+(1-u)vf(i,j+1)+u(1-v)f(i+1,j)+uvf(i+1,j+1)

其中f(i,j)表示源图像(i,j)处的的像素值,以此类推

这就是双线性内插值法。

双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。

由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。

三次卷积法能够克服以上两种算法的不足,计算精度高,但计算量大,他考虑一个浮点坐标(i+u,j+v)周围的16个邻点,目的像素值f(i+u,j+v)可由如下插值公式得到:

f(i+u,j+v)=[A]*[B]*[C]

[A]=[S(u+1)S(u+0)S(u-1)S(u-2)]

┏f(i-1,j-1)f(i-1,j+0)f(i-1,j+1)f(i-1,j+2)┓

[B]=┃f(i+0,j-1)f(i+0,j+0)f(i+0,j+1)f(i+0,j+2)┃

┃f(i+1,j-1)f(i+1,j+0)f(i+1,j+1)f(i+1,j+2)┃

┗f(i+2,j-1)f(i+2,j+0)f(i+2,j+1)f(i+2,j+2)┛

┏S(v+1)┓

[C]=┃S(v+0)┃

┃S(v-1)┃

┗S(v-2)┛

┏1-2*Abs(x)^2+Abs(x)^3,0<=Abs(x)<1

S(x)={4-8*Abs(x)+5*Abs(x)^2-Abs(x)^3,1<=Abs(x)<2

┗0,Abs(x)>=2

S(x)是对Sin(x*Pi)/x的逼近(Pi是圆周率——π)最邻近插值(近邻取样法)、双线性内插值、三次卷积法等插值算法对于旋转变换、错切变换、一般线性变换和非线性变换都适用。

 

5程序主要源代码分析

5.1图像数据存储的主程序如下:

FILE*file=fopen("O.bmp","wb");

writebmpfileheader(file);/*写文件头函数*/

writebmpinfoheader(file);/*写信息头函数*/

writeimagedata(file);/*写图像数据函数*/

fclose(file);

写文件头和写信息头函数比较简单,这里bfSize为230454;biWidth,biHeight为320,240;biSizelmage为230400;biXPelsPerMeter,biYPelsPerMeter,biClrUsed,biCIrImportant均为Oa

以下给出writeimagedata(file)II数的原型:

voidwriteimagedata(FILE*file)

{

Intdatapointer;

Intmydata;

for(inti=0;i<=239;i++)/*共240行*/

datapointer-data+(239-i)*320;

/*data为采集映射时图像数据首地址,计算每一要写入的行在内存中的首地址*/

for(intj=0;j<=319;j++)/*共320列*/

{

mydata=*(datapointer+j);

fwrite(&mydata,1,1,file);/*写入一行数据*/

}

}

}

 

5.2图像平滑模块

Typedefstruct

{unsignedshortbfType;

UnsignedbfSize;

UnsignedshortbfReserved1;

UnsignedshortbfReserved2;

UnsignedbfOffBits;

}BMPHEADER;

BMPHEADERheader;

Typedefstruct

{unsignedbiSize;

unsignedbiWidth;

unsignedbiHeight;

unsignedshortbiplanes;

unsignedshortbiBitCount;

unsignedbi忽略pression;

unsignedbiSizelmage;

unsignedbiXpelsPerMeter;

unsignedbiYpelsPerMeter;

unsignedbiClrUsed;

unsignedbiClrUsed;

unsignedbiClrImportant;

}BMPINFOHEADER;

BMPINFOHEADERinfobeader;

在进行处理之前,先读取文件信息,假设我们将采集到的数据存放成0.bmp文件;

FILE*fp;

Fp=fopen(“0.bmp”,“rb”);

fread(&(header.bfType),2,1,fp);

fread(&(header.bfSize),4,1,fp);

fread(&(header.bfReserved),2,1,fp);

fread(&(header.bfOffBits),4,1,fp);

fread(&(header.bfzeof(BMPINFOHEADER),1,fp);

接下来,将图像数据存入我们的内存中,并将图像数据灰度化:

Unsignedchar*prodata;

Unsignedchar*middledata;

Intsize=infoheader.bitSizeImage;

Prodata=malloc(size);

Fread(prodata,1,size,fp);

Fclose(fp);

For(z=0,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1