邻域平均法虽然可以平滑图像,但在消除噪声的同时,会使图像中的一些细节变得模糊。中值滤波则在消除噪声的同时还能保持图像中的细节部分,防止边缘模糊(保边特性)。 中值滤波是一种非线性滤波。基本原理是把数字图像或数字序列中某一点的值用该点的一个领域的各点值的中值交换。

直接在Python版本的OpenCV中介绍过中值滤波:
OpenCV For Python入门23 平滑处理之高斯滤波及中值滤波

设原始图像在(x,y)的灰度值为f(x,y),增强图像在对应位置(x,y)的灰度值为g(x,y)。则有:

公式

W为选定窗口大小。

MATLAB中提供了medfilt2函数来进行中值滤波。其调用格式如下:

B = medfilt2(A)

B = medfilt2(A,[M N])

[M N]为滤波窗口大小,缺省时如第一种格式则为3×3滤波窗口。

% This is a code that can be reproduced.
% However, this copyright notice shall be attached when copying, pasting and public use
% Author: Xinrui Tao
% Email: [email protected]
% Date: 2022-11-11 12:07:32
% I have my own BLOG(URL: https://www.52txr.cn  ). Welcome to leave a message.

clc;
I = imread("king.png");
image=imnoise(I,'salt & pepper',0.01);   %添加噪音
image_matrix=image(:,:,1);
image_matrix=double(image_matrix);
[height,width,channels]=size(image);

%输入数值,设定的窗口大小(大小必须为奇数)
maskWidth = 5;
maskHeight = 5;

%一般都是奇数
maskCenterX=(maskWidth+1)/2;
maskCenterY=(maskHeight+1)/2;

%寻找数组中中值大小
maskValue=zeros(1,maskHeight*maskWidth);

%数组中间的序号
middleNum = maskHeight*maskWidth/2+0.5;

for i=maskCenterY:1:height-maskHeight+maskCenterY
  for j=maskCenterX:1:width-maskWidth+maskCenterX
      %计算像素值
      pixelResult = 0;
      %遍历模板区域
      for k=1:1:maskHeight
          for p = 1:1:maskWidth
              %把数值放入到数组中
              maskValue((k-1)*maskHeight+p) = image_matrix(i-(maskHeight+1)/2+k,j-(maskWidth+1)/2+p);  
          end
      end

      %找到数组中中值,采用冒泡排序法,把数值从大到小排列
      for num = 1:maskHeight*maskWidth
          for xx = 1:maskHeight*maskWidth-1
              if(maskValue(xx)<maskValue(xx+1))
                  temp = maskValue(xx);
                  maskValue(xx) = maskValue(xx+1);
                  maskValue(xx+1) = temp;
              end
          end
      end 
      %更新中值赋予当前像素点
      image_matrix(i,j)= maskValue(middleNum);
  end
end

image_out = uint8(image_matrix);
%显示
subplot(1,2,1);
imshow(image);
subplot(1,2,2);
imshow(image_out);

运行效果


版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/matlabMedfilt2.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!
▶ 站长邮箱 [email protected][email protected] ,如不方便留言可邮件联系。

最后修改:2022 年 11 月 11 日
如果觉得我的文章对你有用,请随意赞赏