正弦曲线又是由振幅和相位决定的,最终归结到连续周期信号可由振幅和相位确定。时间域和频率域两个角度之间是可以互相转换的,可逆的。
傅里叶变换就是得到高频(像素值变化快的那些像素,比如大草原上有一个狮子,狮子和大草原的接触边界)和低频(像素值变换慢的那些像素,比如大草原所有草都是绿色)信息,对低频和高频处理,还可以逆回去(比如高通滤波允许高频通过,低频衰减,然后再逆回图像,边缘保留,细节丢失)。
傅里叶变换
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
f = np.fft.fft2(img) # 傅里叶变换
fshift = np.fft.fftshift(f) # 低频挪到频谱图中心
res = 20*np.log(np.abs(fshift)) # 映射到[0, 255]
plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off') # 不显示坐标轴
plt.subplot(1, 2, 2)
plt.imshow(res, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')
逆傅里叶变换
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
f = np.fft.fft2(img) # 傅里叶变换
fshift = np.fft.fftshift(f) # 低频挪到频谱图中心
ishift = np.fft.ifftshift(fshift) # 挪回去
iimg = np.fft.ifft2(ishift) # 逆变换
iimg = np.abs(iimg)
plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off') # 不显示坐标轴
plt.subplot(1, 2, 2)
plt.imshow(iimg, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')
高通滤波
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
f = np.fft.fft2(img) # 傅里叶变换
fshift = np.fft.fftshift(f) # 低频挪到频谱图中心
row, col = img.shape
crow, ccol = int(row/2), int(col/2) # 中心点
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 # 中心区域变为0,去除低频
ishift = np.fft.ifftshift(fshift) # 挪回去
iimg = np.fft.ifft2(ishift) # 逆变换
iimg = np.abs(iimg)
plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off') # 不显示坐标轴
plt.subplot(1, 2, 2)
plt.imshow(iimg, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')
低通滤波
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
dshift = np.fft.fftshift(dft)
row, col = img.shape
crow, ccol = int(row/2), int(col/2)
mask = np.zeros((row, col, 2), np.int8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1 # 这块区域代表低频部分保留多少
md = dshift*mask
imd = np.fft.ifftshift(md)
iimg = cv2.idft(imd)
iimg = cv2.magnitude(iimg[:,:,0], iimg[:, :, 1])
plt.subplot(1, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.title('original')
plt.axis('off') # 不显示坐标轴
plt.subplot(1, 2, 2)
plt.imshow(iimg, cmap=plt.cm.gray)
plt.title('res')
plt.axis('off')