【图像滤波】理想滤波器、巴特沃斯滤波器、高斯滤波器实现(包含低通与高通,代码实现与分析)
本篇博客聚焦理想滤波器、巴特沃斯滤波器、高斯滤波器进行原理剖析、代码实现和结果总结,代码含有详细注释,希望帮助大家理解。以下将从理想低通滤波器理想高通滤波器巴特沃斯低通滤波器巴特沃斯高通滤波器高斯低通滤波器高斯高通滤波器六个块题进行阐述,每一块题将分为实验原理实验代码展示实验结果分析三部分进行讲解。
本篇博客聚焦理想滤波器、巴特沃斯滤波器、高斯滤波器进行原理剖析、代码实现和结果总结,代码含有详细注释,希望帮助大家理解。
以下将从理想低通滤波器、理想高通滤波器、巴特沃斯低通滤波器、巴特沃斯高通滤波器、高斯低通滤波器、高斯高通滤波器六个块题进行阐述,每一块题将分为实验原理、实验代码展示、实验结果分析三部分进行讲解。
在本博客中使用的待处理图像如下所示:
理想低通滤波器
实验原理
低通滤波可保留图像中的低频分量而除去高频分量。图像中的边缘和噪声都对应图像傅里叶频谱中的高频部分,所以低通滤波可以除去或削弱噪声的影响并模糊边缘轮廓。理想低通滤波器具有传递函数:
其中为理想低通滤波器的截止频率。理想低通滤波器在半径为的范围内,所有频率都可以没有衰减地通过滤波器,该半径之外的所有频率都完全被衰减掉。
是到频谱中心的距离(欧式距离),计算公式如下:
和表示频谱图像的大小,即为频谱中心。
理想低通滤波器在数学上定义得很清楚,在计算机模拟中也可实现,但在截断频率处直上直下的理想低通滤波器是不能用实际的电子器件实现的。理想低通滤波器图像如下图所示。
一个理想低通滤波器函数的透视图
以图像形式显示的滤波器
滤波器镜像横截图
可以看出,理想低通滤波器具有平滑图像的作用。但是理想低通滤波器的过渡非常急剧,高频信息全部消失,严重降低了复原图像的质量,有很严重的振铃现象。
振铃现象产生的本质原因是:对于窗函数(理想低通滤波器形式)而言,经过逆傅里叶变换转换到空域后的函数形式为辛格函数(),两边的余波将对图像产生振铃现象,如下图。
矩形窗函数和辛格函数
在空间域将低通滤波作为卷积过程来理解的关键是空间滤波函数的特性——可将空间滤波函数分为两部分:原点处的中心部分,中心周围集中的成周期分布的外围部分。前者决定模糊,后者决定振铃现象。如下图所示。若外围部分有明显的震荡,则增强图像会出现振铃。利用傅里叶变换,我们发现,若频域滤波函数具有陡峭变化,则傅里叶逆变换得到的空域滤波函数会在外围出现震荡。
理想低通滤波器在频域和空域内的函数透视图
实验代码实现
理想低通滤波器的代码实现如下,该部分只展示了绘制截止频率图像的相关代码,绘制其他频率图像的代码只需修改截止频率数值即可。该部分使用Matlab代码实现。
close all;
clc;
I = imread("待处理图片.jpg");%读取图片
I = rgb2gray(I);%将图片转化为灰度图像
subplot(331),
imshow(I);%展示图象
title('原始图像');
%'fft_data = fftshift(fft2(im2double(I)));'步骤指对图像进行二维傅里叶变换,可以拆分为三步进行:
%该步将灰度图像I的值转为double并进行归一化,防止原I的unit8类型只能为整数值
%从而导致在涉及到双精度数值时被迫截断而产生误差
%I = im2double(I);
%该步将灰度图像I进行了fft变换
%fft_data = fft2(I);
%该步将fft变换后的频谱图进行了频移,将变换后的图像频谱中心从矩阵的原点移到矩阵的中心
%fft_data = fftshift(fft_data);
fft_data = fftshift(fft2(im2double(I)));
[height, width] = size(fft_data);%获取经fft变换后的矩阵的尺寸
center_x = round(height / 2);%获取中心点的x坐标
center_y = round(width / 2);%获取中心点的y坐标
D0 = 5;%设置截断频率为5
for x = 1 : height
for y = 1 : width
distance = sqrt((x - center_x) ^ 2 + (y - center_y) ^ 2);%求取图像上的(x,y)点距中心原点的距离
if distance <= D0
H = 1;%如果小于截止频率,则频域的变换函数值设置为1(若为高通则改为0)
else
H = 0;%如果大于截止频率,则频域的变换函数值设置为0(若为高通则改为1)
end
fft_data(x, y) = fft_data(x, y) * H;%频域变换,直接相乘
end
end
fft_data = ifft2(ifftshift(fft_data));%将频谱图的中点从中心处移动到原点处,并进行逆傅里叶变换
return_image = real(fft_data);%显示图像时取实部即可
subplot(332),
imshow(return_image, []);%显示图像
title('截止频率D0 = 5的变换图像');
最终选取了八个截止频率(分别为5,10,15,20,30,40,50,60)进行测试,在下一部分对结果进行分析。
实验结果分析
经理想低通滤波器处理后的图像结果展示如下:
可以看到,随着截止频率的增加,图像越来越清晰,细节展现越来越明显。
由理想低通滤波器的原理可知,图像经过理想低通滤波器后,表征轮廓、内容的低频信息被保留,表征细节、边缘等突变信息的高频信息被去除,随着截止频率的增大,保留的信息越来越多,故图像也愈发清晰,细节更加明显。
但处理所得的八个图像均可以观察到较为明显的振铃效应,这是由于理想低通滤波器本身的特性导致的,无法随着频率改变而彻底消除。
理想高通滤波器
实验原理
理想的高通滤波器与理想低通滤波器相反,1减去低通滤波模板即可。高通滤波可保留图像中的高频分量而除去低频分量。图像中的轮廓和内容都对应图像傅里叶频谱中的低频部分,所以高通滤波可以去除图像的轮廓而保留图像的边缘等突变信息。理想高通滤波器的传递函数为:
其中为理想高通滤波器的截止频率。理想高通滤波器在半径为的范围内,所有频率都完全被衰减掉,该半径之外的所有频率都可以没有衰减地通过滤波器。
是到频谱中心的距离(欧式距离),计算公式如下:
和表示频谱图像的大小,即为频谱中心。
与理想低通滤波器同理,理想高通滤波器由于其本身函数的特性,导致在进行逆傅里叶变换时也会出现形如函数的图像,进而导致图像产生振铃现象。
实验代码实现
理想高通滤波器的代码实现与理想低通滤波器代码实现基本一致,唯一需要变动的地方在于当时需设置,当时需设置,修改的位置已在上述代码的注释中表明,在此不再重复贴附代码。
最终选取了八个截止频率(分别为5,10,15,20,30,40,50,60)进行测试,在下一部分对结果进行分析。
实验结果分析
图像经理想高通滤波器处理后,所得结果如下图所示。
可以看到,随着截止频率的增加,图像的边缘信息逐渐凸显,而图像的内容信息逐渐消失,而伴随着截止频率的进一步增加,图像的边缘信息也逐渐消失。
由理想高通滤波器的原理可知,图像经过理想高通滤波器后,表征轮廓、内容的低频信息被去除,表征细节、边缘等突变信息的高频信息被保留,当截止频率增大时,低频信息量越来越少而高频信息量仍然存在,故边缘、细节等信息逐渐凸显,但当截止频率进一步增大时,高频信息量也被去除,故边缘也逐渐消失。
处理所得的八个图像均可以观察到较为明显的振铃效应,这是由于理想高通滤波器本身的特性导致的,无法随着频率改变而彻底消除。
巴特沃斯低通滤波器
实验原理
巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零。在低通情况下,对阶巴特沃斯低通滤波器,其传递函数为:
其中,是虚数单位,为频率,为截止频率。
固定为50,巴特沃斯低通滤波器不同阶数下的幅频响应如下图(a)。通过表达式不难看出,阶数越小,巴特沃斯低通滤波器变化越平滑;阶数越大,其变化越剧烈;若阶数足够高,巴特沃斯低通滤波器应该近似理想低通滤波器,并产生显著的振铃效应。同时注意到,所有阶数的幅频特性曲线都交于同一点。
固定阶数为5,巴特沃斯低通滤波器在不同频率下的幅频响应如下图(b)。从图中可以看出,随着截止频率的增加,滤波器的通带宽度也会增加。低截止频率对应于较窄的通带,而高截止频率对应于较宽的通带。同时,随着截止频率的增加,滤波器的截止斜率也会变平缓。低截止频率下的滤波器更加陡峭,可以更有效地滤除高频成分,但振铃效应也越明显。
实验代码实现
巴特沃斯低通滤波器的代码实现如下,该部分使用Python代码实现。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('exam_image.jpg', cv2.IMREAD_GRAYSCALE)
plt.rcParams['font.family'] = 'Times New Roman'
cutoff_frequency_list=[5 ,10 ,15 ,20, 30 ,40, 50, 60] #设置取样的截止频率
filter_order_list=[1,5,10] #设置取样的阶数
filename0='image/'
# 傅里叶变换图像
image_frequency = np.fft.fftshift(np.fft.fft2(image))
plt.figure()
image_fftlog = np.log(np.abs(image_frequency) + 1)
plt.imshow(image_fftlog, cmap='gray')
plt.xticks([]), plt.yticks([])
plt.savefig(filename0 + 'fft.png', dpi=300)
# 计算图像的中心坐标
center_x, center_y = image.shape[1] // 2, image.shape[0] // 2
for cutoff_frequency in cutoff_frequency_list:
for filter_order in filter_order_list:
# 创建巴特沃斯低通滤波器
butterworth_filter = np.zeros_like(image, dtype=np.float32)
for y in range(image.shape[0]):
for x in range(image.shape[1]):
distance = np.sqrt((x - center_x) ** 2 + (y - center_y) ** 2)
# 计算巴特沃斯滤波器的值
butterworth_filter[y, x] = 1 / (1 + (distance / cutoff_frequency) ** (2 * filter_order))
filename=filename0+f'{cutoff_frequency}_{filter_order}_'
# 应用滤波器
filtered_image_frequency = image_frequency * butterworth_filter
# 反傅里叶变换
filtered_image = np.abs(np.fft.ifft2(np.fft.ifftshift(filtered_image_frequency)))
plt.figure()
# 显示滤波后的图像
plt.subplot(111), plt.imshow(filtered_image, cmap='gray')
plt.title(f'Cutoff Frequency: {cutoff_frequency}, Filter Order: {filter_order}')
plt.xticks([]), plt.yticks([])
plt.savefig(filename+'image.png',dpi=300)
plt.close()
# 设置坐标轴标签
# 去除坐标轴上的数字标签
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.set_zticklabels([])
plt.title(f'Butterworth Filter (Cutoff Frequency: {cutoff_frequency}, Filter Order: {filter_order})')
plt.savefig(filename+'filter3d.png',dpi=300)
plt.close()
print(f'Butterworth Filter (Cutoff Frequency: {cutoff_frequency}, Filter Order: {filter_order})')
小组进行了控制变量分析法得到两组结果——
(1)选取阶数为5,不同截止频率(分别为5,10,15,20,30,40,50,60)的巴特沃斯低通滤波器对测试图像滤波。
(2)选取截止频率为30,不同阶数(分别为1,5,10)的巴特沃斯低通滤波器对测试图像滤波。
在下一部分对结果分别进行分析。
实验结果分析
①选取阶数为5,不同截止频率的巴特沃斯低通滤波器对测试图像滤波。实验结果如下图所示。
可以看出,当截止频率较低时,高频细节会被更严格地抑制,使图像变得更加模糊和平滑。当截止频率较高时,滤波器会通过更多的高频信息,从而保留图像中的细节和纹理。
②选取截止频率为30,不同阶数的巴特沃斯低通滤波器对测试图像滤波。实验结果如下图所示。
可以看出,阶数低的巴特沃斯滤波器滤波后的图像较为平滑,随着阶数增大,幅频曲线变化剧烈,会造成振铃效应增强,当阶数为10时已经能观察出明显的振铃效应。这与理论分析的一致。
但是在图中还是能够发现一些振铃现象的存在,这是由于巴特沃斯函数本身的特性,导致无法完全避免振铃现象。
巴特沃斯高通滤波器
实验原理
巴特沃斯高通滤波器的产生公式为:
其中,是虚数单位,为频率,为截止频率。可以看出与巴特沃斯低通滤波器的公式区别在于把分母上的和交换了位置。
固定为50,巴特沃斯高通滤波器不同阶数下的幅频响应如下图(a)。通过表达式不难看出,阶数越小,巴特沃斯高通滤波器变化越平滑;阶数越大,其变化越剧烈;若阶数足够高,巴特沃斯高通通滤波器应该近似理想高通滤波器,并产生显著的振铃效应。同时注意到,所有阶数的幅频特性曲线都交于同一点。
固定阶数为5,巴特沃斯高通滤波器不同频率下的幅频响应如下图(b)。从图中可以看出,随着截止频率的增加,滤波器的通带宽度也会减小。低截止频率对应于较宽的通带,而高截止频率对应于较窄的通带。同时,随着截止频率的增加,滤波器的截止斜率也会变平缓。低截止频率下的滤波器更加陡峭,但振铃效应也越明显。
实验代码实现
巴特沃斯高通滤波器的代码实现如下,该部分使用Matlab代码实现。
%巴特沃斯高通滤波器处理图片
close all;
clear;
clc;
I = rgb2gray(imread('待处理图片.jpg'));
subplot(2,2,4)
imshow(I);
title('Original Image');
% 阶数n分别为1,5,10
% 截止频率d0分别为 5 10 15 20 30 40 50 60
%n = [1, 5, 10];
n=[1,5,10];
%d0 = [5, 10, 15, 20, 30, 40, 50, 60];
d0=[30];
for a = 1:length(n)
for b = 1:length(d0)
s = fftshift(fft2(im2double(I)));
[N1, N2] = size(s); % 求二维傅立叶变换后图像大小
n1 = round(N1 / 2);
n2 = round(N2 / 2);
for i = 1:N1
for j = 1:N2
distance = sqrt((i - n1)^2 + (j - n2)^2);
if distance == 0
h = 0;
else
h = 1 / (1 + (d0(b) / distance)^(2 * n(a)));
end
s(i, j) = h * s(i, j);
end
end
s = real(ifft2(ifftshift(s)));
subplot(2,2,a)
imshow(s, []);
%title(['Order:', num2str(n(a)), ' Cutoff Frequency:', num2str(d0(b))]);
%title([' Cutoff Frequency:', num2str(d0(b))]);
title(['Order:', num2str(n(a))])
end
end
小组进行了控制变量分析法得到两组结果——
(1)选取阶数为5,不同截止频率(分别为5,10,15,20,30,40,50,60)的巴特沃斯高通滤波器对测试图像滤波。
(2)选取截止频率为30,不同阶数(分别为1,5,10)的巴特沃斯高通滤波器对测试图像滤波。
在下一部分对结果分别进行分析。
实验结果分析
选取阶数为5,不同截止频率的巴特沃斯高通滤波器对测试图像滤波。实验结果如下图所示。
可以看出,在巴特沃斯高通滤波器处理后,当截止频率较低时,低频内容会被更多保留,图像变得更加清晰,也更加贴合原图像。当截止频率较高时,滤波器会通过更少的高频信息,低频细节大量丢失,图像只保留下大致的轮廓部分。
选取截止频率为30,不同阶数的巴特沃斯高通滤波器对测试图像滤波。实验结果如下图所示。
可以看出,阶数低的巴特沃斯滤波器滤波后的图像边缘更加清晰,随着阶数增大,幅频曲线变化剧烈,会造成振铃效应增强,当阶数为5时已经能观察出明显的振铃效应。这也与理论分析的一致。
在图中总能够发现一些振铃现象的存在,这是由于巴特沃斯函数本身的特性,导致无法完全避免振铃现象。
高斯低通滤波器
实验原理
高斯低通滤波器使用高斯函数作为滤波核,它在空间域中的数学表示是一个二维高斯分布。通过高斯低通滤波,图像中的高频噪声被抑制,从而实现平滑效果。高斯低通滤波器可以通过调节标准差参数来控制滤波的程度,标准差越大,滤波效果越明显。
(1)高斯低通滤波器的一维形式为:
其中,是高斯函数在位置处的值,是标准差。
(2)高斯低通滤波器的二维形式为:
是关于中心的扩展度的度量。通过令,我们可以把上式写作:
其中,为截止频率。当时,高斯滤波器下降到其最大值的0.607处。
高斯低通滤波器的相关图像
结合上图,可总结高斯低通滤波器相关性质——
- 平滑效果:高斯低通滤波器通过对图像的像素进行加权平均,减少了图像中的高频细节和噪声。这导致图像变得更加平滑,细节被模糊化。
- 空间域平滑:高斯低通滤波器在空间域中操作,即对图像的每个像素及其周围像素进行加权平均。滤波器的大小和标准差决定了平滑的程度,较大的滤波器和较小的标准差会导致更强烈的平滑效果。
- 频率域衰减:高斯低通滤波器在频率域中的响应是一个高斯函数。这意味着它对较低的频率有较高的响应,而对较高的频率有较低的响应。高频成分被衰减,低频成分得到保留。
- 线性操作:高斯低通滤波器是线性操作,即可以将多个滤波器串联或并联使用。这样可以实现更复杂的滤波效果,例如多尺度平滑或增强图像的某些频率成分。
实验代码实现
高斯低通滤波器的代码实现如下,该部分使用Matlab代码实现。
%图片读取
I = imread('b.jpg');
% D0为截至频率的(相当于设置在傅里叶谱图的半径值)
subplot(3,3,1);imshow(I);title('原图');
I_result = gauss(I,5);
subplot(3,3,2);imshow(I_result);title('截止频率D0=5的变换图像');
I_result = gauss(I,10);
subplot(3,3,3);imshow(I_result);title('截止频率D0=10的变换图像');
I_result = gauss(I,15);
subplot(3,3,4);imshow(I_result);title('截止频率D0=15的变换图像');
I_result = gauss(I,20);
subplot(3,3,5);imshow(I_result);title('截止频率D0=20的变换图像');
I_result = gauss(I,30);
subplot(3,3,6);imshow(I_result);title('截止频率D0=30的变换图像');
I_result = gauss(I,40);
subplot(3,3,7);imshow(I_result);title('截止频率D0=40的变换图像');
I_result = gauss(I,50);
subplot(3,3,8);imshow(I_result);title('截止频率D0=50的变换图像');
I_result = gauss(I,60);
subplot(3,3,9);imshow(I_result);title('截止频率D0=60的变换图像');
% 高斯低通滤波器函数
function [image_result] =gauss (image_orign,D0)
%判断读入的图片是否为灰度图,如果不是则转换为灰度图,如果是则不做操作
if (ndims(image_orign) == 3)
image_2zhi = rgb2gray(image_orign);
else
image_2zhi = image_orign;
end
%用傅里叶变换将图象从空间域转换为频率域
image_fft = fft2(image_2zhi);
%将零频率成分(坐标原点)变换到傅里叶频谱图中心
image_fftshift = fftshift(image_fft);
%创建一个width行,high列数组,用于保存各像素点到傅里叶变换中心的距离
[width,high] = size(image_2zhi);
D = zeros(width,high);
for i=1:width
for j=1:high
%计算像素点(i,j)到傅里叶变换中心的距离
D(i,j) = sqrt((i-width/2)^2+(j-high/2)^2);
%高斯低通滤波函数
H = exp(-1/2*(D(i,j).^2)/(D0*D0));
%若为高通,则修改为
%H = 1 - exp(-1/2 * (D(i, j)^2) / (D0^2));
%将滤波器处理后的像素点保存到对应矩阵
image_fftshift(i,j)= H*image_fftshift(i,j);
end
end
image_result = ifftshift(image_fftshift);%将原点反变换回原始位置
image_result = uint8(real(ifft2(image_result)));
end
最终选取了八个截止频率(分别为5,10,15,20,30,40,50,60)进行测试,在下一部分对结果进行分析。
实验结果分析
图像经高斯低通滤波器处理后,所得结果如下图所示。
截止频率较低: 如果截止频率较低,高频分量被更强烈地抑制,图像会更加模糊,丧失一些细节。这种滤波适用于需要强烈平滑和去噪的情况,但可能会损失许多图像细节。
截止频率较高: 如果截止频率较高,滤波器主要保留图像的大部分频率分量,得到的图像和原图更相像。使用较高的截止频率可以突出图像的边缘和纹理,但可能会不会减少多少噪声的影响,因为高频分量中也包含噪声。
经过高斯低通滤波器处理后的图像不会产生振铃效应,这是由于高斯函数在时域和频域内的图像相同,没有类似$sinc$函数的波形,因而也不会产生振铃效应。这是高斯滤波器的巨大优势。
高斯高通滤波器
实验原理
高斯高通滤波器是高通滤波器的一种,它是高斯低通滤波器的补数。通过从1减去高斯低通滤波器的结果,得到高斯高通滤波器。它可以突出图像中的细节和边缘,抑制低频分量,从而实现边缘检测等应用。
高斯高通滤波器的表示为“1-高斯低通表达式”。高斯高通滤波器的二维形式为:
结合上图,可总结高斯低通滤波器相关性质——
- 细节增强:高斯高通滤波器通过突出图像中的高频成分来增强细节。高频成分对应着图像中的边缘、纹理和细微变化等细节信息。通过增强这些高频成分,图像的细节会更加明显。
- 空间域增强:高斯高通滤波器在空间域中操作,即对图像的每个像素及其周围像素进行加权平均。滤波器的大小和标准差决定了增强的程度,较大的滤波器和较小的标准差会导致更强烈的增强效果。
- 频率域增强:高斯高通滤波器的频率响应对高频成分有较高的响应。因此,它会增强图像中的高频细节,使其更加突出。
- 线性操作:高斯高通滤波器也是线性操作,可以与其他滤波器进行串联或并联使用,以实现更复杂的增强效果。
实验代码实现
高斯高通滤波器的代码实现与高斯低通滤波器代码实现基本一致,唯一需要变动的地方在于需要取,修改的位置已在上述代码的注释中表明,在此不再重复贴附代码。
最终选取了八个截止频率(分别为5,10,15,20,30,40,50,60)进行测试,在下一部分对结果进行分析。
实验结果分析
图像经高斯高通滤波器处理后,所得结果如下图所示。
截止频率较低:当截止频率较低时,低频分量被抑制,高频分量得到保留。这样的滤波器可以用于强调图像中的细节和边缘,使它们更加突出。然而,使用较低的截止频率可能会导致图像的整体模糊,因为高通滤波器会削弱图像中的低频信息。
截止频率较高:当截止频率较高时,高通滤波器会保留较高频率的细节,减弱低频分量。较高的截止频率使得图像细节丧失,减弱了边缘部分高频分量,使得图像细节和纹理丧失,同时可能会导致图像中的噪声增加。
经过高斯高通滤波器处理后的图像不会产生振铃效应,这是由于高斯函数在时域和频域内的图像相同,没有类似$sinc$函数的波形,因而也不会产生振铃效应。这是高斯滤波器的巨大优势。
以上为本次博客的全部内容,欢迎大家讨论以及批评指正~
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)