均值滤波及中值滤波的matlab实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cjsh_123456/article/details/79261271

均值滤波及中值滤波的区别


均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。中值滤波采用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择适当的点来替代污染点的值,所以处理效果好,对椒盐噪声表现较好,对高斯噪声表现较差。


填充问题


在对图像应用滤波器进行过滤时,边界问题是一个需要处理的问题。一般来说,有3种处理的方法。

1. 不做边界处理

不对图像的边界作任何处理,在对图像进行滤波时,滤波器没有作用到图像的四周,因此图像的四周没有发生改变。


2. 填充0

对图像的边界做扩展,在扩展边界中填充0,对于边长为2k+1的方形滤波器,扩展的边界大小为k,若原来的图像为[m, n],则扩展后图像变为[m+2k, n+2k]。进行滤波之后,图像会出现一条黑色的边框。


3. 填充最近像素值

扩展与 填充0 的扩展类似,只不过填充0的扩展是在扩展部分填充0,而这个方法是填充距离最近的像素的值。




matlab代码实现


1.  均值滤波函数如下

该函数为spacelFilter,输入为需要进行滤波的图像(L = 256,像素值为0-255的灰度图像),方形滤波器(大小为2k+1,值类型为uint8),输出为经过滤波器滤波之后的图像。该函数滤波采用填充最近像素值的方法,结果图像不会出现黑边。


 
 
  1. function [image_out] = spacelFilter(image_in, filter)
  2. % (线性)均值滤波函数
  3. % 输入为需要进行空间滤波的灰度图像,线性方形滤波器
  4. % 输出为经过滤波之后的图像
  5. % 图像边缘的填充为最近的像素值,目的是消除填充 0时会出现的黑框
  6. % 滤波器的大小为 n * n, n = 2 * k + 1, k为整数
  7. % 输入图像大小为 m * n, 灰度图像,像素值范围为 0 -255,L = 256
  8. [m, n] = size(image_in);
  9. [mf, nf] = size( filter);
  10. k = (mf - 1) / 2;
  11. image2 = zeros(m+ 2*k, n+ 2*k, 'double');
  12. image_out = zeros(m, n, 'uint8');
  13. coeff = sum( filter(:));
  14. % 填充部分
  15. % 内部直接复制
  16. for i = 1+k : m+k
  17. for j = 1+k : n+k
  18. image2(i, j) = image_in(i-k, j-k);
  19. end
  20. end
  21. % 填充上下边缘
  22. for i = 1 : k
  23. for j = 1 : n
  24. image2(i, j+k) = image_in( 1, j);
  25. image2(m+k+i, j+k) = image_in(m, j);
  26. end
  27. end
  28. % 填充左右边缘
  29. for i = 1 : m
  30. for j = 1 : k
  31. image2(i+k, j) = image_in(i, 1);
  32. image2(i+k, n+k+j) = image_in(i, n);
  33. end
  34. end
  35. % 填充四个角
  36. for i = 1 : k
  37. for j = 1 : k
  38. image2(i, j) = image_in( 1, 1); %填充左上角
  39. image2(i, j+n+k) = image_in( 1, n); %填充右上角
  40. image2(i+n+k, j) = image_in(m, 1); %填充左下角
  41. image2(i+n+k, j+n+k) = image_in(m, n); %填充右下角
  42. end
  43. end
  44. % 滤波部分
  45. for i = 1+k : m+k
  46. for j = 1+k : n+k
  47. sub_image = image2(i-k:i+k, j-k:j+k);
  48. temp1 = double( filter ') .* double(sub_image);
  49. temp2 = sum(temp1(:)) / coeff;
  50. image_out(i-k, j-k) = uint8(temp2);
  51. end
  52. end
  53. end

2. 中值滤波器

实现与均值滤波器类似,只不过在滤波部分的实现有所不同。


 
 
  1. % 滤波部分
  2. for i = 1+k : m+k
  3. for j = 1+k : n+k
  4. sub_image = image2(i-k:i+k, j-k:j+k);
  5. temp = median(sub_image(:));
  6. image_out(i-k, j-k) = uint8(temp);
  7. end
  8. end

3.  测试代码如下

为了方便,我在spacelFilter函数中增加了中值滤波部分,增加了一个返回值,这样spacelFilter函数的返回值为[image1,image2],image1为均值滤波图像,image2为中值滤波图像。


 
 
  1. close all;
  2. clear all;
  3. clc;
  4. image = imread( '2.tif');
  5. [ m, n] = size(image);
  6. %模板大小
  7. k = 3;
  8. myFilter = zeros(k, k, 'uint8');
  9. for i = 1 : k
  10. for j = 1 : k
  11. myFilter ( i, j ) = 1;
  12. end
  13. end
  14. [ image2, image3] = spacelFilter(image, myFilter);
  15. image4 = medfilt2(image, [ 3 3]);
  16. figure;
  17. subplot( 2, 2, 1), imshow(image), title( '原图像');
  18. subplot( 2, 2, 2), imshow(image2), title( '3*3均值滤波图像');
  19. subplot( 2, 2, 3), imshow(image3), title( '3*3中值滤波图像');
  20. subplot( 2, 2, 4), imshow(image4), title( 'matlab自带的中值滤波图像');

4. 代码运行结果如下(测试图像为被椒盐噪声污染的图像):



1. 主要工作: 基于MATLAB图像处理的中值滤波均值滤波以及高斯滤波的实现与对比: a) 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. b) 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。 c) 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。 2. 代码功能: 实现中值滤波均值滤波以及高斯滤波,并对图像进行输出 3. 结果分析 a) 图像经过中值滤波后,高斯噪声没有被完全去除,椒盐噪声几乎被完全去除效果较好。经过均值滤波后不管是高斯噪声还是椒盐噪声大部分都没有被去除,只是稍微模糊化。经过高斯滤波后,高斯噪声和椒盐噪声几乎被很大程度的模糊化,原图好像被加上了一层蒙版。 【注】若添加图片分辨率过高会发出警报,如果可以正常输出则可以忽视。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值