以下代码参考视频解析
这段代码使用了二维FFT变换对输入图像进行频域处理,并设计了一个简单的高通滤波器。
前两行使用了numpy库中的fft2函数对输入图像image进行二维傅里叶变换(FFT)。接着,fft_shift函数将转化后的频谱数据fft_image移至频谱中心。这一步可以利用np.fft.ifftshift逆IFFT移动到原先的位置,不过代码没有实现。
接下来通过设定一个简单的高通滤波器,mask矩阵代表在频域缩小的高频分量。具体来说,给予仿照网站https://homepages.inf.ed.ac.uk/rbf/HIPR2/highpass.htm 定义为一个方形的掩膜(即简单的低通和高通相减),中央留下1,其余元素全部赋为0。然后再通过对滤波器结果与移位后得到的FFT图像进行点乘的方式进行滤波操作。最后再对滤波后数据应用ifftshift函数反转移动的内容,并用np.fft.ifft2 invert 进行傅里叶逆变换并取实数部分,输出被滤波后的图像filtered_image,转变成整数uint8类型的像素值。
一般的应用范围包括图像处理、计算机视觉、数字信号处理及其它领域,如图像增强、降噪等。在计算机视觉中,频域滤波器被广泛应用于对精细特征的提取、图像去噪等方面。
如果想要看懂代码,需要了解傅里叶变换及其频域概念,以及如何使用numpy库进行零频率移动和高通滤波器的设计。此外还需要理解FFT(快速傅里叶变换)和IFFT(逆傅里叶变换)原理,并且对numpy库中这些数据处理函数的参数含义有所了解。
def image_filter(self, image):
"""高通滤波器"""
# 进行二维FFT变换
fft_image = np.fft.fft2(image)
# 将零频率分量移到频谱的中心
fft_shift = np.fft.fftshift(fft_image)
# 可视化频谱
# magnitude_spectrum = 20 * np.log(np.abs(fft_shift))
# 设计一个简单的高通滤波器
rows, cols = image.shape
center_row, center_col = rows // 2, cols // 2
cutoff_freq = 1
# 创建滤波器
mask = np.ones((rows, cols), np.uint8)
mask[center_row - cutoff_freq:center_row + cutoff_freq,
center_col - cutoff_freq:center_col + cutoff_freq] = 0
# 应用滤波器
filtered_shift = fft_shift * mask
# 将频谱转换回原始状态
filtered_image = np.fft.ifftshift(filtered_shift)
# 进行逆FFT变换
filtered_image = np.fft.ifft2(filtered_image)
filtered_image = np.abs(filtered_image).astype(np.uint8)
#
# cv2.imshow("back_eft_src", filtered_image)
src_filter_img = filtered_image.copy()
limit_gray_num = self.re_bg_gray_num(src_filter_img)
# print("调整")
#print("当前图片中位数:",limit_gray_num)
if limit_gray_num >= 28:
#print("超过额定28当前中位数亮度为,",limit_gray_num)
# limit_gray_num = int(limit_gray_num*1.1)
# if limit_gray_num >= 255:
# limit_gray_num = 255
limit_gray_num = int(limit_gray_num*1.19)
if limit_gray_num >= 255:
limit_gray_num = 255
#print("自动调整额定亮度为,", limit_gray_num)
pass
else:
#print("低于额定28当前中位数暗度为,", limit_gray_num)
black_limie_num = 15
limit_gray_num = limit_gray_num + black_limie_num
# print("\n")
# print("输出:",limit_gray_num)
# # limit_gray_num = self.tem # 测试用
# print("limit_gray_num: ", limit_gray_num)
# 对图像进行简单后处理
for i in range(rows):
for j in range(cols):
if filtered_image[i, j] > limit_gray_num:
# if filtered_image[i, j] > 28:
# filtered_image[i,j] = min((filtered_image[i,j] + 50), 255)
filtered_image[i, j] = 255
else:
filtered_image[i, j] = 0 # 黑色
return filtered_image,src_filter_img