中值滤波器.doc

上传人:ng****60 文档编号:2373144 上传时间:2019-05-09 格式:DOC 页数:14 大小:45.50KB
下载 相关 举报
中值滤波器.doc_第1页
第1页 / 共14页
中值滤波器.doc_第2页
第2页 / 共14页
中值滤波器.doc_第3页
第3页 / 共14页
中值滤波器.doc_第4页
第4页 / 共14页
中值滤波器.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、帽泡排序法的汇编实现。 。mov cx,count ;CX数组元素个数dec cx ;元素个数减 1为外循环次数outlp: mov dx,cx ;DX内循环次数mov bx,offset arrayinlp: mov al,bx ; 取前一个元素cmp al,bx+1 ;与后一个元素比较jna nextxchg al,bx+1 ;否则,进行交换mov bx,alnext: inc bx ;下一对元素dec dxjnz inlp ;内循环尾loop outlp ;外循环尾2、中值滤波中值滤汉是对某一参数连续输入 N次(一般 N取奇数),从中选择一个中间值作为本次采样值,若变量变化比较缓慢,采用

2、此方法效果比较好,但对快速变化过程的参数,如流量、自然伽玛等,则不宜采用。中值滤波的 C程序函数如下:float middle_filter(float middle_value , intcount)float sample_value, data;int i, j;for (i=1; i for(j=count-1; j=i,-j)if(middle_valuej-1=middle_valuejdata=middle_valuej-1;middle_valuej-1=middle_valuejmiddle_valuej=data;sample_value=middle_value(coun

3、t-1)/2;return(sample_value);函数假设对某一参数连续采样 3次,若多次采样,可 对该函数稍作修改即可。3 次采样值存储在数组 middle_value3,其中 Sample-value表示有效采样值,count 表示连续采样次数。FILTER3:MOV R2,#04H SRT:MOV A,R2 MOV R3,AMOV R0,#SAMP LOOP:MOV A,R0 INC R0MOV R1,ACLR CSUBB A,R0MOV A,R1JC DONEMOV A,R0 DEC R0XCH A,R0INC R0MOV R0,ADONE:DJNZ R3,LOOP DJNZ R

4、2.,SORT INC R0MOV A,R0RETSAMP EQU 30H用汇编实现冒泡排序的函数;参数说明:_lpData 是待排序的数组首地址,_dwCount 是待排序的个数,_dwOption 设为 0则由小到大排序;如果是非 0值,则是由大到小排序.;返回值:已排序数据放回原数组中.;作者:ONEPROBLEM;=_BubblingSort proc _lpData,_dwCount,_dwOptionlocal dwCountpushadmov edi,1.while edi esi+4 主程序入口 mov ax, dseg mov ds, ax mov cx,n dec cx l

5、oop1: mov di,cx mov bx,0 loop2: mov al,bufferbx cmp al,bufferbx+1 jge continue xchg al,bufferbx+1 mov bufferbx,al continue: add bx,1 loop loop2 mov cx,di loop loop1 mov ah,1;按任意键退出 int 21h mov ax, 4c00h ;程序结束,返回到操作系统系统 int 21h MAIN ENDP CSEG ENDS END MAIN 中值滤波原理中值滤波是一种非线性平滑法,它对一个滑动窗口内的像素灰度值排序,并用其中值代

6、替窗口中心像素的灰度值. 对脉冲干扰及椒盐噪声具有良好的抑制作用,并且在抑制随机噪声的同时能有效保护边缘少受模糊. 二维中值滤波的窗口形状有多种,如线状、方形、十字形、圆形、菱形等. 不同形状的窗口产生不同的滤波效果. 通过研究,不少文献认为十字中值滤波的效果优于方形的中值滤波,而且十字中值滤波也有不同的形式以形成不同的滤波特性,其数据可从方形数据获得. 最常使用的十字中值滤波是对五个相邻像素进行排序,以确定中心点的数值. I=1 7 1 8 1 7 1 11 1 1 5 1 1 1 11 1 5 5 5 1 1 71 1 5 5 5 1 8 18 1 1 5 1 1 1 18 1 1 5 1

7、 1 5 11 1 1 5 1 1 1 11 7 1 8 1 7 1 1 ;M N=size(I);I1=zeros(M,N);for i=2:M-1for j=2:N-1temp=I(i-1:i+1,j-1:j+1);temp=sort(temp);temp=sort(temp);I1(i,j)=temp(2,2);endendimshow(I,);figure,imshow(I1,);中值滤波器属于非线性空间滤波器,用于除去图像中的椒盐噪声。中值滤波器只适用于灰度RGB图像(对于 YUV图像,应该只需要对 Y进行处理) ,一个有趣现象:对于彩色 RGB图像进行中值滤波,得到的输出接近于灰色

8、图像。中值滤波的算法核心就是找出中间值。对于一个 3x3的块,只需要找的这样一个值:1)有 4个比它小;2)有 4个比它大。而不需要进行泡沫排序。对于图像的边界,一般有两种处理方法:边界扩展和不处理。为了跟具有普遍性,此 IP不考虑边界问题。中值滤波器的主要开销在于 line buffer,通常 line buffer需要存储图像的一行像素。对于 3x3块的滤波,就需要两个 line buffer,这对于大尺寸图像是一笔很大的开销。我认为,对于这个问题有两种解决办法:1)和其它模块共享 buffer,实际限制会比较多,也会影响系统的工作频率;2)把大图像分成小块来处理,这样做 IO接口的设计会

9、比较复杂,对于带宽也有一定影响。本文的 IP为 Slave模式,输入为 8bit,支持断续传输。实际应用中,需要设计一个 IO interface。使用了 6级流水线,处理速度可以达到 1pixel/cycle。作为一个 IP,这个设计可能没有太多价值,毕竟实际情况千差万别。但是,我想,作为一个学习的例子还是有一些意义的,这个设计流程已经很接近工程项目了。算法实现起来比较简单,总共花费约 5个工作日。第一天:找资料;第二天:写 Design Spec,并实现;第三天:写 c model,建立仿真环境;第四天:debug;第五天:整理。整个工程包括:RTL,testbanch,c model,D

10、esign Spec和测试向量。要求仿真工具支持verilog 2001。这里对验证环境多说一些,严格来讲,这个只能算是仿真,验证的话需要给出 function coverage和 code coverage报告。因为是没有薪水的工作,所以就不愿意做这些琐碎的事情了。凭我的直觉说应该不会有问题(千万不要对自己的老板这么说,而且 bug往往出现在设计者认为不会出 bug的地方) 。找 Bug的工作就交给大家了:)。对于仿真结果的比较,不知道为什么很多人都习惯用 testbanch dump result file,然后和参考数据作比较。个人觉得这种方法非常不好,我习惯用 monitor做实时比较

11、。到了 2001版本,verilog的文件操作已经做到和 c一样强大了。在这个 testbanch里,激励和比对文件都是二机制的。另外一个比较重要的东西就是 c model了,一般在公司里都是由算法工程师给出来的(我请不起他们只有自己写了) ,个人认为 c model不会对 RTL的实现有所帮助(我从来不看他们的程序,而且我的设计都是和 c model同步完成的) ,但是对于 debug起着事半功倍的作用。一个好的 c model可以给出 debug所需要的所有信息。关于滤波器的实现没有太多难点,这里用的是脉动阵列结构,保证数据在你期望的时间到达就可以了。有一些信号是根据时序凑出来的,不要深究

12、其逻辑意义。基本上基于算法的设计都遵循以下流程:先实现数据通路,然后根据数据通路来凑出控制信号.通常我看 code和波形都是在 debussy下面,如果你不是,应该向我学习,因为 aisc工程师都是这么做的!如果你是想学习而不是拿来用的话,我建议还是自己实现的好。网络上的资源:该文件内容放在.m 文件中才能调用!%中值滤波函数,X 为输入矩阵,a,b 为中值滤波的框大小。%效率很低,可以用来说明中值滤波的概念。%Y为 uint8数据类型,以便用 imshow画图,否则,可以改为其它和 X相同的类型。% medianforfun.mfunction Y=medianforfun(X,a,b)k=

13、floor(a*b/2)+1; % k为矩阵数值中间位置的数M,N=size(X);uint8 Y=zeros(M,N);funBox=zeros(a,b);temp=zeros(a*b);for i=1:M-a % matlab的坐标从(1,1)开始for j=1:N-bfunBox=X(i:i+a,j:j+b);temp=funBox(:); % A(:)矩阵 A以一维数组的形式输出tempSort=sort(temp); % sort()是从小到大排列Y(i,j)=tempSort(k);end;end;调用函数:I = imread(eight.tif);J = imnoise(I,s

14、alt %26amp; pepper,0.02);K = medfilt2(J);imshow(J), figure, imshow(K)Z=medianforfun(J,2,2);figure, imshow(Z)2.原版修改(效果更好):function Y= V0(X,a,b)k=floor(a*b/2)+1; % k为矩阵数值中间位置的数M,N=size(X);uint8 Y=zeros(M,N);funBox=zeros(a,b);p=0;temp=zeros(a*b); % a*b 的方阵for i=1:M-a % matlab的坐标从(1,1)开始for j=1:N-bfunBo

15、x=X(i:i+a-1,j:j+b-1);temp=funBox(:); % A(:)矩阵 A以一维数组的形式输出tempSort=sort(temp); % sort()是从小到大排列p1=i+floor(a/2)+1;p2=j+floor(a/2)+1;Y(p1,p2)=tempSort(k); %找到邻接矩阵排列数的中值赋值给模板的中心点 end;end;调用函数:tic;In = imread(D:sp.jpg); % 用 P= isind(D:sp.png)测试,发现此图片为索引图像I= rgb2gray(In); %那为何使用 rgb2gray能转换,ind2gray 却不能呢?i

16、mhist(I);J = imnoise(I,salt %26amp; pepper,0.08);% K = medfilt2(J);imshow(J);%figure,imshow(K)Z= V0(J,3,3); %模板为 3*3的矩阵,矩阵越大,计算量越大figure, imshow(Z)toc说明:计算程序运行时间的方式:tic;程序;toc (2)matlab自带的中值滤波函数:medfilt2( )判断图像文件的类型:In = imread(D:sp.png);P= isind(D:sp.png)P= isrgb(D:sp.png)效果如下:图片处理前 图片处理后 3.改进版(在原版

17、修改基础上):传统的中值滤波中“中值”一般取“中位数” ,即所有元素排序后中间位置上的元素值。但是排序需要移动大量元素,效率较低。个人认为,其实原版算法主要耗时的地方之一是 matlab的排序函数:sort()说明:耗时的原因很多!值得改进的地方还有很多基于此点,可以改进排序函数,快速排序算法是我的首选,但是不是平常意义的那种快速排序,是经过改良的快速排序。因为它每轮移动的数字都是最后排好序的最终位置,并且,我只是为了找中值,所以不需要真的去排序。只要在有一轮排序中,一个数字被放在中心位置,那么该数就是所要找的中值。最终的排序虽然没有完成,但中值已找到,所以循环就可以停止了!但仍需要移动元素位置。貌似还是很耗时!暂时我只能改进到这样的情况了,尽力了!1.快速排序法(matlab 版)% 快速排序法% 基本的思想:通过一趟排序将待排的记录分割成独立的两部分,% 其中前一部分的 记录的关键字均比另一部分记录的关键字小,% 再分别对两组记录进行递归分割,达到排序的目的% 平均时间复杂度为 O(log2(n)function data=qsort_main(A)data = A; low = 1; high = 9;data = QSort(data, low, high);%before=A(:)%after=data(:)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。