import cv2 # 加载OPENCV模块
import numpy as np # 加载numpy模块
def grey_scale(image):
img_gray = image
rows, cols = img_gray.shape
flat_gray = img_gray.reshape((cols * rows,)).tolist()
A = min(flat_gray)
B = max(flat_gray)
print('A = %d,B = %d' % (A, B))
output = np.uint8(255 / (B - A) * (img_gray - A) + 0.5)
return output
def DFT(img): # DFT函数
Gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 以灰度模式读入图像
row, height = Gray_img.shape # 读取图像的大小
F1 = cv2.dft(np.float32(Gray_img), flags=cv2.DFT_COMPLEX_OUTPUT) # 将图像转为float32,并进行傅里叶正变换
F1_shift = np.fft.fftshift(F1) # 利用np中的fftshift函数进行频谱搬移
F1img = np.log(cv2.magnitude(F1_shift[:, :, 0], F1_shift[:, :, 1])) # 提取幅度谱,对数运算是为了增强显示效果
cf = 30 # 截止频率
crow, cheight = int(row / 2), int(height / 2) # 计算频谱中心
mask = np.zeros((row, height, 2), np.uint8) # 生成rows行cols列的矩阵,数据格式为uint8
for i in range(row): # 对图像进行行遍历
for j in range(height): # 对图像进行列遍历
if np.sqrt(i * i + j * j) <= cf:
# 将距离频谱中心小于D的部分低通信息设置为1,属于低通滤波
mask[crow - cf:crow + cf, cheight - cf:cheight + cf] = 1
low_mask = mask # 低通滤波器掩膜处理
high_mask = 1 - mask # 高通滤波器掩膜处理
low_shift = np.fft.fftshift(F1_shift * low_mask) # 逆变换前再进行频谱搬移,将频谱搬回原位
low = cv2.idft(low_shift) # 进行傅里叶逆变换
low_img = cv2.magnitude(low[:, :, 0], low[:, :, 1]) # 提取幅度谱,得到逆变换后的图像
F2 = cv2.dft(np.float32(low_img), flags=cv2.DFT_COMPLEX_OUTPUT) # 将图像转为float32,并进行傅里叶正变换
F2img = np.log(cv2.magnitude(F2[:, :, 0], F2[:, :, 1])) # 提取幅度谱,对数运算是为了增强显示效果
high_shift = np.fft.fftshift(F1_shift * high_mask) # 逆变换前再进行频谱搬移,将频谱搬回原位
high = cv2.idft(high_shift) # 进行傅里叶逆变换
high_img = cv2.magnitude(high[:, :, 0], high[:, :, 1]) # 提取幅度谱,得到逆变换后的图像
F3 = cv2.dft(np.float32(high_img), flags=cv2.DFT_COMPLEX_OUTPUT) # 将图像转为float32,并进行傅里叶正变换
F3img = np.log(cv2.magnitude(F3[:, :, 0], F3[:, :, 1])) # 提取幅度谱,对数运算是为了增强显示效果
cv2.imshow('img', img) # 显示原图像
cv2.imshow('F1img', grey_scale(F1img)) # 显示幅度谱,grey_scale是灰度拉伸函数
cv2.imshow('low_img', grey_scale(low_img)) # 显示低通滤波后的图像
cv2.imshow('F2img', grey_scale(F2img)) # 显示逆变换后的图像,也需要灰度拉伸
cv2.imshow('high_img', grey_scale(high_img)) # 显示高通滤波后的图像
cv2.imshow('F3img', grey_scale(F3img)) # 显示逆变换后的图像,也需要灰度拉伸
cv2.waitKey(0) # 等待时间
cv2.destroyAllWindows() # 关闭所有创建的窗口
if __name__ == '__main__': # 主函数
img = cv2.imread('desert.jpg') # 读取图像
DFT(img) # 调用DFT函数