Matlab中值过滤器代码

时间:2014-12-17 21:54:25

标签: image matlab image-processing filter median

我需要在MATLAB中为图像实现中值滤波。但是,我 不允许在MATLAB中使用medfilt2ordfilt2函数。我们最近也开始学习MATLAB。

是否有可用于中值滤波器或高斯滤波器的代码?

4 个答案:

答案 0 :(得分:7)

NB:这假定已安装图像处理工具箱。


中值滤波背后的基本前提是分析图像中的像素邻域,对其强度进行排序,然后选择中间强度作为结果。我可以做的一个建议是使用im2col将每个像素邻域转换为单个向量,并将所有这些列向量创建为单个矩阵。每列将表示像素邻域内的像素强度。接下来,使用sort并对每列的行进行排序,然后获取此排序矩阵的中间,该矩阵表示每个像素邻域的中间值。这将是单行向量,表示每个像素邻域的中值。完成后,只需将此矢量重新整形为与原始图像相同的大小,即可获得中值滤波结果。您可以使用col2im来帮助完成最后一步。

但是,对于im2col,它只会抓取原始图像范围内的像素邻域。由于您希望沿着图像的边框对滤镜像素进行中值处理,因此在使用im2col进行处理之前,您需要填充图像边框。使用padarray为您执行此操作。我将假设边框用零填充以使事情变得更简单。

因此,给定灰度图像im,并使用对称邻域来分析N x N,其中N是宽度/高度你的邻居,你的代码可能看起来像这样。我还假设N很奇怪,允许选择中位数更容易:

im_pad = padarray(im, [floor(N/2) floor(N/2)]);
im_col = im2col(im_pad, [N N], 'sliding');
sorted_cols = sort(im_col, 1, 'ascend');
med_vector = sorted_cols(floor(N*N/2) + 1, :);
out = col2im(med_vector, [N N], size(im_pad), 'sliding');

让我们举个例子。我们假设我们的过滤器大小为5 x 5,我们将cameraman.tif用作图像处理工具箱的一部分。如果我们执行下面的代码,那么运行上面看到的中值过滤器代码:

N = 5;
im = imread('cameraman.tif');

我们得到以下内容,包括原始图像,以及使用中值滤波过滤的最终图像。

enter image description here

enter image description here

这是我们所期望的,因为预期中值滤波(或多或少)在进行图像平滑时保持良好的边缘。中值滤波对于椒盐噪声特别有用,因为这些噪声像素很可能在排序像素邻域时出现在开头和结尾,因此选择中间值很可能会过滤掉这些噪声值。


加成

你的帖子也要求从高斯过滤的第一原理中找到代码。我几天前为别人回答了这个问题。

在此处查看此信息:How do I create and apply a Gaussian filter in MATLAB without using fspecial, imfilter or conv2?

答案 1 :(得分:2)

我编写了一段代码,可能有所帮助:

读取图像并为其添加噪音:

I=imread('cameraman.tif');
if(size(I,3)~=1)
I=rgb2gray(I);
end
rr=0.1;  
h=imnoise(I,'salt & pepper',rr);
imshow(h);
[M,N]=size(h);
new=h-h;

询问所需内核的大小:

disp('***************Note:zero-padding method is used!***********');
disp('                                                           ');
kernel_size=input('enter the size of the kernel for the Median-ranking? 3 or 5 or 7 or 9=  ');
k=zeros(kernel_size);  %k is the kernel used. 

将中值滤波器应用于图像:

start=kernel_size-floor(kernel_size*0.5);
for x=start:1:M-floor(kernel_size*0.5)
for y=start:1:N-floor(kernel_size*0.5)

%defining x1 & y1 as the 1st coordinates in the kernel
x1=x-(floor(kernel_size*0.5));
y1=y-(floor(kernel_size*0.5));

%specifying image pixels to the kernel
for p=1:1:kernel_size
for q=1:1:kernel_size
 k(p,q)=h(x1+p-1,y1+q-1);
end    
end
d=reshape(k,1,[]);  %k values into an array d 
[r,c]=size(d);
%*****Ordering kernel members***************
for j=1:1:c-1
for i=1:1:c-1
    a=d(1,i);
    b=d(1,i+1);
    if(a>b)
     d(1,i)=b;
     d(1,i+1)=a;
    end
end  
end
Median=d(1,floor(kernel_size*kernel_size*0.5)+1);
  %*****************end of ordering***********
  %*******************************************

   new(x,y)=Median;    
end
end

显示结果:

figure;imshow(new,[]);

答案 2 :(得分:0)

我告诉你如何开始你的任务。 你只需要建立一个sorting algorithm,然后拿起中心值。很大一部分是实现排序算法。其中一些:

  • Bucket sort
  • 列表项
  • 冒泡排序
  • 插入排序
  • 选择排序
  • 堆排序
  • 归并

他们不难理解并自己编写。您可以轻松找到已写的内容。输入您的搜索引擎sorting algorithms matlab。您说I'm looking for the code of the Built-in function of median filter in Matlab. Matlab允许查看meddilt2()ordfilt2()的源代码,您可以看到这些函数的代码,但请记住版权规则。

实施排序算法后,您可以通过编写mask( ( numel(mask) + 1 ) / 2 )轻松选择过滤器蒙版的中心值。

这'它。

如果您正在寻找某人从头开始为您的任务编写整个解决方案,那么您将需要付出艰苦的努力。

祝你好运。


有两个MATLAB内置函数用于中值滤波:medfilt2()ordfilt2()。实际上medfilt2()会在其正文中调用ordfilt2()。因为中值滤波是秩次序滤波的特例。

答案 3 :(得分:-1)

这是我自己编写的代码。我希望它有效。

clc;
clear all;
close all;

A=imread('2.jpg');
A=rgb2gray(A);
figure;imshow(A);
Y=imnoise(A,'salt & pepper',0.5);
figure;imshow(Y);
[n,m]=size(A);
%median filter
for i=1:n
   for j=1:m
        mat=zeros(3,3);
        if((i-1) == 0 && (j-1) ~= 0 && j~=m)
            mat(2:3,1:3)=Y(i:i+1,j-1:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
       elseif(i==n && (j-1)~=0 && j~=m)
            mat(1:2,:)=Y(i-1:i,j-1:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
       elseif((i-1)~=0 &&(j-1)~=0 && j~=m && i~=n)
            mat(:,:)=Y(i-1:i+1,j-1:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
        elseif((j-1)==0 && (i-1)~=0 && i~=n)
            mat(:,2:3)=Y(i-1:i+1,j:j+1);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
        elseif(j==m && (i-1)~=0 && i~=n)
            mat(:,1:2)=Y(i-1:i+1,j-1:j);
            mat=sort(mat,1);
            mat=sort(mat,2);
            Y(i,j)=mat(2,2);
        end
    end
end

figure;
imshow(Y)