# 在绘图中显示中文字体,而非乱码
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
import cv2
import matplotlib.pyplot as plt
import numpy as np
import math
import os
import pywt.data
plt.rcParams['axes.unicode_minus'] = False
1、导入一张图像,分别对其进行带通和带阻滤波,展示滤波前后图像,并简要叙述带通和带阻滤波对图像的影响。
# 第一题代码部分
def bandpass_filter(image, radius, w, n=1):
fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dshift = np.fft.fftshift(fft)
rows, cols = image.shape[:2]
mid_row, mid_col = int(rows / 2), int(cols / 2)
mask = np.zeros((rows, cols, 2), np.float32)
for i in range(0, rows):
for j in range(0, cols):
d = math.sqrt(pow(i - mid_row, 2) + pow(j - mid_col, 2))
if radius - w / 2 < d < radius + w / 2:
mask[i, j, 0] = mask[i, j, 1] = 1
else:
mask[i, j, 0] = mask[i, j, 1] = 0
fft_filtering = dshift * np.float32(mask)
ishift = np.fft.ifftshift(fft_filtering)
image_filtering = cv2.idft(ishift)
image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])
cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)
return image_filtering
def bandstop_filter(image, radius, w, n=1):
fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dshift = np.fft.fftshift(fft)
rows, cols = image.shape[:2]
mid_row, mid_col = int(rows / 2), int(cols / 2)
mask = np.zeros((rows, cols, 2), np.float32)
for i in range(0, rows):
for j in range(0, cols):
d = math.sqrt(pow(i - mid_row, 2) + pow(j - mid_col, 2))
if radius - w / 2 < d < radius + w / 2:
mask[i, j, 0] = mask[i, j, 1] = 0
else:
mask[i, j, 0] = mask[i, j, 1] = 1
fft_filtering = dshift * np.float32(mask)
ishift = np.fft.ifftshift(fft_filtering)
image_filtering = cv2.idft(ishift)
image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])
cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)
return image_filtering
image = cv2.imread(你的图片, cv2.IMREAD_GRAYSCALE)
image_bandpass_filtering5 = bandpass_filter(image, 30, 56, 1)
image_bandstop_filtering5 = bandstop_filter(image, 30, 35, 1)
img_list1=[image,image_bandpass_filtering5,image_bandstop_filtering5]
title_list1=['原始图像','带通图像','带阻图像']
for i in range(3):
plt.subplot(2, 2, i+1)
plt.imshow(img_list1[i], 'gray')
plt.title(title_list1[i])
plt.xticks([])
plt.yticks([])
plt.show()
第一题文字部分:
一、带通滤波器(Band-pass Filter):允许一定频率范围内的成分通过,同时抑制其他频率成分,用于保留图像的某些细节,而去除其他不必要的信息。
对图像的影响:
1、增强细节:增强图像中的边缘和纹理,使图像看起来更清晰。
2、去除噪声:可以去除或减少高频成分噪声。
3、特征提取:可以用来提取图像中的特定特征。
二、带阻滤波器(Band-stop Filter):抑制一定频率范围内的成分,而允许其他频率成分通过,用于去除图像中的特定频率成分。
对图像的影响:
1、平滑图像:抑制高频成分,使图像看起来更平滑,减少细节和边缘的清晰度。
2、去除周期性噪声:可以有效地去除周期性的噪声,如电力线干扰。
3、保留低频信息:保留了图像的低频成分,如整体的光照变化和大面积的均匀颜色。
2、导入一幅图像,对其进行离散余弦变换,变换后分别保留三种不同数量的低频成分,观察其逆变换后的图像,并简要叙述离散余弦变换的原理和步骤。
# 第二题代码部分
from scipy.fftpack import dct, idct
image =cv2.imread(你的图片, cv2.IMREAD_GRAYSCALE)
dct_result = dct(dct(image.T, norm='ortho').T, norm='ortho')
num_low_freq = [5, 30, 80]
reconstructed_images = []
title_list = ["原始图像"]
img_list = [image]
for n in num_low_freq:
dct_result_copy = dct_result.copy()
dct_result_copy[n:, :] = 0
dct_result_copy[:, n:] = 0
idct_result = idct(idct(dct_result_copy.T, norm='ortho').T, norm='ortho')
idct_result = np.uint8(idct_result)
idct_result_copy=idct_result.copy()
title_list.append("{}低频成分图像".format(n))
img_list.append( idct_result_copy)
for i in range(4):
plt.subplot(2, 2, i+1)
plt.imshow(img_list[i], 'gray')
plt.title(title_list[i])
plt.xticks([])
plt.yticks([])
plt.show()
第二题文字部分:
DCT 的原理:
离散余弦变换(Discrete Cosine Transform,DCT)是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,在有些变形里面需要将输入或者输出的位置移动半个单位(DCT有8种标准类型,其中4种是常见的)。
DCT除了具有一般的正交变换性质外,其变换阵的基向量很近似于Toeplitz矩阵的特征向量,后者体现了人类的语言、图像信号的相关特性。因此,在对语音、图像信号变换的确定的变换矩阵正交变换中,DCT变换被认为是一种准最佳变换。DCT除了实数变换、确定的变换矩阵、准最佳变换性能等特点外,二维DCT还是一种可分离的变换,可以用两次一维变换得到二维变换结果。
DCT的步骤:
分离:DCT 将输入数据(通常是图像)分解成不同的频率成分,每个成分代表图像中的特定模式,如颜色、纹理等。
压缩:DCT 倾向于将大部分能量集中在变换后的前几个系数中,这些系数对应于图像的低频成分。高频成分通常包含图像的细节信息,但对视觉影响较小。
系数量化:在图像压缩中,可以根据需要对这些系数进行量化,即减少系数的精度,以达到压缩数据的目的。
逆变换:在图像重建或解压时,可以使用逆离散余弦变换(Inverse Discrete Cosine Transform,IDCT)将变换后的系数转换回原始数据。
3、导入一幅图像,对其进行小波变换,观察小波变换后的高频子图和低频子图,并简要叙述小波变换的原理和步骤。
#第三题代码部分
image =cv2.imread(你的图片, cv2.IMREAD_GRAYSCALE)
coeffs2 = pywt.dwt2(image, 'haar')
cA, (cH, cV, cD) = coeffs2
pl = cA
ph1 =cH
ph2 =cV
ph3 =cD
title_list = ["图像", "低频子图", "水平高频子图","垂直高频子图","对角高频子图"]
img_list = [image, pl, ph1,ph2,ph3]
for i in range(5):
plt.subplot(2, 3, i+1)
plt.imshow(img_list[i], 'gray')
plt.title(title_list[i])
plt.xticks([])
plt.yticks([])
plt.show()
第三题文字部分:
一、小波变换的原理:
傅里叶变换的基函数(即sin和cos)从负无穷一直延伸到正无穷,无论某一频率出现的信号是早还是晚,傅里叶变换都会一视同仁地进行变换,没有对信号区间进行区分。如果使用在某一个有限区间内的函数(称为母函数)作为基函数,使其在整个时间域上滑动(即平移),则可以逐段描述不同时间段内、该频率函数的占比。改变函数的频率(即尺度),产生一系列小波函数,在整个时间域上滑动,即可得到某一信号的小波函数分解。
小波变换将傅里叶变换的基函数改为一系列小波函数,从而能够得到信号的频率分量、及频率分量对应的时间信息。
二、小波变换的步骤:
1、选择小波基:小波变换使用特定的波形(小波基)来匹配信号的特征。小波基的选择取决于信号的特性和处理目标。
2、分解:信号被分解为不同尺度的近似(低频成分)和细节(高频成分)。近似成分代表了信号的平滑版本,而细节成分包含了信号的局部变化信息。
3、多级分解:小波变换可以进行多级分解,每次分解都会产生更精细的细节成分和更粗糙的近似成分。