Matlab中值过滤器代码

Had*_*adh -1 matlab image image-processing filter median

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

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

ray*_*ica 7

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


中值滤波背后的基本前提是分析图像中的像素邻域,对其强度进行排序,然后选择中间强度作为结果.我可以做的一个建议是使用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');
Run Code Online (Sandbox Code Playgroud)

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

N = 5;
im = imread('cameraman.tif');
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

在此输入图像描述

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


奖金

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

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