傅里叶变换讲解:傅里叶变换
傅里叶变换讲解:傅里叶变换
傅里叶变换(FFT)常被用来分析滤波器的频率特性, 我们可用2维离散傅里叶变换 (DFT) 分析图像频域特性。至于FFT的定义和意义我就不在这里展开, 了大家可以自己去了解一下。其中,opencv中FFT的涉及到 cv2.dft(),cv2.idft()等函数。
我们先来看看, 如果对图像的高频和低频部分进行过滤,产生的图像有什么特性呢?我们可以从下面的图像感受一下:
def get_low_high_f(img radius_ratio):
"""
获取低频和⾼频部分图像
"""
# 傅⾥叶变换
# np.fft.fftn
f = np.fft.fftn(img) # Compute the N-dimensional discrete Fourier Transform. 零频率分量位于频谱图像的左上⾓
fshift = np.fft.fftshift(f) # 零频率分量会被移到频域图像的中⼼位置,即低频
# 获取低频和⾼频部分
hight_parts_fshift = filter_low_f(img fshift.copy() radius_ratio=radius_ratio) # 过滤掉中⼼低频
low_parts_fshift = filter_high_f(img fshift.copy() radius_ratio=radius_ratio)
low_parts_img = ifft(low_parts_fshift) # 先sift回来,再反傅⾥叶变换
high_parts_img = ifft(hight_parts_fshift)
# 显⽰原始图像和⾼通滤波处理图像
img_new_low = (low_parts_img - np.amin(low_parts_img)) / (np.amax(low_parts_img) - np.amin(low_parts_img) 0.00001)
img_new_high = (high_parts_img - np.amin(high_parts_img) 0.00001) / (np.amax(high_parts_img) - np.amin(high_parts_img) 0.00001)
# uint8
img_new_low = np.array(img_new_low*255 np.uint8)
img_new_high = np.array(img_new_high * 255 np.uint8)
return img_new_low img_new_high
def ifft(fshift):
"""
傅⾥叶逆变换
"""
ishift = np.fft.ifftshift(fshift) # 把低频部分sift回左上⾓
iimg = np.fft.ifftn(ishift) # 出来的是复数,⽆法显⽰
iimg = np.abs(iimg) # 返回复数的模
return iimg
def fft(img):
"""
傅⾥叶变换
"""
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
return magnitude_spectrum
例子2:
我们有没有发现比较有趣的现象? 例子2和1及3相比,低频分量更多一些,轮廓边界也不清晰, 这就为后期图像增强和处理提高了思路。
图像模糊和增强处理后效果: