首页 > 其他分享 >数字图像频率域低通滤波器Matlab实现

数字图像频率域低通滤波器Matlab实现

时间:2024-10-14 19:49:14浏览次数:10  
标签:plt img imshow 数字图像 低通滤波器 jpg Matlab 图像 noisy

目录

前言

1.内容、要求与安排

(1)以图像“kebi.jpg”为例,读入该图像,利用傅里叶变换,首先显示该图像的频谱图,然后再中心化该频谱图并显示,最后利用对数变换增强中心化的频谱图并显示。

①Python中操作如下:

②MATLAB中操作如下:

(2)使用频率域滤波器平滑图像(以图像“kebi.jpg”为例),实现对 “kebi.jpg” 图像加噪及平滑的过程

①要求的噪声为Gaussian噪声,其均值为0,方差为0.01,并保存噪声图像;

②生成一个IdealLowFilter.m文件,利用理想低通滤波器对加噪的“keibi.jpg”图像进行平滑滤波(截至频率半径值分别设置30,90,160),分别显示滤波后的结果图像并进行比较分析。

③生成一个ButterworthLowFilter.m文件,利用二阶Butterworth低通滤波器对加噪的“keibi.jpg”图像进行平滑滤波(截至频率半径值分别设置30,90,160),分别显示滤波后的结果图像并进行比较分析。

④生成一个GaussianLowFilter.m文件,利用高斯低通滤波器对加噪的“keibi.jpg”图像进行平滑滤波(截至频率半径值分别设置30,90,160),分别显示滤波后的结果图像并进行比较分析。

总结


前言

了解并掌握数字图像频率域滤波的基本原理,掌握MATLAB中数字图像频率域低通滤波实现过程。利用MATLAB实现数字图像的频率域低通滤波。

1.内容、要求与安排

(1)以图像“kebi.jpg”为例,读入该图像,利用傅里叶变换,首先显示该图像的频谱图,然后再中心化该频谱图并显示,最后利用对数变换增强中心化的频谱图并显示。

①Python中操作如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读入图像
image = cv2.imread("kebi.jpg", 0)

# 进行傅里叶变换
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

# 计算频谱图
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

# 显示频谱图
plt.subplot(131), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Frequency Spectrum'), plt.xticks([]), plt.yticks([])

# 中心化频谱图
rows, cols = image.shape
crow, ccol = int(rows / 2), int(cols / 2)
dft_shift[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0

# 计算中心化后的频谱图
centered_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

# 显示中心化后的频谱图
plt.subplot(132), plt.imshow(centered_spectrum, cmap='gray')
plt.title('Centered Spectrum'), plt.xticks([]), plt.yticks([])

# 对数变换增强中心化的频谱图
enhanced_spectrum = cv2.normalize(centered_spectrum, None, 0, 255, cv2.NORM_MINMAX)

# 显示增强后的频谱图
plt.subplot(133), plt.imshow(enhanced_spectrum, cmap='gray')
plt.title('Enhanced Spectrum'), plt.xticks([]), plt.yticks([])

plt.show()

②MATLAB中操作如下:

% 读入图像
image = imread('kebi.jpg');

% 傅里叶变换
fft_image = fft2(image);

% 频谱图
fft_spectrum = abs(fftshift(fft_image));
figure;
imshow(log(1 + fft_spectrum), []);
title('频谱图');

% 中心化频谱图
centered_spectrum = fftshift(fft_spectrum);
figure;
imshow(log(1 + centered_spectrum), []);
title('中心化频谱图');

% 对数变换增强中心化频谱图
enhanced_spectrum = log(1 + centered_spectrum);
figure;
imshow(enhanced_spectrum, []);
title('增强的频谱图');

(2)使用频率域滤波器平滑图像(以图像“kebi.jpg”为例),实现对 “kebi.jpg” 图像加噪及平滑的过程

①要求的噪声为Gaussian噪声,其均值为0,方差为0.01,并保存噪声图像;

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
image = cv2.imread('kebi.jpg', 0)

# 傅里叶变换
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)

# 构造高斯滤波器
rows, cols = image.shape
crow, ccol = rows // 2, cols // 2
R = 50  # 高斯滤波器半径
mask = np.zeros((rows, cols), np.uint8)
mask[crow - R: crow + R, ccol - R: ccol + R] = 1

# 应用滤波器
fshift_filtered = fshift * mask

# 傅里叶逆变换
f_ishift = np.fft.ifftshift(fshift_filtered)
image_filtered = np.fft.ifft2(f_ishift)
image_filtered = np.abs(image_filtered)  # 取绝对值

# 显示原始图像和平滑后的图像
plt.subplot(121), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(image_filtered, cmap='gray'), plt.title('Filtered Image')
plt.axis('off')
plt.show()

# 生成Gaussian噪声
noise = np.random.normal(0, 0.1, image.shape)

# 添加噪声并保存
image_noisy = image + noise
cv2.imwrite('kebi_noisy.jpg', image_noisy)

# 显示原始图像和加噪后的图像
plt.subplot(121), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(image_noisy, cmap='gray'), plt.title('Noisy Image')
plt.axis('off')
plt.show()
% 加载图像
originalImage = imread('kebi.jpg');
figure('Name', 'Original Image');
imshow(originalImage);

% 添加高斯噪声
noisyImage = imnoise(originalImage, 'gaussian', 0, 0.01);
figure('Name', 'Noisy Image');
imshow(noisyImage);

% 将图像转换为灰度图像
grayImage = rgb2gray(noisyImage);

% 对图像进行傅里叶变换
fftImage = fft2(double(grayImage));

% 创建高斯滤波器
[M, N] = size(fftImage);
sigma = 10;
[x, y] = meshgrid(1:N, 1:M);
centerX = ceil(N/2);
centerY = ceil(M/2);
gaussianFilter = exp(-((x-centerX).^2 + (y-centerY).^2) / (2*sigma^2));

% 使用高斯滤波器平滑图像
filteredImage = real(ifft2(fftImage .* gaussianFilter));

% 显示平滑后的图像
figure('Name', 'Smoothed Image');
imshow(uint8(filteredImage));

% 保存噪声图像
imwrite(noisyImage, 'noisy_image.jpg');

% 保存平滑后的图像
imwrite(uint8(filteredImage), 'smoothed_image.jpg');

②生成一个IdealLowFilter.m文件,利用理想低通滤波器对加噪的“keibi.jpg”图像进行平滑滤波(截至频率半径值分别设置30,90,160),分别显示滤波后的结果图像并进行比较分析。

首先,需要将图像加噪。可以使用imnoise函数向图像中添加高斯噪声:

img = imread('kebi.jpg');
noisy_img = imnoise(img, 'gaussian', 0, 0.02);
imwrite(noisy_img, 'noisy_kebi.jpg');

然后,可以编写IdealLowFilter.m文件实现理想低通滤波器的平滑过程。

function filtered_img = IdealLowFilter(img, freq_radius)
    % 图像的傅里叶变换
    fft_img = fftshift(fft2(img));

    % 获取图像的频率域尺寸
    [rows, cols] = size(fft_img);

    % 构造理想低通滤波器
    freq_mask = zeros(rows, cols);
    center = [rows/2+1, cols/2+1];
    for i = 1:rows
        for j = 1:cols
            dist = sqrt((i-center(1))^2 + (j-center(2))^2);
            if dist <= freq_radius
                freq_mask(i, j) = 1;
            end
        end
    end

    % 将频率域图像与滤波器进行点乘
    filtered_fft_img = fft_img .* freq_mask;

    % 对滤波后的频率域图像进行逆傅里叶变换
    filtered_img = ifft2(ifftshift(filtered_fft_img));
    filtered_img = real(filtered_img);
end

接下来,可以使用IdealLowFilter函数对加噪的图像进行平滑滤波,并显示滤波后的结果图像:

noisy_img = imread('noisy_kebi.jpg');

% 使用不同的截至频率半径对加噪图像进行平滑滤波
filtered_img_30 = IdealLowFilter(noisy_img, 30);
filtered_img_90 = IdealLowFilter(noisy_img, 90);
filtered_img_160 = IdealLowFilter(noisy_img, 160);

% 显示滤波结果图像
figure;
subplot(2, 2, 1);
imshow(noisy_img);
title('加噪图像');
subplot(2, 2, 2);
imshow(filtered_img_30, []);
title('截至频率半径=30');
subplot(2, 2, 3);
imshow(filtered_img_90, []);
title('截至频率半径=90');
subplot(2, 2, 4);
imshow(filtered_img_160, []);
title('截至频率半径=160');

最后,可以进行比较分析滤波后的结果图像。通过观察不同截至频率半径的滤波结果,可以发现随着截至频率半径的增大,图像的平滑效果变得更明显,但也会导致图像的细节损失更多。

③生成一个ButterworthLowFilter.m文件,利用二阶Butterworth低通滤波器对加噪的“keibi.jpg”图像进行平滑滤波(截至频率半径值分别设置30,90,160),分别显示滤波后的结果图像并进行比较分析。

首先,需要将图像加噪。可以使用imnoise函数向图像中添加高斯噪声:

img = imread('kebi.jpg');
noisy_img = imnoise(img, 'gaussian', 0, 0.02);
imwrite(noisy_img, 'noisy_kebi.jpg');

然后,可以编写IdealLowFilter.m文件实现理想低通滤波器的平滑过程。

function filtered_img = IdealLowFilter(img, freq_radius)
    % 图像的傅里叶变换
    fft_img = fftshift(fft2(img));

    % 获取图像的频率域尺寸
    [rows, cols] = size(fft_img);

    % 构造理想低通滤波器
    freq_mask = zeros(rows, cols);
    center = [rows/2+1, cols/2+1];
    for i = 1:rows
        for j = 1:cols
            dist = sqrt((i-center(1))^2 + (j-center(2))^2);
            if dist <= freq_radius
                freq_mask(i, j) = 1;
            end
        end
    end

    % 将频率域图像与滤波器进行点乘
    filtered_fft_img = fft_img .* freq_mask;

    % 对滤波后的频率域图像进行逆傅里叶变换
    filtered_img = ifft2(ifftshift(filtered_fft_img));
    filtered_img = real(filtered_img);
end

接下来,可以使用IdealLowFilter函数对加噪的图像进行平滑滤波,并显示滤波后的结果图像:

noisy_img = imread('noisy_kebi.jpg');

% 使用不同的截至频率半径对加噪图像进行平滑滤波
filtered_img_30 = IdealLowFilter(noisy_img, 30);
filtered_img_90 = IdealLowFilter(noisy_img, 90);
filtered_img_160 = IdealLowFilter(noisy_img, 160);

% 显示滤波结果图像
figure;
subplot(2, 2, 1);
imshow(noisy_img);
title('加噪图像');
subplot(2, 2, 2);
imshow(filtered_img_30, []);
title('截至频率半径=30');
subplot(2, 2, 3);
imshow(filtered_img_90, []);
title('截至频率半径=90');
subplot(2, 2, 4);
imshow(filtered_img_160, []);
title('截至频率半径=160');

④生成一个GaussianLowFilter.m文件,利用高斯低通滤波器对加噪的“keibi.jpg”图像进行平滑滤波(截至频率半径值分别设置30,90,160),分别显示滤波后的结果图像并进行比较分析。

% 加载图片
img = imread('kebi.jpg');
img = im2double(img);
[m, n, ~] = size(img);

% 添加噪声
noise = randn(m, n) * 0.1;
noisy_img = img + noise;

% 显示原图和加噪图
figure;
subplot(1, 2, 1);
imshow(img);
title('Original Image');
subplot(1, 2, 2);
imshow(noisy_img);
title('Noisy Image');

% 频率域滤波
radius_values = [30, 90, 160];
filtered_imgs = cell(1, numel(radius_values));

for i = 1:numel(radius_values)
    radius = radius_values(i);
    
    % 中心化FFT
    fft_img = fftshift(fft2(noisy_img));
    
    % 创建高斯滤波器
    [x, y] = meshgrid(1:n, 1:m);
    center_x = round(n/2);
    center_y = round(m/2);
    gaussian_filter = exp(-((x-center_x).^2 + (y-center_y).^2) / (2*radius^2));
    
    % 滤波
    filtered_img = ifft2(ifftshift(fft_img .* gaussian_filter));
    
    % 保存滤波后的结果
    filtered_imgs{i} = filtered_img;
    
    % 显示滤波结果
    figure;
    subplot(1, 2, 1);
    imshow(noisy_img);
    title('Noisy Image');
    subplot(1, 2, 2);
    imshow(filtered_img);
    title(['Filtered Image (Radius = ' num2str(radius) ')']);
end

% 图像比较和分析
figure;
subplot(2, 2, 1);
imshow(img);
title('Original Image');
subplot(2, 2, 2);
imshow(noisy_img);
title('Noisy Image');

for i = 1:numel(radius_values)
    subplot(2, 2, i+2);
    imshow(filtered_imgs{i});
    title(['Filtered Image (Radius = ' num2str(radius_values(i)) ')']);
end

总结

1. 低通滤波器
截止频率:低通滤波器的截止频率定义了滤波器允许通过信号的最高频率。
去噪效果:较低的截止频率会滤除更多高频噪声,但也可能去除信号中的有用高频成分,导致信号失真。较高的截止频率则允许更多高频成分通过,但去噪效果可能减弱。
关系:截止频率越低,去噪效果越明显,但信号失真风险也越高;截止频率越高,去噪效果越弱,但信号失真风险降低。
2. 高通滤波器
截止频率:高通滤波器的截止频率定义了滤波器允许阻止信号的最低频率。
去噪效果:较高的截止频率会滤除更多低频噪声,但也可能去除信号中的有用低频成分。较低的截止频率则允许更多低频成分通过,去噪效果减弱。
关系:截止频率越高,对低频噪声的去除效果越好,但也可能导致信号低频信息的丢失;截止频率越低,去噪效果越不明显,但信号的低频信息保留更多。
3. 带阻滤波器
截止频率:带阻滤波器定义了两个截止频率,形成一个阻带,阻带内的频率成分被抑制。
去噪效果:带阻滤波器的去噪效果直接取决于阻带的宽度和位置。如果噪声集中在特定频率范围内,通过调整阻带位置可以精确去除噪声。
关系:阻带宽度和位置的选择直接影响去噪效果。阻带越宽,去除噪声的频率范围越大,但也可能去除信号中的有用成分;阻带位置越精确对准噪声频率,去噪效果越好,同时保留信号其他部分的完整性。

标签:plt,img,imshow,数字图像,低通滤波器,jpg,Matlab,图像,noisy
From: https://blog.csdn.net/m6886258/article/details/142926678

相关文章