作业要求:
一、任选两幅频率不同的图像(包括一副自备图像),计算其频谱图,并显示
理解什么图像的高频分量多,什么是图片的低频分量多。观察空域图象和频域频谱的对应关系。
二、任选一个低通滤波器对图片采用频率域滤波的基本步骤进行滤波观察分析空域图象和频谱分布的变化。自选图片,采用一个高通滤波器对图片进行处理,进行滤波观察分析空域图象和频谱分布的变化。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
import skimage
def spectrum_show(img): # 定义一个用于计算灰度图的频谱图并显示的函数
f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将图像中的低频部分移动到图像的中心,默认是在左上角
fimg = np.log(np.abs(fshift)) # fft结果是复数, 其绝对值结果是振幅,取对数的目的是将数据变换到0~255
# 展示结果
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Fourier')
plt.axis('off')
plt.subplot(122), plt.imshow(fimg, 'gray'), plt.title('Fourier Fourier')
plt.axis('off')
plt.show()
def ButterworthPassFilter(image, d, n): # 定义一个Butterworth低通滤波器
f = np.fft.fft2(image) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将图像中的低频部分移动到图像的中心,默认是在左上角
# fft结果是复数, 其绝对值结果是振幅;取对数的目的是将数据变换到0~255
fimg = np.log(np.abs(fshift))
# Butterworth低通滤波器的实现函数的定义
def make_transform_matrix(d):
# 创建一个与输入图像同大小的全0矩阵,用于存储变化后的图像
transform_matrix = np.zeros(image.shape)
# 中心点值的计算,元组形式
center_point = tuple(map(lambda x: (x - 1) / 2, fimg.shape))
for i in range(transform_matrix.shape[0]): # 行遍历
for j in range(transform_matrix.shape[1]): # 列遍历
def cal_distance(pa, pb): # 欧拉距离计算函数的定义
from math import sqrt
dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
return dis
dis = cal_distance(center_point, (i, j)) # 求出每个点与中心点的距离
# 巴特沃斯低通滤波的数学公式实现
transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))
return transform_matrix
d_matrix = make_transform_matrix(d) # 调用自定义函数
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix))) # 生成新图
return new_img
def highPassFilter(image,d): # 定义一个高通滤波器
f = np.fft.fft2(image) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将图像中的低频部分移动到图像的中心,默认是在左上角
# fft结果是复数, 其绝对值结果是振幅;取对数的目的是将数据变换到0~255
fimg = np.log(np.abs(fshift))
# 高通滤波器的实现函数的定义
def make_transform_matrix(d):
# 创建一个与输入图像同大小的全0矩阵,用于存储变化后的图像
transfor_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x:(x-1)/2,fimg.shape)) # 中心点值的计算,元组形式
for i in range(transfor_matrix.shape[0]): # 行遍历
for j in range(transfor_matrix.shape[1]): # 列遍历
def cal_distance(pa,pb): # 欧拉距离计算函数的定义
from math import sqrt
dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
return dis
dis = cal_distance(center_point,(i,j)) # 求出每个点与中心点的距离
# 以下这部分和Butterworth低通滤波器不同
if dis <= d:
transfor_matrix[i,j]=0
else:
transfor_matrix[i,j]=1
# 以上这部分和Butterworth低通滤波器不同
return transfor_matrix
d_matrix = make_transform_matrix(d) # 调用自定义函数
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix))) # 生成新图
return new_img
if __name__ == '__main__':
# 作业要求1:任选两幅频率不同的图像(包括一副自备图像),计算其频谱图,并显示
img1 = cv.imread('girl.tif', 0) # 读取自备图像的图像的灰度图形式
img2 = cv.imread('p1-07.tif', 0) # 读取所给图像的图像的灰度图形式
spectrum_show(img1)
spectrum_show(img2)
"""
理解什么图像的高频分量多,什么是图片的低频分量多。观察空域图象和频域频谱的对应关系:
空域图中空域快速变化部分对应频域的高频分量;高频的多的频谱图偏暗
空域图中空域平缓变化部分对应频域的低频分量;低频的多的频谱图偏亮
"""
# 作业要求2-1
# 任选一个低通滤波器对图片采用频率域滤波的基本步骤进行滤波观察分析空域图象和频谱分布的变化。
img = cv.imread('p3-02.bmp', 0) # 直接读为灰度图像
img = skimage.util.random_noise(img, mode='gaussian', seed=None, clip=True)
spectrum_show(img) # 原图及其频谱图的显示
butter_25_5 = ButterworthPassFilter(img,25, 5) # Butterworth低通滤波处理
spectrum_show( butter_25_5) # 显示低通滤波后的图及其频谱图
# 作业要求2-2
# 自选图片,采用一个高通滤波器对图片进行处理,进行滤波观察分析空域图象和频谱分布的变化。
img = cv.imread('girl.tif', 0) # 直接读为灰度图像
spectrum_show(img) # 原图及其频谱图的显示
highPassFilter= highPassFilter(img, 18) # Butterworth低通滤波处理
spectrum_show(highPassFilter) # 显示低通滤波后的图及其频谱图
|