注意:这假定已安装了图像处理工具箱。
中值滤波的基本前提是分析图像中的像素邻域,对它们的强度进行排序,然后选择中间强度作为结果。我可以提出的一个建议是使用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中创建和应用高斯滤波器?
0
我需要在MATLAB中为图像实现中值滤波。但是, 不允许在MATLAB中使用
medfilt2
或ordfilt2
函数。我们最近还开始学习MATLAB。中值滤波器或高斯滤波器有没有可用的代码?