基于MATLAB的中值滤波算法实现
在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被广泛用于数字图像处理的边缘提取,其基本原理是把数字图像或数字序列中的一点的值用该点邻域内所有的点排序后的中值来代替。
中值滤波对椒盐噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。而且,中值滤波的算法比较简单,也易于用硬件实现。这篇我们先用MATLAB来实现中值滤波。
中值滤波方法是,对待处理的当前像素,选择一个模板3x3、5x5或其他,这里选择3x3矩阵,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。

排序算法示意图
当我们使用3x3窗口后获取领域中的9个像素,就需要对9个像素值进行排序,为了提高排序效率,排序算法思想如图所示。
(1)对窗内的每行像素按降序排序,得到最大值、中间值和最小值。
(2)把三行的最小值即第三列相比较,取其中的最大值。
(3)把三行的最大值即第一列相比较,取其中的最小值。
(4)把三行的中间值即第二列相比较,再取一次中间值。
(5)把前面的到的三个值再做一次排序,获得的中值即该窗口的中值。
sort排序函数
sort(A)若A可以使矩阵或行列向量,默认都是对A进行升序排列。
sort(A)是默认的升序,而sort(A,'descend')是降序排序。
sort(A)若A是矩阵,默认对A的各列进行升序排列
sort(A,dim)
dim=1时相当于sort(A)
dim=2时表示对矩阵A中的各行元素升序排列
sort(A, dim, 'descend’)则对矩阵的每行进行降序排列
MATLAB代码实现
Median Filter
%RGB_YCbCr
clc;
clear all;
close all; RGB_data = imread('lena.jpg');% R_data = RGB_data(:,:,);
G_data = RGB_data(:,:,);
B_data = RGB_data(:,:,); %imshow(RGB_data); [ROW,COL, DIM] = size(RGB_data); Y_data = zeros(ROW,COL);
Cb_data = zeros(ROW,COL);
Cr_data = zeros(ROW,COL);
Gray_data = RGB_data; for r = :ROW
for c = :COL
Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + ;
Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + ;
end
end Gray_data(:,:,)=Y_data;
Gray_data(:,:,)=Y_data;
Gray_data(:,:,)=Y_data; figure;
imshow(Gray_data); %Median Filter
imgn = imnoise(Gray_data,'salt & pepper',0.02); figure;
imshow(imgn); for r = :ROW-
for c = :COL-
median3x3 =[imgn(r-,c-) imgn(r-,c) imgn(r-,c+)
imgn(r,c-) imgn(r,c) imgn(r,c+)
imgn(r+,c-) imgn(r+,c) imgn(r+,c+)];
sort1 = sort(median3x3, , 'descend');
sort2 = sort([sort1(), sort1(), sort1()], 'descend');
sort3 = sort([sort1(), sort1(), sort1()], 'descend');
sort4 = sort([sort1(), sort1(), sort1()], 'descend');
mid_num = sort([sort2(), sort3(), sort4()], 'descend');
Median_Img(r,c) = mid_num();
end
end figure;
imshow(Median_Img);
处理前后比较

Gray lena

加入椒盐噪声后的lena

对加入椒盐噪声后进行中值滤波的lena
可以看出,中值滤波对椒盐噪声的滤除效果真是非常的好。光看我处理后图图片可能看不出太明显对比,有兴趣的朋友可以自己尝试下。这里MTALAB的排序部分基本是是按照排序算法一步步来的,完全符合FPGA实现的思路,所以说掌握算法的基础原理和Verilog自己就可以尝试用FPGA实现了。
这里需要强调的一下是这样的滤波对图像的边缘没有进行处理,这是因为我们在求取均值或中值时,生成的3x3矩阵,第一行的像素并没有处理,同样的图像最外层边缘的像素都没有处理,不过这个对整体影响不大,所以后面再弄,下一篇来实现Sobel边缘检测。

转载请注明出处:NingHeChuan(宁河川)
个人微信订阅号:开源FPGA
如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号
知乎ID:NingHeChuan
微博ID:NingHeChuan
原文地址:https://www.cnblogs.com/ninghechuan/p/9527915.html
基于MATLAB的中值滤波算法实现的更多相关文章
- 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现
基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1. 背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...
- 基于FPGA的中值滤波算法实现
在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...
- 关于中值滤波算法,以及C语言实现(转)
源:关于中值滤波算法,以及C语言实现 1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制 ...
- Matlab图像处理——中值滤波medfilt2问题解决
本文链接:https://blog.csdn.net/Pxzly1117/article/details/79201772程序: I=imread('13.jpg');%读入图像imshow(I);h ...
- matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波
来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...
- 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()
7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...
- verilog实现中值滤波
前言 项目需要,想要实现算法中的其中一步即中值滤波,同时,因为图像处理部分中值滤波相对来说还是比较简单的,将中值滤波的硬件实现作为进入FPGA领域的第一次尝试.虽然说网上有较多关于中值滤波的文档,可是 ...
- opencv-11-中值滤波及自适应中值滤波
开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...
- 3D Slicer中文教程(七)—图像中值滤波
1.中值滤波概念 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护边缘 ...
随机推荐
- 常用类一一时间处理相关类一一java.util.Tomezone(java.util.Calendar , java.util.Date , java.text.DateFormat)
时间处理相关类 时间是一个一维的东东.所以,我们需要一把刻度尺来区表达和度量时间.在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一). ...
- spring 每个jar的作用
spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ...
- java并发:AQS的简单理解
简介: AQS全称 AbstractQueuedSynchronizer,提供了一个基于FIFO(先进先出)队列,可以用于构建锁或者其他相关同步装置的基础框架. ReentrantLock.Semap ...
- poj3666(DP+离散化)
题目链接:http://poj.org/problem?id=3666 思路: 看了讨论区说本题的数据比较弱,只需要考虑不减序列即可,比较懒,所以我也只写了这一部分的代码,思路都一样,能AC就行了. ...
- php libevent 详解与使用
libevent是一个基于事件驱动的高性能网络库.支持多种 I/O 多路复用技术, epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O,定时器和信号等事件: ...
- item2
一.简介 iTerm2 是 OS X 下一款开源免费的的终端工具,很多人基本用它替代了原生的 Terminal. 二.特色功能 https://www.zhihu.com/question/274 ...
- 简单解决 Javascrip 浮点数计算的 Bug(.toFixed(int 小数位数))
众所周知,Javascript 在进行浮点数运算时,结果会非预期地出现一大长串小数. 解决: 如果变量 result 是计算结果,则在返回时这样写,return result.toFixed(2): ...
- Java 8 可重复注解与类型注解
Java 8 可重复注解与类型注解 Java 8 对注解处理提供了两点改进:可重复的注解及可用于类型的注解. // 首先要提供一个容器,MyAnnotation 才能用于可重复注解 @Target({ ...
- 一次HBase问题的解决过程(Status: INCONSISTENT)
==版本信息== HBase:2.7.1 Storm:1.0.1 RocketMQ:3.4.6(阿里版) ==问题描述== 2018年9月3号晚上23点左右,例行巡检系统运行状况时, 发现Storm消 ...
- VC6.0 OpenGL环境配置及编程基础
1.一般情况下VC并不携带glut,需要到opengl官网下载,下载地址 http://www.opengl.org/resources/libraries/glut/glut37.zip 解压后 打 ...