基于arm嵌入式图像处理系统设计与实现论文内容摘要:

滤波器的主要功能是使 拥有不同灰度的点看起来更接近于它的临近值。 中值滤波器使用非常普遍,这是因为对于一定类型的随机噪声,它提供了一种优秀的去噪能力,比小尺寸的线性平滑滤波器的模糊程度明显要低。 中值滤波器对处理脉冲噪声 (椒盐噪声 )非常有效,因为这种噪声是以黑白点叠加在图像上的。 《基于 ARM 嵌入式图像处理系统设计与实现》 第 10 页 共 31 页 尽管在图像处理中,中值滤波器是用得最广泛的统计滤波器,但这并不是说它是唯一的。 所谓中值就是一系列像素值的第 50%个值,当我们取 100%个值,此时就是最大滤波器,相反,当取 0%的值时就变成了最小滤波器。 图像缩放(平移以及转置) 一般采用插值法,有 如下几种插值算法 : 最邻近插值(近邻取样法): 最临近插值的的思想很简单。 对于通过反向变换得到的的一个浮点坐标,对其进行简单的取整,得到一个整数型坐标,这个整数型坐标对应的像素值就是目的像素的像素值,也就是说,取浮点坐标最邻近的左上角点(对于 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) = (1u)(1v)f(i,j) + (1u)vf(i,j+1) + u(1v)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, j1) f(i1, j+0) f(i1, j+1) f(i1, j+2) ┓ [B]=┃ f(i+0, j 1) f(i+0, j+0) f(i+0, j+1) f(i+0, j+2) ┃ 《基于 ARM 嵌入式图像处理系统设计与实现》 第 11 页 共 31 页 ┃ 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)={ 48*Abs(x)+5*Abs(x)^2Abs(x)^3 , 1=Abs(x)2 ┗ 0 , Abs(x)=2 S(x)是对 Sin(x*Pi)/x 的逼近( Pi是圆周率 —— π )最邻近插值(近邻取样法)、双线性内插值、三次卷积法 等插值算法对于旋转变换、错切变换、一般线性变换 和 非线性变换 都适用。 《基于 ARM 嵌入式图像处理系统设计与实现》 第 12 页 共 31 页 5 程序主要源代码分析 图像数据存储的主程序如下 : FILE*file=fopen(,wb)。 writebmpfileheader(file)。 /*写文件头函数 */ writebmpinfoheader(file)。 /* 写信息头函数 */ writeimagedata(file)。 /* 写图像数据函数 */ fclose(fi le)。 写文件头和写信息头函数比较简单,这里 bfSize 为 230454。 b iWidth,biHeight为 320,240。 bi Sizelmage 为 230400。 biXPelsPerMeter,bi YPelsPerMeter,biClrUsed,biCIrImportant 均为 Oa 以下给出 writeimagedata(file)II 数的原型 : voidwriteimagedata(FILE* file) { Int datapointer。 Int mydata。 for (int i= 0。 i = 239。 i++)/*共 240 行 */ datapointer data+(239i )*3 20。 /*data 为采集映射时图像数据首地址,计算每一要写入的行在内存中的首地址*/ for(int j= 0。 j = 31 9。 j + + )/* 共 320 列 */ { mydata=*( datapointer+j)。 fwrite(amp。 mydata,1, 1, fil e)。 /*写入一行数据 */ } } } 《基于 ARM 嵌入式图像处理系统设计与实现》 第 13 页 共 31 页 图像平滑模块 Typedef struct {unsigned short bfType。 Unsigned bfSize。 Unsigned short bfReserved 1。 Unsigned short bfReserved 2。 Unsigned bfOffBits。 }BMPHEADER。 BMPHEADER header。 Typedef struct {unsigned biSize。 unsigned biWidth。 unsigned biHeight。 unsigned short biplanes。 unsigned short biBitCount。 unsigned biCompression。 unsigned biSizelmage。 unsigned biXpelsPerMeter。 unsigned biYpelsPerMeter。 unsigned biClrUsed。 unsigned biClrUsed。 unsigned biClrImportant。 }BMPINFOHEADER。 BMPINFOHEADER infobeader。 在进行处理之前,先读取文件信息,假设我们将采集到的数据存放成 文件; FILE*fp。 Fp=fopen(“ ” ,“ rb” )。 fread(amp。 (),2,1,fp)。 《基于 ARM 嵌入式图像处理系统设计与实现》 第 14 页 共 31 页 fread(amp。 (),4,1,fp)。 fread(amp。 (),2,1,fp)。 fread(amp。 (),4,1,fp)。 fread(amp。 ((BMPINFOHEADER),1,fp)。 接下来,将图像数据存入我们的内存中,并将图像数据灰度化: Unsigned char*prodata。 Unsigned char*middledata。 Int size=。 Prodata=malloc(size)。 Fread(prodata,1,size,fp)。 Fclose(fp)。 For(z=0,z。 z++) {middledata[z]=(unsigned char)(*prodata+z+2)*3 +(unsigned char )(*(prodata+z+1)* + (unsigned char)(*prodata +z)*)。 Z++。 Middledata[z]=middledata[z1]。 Z++。 Middledata[z]=middledata[z1]。 } Memcpy(prodata,middledata,)。 以下是高斯平滑的主程序: Double Template[9]。 /*运算模版 */ Double Coef=(double)()。 /*模版均值 */ /*模版个稀疏声明 */ Template[0]=。 Template[1]=。 Template[2]=。 Template[3]=。 Template[4]=。 Template[5]=。 Template[6]=。 Template[7]=。 Template[8]=。 《基于 ARM 嵌入式图像处理系统设计与实现》 第 15 页 共 31 页 For(x=1。 xXSaveDim1。 x++) {for(y=1。 yYSaveDim1。 y++) {/*XsaveDim,YsaveDim 为图像存储尺寸, x, y 从 1 开始并且以 XsaveDim1,YsaveDim1结束,是为了去除边界 */ for( j=1。 j3。 j++) {for(k=0。 k3。 k++) {/*j, k 为模版内部循环变量 */ Result+=(*(prodata+GetPixelOffset(x=j1,y+k1)))*Template[3*j+k]。 } }/*GetPixelOffset 为我们自己定义的函数,返回对应 x,y坐标的像素在数据空间中的存储位置,返回值为 (XSaveDim*y+x)*()*/ Result*=Coed。 If(Result255) {Result=255。 } Z=GetPixelOffset(x,y)。 Middledata[z]=(unsigned char)(Result+)。 Z++。 Middledata[z]=middledata[z1]。 Z++。 Middledata[z]=middledata[z2]。 } } 图像平移主要代码 int Main(int argc, char **argv) { ARMTargetInit()。 OSInit()。 uHALr_ResetMMU()。 LCD_Init()。 《基于 ARM 嵌入式图像处理系统设计与实现》 第 16 页 共 31 页 LCD_printf(LCD initialization is OK\n)。 LCD_printf(320 x 2。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。