-
2021-12-15 09:53:07
引言:在处理图像时,线性滤波将破坏边缘,而且不能有效滤除脉冲噪声。非线性滤波基于对输入信号序列的一种非线性映射关系,常可把某一特定的噪声近似映射为零而保留信号的重要特征,因而可以在一定程度上克服线性滤波的不足。浅谈中值滤波
中值滤波
1.原理
设有一个序列:x1,x2,x3,x4,x5,将它们按照绝对值大小重新排列此序列x3,x5,x2,x4、x1,重排以后的中值是×2,此值就作为滤波的输出。2.Matlab代码实现
function g = median_filter(f) [height, width]= size(f); % 输入图像的大小 g = zeros(height, width); % 为输出图像分配内存 for y = 1:height for x = 1:width x1 = x - 2; % 5x5 窗口的左列 x2 = x + 2; % 5x5 窗口的右列 y1 = y - 2; % 5x5窗口的顶行 y2 = y + 2; % 5x5窗口的底行 % 当邻域超出图像边界时,舍去超过边界的领域 x1 = max(x1, 1); x2 = min(x2, width); y1 = max(y1, 1); y2 = min(y2, height); window = f(y1:y2, x1:x2); % 5 x 5窗口 window = window(:); % 将窗口重新排列为列向量 g(y, x) = median(window); % 输出像素=窗口的中值 end end g = uint8(g); imshow(g); % 转换为8位图像并显示
中心加权中值滤波(the center weighted median filter)
1.原理
先解释一下加权中值滤波:
设有三个数(3,3,9),中位数为3,若加权系数为(1,1,3),即X3的加权系数W3=3,X1和X2的加权系数分别为W1和W2=1,也就是相当于X1重复1次,X2重复1次,X3重复3次,即相当于有5个数(3,3,9,9,9),中位数为9。一般中值滤波则相当于权系数为(1,1,1)。
而中心加权中值滤波:
就是对中心值加权(重复)
设有三个数(3,6,9),中位数为6,若中心加权系数为3,即X2的权系数W2=3,也就是相当于X2重复2次即相当于有5个数(3,6,6,6,9),中位数为6。一般中值滤波则相当于权系数为(1,1,1)。
2.Matlab代码实现function g = cw_median_filter(f, M) [height, width]= size(f); g = zeros(height, width); for y = 1:height for x = 1:width x1 = x - 2; x2 = x + 2; y1 = y - 2; y2 = y + 2; x1 = max(x1, 1); x2 = min(x2, width); y1 = max(y1, 1); y2 = min(y2, height); window = f(y1:y2, x1:x2); window = window(:); window1=[window;repmat(f(y,x),M-1,1)]; %M-1的原因是,window本身就包含了f(y,x) ,当M=1时就是中值滤波 g(y, x) = median(window1); end end g = uint8(g);
更多相关内容 -
中值滤波_高斯噪声_中值滤波_matlab图像处理_
2021-09-29 11:32:09给图像添加椒盐噪声和高斯噪声,然后对图像进行中值滤波。MATLAB代码可直接运行实现。 -
中值滤波 处理 椒盐噪声
2020-12-21 08:36:41首先对原图像加椒盐噪声,之后经中值滤波 import cv2 as cv import numpy as np def noise(img,snr): h=img.shape[0] w=img.shape[1] img1=img.copy() sp=h*w NP=int(sp*(1-snr)) for i in range (NP): randx... -
中值滤波_matlab_中值滤波_
2021-09-30 08:11:19matlab编程对带椒盐噪声的图片进行中值滤波处理 -
图像处理中的中值滤波、均值滤波以及高斯滤波的实现与对比(基于MATLAB)
2020-03-31 10:43:08a) 图像经过中值滤波后,高斯噪声没有被完全去除,椒盐噪声几乎被完全去除效果较好。经过均值滤波后不管是高斯噪声还是椒盐噪声大部分都没有被去除,只是稍微模糊化。经过高斯滤波后,高斯噪声和椒盐噪声几乎被很大... -
Python 实现中值滤波、均值滤波的方法
2020-12-24 11:27:34Lena椒盐噪声图片: # -*- coding: utf-8 -*- """ Created on Sat Oct 14 22:16:47 2017 @author: Don """ from tkinter import * from skimage import io import numpy as np im=io.imread('lena_sp.jpg', as_... -
matlab对噪声图像进行处理_中值滤波
2022-04-02 17:18:05资源名:matlab对噪声图像进行处理_中值滤波 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有一定... -
3x3中值滤波怎么计算过程-计算机视觉学习笔记8噪声与滤波 计算机视觉.pdf
2022-04-21 12:45:323x3中值滤波怎么计算过程-计算机视觉学习笔记8噪声与滤波 计算机视觉.pdf -
【图像去噪】基于matlab GUI中值滤波图像去噪【含Matlab源码 205期】.zip
2021-12-14 10:06:32完整代码,可直接运行 -
图像处理——均值滤波+中值滤波(Matlab)最新.pdf
2020-09-20 16:03:32题目均值滤波和中值滤波 在自己的证件照中加入椒盐噪声高斯白噪声 分别用3*35*57*7 的均值滤波器和中值滤波器进行滤波 处理过程 1. 用imnoise函数在图像中分别加入椒盐噪声和高斯白噪声 2. 均值滤波用fspecial函数... -
对椒盐噪声分别进行均值和中值滤波
2021-06-12 22:19:18对椒盐噪声分别进行均值和中值滤波 -
基于MATLAB二维中值滤波的图像复原.pdf
2021-06-05 16:28:34图像在获取、传输和存储的过程中由于各种原因引起图像质量的下降,需要对图像进行...本文对图像复原技术、高斯噪声、椒盐噪声进行介绍,探讨二维中值滤波算法和MATLAB下算法的仿真实验,同时分析实验结果,最后得出结论。 -
python 中值滤波,椒盐去噪,图片增强实例
2020-09-18 06:58:51今天小编就为大家分享一篇python 中值滤波,椒盐去噪,图片增强实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
图像处理:添加高斯、椒盐、泊松、均匀噪声,分别进行高斯滤波、中值滤波、盒滤波、双边滤波
2020-11-26 16:27:55图像处理python代码,附带测试图片:添加高斯、椒盐、泊松、均匀噪声,分别进行高斯滤波、中值滤波、盒滤波、双边滤波 -
使用中值滤波去噪:消除图像中除边界像素外的椒盐噪声。-matlab开发
2021-05-30 15:05:09使用中值滤波器,它是一个奇数阶方阵。它消除了图像中的椒盐噪声,产生了平滑的输出。噪声只出现在边界像素值处。中值滤波器提高了图像的 PSNR 质量。 -
中值滤波的MATLAB实现
2017-10-06 15:34:50中值滤波的MATLAB实现,常用的滤波方法,有效解决椒盐噪声 -
均值滤波和中值滤波去噪
2017-12-17 13:48:18均值滤波和中值滤波的内容非常基础,均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。中值滤波的优点是可以很好的过滤掉椒盐噪声,缺点是易造成图像的不连续性。 -
中值滤波代码matlab-MATLAB_for_Image_Processing:用于图像处理活动的MATLAB代码
2021-05-27 07:42:19中值过滤代码matlab 使用MATLAB进行图像处理...中值通过滤波器可消除盐和胡椒粉的噪音 索贝尔过滤器 Prewitts过滤器 罗伯茨过滤器 直方图均衡 对数和逆对数变换 翻转图像,改变亮度,补充图像 圆形,方形,梯形形状创建 -
一种快速并行中值滤波算法的实现
2021-02-23 02:56:18介针对传统中值滤波算法计算量大、耗时较长的缺点提出了一种快速并行中值滤波算法。对于3×...并且通过仿真实验可知,对于椒盐噪声的滤除,算法能够达到与中值滤波同样的视觉处理效果。 更多还原 -
中值滤波,对ECG去噪
2019-03-21 21:43:03使用中值滤波对ECG信号去低频噪声,数据集为MIT-BIH心律失常数据库 -
NR基础篇下——中值滤波、多级中值滤波、多级中值混合滤波、加权中值滤波、中值有理滤波
2021-10-24 18:54:45但是中值滤波作为一种顺序滤波器,对于椒盐噪声的效果很好,而且保边能力很强,所以这一篇主要讨论一下中值相关的算法。 中值滤波 算法原理 中值滤波很好理解,均值滤波就是在一个小窗口中求均值来取代当前像素值,...上一篇分享了一些均值滤波相关的算法,均值滤波作为一种线性滤波器,在滤除噪声的同时也会导致边缘模糊问题。而且均值滤波对高斯噪声的效果很好,但是对于椒盐噪声的效果就很一般。但是中值滤波作为一种顺序滤波器,对于椒盐噪声的效果很好,而且保边能力很强,所以这一篇主要讨论一下中值相关的算法。
中值滤波
算法原理
中值滤波很好理解,均值滤波就是在一个小窗口中求均值来取代当前像素值,而中值滤波就是通过求小窗口中的中位值来取代当前位置的方式来滤波。
如图绿色窗口就是当前的滤波窗口,在一个3X3的邻域窗口中进行滤波。那么中值滤波做的就是:
- 对这个邻域中的像素值进行排序:[45, 50, 52, 60, 75, 80, 90, 200, 255];
- 从排序后的数据中找出中位值:75;
- 用中位值取代当前位置的像素值,所以就可以得到右侧的滤波后的数据。
代码实现
%% -------------------------------- %% author:wtzhu %% email:wtzhu_13@163.com %% date: 20210306 %% fuction: 中值滤波 %% -------------------------------- clear; clc; close all; img = imread('./images/test_pattern_blurring_orig.tif'); [m, n] = size(img); figure;subplot(221);imshow(img);title('original image'); %% 运算的时候需要对边缘进行扩展 % 需要特殊处理四周最外圈的行和列,本算法中将其向外扩展一圈,用最外圈的值填充 headRowMat = img(1,:);%取f的第1行 tailRowMat = img(m,:);%取f的第m行 % 行扩展后,列扩展时需要注意四个角需要单独扩展进去,不然就成了十字架形的 headColumnMat = [img(1,1), img(:,1)', img(m,1)]; tailColumnMat = [img(1,n), img(:,n)', img(m,n)]; expandImage = [headRowMat; img; tailRowMat]; expandImage = [headColumnMat; expandImage'; tailColumnMat]; expandImage = uint8(expandImage'); subplot(222);imshow(expandImage);title('expand image'); newImg = zeros(m, n); for i =2: m+1 for j =2: n+1 imgRoi = [expandImage(i-1, j-1) expandImage(i-1, j) expandImage(i-1, j+1) ... expandImage(i , j-1) expandImage(i , j) expandImage(i , j+1) ... expandImage(i+1, j-1) expandImage(i+1, j) expandImage(i+1, j+1)]; orderedList = sort(imgRoi); sizeRoi = size(imgRoi); newImg(i-1, j-1) = orderedList((sizeRoi(2)+1)/2); end end newImg = uint8(newImg); subplot(223);imshow(newImg);title('new image'); subplot(224);imshow(uint8(newImg-img));title('newImg-img');
从滤波效果图中可以看出去噪能力还可以,百块中的噪点去除了很多,而且边缘信息保留得也很好。
多级中值滤波
算法原理
简单的中值滤波器滤波效果有限,于是就有人提出了将多个中值滤波进行多级级联实现更好的滤波效果。
如图就是一种多级级联的方式,先在窗口中定义一个’+'和’X’形的窗口,然后分别求出这两个窗口的中位值,然后结合当前窗口的中心点就有3个候选值,再从这三个值中求出一个中位值作为滤波后的结果。
这种方式也可以直接应用到RAW图中做BNR,需要修改的就是窗口设置为5X5,然后在做滤波的时候需要区分G和RB通道,因为这个前面已经讲过,RAW图中的RGB分布是不均匀的,G占50%,R和B各占25%。
左侧就是针对G通道的滤波器,右侧是R和B通道的滤波器,都是定义了一个’+'和’X’形的窗口,不同的只是取的点的位置不同。
代码实现
%% -------------------------------- %% author:wtzhu %% email:wtzhu_13@163.com %% date: 20211023 %% fuction: multistage median filters %% -------------------------------- close all; clear all; clc img = imread('./images/lena.bmp'); I = double(img); % I = double(imresize(img, [64, 64])); figure(); imshow(uint8(I)); title('org file'); I_noise = I + 10 * randn(size(I)); figure(); imshow(uint8(I_noise)); title('noise file'); [m,n] = size(I_noise); DenoisedImg = zeros(m,n); PaddedImg = padarray(I,[1, 1],'symmetric','both'); tic for i = 1: m for j = 1: n roi = PaddedImg(i:i+2, j:j+2); % first stage median_HV = median([roi(1,2), roi(2,1), roi(2,2), roi(2,3), roi(3,2)]); median_diag = median([roi(1,1), roi(1,3), roi(2,2), roi(3,1), roi(3,3)]); % second stage DenoisedImg(i, j) = median([median_HV, roi(2,2), median_diag]); end end figure(); imshow(uint8(DenoisedImg)); title('denoise file'); toc b = medfilt2(I_noise,[3,3]); figure(); imshow(uint8(b)); title('median filter of matlab denoise file');
多级中值混合滤波
算法原理
前面介绍过中值滤波和均值滤波各自有各自的优点和缺点,所以就可以考虑将两者结合起来,相互弥补实现更好的滤波效果,于是就有人提出了这种多级混合滤波的方式。
算法流程:
- 求出竖直方向相邻三个点的均值和水平方向相邻三个点的均值,再结合当前点,用这三个点再求一个中位值;
- 求出45°和135°方向上的均值,然后结合当前点求出一个中位值;
- 两个中位值结合当前点组成新的数组,最后求一个中位值作为当前点的值完成滤波。
这样就巧妙的将均值滤波和中位值滤波结合了。然后如果应用在RAW图上,只需要对滤波器稍作改善即可。
代码实现
%% -------------------------------- %% author:wtzhu %% email:wtzhu_13@163.com %% date: 20211023 %% fuction: multistage median hybird filters %% -------------------------------- close all; clear all; clc img = imread('./images/lena.bmp'); I = double(img); figure(); imshow(uint8(I)); title('org file'); I_noise = I + 10 * randn(size(I)); figure(); imshow(uint8(I_noise)); title('noise file'); [m,n] = size(I_noise); DenoisedImg = zeros(m,n); PaddedImg = padarray(I,[1, 1],'symmetric','both'); tic for i = 1: m for j = 1: n roi = PaddedImg(i:i+2, j:j+2); % first stage: average and median mean_V = mean(roi(:,2)); mean_H = mean(roi(2,:)); median_HV = median([mean_V, roi(2, 2)], mean_H); mean45 = mean([roi(1, 3), roi(2, 2), roi(3, 1)]); mean135 = mean([roi(1, 1), roi(2, 2), roi(3, 3)]); median_diag = median([mean45, roi(2, 2)], mean135); % second stage DenoisedImg(i, j) = median([median_HV, roi(2,2), median_diag]); end end figure(); imshow(uint8(DenoisedImg)); title('denoise file'); toc b = medfilt2(I_noise,[3,3]); figure(); imshow(uint8(b)); title('median filter of matlab denoise file');
多级中值有理混合滤波
算法原理
WMF加权中值滤波
加权中值滤波也很好理解,和加权均值滤波差不多,就是在原始数据的基础上给每个点分别赋予一个权重,然后在加权后的数据中取出中位值作为滤波后的值。
算法流程
-
求出’+'形和’X’形的窗口的中位值;
-
对’+'形窗口再利用CWMF求出一个值,CWMF是WMF的一种特殊情况,就是只对中心点进行加权;
-
对以上求出的三个参数用一下公式计算出一个新的值作为滤波后的值
y ( m , n ) = ϕ 2 ( m , n ) + ϕ 1 ( m , n ) − 2 ∗ ϕ 2 ( m , n ) + ϕ 3 ( m , n ) h + k ( ϕ 1 ( m , n ) − ϕ 3 ( m , n ) ) y(m, n)=\phi 2(m, n)+\frac{\phi 1(m, n)-2 * \phi 2(m, n)+\phi 3(m, n)}{h+k(\phi 1(m, n)-\phi 3(m, n))} y(m,n)=ϕ2(m,n)+h+k(ϕ1(m,n)−ϕ3(m,n))ϕ1(m,n)−2∗ϕ2(m,n)+ϕ3(m,n)
一样的,稍作改动该算法就可以用于raw格式图像
代码实现
%% -------------------------------- %% author:wtzhu %% email:wtzhu_13@163.com %% date: 20211023 %% fuction: median rational hybird file filter %% references: MEDIAN-RATIONAL HYBRID FILTERS %% -------------------------------- close all; clear all; clc img = imread('./images/lena.bmp'); I = double(img); figure(); imshow(uint8(I)); title('org file'); I_noise = I + 10 * randn(size(I)); figure(); imshow(uint8(I_noise)); title('noise file'); [m,n] = size(I_noise); DenoisedImg = zeros(m,n); PaddedImg = padarray(I,[1, 1],'symmetric','both'); h = 2; k = 0.01; tic for i = 1: m for j = 1: n roi = PaddedImg(i:i+2, j:j+2); median_HV = median([roi(1,2), roi(2,1), roi(2,2), roi(2,3), roi(3,2)]); median_diag = median([roi(1,1), roi(1,3), roi(2,2), roi(3,1), roi(3,3)]); CWMF = median([roi(1,2), roi(2,1), roi(2,2)*3, roi(2,3), roi(3,2)]); DenoisedImg(i, j) = CWMF + (median_HV + median_diag - 2 * CWMF) / (h + k * (median_HV - median_diag)); end end toc figure(); imshow(uint8(DenoisedImg)); title('denoise file'); b = medfilt2(I_noise,[3,3]); figure(); imshow(uint8(b)); title('median filter of matlab denoise file');
相关链接
-
数字图像处理实验(2)--中值滤波/均值滤波.7z
2020-04-07 14:47:39编程实现灰度图像的中值滤波平滑处理。滤波模板的大小自定(可为3×3、5×5、7×7、15×15等)。实验图像可从提供的实验图像集中的噪声图像中选取。 思考题:(选做) 编程实现灰度图像的均值滤波平滑处理;也可尝试... -
matlab实现中值滤波去除脉冲噪声
2012-10-22 20:41:56matlab实现中值滤波去除脉冲噪声,比较简单的中值滤波程序。 -
添加椒盐噪声,并用高斯滤波、均值滤波、中值滤波、双边滤波四种滤波去噪方式源码.zip
2020-07-01 22:40:12添加高斯噪声,并用高斯滤波、均值滤波、中值滤波、双边滤波四种滤波去噪方式,并且分别得到这四种滤波后的信噪比值,通过比较信噪比值,得到最佳的滤波去噪处理方式。添加噪声的浓度可以改变,并且也可以改变卷积核... -
matlab论文大放送-利用中值滤波去除图像噪声的研究及MATLAB实现.pdf
2019-08-13 04:30:38matlab论文大放送-利用中值滤波去除图像噪声的研究及MATLAB实现.pdf 坚持一天一贴,努力振兴论坛! 实在不知道应该归到那一个版块下面,还是现放这里,等待管理员移动吧。 这些都是在学校老师那里拷的,基本... -
中值滤波和高斯滤波对比
2015-04-22 15:45:18中值滤波与高斯滤波的实验性对比 代码 可供参考 -
求助中值滤波和自适应中值滤波算法错误修改
2021-04-21 01:26:35clear all;close all;I=imread('2.jpg');figure;imshow(I,[]);title('原始图像');I=imnoise(I,'salt & pepper',0.15);figure;...%7×7中值滤波Q=medfilt2(I,[3,3]);figure;imshow(Q,[]);title('...clear all;
close all;
I=imread('2.jpg');
figure;
imshow(I,[]);
title('原始图像');
I=imnoise(I,'salt & pepper',0.15);
figure;
imshow(I,[]);
title('加椒盐噪声');
%7×7中值滤波
Q=medfilt2(I,[3,3]);
figure;
imshow(Q,[]);
title('7×7中值滤波');
%自适应中值滤波
[M,N]=size(I);
for i=3:7
if i<=7
for x=i/2+0.5:M-i/2+0.5
for y=i/2+0.5:M-i/2+0.5
z_max=max(I(M*(y-2)+x-(i/2-0.5):M*(y-2)+x-(i/2-0.5)+i*M-M));
z_min=min(I(M*(y-2)+x-(i/2-0.5):M*(y-2)+x-(i/2-0.5)+i*M-M));
z_med=median(I(M*(y-2)+x-(i/2-0.5):M*(y-2)+x-(i/2-0.5)+i*M-M));
A1=z_med-z_min;
A2=z_med-z_max;
if (A1>0&A2<0)
B1=I(x,y)-z_min;
B2=I(x,y)-z_max;
if (B1>0&B2<0)
I(x,y)=I(x,y);
else
I(x,y)=z_med;
end
else
i=i+2;
end
end
end
else
I(x,y)=I(x,y);
end
end
figure;
imshow(I,[]);
title('自适应中值滤波');
错在z_max=max(I(M*(y-2)+x-(i/2-0.5):M*(y-2)+x-(i/2-0.5)+i*M-M));
z_min=min(I(M*(y-2)+x-(i/2-0.5):M*(y-2)+x-(i/2-0.5)+i*M-M));
z_med=median(I(M*(y-2)+x-(i/2-0.5):M*(y-2)+x-(i/2-0.5)+i*M-M));
这个地方小弟看不懂不懂什么意思 也改不了 麻烦各位大虾们帮下忙
我的目的:就是让中值滤波和自适宜中值滤波对比下看看哪个效果好 如果有别的好的方法 我想把自适宜那段程序换掉
程序的原理我也发下:自适应中值滤波算法描述
当脉冲噪声(椒盐噪声)在空间上出现的概率不大,中值滤波一般可以取得较好的效果。经验表明,当出现的正负脉冲噪声概率均分别小于0.2时,中值滤波是可用的,而当脉冲噪声在空间上出现的概率较大时,使用中值滤波后可能产生较严重的失真[6]。为了改善滤波效果,引入自适应中值滤波算法。即基于中值滤波的特点和性质,考虑采用变换窗口大小的方法,在中值算法中加入一个判断操作,判断窗口内的象素中值及滤波处的像点灰度是否为脉冲噪声,并分别处理。
设 是对像点 进行中值滤波的工作窗口, 为像点 的灰度, 为 中的灰度最小值, 为 中的灰度最大值, 为 中的灰度中值, 为 中的灰度均值, 为允许的最大窗口, 为初始默认窗口。
自适应中值滤波算法的基本步骤如下:
(1)计算 。
(2)如果 ,那么转(4);否则,转至(3)。
(3)若 ,输出 ;否则,增大窗口 尺寸。若 ,则重复(1)和(2);否则输出 。
(4)计算 ;
(5)如果 ,那么输出 ;否则,输出 。
在上述算法中,如果 ,表明 不是噪声,转到(4)判断 是否是脉冲,当 与 都不是脉冲噪声时,优先输出 。当 与 都是脉冲噪声时,输出 的灰度均值 。相应的算法流程图 我放在附件里了
如果有别的好的方法 我想把自适宜那段程序换掉
2008-5-16 15:10 上传
点击文件名下载附件
34 KB, 下载次数: 19075
-
matlab 自写 自适应中值滤波 matlab自适应中值滤波算法
2022-01-11 14:08:16自写自适应中值滤波算法 matlab实现一、自适应中值滤波(代码)
function aOut = stPlus(aIn,f1,f2,st,stMax) %这仅仅是 AdaMedFilter (自适应中值滤波函数) 的子函数 %这仅仅是一个附属函数/功能片段(有特定的功能,输入若干边界条件,输出一个具体的数值) %输入aIn,需要滤波的图像,循环到的行数f1和列数f2,掩模版大小st,和掩模版最大值stMax [ra,ca] = size(aIn); %制作出掩模版 sxy = aIn(f1-round(st/2)+1:f1+round(st/2)-1,f2-round(st/2)+1:f2+round(st/2)-1); %将掩模版从小到大排序并输出为一列 zSort = sort(sxy(:)); %基于排序后的zSort找到最大值,最小值,中值,以及循环位置的值 med = floor(st*st/2)+1; zMax = zSort(st*st); zMin = zSort(1); zMed = zSort(med); zxy = sxy(floor(st/2)+1,floor(st/2)+1); %判断中值是否在最大值和最小值之间 delta1 = zMed-zMin; delta2 = zMax-zMed; if (delta1 * delta2) > 0 %判断循环位置的值是否在最大值和最小值之间 delta3 = zxy - zMin; delta4 = zMax - zxy; if (delta3 * delta4) > 0 %中值 在 最大最小值之间,且循环位置的值 在 最大最小值之间 aOut = zxy; else %中值 在 最大最小值之间,但循环位置的值 不在 最大最小值之间 aOut = zMed; end end if (delta1 * delta2) <= 0 %中值 不在 最大最小值之间 if st < stMax %掩模版尺寸 不是 最大 if f1 >= floor((st+2)/2)+1 && f2 >= floor((st+2)/2)+1 && f1 <= ra-floor((st+2)/2) && f2 <= ca-floor((st+2)/2) %该循环位置是否还可以进行st+2的循环 aOut = Inf;%可以 else aOut = zMed;%不可以,直接输出 end else %掩模版尺寸 是 最大,直接输出 aOut = zMed; end end end
function aOut = AdaMedFilter(aIn,static,stMax) %这仅仅是一个 自适应 中值滤波函数 %输入aIn图像,输出aOut结果 %static是人为定制的静态变量,意义是sxy掩模版的大小,默认为3*3,stMax就是掩模版最大的大小,默认为7*7 %输入参数的默认及处理 if nargin == 1 static = 3; stMax = 7; elseif nargin == 2 stMax = 7; end %定义输入及输出图像 %aIn是最先输入图像 %atemp是对输入图像的初步处理(比如归一化,双精度化,归255化等),可以在后面调用时灵活更改 %aOut是最终输出图像 atemp = aIn; [ra,ca] = size(aIn); aOut = zeros(ra,ca); %定义st = 3,其中static为人为定义的静态变量,所以 st = static; %循环,每次循环把循环位置的值给进去,输出一个唯一的有效值赋值给aOut在当前位置的值 for f1 = round(st/2):ra-round(st/2)+1 for f2 = round(st/2):ca-round(st/2)+1 %st = static在每一个循环的循环开始和循环结束都有,是为了绝对保证st在每次循环开始和末尾都是绝对为3 st = static; %输入循环位置的值,输出处理后的值,当然,有可能st = 3的中值滤波不够,那么就会输出temp = Inf temp = stPlus(atemp,f1,f2,st,stMax); %我已经在函数stPlus中确定当temp = Inf时,一定能够被st+2的中值滤波处理,所以我就循环让st增大取得有效的temp while(temp == Inf) st = st+2; temp = stPlus(atemp,f1,f2,st,stMax); end %每一个循环最重要给我一个唯一的正确值temp,我把它赋值给循环所在位置的aOut! aOut(f1,f2) = temp; %st = static在每一个循环的循环开始和循环结束都有,是为了绝对保证st在每次循环开始和末尾都是绝对为3 st = static; end end end
clear close all aIn = imread("GaosiFilter.jpg"); static = [3,7,11]; stMax = 11; %取不同的st值(掩模版大小)进行滤波 a1 = AdaMedFilter(aIn,static(1),stMax); a2 = AdaMedFilter(aIn,static(2),stMax); a3 = AdaMedFilter(aIn,static(3),stMax); %对滤波后图片a1进行均值滤波以消除图片轮廓的“毛刺” a1Ave = AverageFilter(a1,5); figure,imshow(a1Ave,[]) %反复进行滤波3次 a12 = AdaMedFilter(a1,static(1),stMax); a13 = AdaMedFilter(a12,static(1),stMax); a14 = AdaMedFilter(a13,static(1),stMax); a15 = AdaMedFilter(a14,static(1),stMax); figure,imshow(aIn,[]) figure,imshow(a1,[]) figure,imshow(a2,[]) figure,imshow(a3,[]) figure,imshow(a1,[]) figure,imshow(a12,[]) figure,imshow(a13,[]) figure,imshow(a14,[]) figure,imshow(a15,[]) %对比1次滤波和5次滤波的剖线差别 figure,hold on; plot(a1(220,:),'r') plot(a15(220,:),'b')
二、自适应中值滤波(图片)
1、输入的噪声图像
2、当st = 3,stmax = 11时输出的滤波后图像
3、分析
中值滤波对胡椒噪声和盐噪声滤波效果特别好,但是自适应保边中值滤波会让滤波后图片的边缘出现“毛刺”,这个时候我们可以采用均值滤波,以图片稍微变模糊一些的代价将边缘的毛刺消除,如下图:
三、st的不同对滤波效果的影响
1、st = 3
2、st = 7
3、st = 11
4、结论
随着st(掩模版大小)的增大,滤波效果并没有变得更好,甚至会让原本清晰的图片边缘变得更模糊。
四、探究对图像重复进行滤波多次对滤波效果的影响
1、滤波一次图片
2、滤波五次图片
3、对比一次滤波的剖线和五次滤波的剖线
说明:
蓝色线条是“5次滤波”图片的剖线;红色线条是“1次滤波”图片的剖线
4、结论
从图片上看,一次滤波和五次滤波效果差别不大,但是从剖线上看,很明显的感知到,对于图片平滑部位,一次滤波和五次滤波效果相差无几,但是对于图像急剧变化的部分,很明显的是五次滤波后的图像线条更加的平滑,变化更加均匀!
-
中值滤波代码matlab-noise-removal:消除噪音
2021-05-27 07:47:14中值过滤代码matlab 图像处理-去噪 第三组 TrầnQuang Duy VũBìnhDương TrầnHươngThảo NguyĐứnĐứcTùng 描述 文件夹images包含具有不同杂点类型的扫描文档的图像 有三个文件夹, Mean filter, Median ... -
中值滤波:中值滤波器、拉普拉斯分布去除噪声、拉普拉斯滤波器-matlab开发
2021-06-01 11:56:10中值滤波器是一种非线性数字滤波技术,常用于通过拉普拉斯分布去除噪声。 中值滤波器的主要思想是逐个条目遍历信号条目,用相邻条目的中值替换每个条目。 邻居的模式称为“窗口”,它在整个信号上逐项滑动。