中值滤波快速算法&菱形窗口matlab实现

合集下载

一种快速并行中值滤波算法的实现

一种快速并行中值滤波算法的实现

Micr ocomputer Applica tions V ol.27,No.8,2011开发应用微型电脑应用2011年第27卷第8期5文章编号:1007-757X(2011)08-0050-03一种快速并行中值滤波算法的实现辛月兰摘要:介针对传统中值滤波算法计算量大、耗时较长的缺点提出了一种快速并行中值滤波算法。

对于3×3滑动窗口,窗口的9个数据是并行传给计算比较模块的,第二级的计算也是并行进行的。

新算法有效减少了重复比较操作的执行,同时也大幅减少了比较次数。

对于3×3滑动窗口,新算法的比较次数为13次,相对于传统中值滤波的30次,比较次数少了2倍多。

比较次数的减少,意味着算法复杂度的降低和图像滤波处理速度的提高。

并且通过仿真实验可知,对于椒盐噪声的滤除,算法能够达到与中值滤波同样的视觉处理效果。

关键词:并行处理;中值滤波;预处理;快速算法;图像处理中图分类号:0246文献标志码:A0引言实际图像在采集、形成、传输过程中,不可避免会受到噪声干扰,严重影响视觉效果,对后续的边缘检测、图像分割、特征提取、模式识别等产生影响。

因此,去噪是一项非常重要的预处理步骤[1]。

中值滤波是一种常用的抑制噪声的非线性方法,它可以克服线性滤波如最小均方滤波和均值滤波给图像边缘带来的模糊,从而获得较为满意的复原效果;它能较好地保护边界,对于消除图像的椒盐噪声非常有效,但有时会失掉图像中的细线和小块的目标区域[2-3]。

理想的滤波算法应该只对噪声点进行处理,而保留信号灰度值不变。

Sun and Neuvo[4]和Florencio and Schafer[5]分别提出了开关中值滤波的方法,更好地保留了图像细节,但噪声点判断方法是通过假定噪声水平上的硬阈值方法,使得其推广能力受到了限制。

H.L.Eng 和K.K.Ma[6]提出噪声自适应软开关中值滤波(NASM)算法,它是一种软阈值的判断方法,这种算法自适应性虽然比其它的开关中值滤波算法强,但其计算时间随噪声密度的增大而增加,如当噪声密度为70%时,NASM 算法所用的时间大约为中值滤波算法的17倍,因此不能满足实时图像处理。

数字图像处理之快速中值滤波算法

数字图像处理之快速中值滤波算法

数字图像处理之快速中值滤波算法快速中值滤波算法 : 在图像处理中,在进⾏如边缘检测这样的进⼀步处理之前,通常需要⾸先进⾏⼀定程度的降噪。

中值滤波是⼀种⾮线性数字滤波器技术,经常⽤于去除图像或者其它信号中的噪声。

这个设计思想就是检查输⼊信号中的采样并判断它是否代表了信号,使⽤奇数个采样组成的观察窗实现这项功能。

观察窗⼝中的数值进⾏排序,位于观察窗中间的中值作为输出。

然后,丢弃最早的值,取得新的采样,重复上⾯的计算过程。

中值滤波是图像处理中的⼀个常⽤步骤,它对于斑点噪声和椒盐噪声来说尤其有⽤。

保存边缘的特性使它在不希望出现边缘模糊的场合也很有⽤。

为了演⽰中值滤波器的⼯作过程,我们给下⾯的数组加上观察窗 3 ,重复边界的数值: x = [2 80 6 3] y[1] = Median[2 2 80] = 2 y[2] = Median[2 80 6] = Median[2 6 80] = 6 y[3] = Median[80 6 3] = Median[3 6 80] = 6 y[4] = Median[6 3 3] = Median[3 3 6] = 3 于是 y = [2 6 6 3] 其中 y 是 x 的中值滤波输出。

普通中值滤波算法伪代码: Input: image X of size m*n, kernel radius r. output: image Y as X. for i = r to m - r do for j = r to n - r do initialize list A[] for a = i-r to i+r for b = j-r to j+r add X(a, b) to A[] end end sort A[] then Y(i ,j) = A[A.size/2] end end 处理前: 处理后: 但是,上述算法在像素处理处的复杂度为O(r2). OpenCV实现代码:#include "cv.h"#include "highgui.h"#include <iostream>using namespace std;using namespace cv;int main(int argc, char* argv[]){Mat src = imread("beauty.jpg");Mat dst;//参数是按顺序写的//⾼斯滤波//src:输⼊图像//dst:输出图像//Size(5,5)模板⼤⼩,为奇数//x⽅向⽅差//Y⽅向⽅差GaussianBlur(src,dst,Size(5,5),0,0);imwrite("gauss.jpg",dst);//中值滤波//src:输⼊图像//dst::输出图像//模板宽度,为奇数medianBlur(src,dst,3);imwrite("med.jpg",dst);//均值滤波//src:输⼊图像//dst:输出图像//模板⼤⼩//Point(-1,-1):被平滑点位置,为负值取核中⼼blur(src,dst,Size(3,3),Point(-1,-1));imwrite("mean.jpg",dst);//双边滤波//src:输⼊图像//dst:输⼊图像//滤波模板半径//颜⾊空间标准差//坐标空间标准差bilateralFilter(src,dst,5,10.0,2.0);//这⾥滤波没什么效果,不明⽩imwrite("bil.jpg",dst);waitKey();return0;}View Code 快速中值滤波算法: O(r)复杂度的Huang算法:<> 这个代码的核⼼在于维护⼀个kernel直⽅图,可以实现快速的读取和删除扫描区域的像素值。

中值滤波的快速算法

中值滤波的快速算法

中值滤波的快速算法
中值滤波的快速算法有很多种,常见的有以下几种:
1. 快速排序算法:使用快速排序对滤波窗口中的像素值进行排序,然后取排序后的中间值作为滤波结果。

这种算法时间复杂度为O(nlogn),其中n是滤波窗口的大小。

2. 快速选择算法:快速选择算法是一种改进的快速排序算法。

它不需要完全对滤波窗口进行排序,而是通过选择一部分元素进行比较,找到第k小的值。

这种算法时间复杂度为O(n),
其中n是滤波窗口的大小。

3. 堆排序算法:使用堆数据结构对滤波窗口中的像素值进行排序,然后取堆顶元素作为滤波结果。

这种算法时间复杂度为
O(nlogn),其中n是滤波窗口的大小。

4. 快速中值滤波算法:该算法使用线性时间的中值搜索算法,通过选择一个约束条件,将滤波窗口中的像素分成两个部分,然后在这两个部分中搜索中值。

这种算法时间复杂度为O(n),其中n是滤波窗口的大小。

以上是常见的几种中值滤波的快速算法,根据实际应用场景和需求可以选择适合的算法。

中值滤波算法

中值滤波算法

中值滤波算法本文提出一种中值滤波算法,该算法充分地利用相邻两次中值滤波窗口内数据的相关性。

中值滤波算法在运算过程中通过对有序序列快速的对半查找和内插操作,重构有序序列,占L面得到各中值算法很大地提高了运算效率-计算机模拟寝明该方法是有效的。

在数字信号处理中,经常会遇到对信号数据作平滑处理。

局部平均滤波是常用的一种算法,若是对具有随机脉冲噪声的信号进行处理,虽然脉冲噪声有所衰减,但它对滤波结果仍有显著的影响。

中值滤波却是对窗内数据进行大小的排序,取结果的中间项对应的值,这样脉冲噪声就不起作用,不影响中值结果 所以,中值滤波在有随机脉冲噪声的情况下,能较好地保护原始信号。

中值滤波的主要运算就是对窗口内的信号数据序列进行排序。

文[4]提出的二维中值滤波快速算法,只适用于幅度量化级为极其有限的数据(如:数字图象处理中的象素幅度,若是用单字节(8位二进制存贮单元)存放,共有28=256个灰度级),原因是要给每个量化级设置一个作为计数器的存贮单元。

文[5—8]的方法也是针对于幅度量化级为有限的数据。

若是数据为任意大小或精度的浮点数,则以上的方法不适用,通常采用每次对窗内数据排序并输出相应的中值。

假设原始信号数据序列的长度为 ,表示为{ (O),x(1),⋯,x(M-1)},窗口长度为2^r+1,表示为{ (O), (1),⋯, (2Ⅳ)},共需要 一2N次对长度为2N+l的窗内数据序列分别进行排序。

要进行排序,就必须对序列中数据元索做比较和交换.数据元素问的比较次数是影响排序速度的一个重要因素。

一般认为,对 个元素进行排序时,所需的比较次数在理论上的最小值为 0(n|og。

n) 当原始信号数据序列较长或窗口较大时,用这种传统中值滤波方法是十分费时的。

文[9]提出把相邻两次的中值滤波合并为一次进行,只做一次排序。

从而,总的排序次数减少一半,运算时间节省约一半本文提出一种中值滤波的快速算法,避免了反复对无序序列排序,而只对有序序列进行数据元素的快速查找和内插,实现中值滤波.中值滤波的快速算法本文提出的中值滤波的快速算法的基本思想是:原始数据序列上中值滤波的滑窗在移动过程中,当前窗只要删除其最早的元素,加入窗后的新元素,即成为下一窗的内容。

基于FPGA的快速中值滤波算法实现

基于FPGA的快速中值滤波算法实现

• 98•武汉迈迪克光电股份有限公司陈军旗 南开大学滨海学院 赵凤怡• 99•就能够构建出快速中值滤波的硬件模块,满足图像实时处理的要求。

2 设计实现2.1 滑动窗口模块基于邻域操作的图像处理算法广泛采用滑动窗口技术,用于获取待处理图像相关位置的原始数据(汤露,程姝,基于FPGA的实时中值滤波算法硬件设计,工业控制计算机,2018年第2期20-22页)。

本设计中采用3*3的窗口模板,模块的结构如图2所示。

4个LineBuffer和9个单寄存器组成模块的缓存单元,每个LineBuffer由双口RAM构成,其位宽和存储深度由视频图像的数据规模决定,至少要满足一行数据的存储要求;列缓存对每一行的输出进行移位操作,实现3个元素的顺序输出;多路选择器负责对输入输出的数据进行路由选择,保证输出数据的结构特征,满足算法设计的技术要求。

组成行缓存的4个LineBuffer在视频行同步信号的边沿切换工作状态,形成 “乒乓操作”结构。

任意时刻,保持一个LineBuffer处于写状态,其它三个LineBuffer处于读状态。

在同步信号的控制下依序切换,4个周期形成一个循环,周而复始。

由于4个LineBuffer的输出状态不断切换,为保证输出数据在空间上的顺序关系,需要对输出的3行数据进行重定位。

考虑到算法第一步要求对每一列的数据进行排序,本质上就已经打乱了原始数据的顺序关系。

因此可以直接对LineBuffer的输出数据进行排序输出,这样进入列缓存的数据已经完成算法要求的第一步处理,直接生成了中间序列。

2.2 快速排序算法的原理与与处理流程已经在论文2.2节有详细介绍,其中第一步已经在生成滑动窗口的过程完成,接下来需要对滑动窗口内每一行的三个元素分别进行排序,实现的代码如下所示。

其中X1为第一行的最大值,X2为第二行的中间值,X3为第三行的最小值,它们三个构成第三步对角线上的三个元素。

按照相同的方法,对X(n)重新排序,其中值即为最终的输出结果。

多种形状窗口下的快速中值滤波算法

多种形状窗口下的快速中值滤波算法
于和小于的两部分 ; 通过边界上像素 的调 整使 得数 量较 多部 分
的像素逐个移到数 量较 少 的部分 , 直到 两部分 像 素数 量只 差 l 这时就 可以在边界上找 出中值 。此算 法在窗 口横向移动时 , , 每次只需新 加入一列 排序 , 其他有序 的列 以及上个 窗 口查找 中 值时遗留下 的边 界都保 留下来 , 为新窗 口开 始查 找中值的起 作
,Ti h aU i rt, e n 00 4,C ia s g u nv sy B l g 10 8 n ei i t hn )
Ab ta t A s r s o lo i m r rp s d i h a e e fr me in f trn u c l n7 k n s fw n o sr c : e e fag r h ae p o o e t e p p rt p r m d a l i g q ik yi i d i d w.T e a e i t n o o ie o h y tk
广 A00 ,)

义的。文献[ 1 2 中对中值滤波的多种形态及其发展有详细的 ] 介绍。传统的中值滤波算法要对每个窗1内的像素进行排序 2 1
以求中值 , 而无论是一般排序还是快速排序 , 在最坏的情况下 ,
Ao1 , )
… AoN- ) , 2
foN一 ) ] (, 1
t n o i g ag r h i a s  ̄ n lo i m. ol t
Ke r s Me in F l rAlo t m ;Gl e Wi d w;Co lxt ;I g r c si g y wo d : da ie g r h t i i no d mpe i y ma eP o e sn
在数字 图像处理 中 , 为一种 典型 的非 线性 滤波方法 , 作 中 值滤波应用得非常广 泛 , 因而对 于其算法效率 的提 高是很有 意

中值滤波算法

中值滤波算法

中值滤波算法步骤:(1)对窗内的每⾏像素按降序排序,得到最⼤值、中间值和最⼩值。

(2)把三⾏的最⼩值即第三列相⽐较,取其中的最⼤值。

(3)把三⾏的最⼤值即第⼀列相⽐较,取其中的最⼩值。

(4)把三⾏的中间值即第⼆列相⽐较,再取⼀次中间值。

(5)把前⾯的到的三个值再做⼀次排序,获得的中值即该窗⼝的中值。

代码:close all;clear all;clc;I=imread('C:\Users\luoqi\Desktop\图⽚\影院\file.jpg');if ndims(I)==3I=rgb2gray(I);end[m,n]=size(I);%%%添加⾼斯⽩噪声J=zeros(m,n);simd=20*rand(1);% for i=1:m% for j=1:2:n% t1=rand(1);% t2=rand(1);% z1=simd*cos(2*pi*t1)*sqrt(-2*log(t2));% z2=simd*sin(2*pi*t1)*sqrt(-2*log(t2));% J(i,j)=I(i,j)+z1;% if j+1<=n% J(i,j+1)=I(i,j+1)+z2;% end% end% end% for i=1:m% for j=1:n% if J(i,j)>255% J(i,j)=255;% elseif J(i,j)<0% J(i,j)=0;% end% end% end%J=uint8(J);%figure(1);%imshow(J);%%%添加椒盐噪声J=imnoise(I,'salt & pepper',0.02);figure(1);imshow(J);%%%中值滤波% for i=2:m-1% for j=2:n-1% median3x3=[J(i-1,j-1),J(i-1,j),J(i-1,j+1);% J(i,j-1),J(i,j),J(i,j+1);% J(i+1,j-1),J(i+1,j),J(i+1,j+1);];% sort1=sort(median3x3,2,'descend');% sort2=sort([sort1(1),sort1(4),sort1(7)],'descend');% sort3=sort([sort1(2),sort1(5),sort1(8)],'descend');% sort4=sort([sort1(3),sort1(6),sort1(9)],'descend');% mid_num=sort([sort2(3),sort3(2),sort4(1)],'descend');% J(i,j)=mid_num(2);% end% end%%%matlab⾃带函数J=medfilt2(J);figure(2) imshow(J);。

中值滤波算法公式

中值滤波算法公式

中值滤波算法公式 中值滤波是一种常用的信号处理方法,用于去除图像或信号中的噪声。

它通过取邻域内像素的中值来替代当前像素的值,从而平滑图像或信号。

中值滤波算法的基本思想是将邻域内的像素值进行排序,然后取中间值作为当前像素的新值。

该算法的主要步骤如下: 1. 定义邻域大小:选择一个合适的邻域大小,通常是一个正方形区域。

这个区域可以是3x3、5x5乃至更大的尺寸。

2. 定位邻域:在图像中,以当前像素为中心,定位邻域大小。

3. 提取邻域像素值:根据邻域的位置,提取出所有邻域内的像素值。

4. 排序邻域像素值:对提取出的邻域像素值进行排序,从小到大排列。

5. 计算中值:取排序后的邻域像素值的中间值作为当前像素的新值。

6. 更新图像:将当前像素的新值更新到原始图像中。

7. 遍历整个图像:对所有像素都按照以上步骤处理,得到滤波后的图像。

中值滤波算法的优点在于可以有效地去除图像或信号中的椒盐噪声、斑点噪声等,同时保持图像或信号的边缘信息不被模糊化。

由于使用了中值,该算法对于异常值也具有一定的抗干扰能力。

然而,中值滤波也存在一些缺点。

首先,它无法处理大面积的噪声,因为中值滤波只能对某一个像素点进行处理。

其次,在处理图像边缘区域时,由于邻域的大小限制,可能导致边缘附近的像素值被错误地替换。

中值滤波算法在图像处理领域广泛应用。

例如,在数字图像传输过程中,由于传输或存储过程中的噪声干扰,图像容易出现噪点,这时可以利用中值滤波算法来降低噪声的影响。

另外,在数字摄影中,拍摄照片时可能会产生图像噪声,通过中值滤波可以有效去除这些噪声。

总之,中值滤波算法是一种简单而有效的信号处理方法。

通过取邻域内像素的中值来替代当前像素的值,可以去除图像或信号中的噪声。

尽管算法存在一些限制,但在很多实际应用中,中值滤波算法仍然是一种非常有用的工具。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

function g=QuiMedFil2(f)
g=f;
t=2;
[m,n]=size(f);
for i=2:m-1
for j=2:n-1
if(j==2)
A=f(i-1:i+1,j-1:j+1);
hist=imhist(A);
mdn=median(A(:));
%mdn=Med(f(i-1:i+1,j-1:j+1))+1;
L=find(f(i-1:i+1,j-1:j+1)<mdn);%-1
Ltmdn=length(L);
g(i,j)=mdn;%-1;
else
for k=t-1:t+1
hist(f(k,j-2)+1)=hist(f(k,j-2)+1)-1;
if(f(k,j-2))<mdn
Ltmdn=Ltmdn-1;
end
end
for k=t-1:t+1
hist(f(k,j+1)+1)=hist(f(k,j+1)+1)+1;
if(f(k,j+1))<mdn
Ltmdn=Ltmdn+1;
end
end
th=4;
while Ltmdn>th
mdn=mdn-1;
Ltmdn = Ltmdn-hist(mdn+1);
end
while (Ltmdn+hist(mdn+1))<=th
Ltmdn=Ltmdn+hist(mdn+1);
mdn=mdn+1;
end
g(i,j)=mdn;
end
end
t=t+1;%t-line;
end
======================================= =========================实现过程如下
rgb=imread('Figure1.JPG'); %此处通过matlab读入任何一幅图像
>> I=rgb2gray(rgb); %将图像灰度化
>> I=imresize(I,0.1); %若图像过大可进行适当调整,或省略此步
>> g=QuiMedFil2(I) %调用所编程序执行中值滤波快速算法
figure,imshow(I),figure,imshow(g) %显示原图像和滤波后的图像
=============================================================================== ===================================================
与传统中值滤波算法的同窗口的计算时间对比
快速算法略高于一般算法
=============================================================================== =====================================================菱形5*5中值滤波程序function g=MedFilRho(f)
g=f;
g=[];
[m,n]=size(f);
for i=3:(m-2)
for j=3:(n-2)
B=[f(i,j),f(i-2,j),f(i-1,j),f(i+1,j),f(i+2,j),f(i,j-1),f(i,j-2),f(i,j+1),f(i,j+2),f(i-1,j-1),f(i+1,j+1),f(i-1,j+1),f(i+1,j-1)];
g(i,j)=median(B);
end
end
备注:程序为原创,原文地址:
/walqxlqxaw/blog/item/aabb517f877e6f190dd7daad.ht ml。

相关文档
最新文档