Matlab中值过滤器代码
image
image-processing
matlab
5
0

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

中值滤波器或高斯滤波器有没有可用的代码?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

注意:这假定已安装了图像处理工具箱。


中值滤波的基本前提是分析图像中的像素邻域,对它们的强度进行排序,然后选择中间强度作为结果。我可以提出的一个建议是使用im2col将每个像素邻域转换为单个向量,并采用所有这些列向量来创建单个矩阵。每列将代表像素邻域内的像素强度。接下来,使用sort和排序沿着行对每列,然后抓住它表示对于每个像素邻域的中间值此有序矩阵的中间 。这将是一个单行向量,代表每个像素邻域的中位数。完成操作后,只需将此向量重塑为与原始图像相同的大小即可获得中值滤波结果。您可以使用col2im来帮助完成最后一步。

但是,使用im2col ,它仅im2col原始图像范围内的像素邻域。因为您需要对沿着图像边界的滤镜像素进行中值处理, 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');

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

在此处输入图片说明

在此处输入图片说明

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


奖金

您的帖子还要求从进行高斯滤波的基本原理中查找代码。我几天前为别人回答了这个问题。

在此处查看这篇文章: 如何在不使用fspecial,imfilter或conv2的情况下在MATLAB中创建和应用高斯滤波器?

收藏
评论

我已经编写了代码,可能会有所帮助:

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

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,[]);
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号