HOWTO · MATLAB

MATLAB 图像低通滤波器

可以使用 MATLAB 中的 fspecial() 函数为图像创建 2D 低通滤波器。

本页内容

本教程将讨论使用 MATLAB 中的 fspecial() 函数为图像创建 2D 低通滤波器。

在 MATLAB 中使用低通滤波器平滑图像

图像中存在两个频率级别。图像中的边缘和噪声代表高频分量,平滑区域代表低频分量。

高频分量具有高强度等级或高对比度,低频分量具有低强度等级或低对比度。

假设图像有锐利的边缘或噪声,我们想要对其进行平滑处理。在这种情况下,我们必须创建一个低通滤波器,允许低频分量或像素通过并阻止高频分量或像素,从而降低图像中像素的强度水平。

假设图像具有平滑或低对比度区域,并且我们想要锐化它。在这种情况下,我们必须创建一个高通滤波器,允许高频分量或像素通过并阻止低频分量或像素,从而提高图像中像素的强度级别。

我们可以使用不同种类的滤波器来制作低通或高通滤波器。

MATLAB 的 fspecial() 函数可用于制作二维低通或高通滤波器。创建过滤器后,我们可以使用 imfilter() 或 filter2() 函数将其应用于给定图像。

fspecial() 函数根据不同的过滤器有不同的语法。可用的 fspecial() 过滤器及其语法如下所示。

Filter_object = fspecial(type)
Filter_object = fspecial('average',hsize)
Filter_object = fspecial('disk',radius)
Filter_object = fspecial('gaussian',hsize,sigma)
Filter_object = fspecial('laplacian',alpha)
Filter_object = fspecial('log',hsize,sigma)
Filter_object = fspecial('motion',len,theta)
Filter_object = fspecial('prewitt')
Filter_object = fspecial('sobel')

第一个语法是 fspecial() 函数的基本语法,第一个语法之后的六个滤波器是用于平滑图像的低通滤波器,最后两个滤波器是用于锐化图像边缘的高通滤波器给定的图像。我们必须传递过滤器的类型或过滤器名称来制作该特定类型的过滤器。

一些过滤器也有可选参数,但如果我们只传递过滤器名称,该函数将使用可选参数的默认值。我们还可以使用它们的特定语法设置过滤器的可选参数,这在第一个语法之后显示。

例如,在平均滤波器的情况下,我们可以使用上面列出的第二种语法设置滤波器大小,可以是正整数或两个元素的向量。

如果我们将 hsize 设置为正整数或缩放器,过滤器将是一个方阵。如果我们将 hsize 设置为两个元素的向量,第一个元素将表示行数,第二个元素将表示过滤矩阵的列数。

第三种语法用于根据给定的半径创建圆形平均滤波器或圆盘滤波器,可以是正整数,默认设置为 5。第四种语法用于创建高斯滤波器 size hsize 和 sigma,表示标准偏差,默认情况下,其值设置为 0.5。

我们还可以使用 MATLAB 中的 imgaussfilt() 和 imgaussfilt3() 函数来创建高斯滤波器并将其应用于给定图像。第五个语法用于根据 alpha 创建 laplacian 过滤器,设置 Laplacian 的形状,默认值为 0.2。

第六个语法用于根据滤波器大小 hsize 和 sigma 创建高斯滤波器的拉普拉斯滤波器,表示标准差。

第七个语法用于创建运动过滤器,以根据 len 指定的运动长度来平滑包含相机线性运动的图像,其默认值为 9,运动角度以度为单位由 theta 指定。角度为逆时针方向,默认值为 0。

第八个语法创建一个高通滤波器,以使用垂直梯度增强水平边缘的强度级别。如果我们想创建一个过滤器来增强垂直边缘,我们可以对输出过滤器矩阵进行转置。

最后一个语法与倒数第二个语法相同;唯一的区别是最后一个语法用于使用平滑效果创建过滤器。例如,让我们使用 fspecial() 函数创建平均过滤器,以去除图像中存在的椒盐噪声。

请参阅下面的代码。

clc
clear

Input_image = imread('eight.tif');
Noisy_image = imnoise(Input_image,'salt & pepper',0.03);
h = fspecial('average');
Smoothed_image = filter2(h, Input_image);
imshowpair(Noisy_image,Smoothed_image,'montage')

输出:

平均滤波器

在上面的代码中,我们使用 imnoise() 函数将椒盐噪声放入给定图像中,我们使用 filter2() 函数将平均滤波器应用于噪声图像。我们使用 imshowpair() 函数来显示噪声和平滑图像以进行比较。

我们可以在上面的输出中看到,使用平均滤波器对右侧图像进行了平滑处理。我们可以对图像应用不同的过滤器来检查结果。

我们还可以使用 imfilter() 函数在给定图像上应用过滤器。filter2() 和 imfilter() 之间的区别在于它们在给定图像上应用过滤器的算法。

imfilter() 使用双精度和浮点运算来计算输出图像的像素值,filter2() 采用给定图像和过滤器矩阵的 2D 卷积,将旋转 180 度找到输出像素值。我们可以尝试这两个函数并比较它们的结果。

我们还可以设置 imfilter() 函数的一些选项,例如输入数组的填充选项、输出矩阵的大小和卷积选项。我们还可以在 filter2() 函数的情况下设置输出过滤数据的形状,默认情况下设置为 same,但我们也可以将其设置为 full 以获得完整的 2D 过滤数据和 valid 对于不使用零填充边计算的数据。

查看此链接了解有关 filter2() 函数的更多详细信息。查看此链接以获取有关 imfilter() 函数的更多详细信息。