标题 | 基于Framebuffer的二维图像处理关键技术研究与应用 |
范文 | 范丽辰 王桂海 姜淑香 摘要:介绍二维图像处理原理与处理过程,阐述Framebuffer的概念与工作原理,描述基于Framebuffer的二维图像处理关键技术,为开发嵌入式GUI与嵌入式应用提供技术参考。 关键词:嵌入式GUI;Framebuffer;二维图像 DOIDOI:10.11907/rjdk.151379 中图分类号:TP317.4 文献标识码:A 文章编号文章编号:16727800(2015)008019702 0 引言 嵌入式应用中人机交互接口的图形用户接口(GUI),应为用户提供友好界面,操作简洁、直观,并满足体积小、运行时耗用资源少、上层接口与硬件无关、可移植性好、可靠性高等要求。 嵌入式系统GUI的开发、移植与底层显示设备密切相关,如果对显示设备不熟悉,则无法开发GUI。然而,不同应用系统使用的显示设备不同,驱动程序也则不同。开发GUI的用户如果总是去关心底层设备,将会导致开发工作量大、技术难度高、开发效率低、开发的软件可移植性差。为避免上述问题,Linux操作系统抽象出Framebuffer,用户通过Framebuffer提供的接口即可操作底层设备。这样用户只需面向Framebuffer编程,从而简化了开发步骤,也增加了可移植性。此外,Framebuffer也是X Windows、MiniGUI等实现的重要基础。理解二维图像处理原理,掌握Framebuffer的原理与开发技术,是进行嵌入式系统GUI开发所必须具备的基础。 1 二维图像处理原理 二维图像处理在嵌入式开发中得到普遍应用,其包括获取、压缩、存储、解压缩、显示等环节。 1.1 图像获取与存储 用于获取二维图像的设备种类繁多,如数码相机、摄像机、扫描仪等,由于生产厂家不同、使用目的不同,得到的图像格式也不同,常见的存储格式有BMP、GIF、JPEG、PNG等[1]。 BMP位图格式是Windows操作系统的标准图像文件格式,Windows的画图软件即使用这种格式;GIF是CompuServe公司开发的图像文件存储格式,可以在一个文件中存放多幅彩色图形/图像;JPEG格式是有损压缩的静态图像文件存储格式,用于在互联网上存储和传输照片;PNG是20世纪90年代出现的图像文件存储格式,增加了一些GIF格式所不具备的特性。 1.2 图像压缩 二维图像有多种格式,不同格式的图像占用存储空间不同。如BMP格式存储的图像数据量大,占用存储空间大,因而影响传输效率。为减少存储空间,对图像进行压缩,用较小的数据量表达原始图像,从而能在较小的空间存储更多图像,同时带来更高的传输效率。 图像中存在很多重复数据,使用数学方法可以减少数据量。另外,人视觉对图像细节和颜色的辨认有一个极限,把超过极限的部分去掉,也能减少数据量,达到压缩的目的。 压缩方法为使用离散余弦变换将色彩空间表示的图转换为频率空间表示的图,并进行量化与编码。 不同设备使用不同的压缩算法进行图像处理,但图像压缩处理步骤大致相同。以JPEG图像为例,在进行离散余弦变换将色彩空间转换到频率空间之前,先将RGB颜色模型转换为YUV颜色模型。因为RGB颜色模型的图像数据量非常大,压缩效果并不理想,而JPEG压缩算法也是基于YUV颜色模型的。人们视觉对亮度的变化比对色彩的变化敏感,利用这一特性,YUV颜色模型将图像的亮度信息Y和颜色信息(U,V)分离,用不同的位数存储Y、U、V 3个分量,从而提高了压缩效率,更好地利用了存储空间。将RGB颜色模型转换为YUV颜色模型时,保存亮度和颜色变化的数据部分,还要舍弃人眼不敏感的成分。这样既保证了图像质量,也节省了存储空间。 不同设备使用不同的压缩算法,不同压缩算法产生不同的图像格式。例如,用于BMP位图文件的压缩算法有RLE4、RLE8两种,JPEG格式采用JPEG压缩算法,PNG格式采用LZ77派生的DEFLATE非专利无失真压缩算法,GIF格式采用LZW压缩算法。 1.3 图像解压缩 对于压缩存储的图像,要经过解压缩后才能还原为在显示设备上可用的数据格式。解压缩是压缩的逆过程,包括头文件解析、熵编码、反量化、反离散余弦变换、颜色模型转换等几个步骤,解压缩后的图像数据为RGB颜色模型。 首先对图像数据进行头文件解析,得到图像的文件信息;然后通过熵编码得到图像压缩前离散余弦变换的量化值;接着进行反量化,将量化值乘以反量化参数,得到离散余弦变换的频率系数;再对频率系数进行反离散余弦变换,得到YUV颜色模型的图像取样数据;最后将YUV颜色模型转换为RGB颜色模型,完成图像解压缩。 2 Framebuffer工作原理及应用 Linux操作系统工作在保护模式下,用户程序不能直接对设备进行操作,只能利用操作系统提供的接口完成对设备的读写。对于显示设备,该接口即是Framebuffer,称作帧缓冲。Framebuffer设备是图形设备的抽象,是某些视频硬件的帧缓冲,允许用户在完全不了解底层硬件的情况下,应用程序通过已定义好的接口(framebuffer)访问图形硬件。 2.1 Framebuffer工作原理 Linux操作系统将视频设备进行抽象,成为Framebuffer设备,对帧缓冲设备操作即相当于对视频设备操作,改变帧缓冲设备中的数据,则会改变LCD屏的显示内容。mmap()函数将帧缓冲设备描述符映射到帧缓冲区,通过读写帧缓冲区来操作帧缓冲设备。应用程序向帧缓冲区首地址指定的某个位置写入数据,即是向显存的对应位置写入数据。LCD控制器将显存内容输出到LCD屏,从而实现写屏。图1描述了Framebuffer的工作原理。 图1 Framebuffer工作原理 帧缓冲区的数据与LCD屏像素点有不同的对应关系。针对像素深度为16位的LCD屏,帧缓冲区每一个字节的数据对应LCD屏上一个像素点,改变一个像素点的颜色需要改变一个字节的内容;针对像素深度为16、24、32位的LCD屏,帧缓冲区中每2、3、4个字节数据分别对应LCD屏上一个像素点,改变一个像素点的颜色则需要同时改变相关字节的内容。 2.2 Framebuffer应用 应用Framebuffer进行二维图像显示时,需要经过图像文件打开、建立帧缓冲、进行内存映射、图像解压缩、格式转换及写屏等步骤。在Linux下进行二维图像开发,可以借助已有函数库对其进行解压缩,不同格式的二维图像使用不同的库,如libjpeg库、libgif库、libpng库等,分别用于JPEG、GIF、PNG格式图像的压缩/解压缩。 下面以JPEG图像为例,将图像显示在LCD屏上的过程如下:首先初始化Framebuffer设备。包括打开Framebuffer设备、获取设备描述符、用ioctl()函数获取屏幕参数、设置帧缓冲区大小、用mmap()函数将帧缓冲设备描述符映射到帧缓冲区、得到帧缓冲区首地址指针等步骤[2];然后使用libjpeg库解压缩JPEG图像。在Linux系统中安装该函数库,在程序中包含jpeglib.h、jerror.h头文件,之后调用库函数对图像进行解压缩,并将解压后的图像数据存储到虚拟内存。 具体步骤如下:①打开JPEG图像文件,获取文件描述符;②通过jpeg_create_decompress()函数分配并初始化一个jpeg对象,通过jpeg_std_error()函数定义用于错误处理的结构体对象,将其与jpeg对象绑定;③用jpeg_stdio_src()函数指定解压缩数据源,将JPEG图像与jpeg对象绑定;④用jpeg_read_header()函数获取图像信息,填充到jpeg对象;⑤为解压缩设定参数,例如可以设置解压后的图像与原图的比例;⑥用jpeg_start_decompress()函数开始解压缩,将解压后的图像信息填充至jpeg对象;⑦用jpeg_read_scanlines()函数从jpeg对象中读取一行像素点的颜色值,将读取的颜色值存放到虚拟内存,直至读完所有行并将数据存储到虚拟内存;⑧调用jpeg_finish_decompress()函数,完成解压缩;⑨调用jpeg_destroy_decompress()函数,释放jpeg对象;⑩调用写屏函数,将虚拟内存中的像素点颜色值写入帧缓冲区首地址指向的位置中。需要注意的是,解压后的图像采用24位的RGB 8:8:8颜色模型,而显示设备可能是8位、16位、24位与32位的RGB颜色模型。针对不同RGB颜色模型的设备,调用写屏函数之前,可能需要将解压后的图像进行RGB颜色模型的转换,使解压后图像与设备的RGB颜色模型相同。 针对8位RGB 3:3:2颜色模型的设备,转换时要保留R分量的高3位、G分量的高3位与B分量的高2位,舍去低位;16位RGB颜色模型有RGB 5:6:5与RGB 5:5:5(剩余一位是透明度)两种,转换为第一种颜色模型时,要保留R分量的高5位、G分量的高6位与B分量的高5位,舍去低位。转换为第二种颜色模型时,保持透明度不变,保留R分量的高5位、G分量的高5位与B分量的高5位,舍去低位;针对24位RGB 8:8:8颜色模型的设备,无需转换;针对32位RGB 8:8:8(剩余8位是透明度)颜色模型的设备,需将24位RGB颜色模型扩展为32位,保持R分量、G分量与B分量的值不变,添加8位透明度。 为了实现虚拟显示,保存图像数据的虚拟缓冲区大小,应大于实际LCD面板显示屏全部像素所需的数据缓冲区大小[3]。 3 结语 本文研究了二维图像处理的关键技术,描述了基于Framebuffer的二维图像处理过程。Framebuffer能支持绝大多数显示设备,具有良好的平台无关性,因而对应用程序开发者而言,不用关心底层设备的细节即可开发出完美的二维图像处理程序。Framebuffer不支持三维图像开发,如果进行三维图像应用开发,可以在Windows下使用DirectX,或在Linux下使用OpenGL。二维图像是图形库的基本元素,Framebuffer为构建GUI提供了实现基础,研究基于Framebuffer的二维图像处理,可为开发轻型、可靠、可移植的嵌入式系统GUI提供思路,具有一定参考价值。 参考文献: [1] 林宗福.多媒体技术基础[M].第2版.北京:清华大学出版社,2002. [2] 郭剑,赵建.嵌入式Linux的图像采集与显示[J].现代电子技术,2006(7):129131. [3] 刘彦文.嵌入式系统原理与接口技术[M].北京:清华大学出版社,2011. (责任编辑:黄 健) |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。