median_block.m

来自「关于偏微分方程进行图像处理的电子书,对于学习动态轮廓实现图像的分割非常有用」· M 代码 · 共 68 行

M
68
字号
function median_block(filename,r,out_file_name)
% 中值算子
% filename 输入图像文件名
% 结构元素为方块,边长为2r+1
% out_file_name 输出文件名

if nargin<3
    disp('请按输入参数说明正确输入参数!!!');
    return;
end

  image_I=imread(filename);
  [size_m,size_n]=size(image_I);
  image_O=image_I;
 
  image_ex=matrix_expand(image_I,r);
  
  for row=1:size_m
      for col=1:size_n
          % 对每一点求其 r领域 的最小值
              array=[];
              for x=-r:r
                  for y=-r:r    
                      array=[array image_ex(row+r+x,col+r+y)];
                  end
              end
              array=sort(array);
              image_O(row,col)=array( ceil(length(array)/2) );
      end
  end
     
 imwrite(image_O,out_file_name);                      
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function matrix_ex=matrix_expand(matrix,x)
% 对矩阵进行延拓 ,镜面映射  
   [size_r,size_c]=size(matrix);
   matrix_ex=zeros(size_r+2*x,size_c+2*x);
   % 中
   for row=1:size_r
       for col=1:size_c
           matrix_ex(row+x,col+x)=matrix(row,col);
       end
  end
  % 左,右
  for row=1:size_r
      for col=1:x
          matrix_ex(row+x,x-col+1)=matrix(row,col);
          matrix_ex(row+x,size_c+x+col)=matrix(row,size_c-col+1);
      end
  end
  % 上,下
  for row=1:x
      for col=1:size_c 
          matrix_ex(x-row+1,col+x)=matrix(row,col);
          matrix_ex(size_r+x+row,col+x)=matrix(size_r-row+1,col);
      end
  end

  for row=1:x
       for col=1:x
           matrix_ex( x-col+1,x-row+1 )=matrix(row,col);   % LL
           matrix_ex( x-col+1,size_c+x+row )=matrix(row,size_c-col+1); %LH
           matrix_ex( size_r+x+col,x-row+1 )=matrix(size_r-row+1,col); % HL
           matrix_ex( size_r+x+col,size_c+x+row)=matrix(size_r-row+1,size_c-col+1);%HH
       end
   end   
% --------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?