找回密码
 注册
关于网站域名变更的通知
查看: 654|回复: 4
打印 上一主题 下一主题

一文教你用MATLAB来实现中值滤波

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-5-8 14:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

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


" g4 \3 M% J2 ^+ g$ o' i6 W

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


6 s  ?! @- @, A0 v4 M. X

. g0 _* B/ l/ ]* h+ s

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

处理前后比较

/ N! y- |" e# a. N- U5 {

3 h- m1 \9 q5 U2 s

Gray lena

9 N2 q( n- w! [  O2 s


" c* t5 x: H) f( ?+ O- V

加入椒盐噪声后的lena

7 L) h1 S) L  N$ B" C) Z7 D, f


# n; |% {; p& J# U0 \% S  ~% [

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

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


+ Q* v  O2 G! a; t  x
  • TA的每日心情
    开心
    2023-1-3 15:10
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2021-5-8 15:17 | 只看该作者
    中值滤波对椒盐噪声有良好的滤除作用
  • TA的每日心情
    开心
    2022-12-27 15:46
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    3#
    发表于 2021-5-8 18:13 | 只看该作者
    干扰噪声和椒盐噪声

    该用户从未签到

    4#
     楼主| 发表于 2021-5-10 09:52 | 只看该作者
    大家能学到东西就是好的

    该用户从未签到

    5#
    发表于 2021-5-13 16:57 | 只看该作者
    加入椒盐噪声后确实好看了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-17 12:54 , Processed in 0.078125 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表