为了账号安全,请及时绑定邮箱和手机立即绑定

基于MATLAB的中值滤波算法实现

标签:
算法

 在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被广泛用于数字图像处理的边缘提取,其基本原理是把数字图像或数字序列中的一点的值用该点邻域内所有的点排序后的中值来代替。

  中值滤波对椒盐噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。而且,中值滤波的算法比较简单,也易于用硬件实现。这篇我们先用MATLAB来实现中值滤波。

中值滤波方法是,对待处理的当前像素,选择一个模板3x3、5x5或其他,这里选择3x3矩阵,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。

https://img1.sycdn.imooc.com//5b80af230001d4d105120412.jpg

排序算法示意图

当我们使用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

复制代码

 1 %RGB_YCbCr 2 clc; 3 clear all; 4 close all; 5  6 RGB_data = imread('lena.jpg');% 7  8 R_data =    RGB_data(:,:,1); 9 G_data =    RGB_data(:,:,2);10 B_data =    RGB_data(:,:,3);11 12 %imshow(RGB_data);13 14 [ROW,COL, DIM] = size(RGB_data); 
15 16 Y_data = zeros(ROW,COL);17 Cb_data = zeros(ROW,COL);18 Cr_data = zeros(ROW,COL);19 Gray_data = RGB_data;20 21 for r = 1:ROW 
22     for c = 1:COL23         Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);24         Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;25         Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;26     end27 end 
28 29 Gray_data(:,:,1)=Y_data;30 Gray_data(:,:,2)=Y_data;31 Gray_data(:,:,3)=Y_data;32 33 figure;34 imshow(Gray_data);35 36 %Median Filter37 imgn = imnoise(Gray_data,'salt & pepper',0.02); 
38 39 figure;40 imshow(imgn);41 42 43 for r = 2:ROW-144     for c = 2:COL-145         median3x3 =[imgn(r-1,c-1)    imgn(r-1,c) imgn(r-1,c+1)46                     imgn(r,c-1)      imgn(r,c)      imgn(r,c+1)47                     imgn(r+1,c-1)      imgn(r+1,c) imgn(r+1,c+1)];48         sort1 = sort(median3x3, 2, 'descend');49         sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');50         sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');51         sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');52         mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');53         Median_Img(r,c) = mid_num(2);54     end55 end56 57 figure;58 imshow(Median_Img);

复制代码

处理前后比较

https://img1.sycdn.imooc.com//5b80af2f000194e208050566.jpg

Gray lena

https://img1.sycdn.imooc.com//5b80af3c0001e6aa08050566.jpg

加入椒盐噪声后的lena

https://img1.sycdn.imooc.com//5b80af4b0001076408040565.jpg

对加入椒盐噪声后进行中值滤波的lena

  可以看出,中值滤波对椒盐噪声的滤除效果真是非常的好。光看我处理后图图片可能看不出太明显对比,有兴趣的朋友可以自己尝试下。这里MTALAB的排序部分基本是是按照排序算法一步步来的,完全符合FPGA实现的思路,所以说掌握算法的基础原理和Verilog自己就可以尝试用FPGA实现了。

  这里需要强调的一下是这样的滤波对图像的边缘没有进行处理,这是因为我们在求取均值或中值时,生成的3x3矩阵,第一行的像素并没有处理,同样的图像最外层边缘的像素都没有处理,不过这个对整体影响不大,所以后面再弄,下一篇来实现Sobel边缘检测。

原文出处:https://www.cnblogs.com/ninghechuan/p/9527915.html

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消