时域滤波:
空间域滤波的步骤一般如下:
1. 选择滤波器
选择一种低通滤波器,常见的包括:
- 均值滤波(平均滤波器)
- 高斯滤波(Gaussian filter)
2. 定义滤波器核
根据选择的滤波器类型,定义相应的滤波器核。例如,对于高斯滤波,可以使用高斯函数创建一个二维核。
3. 图像边界处理
决定如何处理图像边界。常见的方法有:
- 零填充(Zero padding)
- 镜像扩展(Mirror padding)
4. 卷积操作
对图像应用滤波器,通常使用卷积操作。具体步骤如下:
- 对图像中的每一个像素,使用滤波器核计算加权和。
- 替换图像中当前像素的值为加权和的结果。
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('image.jpg')
# 定义均值滤波器核 lp
#kernel_size = 5
#kernel = np.ones((kernel_size, kernel_size), np.float32) / (kernel_size * kernel_size)
# 拉普拉斯卷积核 hp
kernel = np.array([[0, -1, 0],
[-1, 4, -1],
[0, -1, 0]])
# 应用卷积
low_pass_filtered = cv2.filter2D(image, -1, kernel)
# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title('Low Pass Filtered Image (Spatial Domain)')
plt.imshow(cv2.cvtColor(low_pass_filtered, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.tight_layout()
plt.show()
频域滤波:
频域低通滤波的步骤通常如下:
1. 傅里叶变换
将图像从时域转换到频域。使用快速傅里叶变换(FFT)来实现。
2. 中心化傅里叶频谱
将频谱中心化,以便高频成分位于中心位置,便于创建滤波器。
3. 创建低通滤波器
设计一个低通滤波器,例如:
- 理想低通滤波器:保留中心圆内的频率,抑制外部频率。
- 高斯低通滤波器:根据高斯函数构建一个平滑的低通滤波器。
4. 应用低通滤波器
将低通滤波器应用于中心化后的频谱,通常通过逐元素相乘实现。
5. 逆傅里叶变换
对经过低通滤波的频谱进行逆傅里叶变换,将其转换回时域。
python
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('image.jpg', 0) # 以灰度图读取
# image = cv2.resize(image, (512, 512)) # 调整大小,方便处理
# 进行傅里叶变换
dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)
# 获取图像尺寸
rows, cols = image.shape
crow, ccol = rows // 2, cols // 2
# # 创建高斯低通滤波器
# def gaussian_lowpass(rows, cols, cutoff):
# x = np.arange(0, cols)
# y = np.arange(0, rows)
# x, y = np.meshgrid(x, y)
# gaussian = np.exp(-((x - ccol) ** 2 + (y - crow) ** 2) / (2 * (cutoff ** 2)))
# return gaussian
#
# cutoff_radius = 30
# mask = gaussian_lowpass(rows, cols, cutoff_radius)
# 创建理想高通滤波器
cutoff_radius = 30 # 设置截止频率(低频成分被抑制的半径)
mask = np.ones((rows, cols), np.uint8)
x, y = np.ogrid[0:rows, 0:cols]
center = (crow, ccol)
mask[(x - center[0])**2 + (y - center[1])**2 <= cutoff_radius**2] = 0
# 应用低通滤波器
filtered_dft = dft_shift * mask # 时域卷积=频域相乘
# 进行逆傅里叶变换
filtered_image = np.fft.ifft2(np.fft.ifftshift(filtered_dft))
filtered_image = np.abs(filtered_image)
# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title('Low Pass Filtered Image (Frequency Domain)')
plt.imshow(filtered_image, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
cutoff_radius = 30 在频域高通滤波的上下文中指的是截止频率。具体而言,它代表了在频域中,低频成分被抑制的半径。
解释:
高通滤波器:当频率小于这个截止半径的频率成分会被滤除,而高于这个半径的成分会被保留。
单位:这个参数的单位通常与图像的尺寸相关,表示频谱中距离中心点的距离。
效果:
选择合适的截止频率非常重要,过低的截止频率会导致图像细节丢失,而过高的截止频率可能保留过多噪声。