图像的频域处理实验作业

# 在绘图中显示中文字体,而非乱码
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、多级分解:小波变换可以进行多级分解,每次分解都会产生更精细的细节成分和更粗糙的近似成分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值