滤波过程中图像边界补零没有补零什么意思

《中值滤波原理》_精选优秀范文十篇
中值滤波原理
中值滤波原理
范文一:北京理工大学珠海学院实验报告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY班级
成绩实验题目
实验时间1. 题目概述1. 中值滤波:设计中值滤波器,处理peppterN2. 图像锐化:先将lana图像均值滤波(3*3,或5*5),作为原图像,设计锐化滤波器,处理。2. 设计思路和流程图【正文用小五号,宋体字体】【不得改变格式】1. 中值滤波:设计中值滤波器,处理peppterN此题根据实验要求以及图片可知,需要处理的对象图片是一副充满“椒盐”的图像,而我们的实验要求是处理图片中的椒盐,让图片变得正常。根据题目要求我们应该使用中指滤波器来处理图像。而中指滤波的原理是给图像进行一个设定的模板的像素大小的排序。而我在本题中使用的是3*3的模板来处理图像。 第一步:读取原图片(pepperN.ppm)通过读取原图片,我们可以与处理后图片进行比较。代码:P = imread('pepperN.ppm');imshow('pepperN.ppm');第二步:算法的实现因为我们使用的是3*3模板,因此每次遍历3*3都把该9个像素的值赋给一个数组for ii = i-1:i+1for jj = j-1:j+1 %遍历图像某个像素周围的9个像素t(k) = P(ii,jj);k = k + 1;endend而i和j的取值范围只能是2:255(因为i可以取到1的话ii的值就可以取到0,255同理)数组遍历完成后,用sort(t)来给t排序,把中间的值即t(5)赋给g(i,j)。如此循环最后的得出g即为处理后的图像第三步:输出图像imshow(g);2. 图像锐化:先将lana图像均值滤波(3*3,或5*5),作为原图像,设计锐化滤波器,处理。第一步:均值滤波因为均值滤波涉及像素的计算,数值很可能超过256,从而得出错误的结果,因此需要把图像像素由uint8转换为double型来进行计算,把图像中以(i,j)为中心的3*3个像素相加起来 然后取均值赋给g(i,j),最后g为均值滤波处理后的图像。实现代码f=im2double(f);%转换为double以便之后的像素值运算,其中f为处理的图像均值滤波算法计算代码如下:for i = 2:255for j = 2:255k = 1;for ii = i-1:i+1for jj = j-1:j+1g(i,j) = g(i,j) + f(ii,jj);endendg(i,j) = g(i,j)/9;endend第二步:锐化滤波定义拉普拉模板,然后以图像中以(i,j)为中心的9个像素乘以拉普拉模板的9个元素,把值累加起来,结果就作为z(i,j)的值,最后输出z,就是处理后的图像定义拉普拉模板:Lapla=[0 -0.5 0 -0.5 3 -0.5 0 -0.5 0];锐化滤波算法代码如下:for i = 2:255for j = 2:255k=1;for ii = i-1:i+1for jj= j-1:j+1z(i,j) = z(i,j) + g(ii,jj)*Lapla(k);k = k + 1;endendendend3. 结果和分析【正文用小五号,宋体字体】【不得改变格式】第一题处理前的图像经过中值滤波后的图像分析:中值滤波适合于处理椒盐噪声比较多的图像 第二题经过均值滤波后的图像经过锐化滤波后的图像分析:锐化滤波可以用以给图像进行锐化4. 心得体会【正文用小五号,宋体字体】【不得改变格式】经过锐化滤波后的图像会变得清晰中值滤波适合于处理椒盐图像均值滤波可能会使图像变模糊原文地址:北京理工大学珠海学院实验报告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY班级
成绩实验题目
实验时间1. 题目概述1. 中值滤波:设计中值滤波器,处理peppterN2. 图像锐化:先将lana图像均值滤波(3*3,或5*5),作为原图像,设计锐化滤波器,处理。2. 设计思路和流程图【正文用小五号,宋体字体】【不得改变格式】1. 中值滤波:设计中值滤波器,处理peppterN此题根据实验要求以及图片可知,需要处理的对象图片是一副充满“椒盐”的图像,而我们的实验要求是处理图片中的椒盐,让图片变得正常。根据题目要求我们应该使用中指滤波器来处理图像。而中指滤波的原理是给图像进行一个设定的模板的像素大小的排序。而我在本题中使用的是3*3的模板来处理图像。 第一步:读取原图片(pepperN.ppm)通过读取原图片,我们可以与处理后图片进行比较。代码:P = imread('pepperN.ppm');imshow('pepperN.ppm');第二步:算法的实现因为我们使用的是3*3模板,因此每次遍历3*3都把该9个像素的值赋给一个数组for ii = i-1:i+1for jj = j-1:j+1 %遍历图像某个像素周围的9个像素t(k) = P(ii,jj);k = k + 1;endend而i和j的取值范围只能是2:255(因为i可以取到1的话ii的值就可以取到0,255同理)数组遍历完成后,用sort(t)来给t排序,把中间的值即t(5)赋给g(i,j)。如此循环最后的得出g即为处理后的图像第三步:输出图像imshow(g);2. 图像锐化:先将lana图像均值滤波(3*3,或5*5),作为原图像,设计锐化滤波器,处理。第一步:均值滤波因为均值滤波涉及像素的计算,数值很可能超过256,从而得出错误的结果,因此需要把图像像素由uint8转换为double型来进行计算,把图像中以(i,j)为中心的3*3个像素相加起来 然后取均值赋给g(i,j),最后g为均值滤波处理后的图像。实现代码f=im2double(f);%转换为double以便之后的像素值运算,其中f为处理的图像均值滤波算法计算代码如下:for i = 2:255for j = 2:255k = 1;for ii = i-1:i+1for jj = j-1:j+1g(i,j) = g(i,j) + f(ii,jj);endendg(i,j) = g(i,j)/9;endend第二步:锐化滤波定义拉普拉模板,然后以图像中以(i,j)为中心的9个像素乘以拉普拉模板的9个元素,把值累加起来,结果就作为z(i,j)的值,最后输出z,就是处理后的图像定义拉普拉模板:Lapla=[0 -0.5 0 -0.5 3 -0.5 0 -0.5 0];锐化滤波算法代码如下:for i = 2:255for j = 2:255k=1;for ii = i-1:i+1for jj= j-1:j+1z(i,j) = z(i,j) + g(ii,jj)*Lapla(k);k = k + 1;endendendend3. 结果和分析【正文用小五号,宋体字体】【不得改变格式】第一题处理前的图像经过中值滤波后的图像分析:中值滤波适合于处理椒盐噪声比较多的图像 第二题经过均值滤波后的图像经过锐化滤波后的图像分析:锐化滤波可以用以给图像进行锐化4. 心得体会【正文用小五号,宋体字体】【不得改变格式】经过锐化滤波后的图像会变得清晰中值滤波适合于处理椒盐图像均值滤波可能会使图像变模糊
范文二:中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。高斯滤波高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,我们知道数字图像用于后期应用,其噪声是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。与此相关的有Gauss-Lapplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积。滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,能量低的就排除掉,噪声就是属于低能量部分,其实编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果若使用理想滤波器,会在图像中产生振铃现象。采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。中值滤波 (随机噪声!!!)中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值。 实现方法:1. 通过从图像中的某个采样窗口取出奇数个数据进行排序2. 用排序后的中值取代要处理的数据即可中值滤波法对消除颗粒噪声非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。中值滤波在图像处理中, 常用于用来保护边缘信息,是经典的平滑噪声的方法中值滤波原理中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个临域中各点值的中值代替,让周围的像素值接近的值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,方形,圆形,十字形,圆环形,菱形等。介绍了一种中值滤波编码快速算法的设计思路、基本运算步骤、算法流程及算法分析 该算法利用数据窗口中元素的位置关系 ,并考虑了相邻的两个中值滤波窗口内数据元素的相关性 ,采用编码排序的方法保留前面窗口内数据的编码排序信息 ,作为后一个窗口内数据排序的参考依据 由此 ,将传统算法中相邻的两次中值滤波运算合并为一次进行 ,减少了中值滤波过程中比较运算的次数 该算法可将传统算法的复杂度O(n2 )简化为O(n)
范文三:二维中值滤波(2-D median filtering) medfilt2( 07:23:26)转载▼标签: 杂谈 分类: MATLAB1.函数形式B = medfilt2(A, [m n])B = medfilt2(A)B = medfilt2(A, 'indexed', ...)B = medfilt2(..., padopt)2.描述中值滤波是一种非线性操作,通常用于滤除椒盐噪声( "salt and pepper" noise)。当目标是既要滤除噪声又要保留边缘时,中值滤波比卷积更有效。B = medfilt2(A, [m n]) 完成矩阵A在二维方向的中值滤波。每个输出像素为输入图像相关像素m*n邻域的中值。medfilt2在边缘处为图像补零,因此对于边缘 [m n]/2 内的点会有些扭曲。B = medfilt2(A) 完成矩阵A在3*3邻域内的中值滤波。B = medfilt2(A, 'indexed', ...) processes A as an indexed image, padding with 0s if the class of A is uint8, or 1s if the class of A is double.B = medfilt2(..., padopt) controls how the matrix boundaries are padded. padopt may be 'zeros' (the default), 'symmetric', or 'indexed'. If padopt is 'symmetric', A is symmetrically extended at the boundaries. If padopt is 'indexed', A is padded with
otherwise it is padded with zeros.
范文四:matLab 自编的 均值滤波、中值滤波、高斯滤波 图像处理函数(转)虽然matlab里面有这些函数,但是要求自己编写,计算机视觉上有这个实验,是别人编写的。别人到网上找了半天才零散的找到一些碎片,整理以后发上来的!MatLab自编的均值滤波、中值滤波、高斯滤波 图像处理函数。%自编的均值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)function d=avefilt(x,n)a(1:n,1:n)=1;
%a即n×n模板,元素全是1p=size(x);
%输入图像是p×q的,且p>n,q>nx1=double(x);x2=x1;%A(a:b,c:d)表示A矩阵的第a到b行,第c到d列的所有元素for i=1:p(1)-n+1for j=1:p(2)-n+1c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘
s=sum(sum(c));
%求c矩阵(即模板)中各元素之和x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将模板各元素的均值赋给模板中心位置的元素
endend%未被赋值的元素取原值d=uint8(x2);%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)function d=midfilt(x,n)p=size(x);
%输入图像是p×q的,且p>n,q>nx1=double(x);x2=x1;for i=1:p(1)-n+1for j=1:p(2)-n+1c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)
%是c矩阵的第一行for u=2:ne=[e,c(u,:)];
%将c矩阵变为一个行矩阵endmm=median(e);
%mm是中值x2(i+(n-1)/2,j+(n-1)/2)=
%将模板各元素的中值赋给模板中心位置的元素
endend%未被赋值的元素取原值d=uint8(x2);%自编的高斯滤波函数,S是需要滤波的图象,n是均值,k是方差function d=gaussfilt(k,n,s)Img = double(s);n1=floor((n+1)/2);%计算图象中心for i=1:nfor j=1:nb(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*k))/(4*pi*k);endend%生成高斯序列b。Img1=conv2(Img,b,'same'); %用生成的高斯序列卷积运算,进行高斯滤波d=uint8(Img1);%此为程序主文件,包含主要功能单元,以及对子函数进行调用try%实验步骤一:彩色、灰度变换h=imread('photo.jpg'); %读入彩色图片c=rgb2gray(h); %把彩色图片转化成灰度图片,256级figure,imshow(c),title('原始图象'); %显示原始图象g=imnoise(c,'gaussian',0.1,0.002); %加入高斯噪声figure,imshow(g),title('加入高斯噪声之后的图象'); %显示加入高斯噪声之后的图象%实验步骤二:用系统预定义滤波器进行均值滤波n=input('请输入均值滤波器模板大小\n');A=fspecial('average',n); %生成系统预定义的3X3滤波器Y=filter2(A,g)/255;
%用生成的滤波器进行滤波,并归一化figure,imshow(Y),title('用系统函数进行均值滤波后的结果'); %显示滤波后的图象 %实验步骤三:用自己的编写的函数进行均值滤波Y2=avefilt(g,n);
%调用自编函数进行均值滤波,n为模板大小figure,imshow(Y2),title('用自己的编写的函数进行均值滤波之后的结果'); %显示滤波后的图象%实验步骤四:用Matlab系统函数进行中值滤波n2=input('请输入中值滤波的模板的大小\n');Y3=medfilt2(g,[n2 n2]);
%调用系统函数进行中值滤波,n2为模板大小figure,imshow(Y3),title('用Matlab系统函数进行中值滤波之后的结果'); %显示滤波后的图象 %实验步骤五:用自己的编写的函数进行中值滤波Y4=midfilt(g,n2);
%调用自己编写的函数进行中值滤波,figure,imshow(Y4),title('用自己编写的函数进行中值滤波之后的结果');%实验步骤六:用matlab系统函数进行高斯滤波n3=input('请输入高斯滤波器的均值\n');k=input('请输入高斯滤波器的方差\n');A2=fspecial('gaussian',k,n3);
%生成高斯序列Y5=filter2(A2,g)/255;
%用生成的高斯序列进行滤波figure,imshow(Y5),title('用Matlab函数进行高斯滤波之后的结果');
%显示滤波后的图象 %实验步骤七:用自己编写的函数进行高斯滤波Y6=gaussfilt(n3,k,g); %调用自己编写的函数进行高斯滤波,n3为均值,k为方差figure,imshow(Y6),title('用自编函数进行高斯滤波之后的结果');
%显示滤波后的图象catch
%捕获异常disp(lasterr);
%如果程序有异常,输出 end
范文五:中值滤波器.txt让人想念而死,是谋杀的至高境界,就连法医也鉴定不出死因。。。。。。帽泡排序法的汇编实现。。mov cx,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 dx内循环尾外循环尾2、中值滤波中值滤汉是对某一参数连续输入N次(一般N取奇数),从中选择一个中间值作为本次采样值,若变量变化比较缓慢,采用此方法效果比较好,但对快速变化过程的参数,如流量、自然伽玛等,则不宜采用。中值滤波的C程序函数如下:float middle_filter(float middle_value [] , intcount){float sample_value,int i,for (i=1; i for(j=count-1; j>=i,--j){if(middle_value[j-1]=middle_value[j]{data=middle_value[j-1];middle_value[j-1]=middle_value[j]middle_value[j]=}}sample_value=middle_value(count-1)/2];return(sample_value);}函数假设对某一参数连续采样3次,若多次采样,可 对该函数稍作修改即可。3次采样值存储在数组middle_value[3],其中Sample-value表示有效采样值,count表示连续采样次数。FILTER3:MOV
R2,#04HSRT:MOV
R0,#SAMPLOOP:MOV A,@R0INC
@R0,ADONE:DJNZ R3,LOOPDJNZ
R2.,SORTINC
A,@R0RETSAMP
EQU 30H用汇编实现冒泡排序的函数;参数说明:_lpData是待排序的数组首地址,_dwCount是待排序的个数,_dwOption设为0则由小到大排序;如果是非0值,则是由大到小排序.;返回值:已排序数据放回原数组中.;作者:ONEPROBLEM;=================================================_BubblingSort proc _lpData,_dwCount,_dwOptionlocal @dwCountpushadmov edi,1.while edimov esi,_lpDatamov eax,_dwCountmov @dwCount,eaxsub @dwCount,edimov ebx,1.while ebxmov eax,[esi].if eaxjmp next.elseif eax>[esi+4] && _dwOption==0jmp continue.elseif eaxjmp continue.elseif eax>[esi+4] && _dwOption!=0jmp next.endifcontinue:mov eax,[esi]mov edx,[esi+4]mov [esi],edxmov [esi+4],eaxnext:add esi,4inc ebx.endwinc edi.endwpopadret_BubblingSort endpDSEG SEGMENTn equ 10BUFFER DB 9,11,2,7,21,13,2,0,14,3DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEGMAIN PROC FAR ;主程序入口mov ax, dsegmov ds, axdec cxloop1: mov di,cxmov bx,0loop2: mov al,buffer[bx]cmp al,buffer[bx+1]jge continuexchg al,buffer[bx+1]mov buffer[bx],alcontinue: add bx,1loop loop2mov cx,diloop loop1mov ah,1;按任意键退出int 21hmov ax, 4c00程序结束,返回到操作系统系统int 21hMAIN ENDPCSEG ENDSEND MAIN中值滤波原理中值滤波是一种非线性平滑法,它对一个滑动窗口内的像素灰度值排序,并用其中值代替窗口中心像素的灰度值. 对脉冲干扰及椒盐噪声具有良好的抑制作用,并且在抑制随机噪声的同时能有效保护边缘少受模糊. 二维中值滤波的窗口形状有多种,如线状、方形、十字形、圆形、菱形等. 不同形状的窗口产生不同的滤波效果. 通过研究,不少文献认为十字中值滤波的效果优于方形的中值滤波,而且十字中值滤波也有不同的形式以形成不同的滤波特性,其数据可从方形数据获得. 最常使用的十字中值滤波是对五个相邻像素进行排序,以确定中心点的数值.I=[1
1];[M N]=size(I);I1=zeros(M,N);for 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图像进行中值滤波,得到的输出接近于灰色图像。中值滤波的算法核心就是找出中间值。对于一个3x3的块,只需要找的这样一个值:1)有4个比它小;2)有4个比它大。而不需要进行泡沫排序。对于图像的边界,一般有两种处理方法:边界扩展和不处理。为了跟具有普遍性,此IP不考虑边界问题。中值滤波器的主要开销在于line buffer,通常line buffer需要存储图像的一行像素。对于3x3块的滤波,就需要两个line buffer,这对于大尺寸图像是一笔很大的开销。我认为,对于这个问题有两种解决办法:1)和其它模块共享buffer,实际限制会比较多,也会影响系统的工作频率;2)把大图像分成小块来处理,这样做IO接口的设计会比较复杂,对于带宽也有一定影响。本文的IP为Slave模式,输入为8bit,支持断续传输。实际应用中,需要设计一个IO interface。使用了6级流水线,处理速度可以达到1pixel/cycle。作为一个IP,这个设计可能没有太多价值,毕竟实际情况千差万别。但是,我想,作为一个学习的例子还是有一些意义的,这个设计流程已经很接近工程项目了。算法实现起来比较简单,总共花费约5个工作日。第一天:找资料;第二天:写Design Spec,并实现;第三天:写c model,建立仿真环境;第四天:debug;第五天:整理。整个工程包括:RTL,testbanch,c model,Design Spec和测试向量。要求仿真工具支持verilog 2001。这里对验证环境多说一些,严格来讲,这个只能算是仿真,验证的话需要给出functioncoverage和code coverage报告。因为是没有薪水的工作,所以就不愿意做这些琐碎的事情了。凭我的直觉说应该不会有问题(千万不要对自己的老板这么说,而且bug往往出现在设计者认为不会出bug的地方)。找Bug的工作就交给大家了:)。对于仿真结果的比较,不知道为什么很多人都习惯用testbanch dump result file,然后和参考数据作比较。个人觉得这种方法非常不好,我习惯用monitor做实时比较。到了2001版本,verilog的文件操作已经做到和c一样强大了。在这个testbanch里,激励和比对文件都是二机制的。另外一个比较重要的东西就是c model了,一般在公司里都是由算法工程师给出来的(我请不起他们只有自己写了),个人认为c model不会对RTL的实现有所帮助(我从来不看他们的程序,而且我的设计都是和c model同步完成的),但是对于debug起着事半功倍的作用。一个好的c model可以给出debug所需要的所有信息。关于滤波器的实现没有太多难点,这里用的是脉动阵列结构,保证数据在你期望的时间到达就可以了。有一些信号是根据时序凑出来的,不要深究其逻辑意义。基本上基于算法的设计都遵循以下流程:先实现数据通路,然后根据数据通路来凑出控制信号.通常我看code和波形都是在debussy下面,如果你不是,应该向我学习,因为aisc工程师都是这么做的!如果你是想学习而不是拿来用的话,我建议还是自己实现的好。网络上的资源:该文件内容放在.m 文件中才能调用!!!%中值滤波函数,X为输入矩阵,a,b为中值滤波的框大小。%效率很低,可以用来说明中值滤波的概念。%Y为uint8数据类型,以便用imshow画图,否则,可以改为其它和X相同的类型。% medianforfun.mfunction [Y]=medianforfun(X,a,b)k=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);调用函数:I = imread('eight.tif');J = imnoise(I,'salt %26 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-bfunBox=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); %找到邻接矩阵排列数的中值赋值给模板的中心点调用函数:In = imread('D:\sp.jpg'); % 用P= isind('D:\sp.png')测试,发现此图片为索引图像I= rgb2gray(In); %那为何使用rgb2gray能转换,ind2gray却不能呢???imhist(I);J = imnoise(I,'salt %26 pepper',0.08);% K = medfilt2(J);imshow(J);%figure,imshow(K)Z= V0(J,3,3); %模板为3*3的矩阵,矩阵越大,计算量越大figure, imshow(Z)toc说明:计算程序运行时间的方式:程序;toc(2)matlab自带的中值滤波函数:medfilt2( )判断图像文件的类型:In = imread('D:\sp.png');P= isind('D:\sp.png')P= isrgb('D:\sp.png')效果如下:图片处理前 图片处理后3.改进版(在原版修改基础上):传统的中值滤波中“中值”一般取“中位数”,即所有元素排序后中间位置上的元素值。但是排序需要移动大量元素,效率较低。个人认为,其实原版算法主要耗时的地方之一是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(:)function data = QSort(data, low, high)if nargin == 1low = 1;high = length(data);endif(low%26high)[data pivokey] = qPartition(data, low, high);(3)if(pivokey==5) %特定情况处理,如果第一个数就是中值,那么就可以停止该循环了!enddata = QSort( data, low, pivokey - 1 );%递归调用data = QSort( data, pivokey + 1, high );end% 将数组分成两部分,前一部分的值均比后一部分值小% 返回分界点function [data low] = qPartition(data, low, high)if nargin == 1low = 1;hight = length(data);endpivokey=data(low);while low %26 highwhile low %26 high %26 data(high) %26= pivokeyhigh = high - 1;endc = data(low); d = data(high);data(low) = data(high) =while low %26 high %26 data(low) %26= pivokeylow = low + 1;endc = data(low); d = data(high);data(low) = data(high) =if(low==high%26low==5) %low与high均到达中心位置!!!!!% fprintf('ppppppppp');endend中值滤波函数: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);temp=zeros(a*b); % a*b 的方阵for i=1:M-a % matlab的坐标从(1,1)开始for j=1:N-bfunBox=X(i:i+a-1,j:j+b-1);temp=funBox(:); % A(:)矩阵A以一维数组的形式输出tempSort=qsort_main(temp); % 快速排序!!!!!p1=i+floor(a/2)+1;p2=j+floor(a/2)+1;Y(p1,p2)=tempSort(k); %找到邻接矩阵排列数的中值赋值给模板的中心点调用函数:In = imread('D:\sp.jpg'); % 用P= isind('D:\sp.png')测试,发现此图片为索引图像I= rgb2gray(In); %那为何使用rgb2gray能转换,ind2gray却不能呢???imhist(I);J = imnoise(I,'salt %26 pepper',0.08);% K = medfilt2(J);imshow(J);%figure,imshow(K)Z= V0(J,3,3); %模板为3*3的矩阵,矩阵越大,计算量越大figure, imshow(Z)toc
范文六:帽泡排序法的汇编实现。。mov cx,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 dx内循环尾外循环尾2、中值滤波中值滤汉是对某一参数连续输入N次(一般N取奇数),从中选择一个中间值作为本次采样值,若变量变化比较缓慢,采用此方法效果比较好,但对快速变化过程的参数,如流量、自然伽玛等,则不宜采用。中值滤波的C程序函数如下:float middle_filter(float middle_value [] , intcount){float sample_value,int i,for (i=1; i for(j=count-1; j>=i,--j){if(middle_value[j-1]=middle_value[j]{data=middle_value[j-1];middle_value[j-1]=middle_value[j]middle_value[j]=}}sample_value=middle_value(count-1)/2];return(sample_value);}函数假设对某一参数连续采样3次,若多次采样,可 对该函数稍作修改即可。3次采样值存储在数组middle_value[3],其中Sample-value表示有效采样值,count表示连续采样次数。FILTER3:MOV
R2,#04HSRT:MOV
R0,#SAMPLOOP:MOV A,@R0INC
@R0,ADONE:DJNZ R3,LOOPDJNZ
R2.,SORTINC
A,@R0RETSAMP
EQU 30H用汇编实现冒泡排序的函数;参数说明:_lpData是待排序的数组首地址,_dwCount是待排序的个数,_dwOption设为0则由小到大排序;如果是非0值,则是由大到小排序.;返回值:已排序数据放回原数组中.;作者:ONEPROBLEM;=================================================_BubblingSort proc _lpData,_dwCount,_dwOptionlocal @dwCountpushadmov edi,1.while edimov esi,_lpDatamov eax,_dwCountmov @dwCount,eaxsub @dwCount,edimov ebx,1.while ebxmov eax,[esi].if eaxjmp next.elseif eax>[esi+4] && _dwOption==0jmp continue.elseif eaxjmp continue.elseif eax>[esi+4] && _dwOption!=0jmp next.endifcontinue:mov eax,[esi]mov edx,[esi+4]mov [esi],edxmov [esi+4],eaxnext:add esi,4inc ebx.endwinc edi.endwpopadret_BubblingSort endpDSEG SEGMENTn equ 10BUFFER DB 9,11,2,7,21,13,2,0,14,3DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEGMAIN PROC FAR ;主程序入口mov ax, dsegmov ds, axmov cx,ndec cxloop1: mov di,cxmov bx,0loop2: mov al,buffer[bx]cmp al,buffer[bx+1]jge continuexchg al,buffer[bx+1]mov buffer[bx],alcontinue: add bx,1loop loop2mov cx,diloop loop1mov ah,1;按任意键退出int 21hmov ax, 4c00程序结束,返回到操作系统系统int 21hMAIN ENDPCSEG ENDSEND MAIN中值滤波原理中值滤波是一种非线性平滑法,它对一个滑动窗口内的像素灰度值排序,并用其中值代替窗口中心像素的灰度值. 对脉冲干扰及椒盐噪声具有良好的抑制作用,并且在抑制随机噪声的同时能有效保护边缘少受模糊. 二维中值滤波的窗口形状有多种,如线状、方形、十字形、圆形、菱形等. 不同形状的窗口产生不同的滤波效果. 通过研究,不少文献认为十字中值滤波的效果优于方形的中值滤波,而且十字中值滤波也有不同的形式以形成不同的滤波特性,其数据可从方形数据获得. 最常使用的十字中值滤波是对五个相邻像素进行排序,以确定中心点的数值.I=[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图像进行中值滤波,得到的输出接近于灰色图像。中值滤波的算法核心就是找出中间值。对于一个3x3的块,只需要找的这样一个值:1)有4个比它小;2)有4个比它大。而不需要进行泡沫排序。对于图像的边界,一般有两种处理方法:边界扩展和不处理。为了跟具有普遍性,此IP不考虑边界问题。中值滤波器的主要开销在于line buffer,通常line buffer需要存储图像的一行像素。对于3x3块的滤波,就需要两个line buffer,这对于大尺寸图像是一笔很大的开销。我认为,对于这个问题有两种解决办法:1)和其它模块共享buffer,实际限制会比较多,也会影响系统的工作频率;2)把大图像分成小块来处理,这样做IO接口的设计会比较复杂,对于带宽也有一定影响。本文的IP为Slave模式,输入为8bit,支持断续传输。实际应用中,需要设计一个IO interface。使用了6级流水线,处理速度可以达到1pixel/cycle。作为一个IP,这个设计可能没有太多价值,毕竟实际情况千差万别。但是,我想,作为一个学习的例子还是有一些意义的,这个设计流程已经很接近工程项目了。算法实现起来比较简单,总共花费约5个工作日。第一天:找资料;第二天:写Design Spec,并实现;第三天:写c model,建立仿真环境;第四天:debug;第五天:整理。整个工程包括:RTL,testbanch,c model,Design Spec和测试向量。要求仿真工具支持verilog 2001。这里对验证环境多说一些,严格来讲,这个只能算是仿真,验证的话需要给出function coverage和code coverage报告。因为是没有薪水的工作,所以就不愿意做这些琐碎的事情了。凭我的直觉说应该不会有问题(千万不要对自己的老板这么说,而且bug往往出现在设计者认为不会出bug的地方)。找Bug的工作就交给大家了:)。对于仿真结果的比较,不知道为什么很多人都习惯用testbanch dump result file,然后和参考数据作比较。个人觉得这种方法非常不好,我习惯用monitor做实时比较。到了2001版本,verilog的文件操作已经做到和c一样强大了。在这个testbanch里,激励和比对文件都是二机制的。另外一个比较重要的东西就是c model了,一般在公司里都是由算法工程师给出来的(我请不起他们只有自己写了),个人认为c model不会对RTL的实现有所帮助(我从来不看他们的程序,而且我的设计都是和c model同步完成的),但是对于debug起着事半功倍的作用。一个好的c model可以给出debug所需要的所有信息。关于滤波器的实现没有太多难点,这里用的是脉动阵列结构,保证数据在你期望的时间到达就可以了。有一些信号是根据时序凑出来的,不要深究其逻辑意义。基本上基于算法的设计都遵循以下流程:先实现数据通路,然后根据数据通路来凑出控制信号.通常我看code和波形都是在debussy下面,如果你不是,应该向我学习,因为aisc工程师都是这么做的!如果你是想学习而不是拿来用的话,我建议还是自己实现的好。网络上的资源:该文件内容放在.m 文件中才能调用!!!%中值滤波函数,X为输入矩阵,a,b为中值滤波的框大小。%效率很低,可以用来说明中值滤波的概念。%Y为uint8数据类型,以便用imshow画图,否则,可以改为其它和X相同的类型。% medianforfun.mfunction [Y]=medianforfun(X,a,b)k=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);调用函数:I = imread('eight.tif');J = imnoise(I,'salt %26 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-bfunBox=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); %找到邻接矩阵排列数的中值赋值给模板的中心点调用函数:In = imread('D:\sp.jpg'); % 用P= isind('D:\sp.png')测试,发现此图片为索引图像I= rgb2gray(In); %那为何使用rgb2gray能转换,ind2gray却不能呢???imhist(I);J = imnoise(I,'salt %26 pepper',0.08);% K = medfilt2(J);imshow(J);%figure,imshow(K)Z= V0(J,3,3); %模板为3*3的矩阵,矩阵越大,计算量越大figure, imshow(Z)toc说明:计算程序运行时间的方式:程序;toc(2)matlab自带的中值滤波函数:medfilt2( )判断图像文件的类型:In = imread('D:\sp.png');P= isind('D:\sp.png')P= isrgb('D:\sp.png')效果如下:图片处理前 图片处理后3.改进版(在原版修改基础上):传统的中值滤波中“中值”一般取“中位数”,即所有元素排序后中间位置上的元素值。但是排序需要移动大量元素,效率较低。个人认为,其实原版算法主要耗时的地方之一是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(:)function data = QSort(data, low, high)if nargin == 1low = 1;high = length(data);endif(low%26high)[data pivokey] = qPartition(data, low, high);(3)if(pivokey==5) %特定情况处理,如果第一个数就是中值,那么就可以停止该循环了!enddata = QSort( data, low, pivokey - 1 );%递归调用data = QSort( data, pivokey + 1, high );end% 将数组分成两部分,前一部分的值均比后一部分值小% 返回分界点function [data low] = qPartition(data, low, high)if nargin == 1low = 1;hight = length(data);endpivokey=data(low);while low %26 highwhile low %26 high %26 data(high) %26= pivokeyhigh = high - 1;endc = data(low); d = data(high);data(low) = data(high) =while low %26 high %26 data(low) %26= pivokeylow = low + 1;endc = data(low); d = data(high);data(low) = data(high) =if(low==high%26low==5) %low与high均到达中心位置!!!!!% fprintf('ppppppppp');endend中值滤波函数: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);temp=zeros(a*b); % a*b 的方阵for i=1:M-a % matlab的坐标从(1,1)开始for j=1:N-bfunBox=X(i:i+a-1,j:j+b-1);temp=funBox(:); % A(:)矩阵A以一维数组的形式输出tempSort=qsort_main(temp); % 快速排序!!!!!p1=i+floor(a/2)+1;p2=j+floor(a/2)+1;Y(p1,p2)=tempSort(k); %找到邻接矩阵排列数的中值赋值给模板的中心点调用函数:In = imread('D:\sp.jpg'); % 用P= isind('D:\sp.png')测试,发现此图片为索引图像I= rgb2gray(In); %那为何使用rgb2gray能转换,ind2gray却不能呢???imhist(I);J = imnoise(I,'salt %26 pepper',0.08);% K = medfilt2(J);imshow(J);%figure,imshow(K)Z= V0(J,3,3); %模板为3*3的矩阵,矩阵越大,计算量越大figure, imshow(Z)toc帽泡排序法的汇编实现。。mov cx,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 dx内循环尾外循环尾2、中值滤波中值滤汉是对某一参数连续输入N次(一般N取奇数),从中选择一个中间值作为本次采样值,若变量变化比较缓慢,采用此方法效果比较好,但对快速变化过程的参数,如流量、自然伽玛等,则不宜采用。中值滤波的C程序函数如下:float middle_filter(float middle_value [] , intcount){float sample_value,int i,for (i=1; i for(j=count-1; j>=i,--j){if(middle_value[j-1]=middle_value[j]{data=middle_value[j-1];middle_value[j-1]=middle_value[j]middle_value[j]=}}sample_value=middle_value(count-1)/2];return(sample_value);}函数假设对某一参数连续采样3次,若多次采样,可 对该函数稍作修改即可。3次采样值存储在数组middle_value[3],其中Sample-value表示有效采样值,count表示连续采样次数。FILTER3:MOV
R2,#04HSRT:MOV
R0,#SAMPLOOP:MOV A,@R0INC
@R0,ADONE:DJNZ R3,LOOPDJNZ
R2.,SORTINC
A,@R0RETSAMP
EQU 30H用汇编实现冒泡排序的函数;参数说明:_lpData是待排序的数组首地址,_dwCount是待排序的个数,_dwOption设为0则由小到大排序;如果是非0值,则是由大到小排序.;返回值:已排序数据放回原数组中.;作者:ONEPROBLEM;=================================================_BubblingSort proc _lpData,_dwCount,_dwOptionlocal @dwCountpushadmov edi,1.while edimov esi,_lpDatamov eax,_dwCountmov @dwCount,eaxsub @dwCount,edimov ebx,1.while ebxmov eax,[esi].if eaxjmp next.elseif eax>[esi+4] && _dwOption==0jmp continue.elseif eaxjmp continue.elseif eax>[esi+4] && _dwOption!=0jmp next.endifcontinue:mov eax,[esi]mov edx,[esi+4]mov [esi],edxmov [esi+4],eaxnext:add esi,4inc ebx.endwinc edi.endwpopadret_BubblingSort endpDSEG SEGMENTn equ 10BUFFER DB 9,11,2,7,21,13,2,0,14,3DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEGMAIN PROC FAR ;主程序入口mov ax, dsegmov ds, axmov cx,ndec cxloop1: mov di,cxmov bx,0loop2: mov al,buffer[bx]cmp al,buffer[bx+1]jge continuexchg al,buffer[bx+1]mov buffer[bx],alcontinue: add bx,1loop loop2mov cx,diloop loop1mov ah,1;按任意键退出int 21hmov ax, 4c00程序结束,返回到操作系统系统int 21hMAIN ENDPCSEG ENDSEND MAIN中值滤波原理中值滤波是一种非线性平滑法,它对一个滑动窗口内的像素灰度值排序,并用其中值代替窗口中心像素的灰度值. 对脉冲干扰及椒盐噪声具有良好的抑制作用,并且在抑制随机噪声的同时能有效保护边缘少受模糊. 二维中值滤波的窗口形状有多种,如线状、方形、十字形、圆形、菱形等. 不同形状的窗口产生不同的滤波效果. 通过研究,不少文献认为十字中值滤波的效果优于方形的中值滤波,而且十字中值滤波也有不同的形式以形成不同的滤波特性,其数据可从方形数据获得. 最常使用的十字中值滤波是对五个相邻像素进行排序,以确定中心点的数值.I=[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图像进行中值滤波,得到的输出接近于灰色图像。中值滤波的算法核心就是找出中间值。对于一个3x3的块,只需要找的这样一个值:1)有4个比它小;2)有4个比它大。而不需要进行泡沫排序。对于图像的边界,一般有两种处理方法:边界扩展和不处理。为了跟具有普遍性,此IP不考虑边界问题。中值滤波器的主要开销在于line buffer,通常line buffer需要存储图像的一行像素。对于3x3块的滤波,就需要两个line buffer,这对于大尺寸图像是一笔很大的开销。我认为,对于这个问题有两种解决办法:1)和其它模块共享buffer,实际限制会比较多,也会影响系统的工作频率;2)把大图像分成小块来处理,这样做IO接口的设计会比较复杂,对于带宽也有一定影响。本文的IP为Slave模式,输入为8bit,支持断续传输。实际应用中,需要设计一个IO interface。使用了6级流水线,处理速度可以达到1pixel/cycle。作为一个IP,这个设计可能没有太多价值,毕竟实际情况千差万别。但是,我想,作为一个学习的例子还是有一些意义的,这个设计流程已经很接近工程项目了。算法实现起来比较简单,总共花费约5个工作日。第一天:找资料;第二天:写Design Spec,并实现;第三天:写c model,建立仿真环境;第四天:debug;第五天:整理。整个工程包括:RTL,testbanch,c model,Design Spec和测试向量。要求仿真工具支持verilog 2001。这里对验证环境多说一些,严格来讲,这个只能算是仿真,验证的话需要给出function coverage和code coverage报告。因为是没有薪水的工作,所以就不愿意做这些琐碎的事情了。凭我的直觉说应该不会有问题(千万不要对自己的老板这么说,而且bug往往出现在设计者认为不会出bug的地方)。找Bug的工作就交给大家了:)。对于仿真结果的比较,不知道为什么很多人都习惯用testbanch dump result file,然后和参考数据作比较。个人觉得这种方法非常不好,我习惯用monitor做实时比较。到了2001版本,verilog的文件操作已经做到和c一样强大了。在这个testbanch里,激励和比对文件都是二机制的。另外一个比较重要的东西就是c model了,一般在公司里都是由算法工程师给出来的(我请不起他们只有自己写了),个人认为c model不会对RTL的实现有所帮助(我从来不看他们的程序,而且我的设计都是和c model同步完成的),但是对于debug起着事半功倍的作用。一个好的c model可以给出debug所需要的所有信息。关于滤波器的实现没有太多难点,这里用的是脉动阵列结构,保证数据在你期望的时间到达就可以了。有一些信号是根据时序凑出来的,不要深究其逻辑意义。基本上基于算法的设计都遵循以下流程:先实现数据通路,然后根据数据通路来凑出控制信号.通常我看code和波形都是在debussy下面,如果你不是,应该向我学习,因为aisc工程师都是这么做的!如果你是想学习而不是拿来用的话,我建议还是自己实现的好。网络上的资源:该文件内容放在.m 文件中才能调用!!!%中值滤波函数,X为输入矩阵,a,b为中值滤波的框大小。%效率很低,可以用来说明中值滤波的概念。%Y为uint8数据类型,以便用imshow画图,否则,可以改为其它和X相同的类型。% medianforfun.mfunction [Y]=medianforfun(X,a,b)k=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);调用函数:I = imread('eight.tif');J = imnoise(I,'salt %26 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-bfunBox=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); %找到邻接矩阵排列数的中值赋值给模板的中心点调用函数:In = imread('D:\sp.jpg'); % 用P= isind('D:\sp.png')测试,发现此图片为索引图像I= rgb2gray(In); %那为何使用rgb2gray能转换,ind2gray却不能呢???imhist(I);J = imnoise(I,'salt %26 pepper',0.08);% K = medfilt2(J);imshow(J);%figure,imshow(K)Z= V0(J,3,3); %模板为3*3的矩阵,矩阵越大,计算量越大figure, imshow(Z)toc说明:计算程序运行时间的方式:程序;toc(2)matlab自带的中值滤波函数:medfilt2( )判断图像文件的类型:In = imread('D:\sp.png');P= isind('D:\sp.png')P= isrgb('D:\sp.png')效果如下:图片处理前 图片处理后3.改进版(在原版修改基础上):传统的中值滤波中“中值”一般取“中位数”,即所有元素排序后中间位置上的元素值。但是排序需要移动大量元素,效率较低。个人认为,其实原版算法主要耗时的地方之一是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(:)function data = QSort(data, low, high)if nargin == 1low = 1;high = length(data);endif(low%26high)[data pivokey] = qPartition(data, low, high);(3)if(pivokey==5) %特定情况处理,如果第一个数就是中值,那么就可以停止该循环了!enddata = QSort( data, low, pivokey - 1 );%递归调用data = QSort( data, pivokey + 1, high );end% 将数组分成两部分,前一部分的值均比后一部分值小% 返回分界点function [data low] = qPartition(data, low, high)if nargin == 1low = 1;hight = length(data);endpivokey=data(low);while low %26 highwhile low %26 high %26 data(high) %26= pivokeyhigh = high - 1;endc = data(low); d = data(high);data(low) = data(high) =while low %26 high %26 data(low) %26= pivokeylow = low + 1;endc = data(low); d = data(high);data(low) = data(high) =if(low==high%26low==5) %low与high均到达中心位置!!!!!% fprintf('ppppppppp');endend中值滤波函数: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);temp=zeros(a*b); % a*b 的方阵for i=1:M-a % matlab的坐标从(1,1)开始for j=1:N-bfunBox=X(i:i+a-1,j:j+b-1);temp=funBox(:); % A(:)矩阵A以一维数组的形式输出tempSort=qsort_main(temp); % 快速排序!!!!!p1=i+floor(a/2)+1;p2=j+floor(a/2)+1;Y(p1,p2)=tempSort(k); %找到邻接矩阵排列数的中值赋值给模板的中心点调用函数:In = imread('D:\sp.jpg'); % 用P= isind('D:\sp.png')测试,发现此图片为索引图像I= rgb2gray(In); %那为何使用rgb2gray能转换,ind2gray却不能呢???imhist(I);J = imnoise(I,'salt %26 pepper',0.08);% K = medfilt2(J);imshow(J);%figure,imshow(K)Z= V0(J,3,3); %模板为3*3的矩阵,矩阵越大,计算量越大figure, imshow(Z)toc
范文七:均值滤波算法:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度。有效抑制加性噪声,但容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理。[cpp] view plaincopy%x是需要滤波的图像,n是模板大小(即n×n)function d=avg_filter(x,n)a(1:n,1:n)=1;
%a即n×n模板,元素全是1[height, width]=size(x);
%输入图像是hightxwidth的,且hight>n,width>nx1=double(x);x2=x1;for i=1:hight-n+1for j=1:width-n+1c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘s=sum(sum(c));
%求c矩阵中各元素之和x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将与模板运算后的各元素的均值赋给模板中心位置的元素endend%未被赋值的元素取原值d=uint8(x2);中值滤波:基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,一般为方形邻域,也可以为圆形、十字形等等,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值,这里领域被称为窗口,当窗口移动时,利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。很容易自适应化[cpp] view plaincopy%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)function d=mid_filter(x,n)[height, width]=size(x);
%输入图像是p×q的,且p>n,q>nx1=double(x);x2=x1;for i=1:height-n+1for j=1:height-n+1c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)e=c(1,:);
%是c矩阵的第一行for u=2:ne=[e,c(u,:)];
%将c矩阵变为一个行矩阵endmm=median(e);
%mm是中值x2(i+(n-1)/2,j+(n-1)/2)=
%将模板各元素的中值赋给模板中心位置的元素endend%未被赋值的元素取原值d=uint8(x2);
范文八:均值滤波与自适应中值滤波的仿真与实现摘 要 图像是一种重要的信息源,通过图像处理可以帮助人们了解信 息的内涵,然而在图像使用和传输过程中,不可避免会受到噪声的干 扰,因此为了恢复原始图像,达到好的视觉效果,需要对图像进行滤 波操作。根据噪声种类不同,可以采用不同的滤波方法,均值滤波是 典型的线性滤波算法,能够有效滤波图像中的加性噪声,而中值滤波 器是能够有效滤除脉冲噪声的非线性滤波器, 但传统中值滤波去脉冲 噪声的性能受滤波窗口尺寸的影响较大, 在抑制图像噪声和保护细 节两方面存在矛盾。 本文首先对不同均值滤波器在处理不同噪声方面 的优缺点进行了分析, 然后分别用中值滤波器和自适应中值滤波器对 被椒盐噪声污染的图像进行了滤波操作, 发现自适应中值滤波方法不 仅可以有效滤波椒盐噪声, 同时还可以有效地克服中值滤波器造成图 像边缘模糊的缺点。 1. 均值滤波 均值滤波是典型的线性滤波算法, 它是指在图像上对目标像素给 一个模板,该模板包括了其周围的临近像素点和其本身像素点。再用 模板中的全体像素的平均值来代替原来像素值。 均值滤波也称为线性 滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均 值代替原图像中的各个像素值,即对待处理的当前像素点(x,y), 选择一个模板,该模板由其邻近的若干像素组成,求模板中所有像素阅读详情:的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该 点上的灰度值 g(x,y),即 g(x,y)=1/m ∑f(x,y), m 为该 模板中包含当前像素在内的像素总个数。 均值滤波能够有效滤除图像 中的加性噪声,但均值滤波本身存在着固有的缺陷,即它不能很好地 保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使 图像变得模糊。均值滤波主要有算术均值滤波,几何均值滤波,谐波 均值滤波以及逆谐波均值滤波,本文只对算术均值滤波,几何均值滤 波和逆谐波均值滤波进行研究。 其中几何均值滤波器所达到的平滑度 可以与算术均值滤波器相比,但在滤波过程中丢失更少的图象细节。 逆谐波均值滤波器更适合于处理脉冲噪声,但它有个缺点,就是必须 要知道噪声是暗噪声还是亮噪声,以便于选择合适的滤波器阶数符号, 如果阶数的符号选择错了可能会引起灾难性的后果。 下面分别对算术 平均滤波, 几何平均滤波和逆谐波均值滤波对不同噪声的滤波效果进 行仿真分析。阅读详情:1.1 算术平均滤波,几何平均滤波和逆谐波均值滤波对高斯噪声 进行滤波A原始图像 B 高斯噪声污染的图像 C 用 3x3算 术 均 值 滤波 器 滤 波 后 图 像D 用 3x3几 何 均 值 滤 波 器 滤 波 后 图 像E Q=-1.5的 逆 谐 波 滤 波 器 滤 波 后 图 像F Q=1.5的 逆 谐 波 滤 波 器 滤 波 后 图 像图一 均值滤波(高斯噪声) 如图一所示,图 A 为原始图像,图 B 为被高斯噪声污染的图 像,图 C 为用 3x3 算术均值滤波处理后的图像,图 D 为用 3x3 几 何均值滤波处理后的图像,图 E 为用 Q=-1.5 的逆谐波均值滤波处 理后的图像,图 F 为用 Q=1.5 的逆谐波均值滤波处理后的图像。 与图 B 进行比较,图 C,D,E,F 经均值滤波处理后视觉效果明显改 善,说明均值滤波能有效滤除图像中的高斯噪声。将图 C,D,E 与 图 A 进行对比可以看出,对图像进行均值滤波后,图像细节处变 得模糊了,说明均值滤波在去除噪声的同时也破坏了图像的细节 部分。将图 C 与图 D 进行对比,可以发现,图 D 中的细节部分保 留得较多,说明几何均值滤波与算术均值滤波器相比,在滤波过程 中丢失更少的图像细节。将图 E,图 F 与图 A 进行对比可以发现, 当 Q 为正数时,处理后图像中黑色线条比原图变细了,当 Q 为负 数时,处理后图像中黑色线条比原图变粗了,说明当 Q 为正数时,阅读详情:逆谐波滤波器会从黑色物体边缘移走一些黑色像素,而当 Q 为负 数时,逆谐波滤波器会从亮色物体边缘移走一些白色像素。 1.2 算术平均滤波, 几何平均滤波和逆谐波均值滤波对椒盐噪声进 行滤波A原始图像 B 椒盐噪声污染的图像 C 用 3x3算 术 均 值 滤 波 器 滤 波 后 图 像D 用 3x3几 何 均 值 滤 波 器 滤 波 后 图 像E Q=-1.5的 逆 谐 波 滤 波 器 滤 波 后 图 像F Q=1.5的 逆 谐 波 滤 波 器 滤 波 后 图 像图二 均值滤波(椒盐噪声) 如图二所示,图 A 为原始图像,图 B 为被椒盐噪声污染的图 像,图 C 为用 3x3 算术均值滤波处理后的图像,图 D 为用 3x3 几 何均值滤波处理后的图像,图 E 为用 Q=-1.5 的逆谐波均值滤波处 理后的图像,图 F 为用 Q=1.5 的逆谐波均值滤波处理后的图像。 与图 B 进行比较,图 C,D,E,F 经均值滤波处理后的图像中仍有很 多噪声点,椒盐噪声并没有完全去除,并且滤波后图像比原图要 模糊,说明均值滤波不能很好的滤除椒盐噪声,这是因为椒盐噪 声是幅值近似相等但随机分布在不同位置上,图像中有暗点也有 亮点。且其噪声的均值不为 0,所以均值去滤波不能很好地除噪声 点。将图 E,F 分别于图 B 进行对比可以发现,当 Q 为负数时,图 B 中的“盐噪声” (亮点)被滤除了,但“胡椒” (黑点)噪声保留阅读详情:了下来;当 Q 为正数时,图 B 中的“胡椒噪声”被滤除了,但“盐” 噪声保留了下来。说明当 Q 为正数时,逆谐波均值滤波对“胡椒” 噪声有很好的滤除作用,当 Q 为负数时,逆谐波均值滤波对“盐” 噪声有很好的滤除作用。但逆谐波均值滤波不能同时滤除“胡椒” 噪声和“盐”噪声,因为 Q 值在一次处理过程中是确定的。 1.3 算术平均滤波, 几何平均滤波和逆谐波均值滤波对均匀分布噪 声进行滤波A原始图像 B 均匀分布噪声污染的图像 C 用 3x3算 术 均 值 滤 波 器 滤 波 后 图 像D 用 3x3几 何 均 值 滤 波 器 滤 波 后 图 像E Q=-1.5的 逆 谐 波 滤 波 器 滤 波 后 图 像F Q=1.5的 逆 谐 波 滤 波 器 滤 波 后 图 像图三 均值滤波(均匀分布噪声) 如图三所示,图 A 为原始图像,图 B 为被均匀分布噪声污染 的图像,图 C 为用 3x3 算术均值滤波处理后的图像,图 D 为用 3x3 几何均值滤波处理后的图像,图 E 为用 Q=-1.5 的逆谐波均值滤波 处理后的图像,图 F 为用 Q=1.5 的逆谐波均值滤波处理后的图像。 与图 B 进行比较,图 C,D,E,F 经均值滤波处理后的图像,噪声分量 明显减少了,图像效果有了很大改善,说明均值滤波能有效滤除 图像中的均匀分布噪声。 1.4 结论阅读详情:(1)均值滤波对高斯噪声和均匀分布噪声的抑制作用是比较好 的,但对椒盐噪声的影响不大,在削弱噪声的同时整幅图像总体 也变得模糊,其噪声仍然存在。 (2)经均值滤波处理后的图像边缘和细节处模糊变得模糊,说明 均值滤波在去除噪声的同时也破坏了图像的细节部分。 (3)逆谐波均值滤波器能够减少和消除图像中的椒盐噪声。当 Q 为正数时,逆谐波均值滤波对“胡椒”噪声有很好的滤除作用, 当 Q 为负数时,逆谐波均值滤波对“盐”噪声有很好的滤除作用。 但逆谐波均值滤波不能同时滤除“胡椒”噪声和“盐”噪声。 2. 中值滤波 中值滤波是一种常用的非线性平滑滤波器,其基本原理是把 数字图像或数字序列中一点的值用该点的一个邻域中各点值的中 值来替换,其主要功能是让周围像素灰度值差别比较大的像素改 取与周围的像素值接近的值,从而可以消除孤立的噪声点,所以中 值滤波对于滤除图像的椒盐噪声非常有效。常规中值滤波器对长 拖尾概率分布的噪声能起到良好的平滑效果。不仅如此,它在消 除噪声的同时还具有保护边界信息的优点,对图像中的某些细节 起到保护作用,因而在图像去噪处理中得到了比较广泛的应用。 但是常规中值滤波去脉冲噪声的性能受滤波窗口尺寸的影响较 大,而且它在抑制图像噪声和保护细节两方面存在一定的矛盾:取 的滤波窗口越小,就可较好地保护图像中某些细节,但滤除噪声 的能力会受到限制;反之,取的滤波窗口越大就可加强噪声抑制阅读详情:能力,但对细节的保护能力会减弱。这种矛盾在图像中噪声干扰 较大时表现得尤为明显。根据经验:在脉冲噪声强度大于 0.2 时 常规中值滤波的效果就显得不令人满意了。但是由于常规中值滤 波器所使用的滤波窗口大小是固定不变的,所以我们在选择窗口 大小和保护细节两方面只能做到二选一,这样矛盾始终得不到解 决。因此,单单采用常规中值滤波的方法在图像去噪应用中是远 远不够的,这就需要寻求新的改进算法来解决这一矛盾。 自适应 中值滤波器的滤波方式和常规的中值滤波器一样,都使用一个矩 形区域的窗口 Sxy,不同的是在滤波过程中,自适应滤波器会根据 一定的设定条件改变(即增加)滤波窗的大小,同时当判断滤波窗 中心的像素是噪声时,该值用中值代替,否则不改变其当前像素 值。这样用滤波器的输出来替代像素(x,y)处(即目前滤波窗中心 的坐标)的值。自适应中值滤波器可以处理噪声概率更大的脉冲噪 声,同时能够更好地保持图像细节,这是常规中值滤波器做不到 的。下面我们分别用常规中值滤波和自适应中值滤波对被椒盐噪 声污染的图像进行滤波后的效果进行分析。 2.1 利用中值滤波对被椒盐噪声污染的图像进行滤波阅读详情:A原始图像B 被椒盐噪声污染的图像C常规中值滤波后的图像D自适应中值滤波后的图像图四 中值滤波 如图四所示,图 A 是原始图像,图 B 是加了椒盐噪声的图像, 图 C 是经过常规中值滤波器滤波后的图像, D 是自适应中值滤波后 图 的图像。将图 C,D 与图 B 进行对比可以看出,中值滤波对滤除椒盐 图像噪声效果比较明显。将图 C 与图 D 进行对比可以看出,利用自适 应中值滤波滤除椒盐噪声效果明显好于常规中值滤波, 自适应中值滤 波克服了中值滤波不能有效的保持图像细节的问题。 在去除图像椒盐 噪声的同时,还能够保持图像比较清晰的轮廓。自适应中值滤波器能 够很好的处理图像的细节和边缘,使图像更加细腻,清晰,给人以良 好的视觉冲击。 2.2 结论 (1)中值滤波对去除“椒盐”噪声可以起到很好的效果,因为椒盐噪 声只在画面中的部分点上随机出现,所以根据中值滤波原理可知,通 过数据排序的方法,将图像中未被噪声污染的点代替噪声点的值的概 率比较大,因此噪声的抑制效果很好。阅读详情:(2)中值滤波与均值滤波相比,在去除图像椒盐噪声的同时?还能 够保持图像比较清晰的轮廓。 (3)自适应中值滤波器与常规中值滤波相比,能够更好的处理图像 的细节和边缘,使图像更加细腻,清晰,给人以良好的视觉冲击。 在图像处理过程中,消除图像的噪声干扰是一个非常重要的问题, 本文利用matlab 软件,采用中值和均值滤波的方式,对带有椒盐噪声 的图像进行处理,经过滤波后的图像既适合人眼的视觉感觉又能够消 除图像中的干扰影响。 通过本次试验我们可以看到中值滤波对于滤除 图像的“椒盐”噪声非常有效,它可以做到既去除噪声又能保护图像 的边缘,从而获得较满意的复原效果,尤其在滤除叠加白噪声和长尾 叠加噪声方面显出极好的性能。但均值滤波效果一般。因此中值滤波 是图像处理所不可缺少的,许多类型的图像噪声都可以利用中值滤波 法加以除噪。 3. MATLAB 程序3.1.I=imread('dianlu.tif'); subplot(231),imshow(I);title('A 原始图像'); I1=double(imnoise(I,'gaussian',0.06)); subplot(232),imshow(I1,[]);title('B 高斯噪声污染的图像'); I2=imfilter(I1,fspecial('average',3)); subplot(233),imshow(I2,[]);title('C 用3x3均值滤波器滤波后图像'); I3=exp(imfilter(log(I1),fspecial('average',3))); subplot(234),imshow(I3,[]);title('D 用3x3几何滤波器滤波后图像'); Q=-1.5; I4=imfilter(I1.^(Q+1),fspecial('average',3))./imfilter(I1.^Q,fspecial('average',3)); Q=1.5; I5=imfilter(I1.^(Q+1),fspecial('average',3))./imfilter(I1.^Q,fspecial('average',3)); subplot(235),imshow(I4,[]);title('E Q=-1.5逆谐波滤波器滤波后图像'); subplot(236),imshow(I5,[]);title('F Q=1.5逆谐波滤波器滤波后图像');阅读详情:3.2.I=imread('dianlu.tif'); subplot(231),imshow(I);title('A 原始图像'); I1=double(imnoise(I,'salt & pepper',0.02)); subplot(232),imshow(I1,[]);title('B 椒盐噪声污染的图像'); I2=imfilter(I1,fspecial('average',3)); subplot(233),imshow(I2,[]);title(' C 用3x3均值滤波器滤波后图像'); I3=exp(imfilter(log(I1),fspecial('average',3))); subplot(234),imshow(I3,[]);title(' D 用3x3几何滤波器滤波后图像'); Q=-1.5; I4=imfilter(I1.^(Q+1),fspecial('average',3))./imfilter(I1.^Q,fspecial('average',3)); Q=1.5; I5=imfilter(I1.^(Q+1),fspecial('average',3))./imfilter(I1.^Q,fspecial('average',3)); subplot(235),imshow(I4,[]);title(' E Q=-1.5逆谐波滤波器滤波后图像'); subplot(236),imshow(I5,[]);title(' F Q=1.5逆谐波滤波器滤波后图像'); 3.3.I=imread('dianlu.tif'); subplot(231),imshow(I);title(' A 原始图像'); I1=double(imnoise(I,'speckle',0.05)); subplot(232),imshow(I1,[]);title(' B 均匀分布噪声污染的图像'); I2=imfilter(I1,fspecial('average',3)); subplot(233),imshow(I2,[]);title(' C 用3x3均值滤波器滤波后图像'); I3=exp(imfilter(log(I1),fspecial('average',3))); subplot(234),imshow(I3,[]);title(' D 用3x3几何滤波器滤波后图像'); Q=-1.5; I4=imfilter(I1.^(Q+1),fspecial('average',3))./imfilter(I1.^Q,fspecial('average',3)); Q=1.5; I5=imfilter(I1.^(Q+1),fspecial('average',3))./imfilter(I1.^Q,fspecial('average',3)); subplot(235),imshow(I4,[]);title(' E Q=-1.5逆谐波滤波器滤波后图像'); subplot(236),imshow(I5,[]);title(' F Q=1.5逆谐波滤波器滤波后图像'); 3.4.I=imread('dianlu.tif'); J=imnoise(I,'salt & pepper',0.1); [m,n]=size(J); F=zeros(m,n); for i=1:m for j=1:n if J(i,j)>190 F(i,j)=1; end if J(i,j)阅读详情:R = medfilt2(J); R1=R; for i=1:m for j=1:n if F(i,j)==0 R1(i,j)=J(i,j); end end end subplot(2,2,1);imshow(I);title('A原始图像'); subplot(2,2,2);imshow(J); title('B 被椒盐噪声污染的图像'); subplot(2,2,3);imshow(R);title('C 常规中值滤波后的图像'); subplot(2,2,4);imshow(R1);title('D 自适应中值滤波后的图像');
范文九:数字图像处理作业(中值滤波&均值滤波)1中值滤波1.1、中值滤波原理:中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)},其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。1.2、实现方法:(1)通过从图像中的某个采样窗口取出奇数个数据进行排序;(2)用排序后的中值取代要处理的数据即可;1.3、matlab程序(zhongzhilvbo.m)I=imread('I3_256.bmp');figure,imshow(I),title('原始图象');J=imnoise(I,'salt&pepper',0.02);imshow(J);title('噪声干扰图像')X=J;a=3;b=3;%3*3的邻域%求出中值,即k=5%求出输入图像的行数M和列数Nk=floor(a*b/2)+1;[M,N]=size(X);uint8Y=zeros(M,N);funBox=zeros(a,b);temp=zeros(a*b);%X(a:b,c:d)表示A矩阵的第a到b行,第c到d列的所有元素fori=1:M-aforj=1:N-bfunBox=X(i:i+a,j:j+b);funboxtemp=funBox(:);tempSort=sort(temp);Y(i,j)=tempSort(k);%把图像中的一个3*3领域赋给%把领域中的每个元素赋给temp%对其中的像素值进行排序%将模板的中值(k=5)赋给模板中心位置的元素figure,imshow(Y);title('中值滤波图像')1.4、结果:2均值滤波2.1、均值滤波原理均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个象素,构成一个滤波模板,即去掉目标象素本身)。再用模板中的全体像素的平均值来代替原来像素值。2.2、实现方法均值滤波也称为线性滤波,其采用的主要方法为领域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m∑f(x,y)m为该模板中包含当前像素在内的像素总个数。2.3、matlab程序(junzhilvbo.m)c=imread('I3_256.bmp');%把彩色图片转化成灰度图片,256级figure,imshow(c),title('原始图象');%显示原始图象g=imnoise(c,'salt&pepper',0.02);%加入椒盐噪声噪声figure,imshow(g),title('加入椒盐噪声之后的图象');%显示加入高斯噪声之后的图象n=3;a(1:n,1:n)=1;p=size(g);x1=double(g);%a即n×n模板,元素全是1%输入图像是p×q的,且p>n,q>nx2=x1;%A(a:b,c:d)表示A矩阵的第a到b行,第c到d列的所有元素fori=1:p(1)-n+1forj=1:p(2)-n+1c=x1(i:i+(n-1),j:j+(n-1)).*a;%取出x1中从(i,j)开始的n行n列元素与模板相乘s=sum(sum(c));%求c矩阵(即模板)中各元素之和x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n);%将模板各元素的均值赋给模板中心位置的元素endend%未被赋值的元素取原值d=uint8(x2);figure,imshow(d),title('均值滤波后的图像');%显示均值滤波后的图象2.4、结果3结论中值滤波器对处理椒盐噪声非常有效,因为这种噪声是以黑白点叠加在图像上的。经均值滤波器处理后的图像肃然可见噪声更少,但是所付出的代价是图像变得模糊了。在这种情况下综合考虑可以得出,中值滤波器要远远优于均值滤波器。通常,中值滤波器比均值滤波器更适合去除椒盐噪声。
范文十:均值滤波和中值滤波的比较分析一、图像系统中的常见噪声一般在图像中常见的噪声有:1、按噪声幅度分布形状而分,成高斯分布的称为高斯噪声,主要由阻性元器件内部产生。2、按噪声和信号之间的关系分为加性噪声和乘性噪声。加性噪声与输入图像信号无关,含噪图像可表示为f(x,y)?g(x,y)?n(x,y)。乘性噪声往往随图像信号的变化而变化其含噪图像可表示为f(x,y)?g(x,y)?n(x,y)g(x,y)3、椒盐(Salt and pepper)噪声:主要是图像切割引起的黑图像上的白点噪声或光电转换过程中产生泊松噪声。4、量化噪声:此类噪声与输入图像信号无关,是量化过程存在量化误差,再反映到接收端而产生,其大小显示出数字图像和原始图像差异。本文为了分析不同去噪方法的应用范围,将原图像分别加入高斯噪声及椒盐噪声,运用Matalab编程实现两种不同滤波方法的去噪结果,并据此进行比较得出相应结论。下面几幅图为本文所选用的经过灰度变换后得到的图像、添加椒盐噪声和高斯噪声后的图像:二.去噪的两种常用方法1.均值滤波均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。其基本原理是用均值替代原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y) ,作为处理后图像在该点上的灰度g(x,y) ,即g(x,y)?1M?f?sf(x,y),其中,s为模板,M为该模板中包含当前像素在内的像素总个数。如下即分别为用中值滤波对加有高斯噪声、椒盐噪声、的图像处理后的对比图:2.中值滤波中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。其实现原理如下:将某个像素邻域中的像素按灰度值进行排序,然后选择该序列的中间值作为输出的像素值,让周围像素灰度值的差比较大的像素改取与周围的像素值接近的值,从而可以消除孤立的噪声点。其具体的操作是:首先确定一个以某个像素为中心点的领域,一般为方形领域(如3 * 3、5 * 5的矩形领域),然后将领域中的各个像素的灰度值进行排序。 假设其排序为:x1?x2?x3...?xn,Y?Med{x1,x2,x3,xn}?x((1?n)/2),n为奇数,取排好序的序列的Y?Med{x1,x2,x3,xn}?1/2?[x(n/2)?x((1?n)/2)],n为偶数,中间值作Y为中心点像素灰度的新值,这里的邻域通常被称为窗口。当窗口在图像中上下左右进行移动后,利用中值滤波算法可以很好地对图像进行平滑处理。 如下即分别为用中值滤波对加有高斯噪声、椒盐噪声的图像处理后的对比图:三.结果对比与分析根据以上实验结果进行对比分析,可以得出以下结论:(1)对于均值滤波, 由以上处理后的图像可以看到:均值滤波对高斯噪声的抑制是比较好的,处理后的图像边缘模糊较少。但对椒盐噪声的影响不大,因为在削弱噪声的同时整幅图像内容总体也变得模糊,其噪声仍然存在。(2)对于中值滤波,由图像处理的结果可以看出,它只影响了图像的基本信息,说明中值滤波对高斯噪声的抑制效果不明显。这是因为高斯噪声使用随机大小的幅值污染所有的点,因此无论怎样进行数据选择,得到的始终还是被污染的值。而由图还可以看出,中值滤波对去除“椒盐”噪声可以起到很好的效果,因为椒盐噪声只在画面中的部分点上随机出现,所以根据中值滤波原理可知,通过数据排序的方法,将图像中未被噪声污染的点代替噪声点的值的概率比较大,因此噪声的抑制效果很好,同时画面的轮廓依然比较清晰。由此看来,对于椒盐噪声密度较小时,尤其是孤立噪声点,用中值滤波的效果非常好的。均值滤波对高斯噪声有较好的抑制作用,而对于椒盐噪声的处理中值滤波要略微有优势。

我要回帖

更多关于 图像滤波 的文章

 

随机推荐