数字图像处理:频域图像增强

频域处理

设计思路

频域处理的核心思想是将图像从其原始的空间域转换到频域,这样可以便于分析和修改图像的频率成分。在频域中,图像的不同特性,如边缘(高频成分)和平滑区域(低频成分),可以被更直观地识别和处理。

实现方法

实现频域处理通常涉及将图像通过二维快速傅里叶变换(FFT)转换到频域,对频域表示进行所需的修改(如滤波、增强等),然后使用逆傅里叶变换(IFFT)将其转换回空间域。这个过程允许对图像的频率成分进行精确控制,实现各种图像处理效果。

matlab代码

matlab 复制代码
% 读取图片
img = imread('G.png');

% 转换为灰度图
grayImg = rgb2gray(img);

% 计算灰度图的二维离散傅里叶变换(DFT)
dftImg = fft2(double(grayImg));

% 将零频率分量移动到频域图的中心
shiftedDftImg = fftshift(dftImg);

% 计算频域图的幅度谱,对其进行对数变换以便于显示
magnitudeDft = log(1 + abs(shiftedDftImg));

% 显示原图
subplot(1, 2, 1);
imshow(grayImg);
title('Original Gray Image');

% 显示频域图
subplot(1, 2, 2);
imshow(magnitudeDft, []);
title('Frequency Domain Image');

效果

理想低通滤波

设计思路

理想低通滤波的目的是在频域中切除高于某个截止频率的所有频率成分,从而平滑图像并减少细节和噪声。这种滤波器在截止频率处有一个硬边界,即完全通过所有低于截止频率的成分,而阻断所有高于截止频率的成分。

实现方法

实现理想低通滤波需要几个步骤:首先,对图像进行灰度化处理并通过二维快速傅里叶变换(FFT)进入频域。然后,创建一个理想的低通滤波器,该滤波器在预定的截止频率内值为1,在截止频率外值为0。将此滤波器应用于图像的频域表示,以滤除高频成分。最后,通过逆FFT将处理后的频域图像转换回空间域,得到最终的平滑图像。

matlab代码

matlab 复制代码
% 读取图像并转换为灰度图
img = imread('G.png');
grayImg = rgb2gray(img);

% 获取图像尺寸
[M, N] = size(grayImg);

% 应用二维FFT并中心化
fftImg = fftshift(fft2(double(grayImg)));
fftMagnitude = log(1 + abs(fftImg));  % 用于显示的频域图像

% 设定三个不同的滤波器半径
radii = [10, 30, 60];
filteredImages = cell(1, length(radii));

% 对每个半径应用低通滤波器并进行逆FFT
for i = 1:length(radii)
    radius = radii(i);
    
    % 创建低通滤波器(圆形区域)
    [X, Y] = meshgrid(1:N, 1:M);
    centerX = round(N/2);
    centerY = round(M/2);
    mask = (X - centerX).^2 + (Y - centerY).^2 <= radius^2;

    % 应用低通滤波器
    filteredFFT = fftImg .* mask;
    
    % 进行逆FFT回到空间域
    filteredImg = ifft2(ifftshift(filteredFFT));
    filteredImages{i} = abs(filteredImg);
end

% 显示原始图像和经过不同低通滤波处理的图像
figure, subplot(2, 3, 1), imshow(grayImg), title('Original Image');
for i = 1:length(radii)
    subplot(2, 3, i+1), imshow(filteredImages{i}, []), title(['Low Pass, Radius = ', num2str(radii(i))]);
end

% 显示带有三个半径圆环的频域图像
subplot(2, 3, 5), imshow(fftMagnitude, []), title('Frequency Domain with Circles');
hold on;
for i = 1:length(radii)
    viscircles([centerX, centerY], radii(i), 'Color', 'white', 'LineWidth', 0.5, 'EnhanceVisibility', false);
end
hold off;

效果

Butterworth低通滤波

设计思路

Butterworth低通滤波旨在平滑地过滤掉图像的高频成分,同时尽量保留低频信息,以减少图像处理中的振铃效应和模糊。它通过一个平滑的过渡来避免理想滤波器的硬截断,实现频率的逐渐衰减,保持了图像的自然性和连续性。

实现方法

实现Butterworth低通滤波涉及以下步骤:首先将图像转换为灰度并应用二维快速傅里叶变换(FFT)来移动到频域。接着,设计一个Butterworth滤波器,该滤波器根据预设的截止频率和阶数决定每个频率成分的通过程度。然后,将此滤波器应用于频域图像以滤除高频成分。最后,通过逆FFT将图像转换回空间域,并展示处理后的结果。

matlab代码

matlab 复制代码
% 读取图像并转换为灰度图
img = imread('G.png');
grayImg = rgb2gray(img);

% 获取图像尺寸
[M, N] = size(grayImg);

% 应用二维FFT并中心化
fftImg = fftshift(fft2(double(grayImg)));

% 设定三个不同的截止频率
cutoffFrequencies = [10, 30, 60];

% Butterworth滤波器的阶数
n = 2;  % 可以调整此值以改变滤波器的平滑性/陡峭性

% 预分配数组以存储滤波后的图像
filteredImages = cell(1, length(cutoffFrequencies));

% 对每个截止频率应用Butterworth低通滤波器
for i = 1:length(cutoffFrequencies)
    cutoff = cutoffFrequencies(i);
    
    % 创建距离矩阵D(u,v)
    [U, V] = meshgrid(1:N, 1:M);
    D = sqrt((U - N/2).^2 + (V - M/2).^2);
    
    % 创建Butterworth滤波器
    H = 1 ./ (1 + (D / cutoff).^(2*n));
    
    % 应用滤波器并进行逆FFT
    filteredFFT = fftImg .* H;
    filteredImg = ifft2(ifftshift(filteredFFT));
    filteredImages{i} = abs(filteredImg);
end

% 显示原始图像和经过不同Butterworth低通滤波处理的图像
figure, subplot(2, 2, 1), imshow(grayImg), title('Original Image');
for i = 1:length(cutoffFrequencies)
    subplot(2, 2, i+1), imshow(filteredImages{i}, []), title(['Butterworth LPF, Cutoff = ', num2str(cutoffFrequencies(i))]);
end

效果

Gaussian低通滤波

设计思路

高斯低通滤波器利用高斯函数的平滑特性来减少图像的高频成分,从而达到去噪和模糊的效果。与理想和巴特沃斯低通滤波器相比,高斯滤波器在频域中以自然且平滑的方式过渡,避免了边缘振铃等不良效应。

实现方法

实现高斯低通滤波首先涉及将图像转换为灰度图并通过二维快速傅里叶变换(FFT)移入频域。然后,根据高斯函数构造滤波器,其大小与图像相同,中心对应低频成分。此滤波器乘以图像的频域表示以实现低通滤波。最后,逆FFT将图像转换回空间域,展示处理后的结果。

matlab代码

matlab 复制代码
% 读取图像并转换为灰度图
img = imread('G.png');
grayImg = rgb2gray(img);

% 获取图像尺寸
[M, N] = size(grayImg);

% 应用二维FFT并中心化
fftImg = fftshift(fft2(double(grayImg)));

% 定义三个不同的截止频率
cutoffFrequencies = [10, 30, 60];

% 预分配数组以存储滤波后的图像
filteredImages = cell(1, length(cutoffFrequencies));

% 对每个截止频率应用高斯低通滤波器
for i = 1:length(cutoffFrequencies)
    cutoff = cutoffFrequencies(i);
    
    % 创建距离矩阵D(u,v)
    [U, V] = meshgrid(1:N, 1:M);
    D = sqrt((U - N/2).^2 + (V - M/2).^2);
    
    % 创建高斯滤波器
    H = exp(-(D.^2) / (2 * cutoff^2));
    
    % 应用滤波器并进行逆FFT
    filteredFFT = fftImg .* H;
    filteredImg = ifft2(ifftshift(filteredFFT));
    filteredImages{i} = abs(filteredImg);
end

% 显示原始图像和经过不同高斯低通滤波处理的图像
figure, subplot(2, 2, 1), imshow(grayImg), title('Original Image');
for i = 1:length(cutoffFrequencies)
    subplot(2, 2, i+1), imshow(filteredImages{i}, []), title(['Gaussian LPF, Cutoff = ', num2str(cutoffFrequencies(i))]);
end

效果

高通滤波

设计思路

高通滤波的目的是保留图像中的高频成分,如边缘和细节,同时去除低频成分,如平滑区域和背景。这种处理强调了图像的纹理和轮廓,有助于图像分析和特征提取。

实现方法

实现高通滤波通常包括将图像转换到频域,设计并应用高通滤波器(如理想、Butterworth或Gaussian高通滤波器),然后将滤波后的频域图像通过逆傅里叶变换转换回空间域。这样可以有效地突出图像的高频信息,如边缘和纹理细节。

matlab代码

matlab 复制代码
% 读取图像并转换为灰度图
img = imread('G.png');
grayImg = rgb2gray(img);

% 获取图像尺寸
[M, N] = size(grayImg);

% 应用二维FFT并中心化
fftImg = fftshift(fft2(double(grayImg)));

% 定义截止频率
cutoff = 30;  % 可根据需要调整

% 创建距离矩阵D(u,v)
[U, V] = meshgrid(1:N, 1:M);
D = sqrt((U - N/2).^2 + (V - M/2).^2);

% 理想高通滤波器
H_ideal = double(D > cutoff);

% Butterworth高通滤波器
n = 2;  % Butterworth滤波器的阶数
H_butterworth = 1 ./ (1 + (cutoff ./ D).^(2*n));

% Gaussian高通滤波器
H_gaussian = 1 - exp(-(D.^2) / (2 * cutoff^2));

% 应用高通滤波器并进行逆FFT
filteredImg_ideal = ifft2(ifftshift(fftImg .* H_ideal));
filteredImg_butterworth = ifft2(ifftshift(fftImg .* H_butterworth));
filteredImg_gaussian = ifft2(ifftshift(fftImg .* H_gaussian));

% 显示原始图像和经过高通滤波处理的图像
figure;
subplot(2, 2, 1), imshow(grayImg), title('Original Image');
subplot(2, 2, 2), imshow(abs(filteredImg_ideal), []), title('Ideal High Pass Filtered');
subplot(2, 2, 3), imshow(abs(filteredImg_butterworth), []), title('Butterworth High Pass Filtered');
subplot(2, 2, 4), imshow(abs(filteredImg_gaussian), []), title('Gaussian High Pass Filtered');

效果

高频提升

设计思路

高频提升滤波是一种增强图像细节和边缘的技术,通过加强图像的高频成分来提升图像的清晰度和对比度。这种方法结合了图像的原始版本和其高通滤波后的版本,以强调细节和纹理。

实现方法

实现高频提升首先包括对原始图像应用高通滤波器以提取高频成分,然后将这些高频成分乘以一个大于1的增强因子,并与原始图像相加。这样可以在保留原图信息的同时增加图像的高频细节,从而达到提升效果。

matlab代码

matlab 复制代码
% 读取图像并转换为灰度图
img = imread('G.png');
grayImg = rgb2gray(img);

% 获取图像尺寸
[M, N] = size(grayImg);

% 应用二维FFT并中心化
fftImg = fftshift(fft2(double(grayImg)));

% 定义高斯高通滤波器的截止频率
cutoff = 30; % 可以根据需要调整

% 创建距离矩阵D(u,v)
[U, V] = meshgrid(1:N, 1:M);
D = sqrt((U - N/2).^2 + (V - M/2).^2);

% 创建高斯高通滤波器
H_gaussian_highpass = 1 - exp(-(D.^2) / (2 * cutoff^2));

% 应用高斯高通滤波器并进行逆FFT
filteredFFT = fftImg .* H_gaussian_highpass;
fhp = ifft2(ifftshift(filteredFFT));

% 设定增强系数A
A = 1.5;  % A > 1,可根据需要调整

% 应用高频提升公式
fhb = (A - 1) * double(grayImg) + abs(fhp);

% 显示原始图像和高频提升后的图像
figure, subplot(1, 2, 1), imshow(grayImg), title('Original Image');
subplot(1, 2, 2), imshow(fhb, []), title('High-frequency Enhanced Image');

效果

带通带阻

设计思路

在设计带通和带阻滤波器时,目标是允许特定频率范围的信号通过,同时阻止其他频率的信号。带通滤波器允许位于某个频率区间内的信号通过,而带阻滤波器则阻止这个区间内的信号通过,允许其他信号通过。这种设计思路在图像处理中可用于增强或抑制图像中的特定细节和纹理,或者去除特定频率的噪声。

实现方法

实现带通和带阻滤波通常通过在频域内应用滤波器来完成。首先,对图像执行快速傅里叶变换(FFT)以转换到频域。然后,根据带通或带阻的要求设计一个滤波器掩膜,该掩膜定义了要通过或阻止的频率范围。通过与原始图像的频域表示相乘来应用该掩膜。最后,执行逆快速傅里叶变换(IFFT)将图像转换回空间域。这个过程可以调整以满足特定的图像处理需求,比如改善图像的视觉质量或去除噪声。

matlab代码

matlab 复制代码
I = imread('G.png');  % 
I_gray = rgb2gray(I);  % 如果图像是彩色的,转换成灰度图像

% 设定频率范围
low_freq = 0.3;  % 低频截止
high_freq = 0.5;  % 高频截止

% FFT变换
I_fft = fft2(double(I_gray));
I_fft_shift = fftshift(I_fft);

% 获取图像尺寸
[M, N] = size(I_gray);
[X, Y] = meshgrid(1:N,1:M);
centerX = ceil(N/2);
centerY = ceil(M/2);

% 计算距离矩阵
D = sqrt((X - centerX).^2 + (Y - centerY).^2);

% 创建带通滤波器掩膜
BP_mask = D >= M*low_freq & D <= M*high_freq;
% 创建带阻滤波器掩膜
BS_mask = ~(D >= M*low_freq & D <= M*high_freq);

% 应用带通和带阻滤波器
BP_filtered = I_fft_shift .* BP_mask;
BS_filtered = I_fft_shift .* BS_mask;

% 逆FFT变换
I_BP = ifft2(ifftshift(BP_filtered));
I_BS = ifft2(ifftshift(BS_filtered));

subplot(1,3,1), imshow(I_gray), title('Original Image');
subplot(1,3,2), imshow(log(1+abs(I_BP)), []), title('Bandpass Filtered');
subplot(1,3,3), imshow(log(1+abs(I_BS)), []), title('Bandstop Filtered');

效果

同态滤波

设计思路

同态滤波的设计思路旨在通过同时增强图像的亮度变化和对比度来改善图像质量。它利用频域滤波的方法,区分图像的光照分量和反射分量,并对这两个分量进行不同程度的增强或衰减,以达到同时增强图像细节和调整图像亮度的效果。

实现方法

同态滤波的实现涉及几个关键步骤:首先,对图像应用对数变换,将乘性噪声转换为加性噪声并分离出光照和反射分量。接着,对变换后的图像执行快速傅里叶变换(FFT)进入频域。在频域中,通过一个设计好的滤波器来增强高频成分(细节部分)并衰减低频成分(光照变化部分)。最后,通过逆快速傅里叶变换(IFFT)和指数变换将处理后的图像转换回原始空间域。这一系列操作提升了图像的视觉效果,特别是在对比度和细节方面。

matlab代码

matlab 复制代码
% 读取图像
I = imread('R.png'); % 替换为你的图像文件路径
I_gray = rgb2gray(I); % 如果图像是彩色的,转换为灰度图

% 应用对数变换
I_log = log(double(I_gray) + 1);

% 进行FFT
I_fft = fft2(I_log);
I_fft_shift = fftshift(I_fft);

% 创建同态滤波器
[M, N] = size(I_gray);
[X, Y] = meshgrid(1:N,1:M);
centerX = ceil(N/2);
centerY = ceil(M/2);
D = sqrt((X - centerX).^2 + (Y - centerY).^2);

% 设定滤波器参数
sigmaL = 0.1; % 减弱低频的参数
sigmaH = 0.1; % 增强高频的参数
D0 = 50; % 截止频率

% 构建滤波器
H = (sigmaH - sigmaL) * (1 - exp(-D.^2 / (2 * D0^2))) + sigmaL;

% 应用滤波器
I_filtered = I_fft_shift .* H;

% 进行逆FFT
I_ifft_shift = ifftshift(I_filtered);
I_ifft = ifft2(I_ifft_shift);

% 应用指数变换
I_exp = exp(real(I_ifft)) - 1;

I_final = im2uint8(mat2gray(I_exp));  % 将图像转换为0到255范围内的uint8类型

% 显示结果
subplot(1,2,1), imshow(I_gray), title('Original Image');
subplot(1,2,2), imshow(I_final, []), title('Homomorphic Filtered');

效果

相关推荐
zaizai100717 天前
WebGL编程指南 - 颜色与纹理续
图形学
zaizai100720 天前
WebGL编程指南 - 绘制和变换三角形
图形学
zaizai100721 天前
WebGL编程指南 - 入门续
图形学
闲人编程1 个月前
使用Python实现图形学的阴影贴图算法
python·算法·图形学·贴图·阴影贴图
闲人编程1 个月前
使用Python实现图形学的纹理映射算法
开发语言·python·算法·图形学·纹理映射
闲人编程1 个月前
使用Python实现图形学的环境映射算法
开发语言·python·算法·图形学·环境映射
闲人编程1 个月前
Python实现图形学曲线和曲面的Bezier曲线算法
开发语言·python·算法·图形学·曲线·曲面·bezier
CaptainHarryChen1 个月前
从 Affine Particle-In-Cell (APIC) 到 Material Point Method (MPM 物质点法)
图形学·物理仿真·mpm·仿真算法
Jozky863 个月前
图形学论文笔记
笔记·图形学
赵青青3 个月前
DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑
图形学