如何使用 MATLAB 从频域中的数字图像中去除噪声?
噪声被定义为异常像素。换句话说,噪声是由不能正确表示场景颜色或曝光的像素组成的。在本文中,我们将介绍如何在频域中去除数字图像中的噪声。
有两种类型的噪声源
- 图像采集
- 图像传输
在数字图像处理中,可以使用不同类型的噪声模型,即:
- 空间独立的噪声模型
- 高斯噪声
- 瑞利噪声
- Erlang (Gamma) 噪声
- 指数噪声
- 脉冲(椒盐)噪声
- 空间相关噪声模型
- 周期性噪声
现在我们看到从图像中去除了高斯噪声。
脚步:
- 阅读无噪声图像。
- 创建高斯白噪声并将其添加到图像中。
- 计算噪声图像的傅里叶变换。
- 创建巴特沃斯低通滤波器。
- 对有噪图像进行 BLPF 和 FT 的逐元素乘法。
- 计算上述结果的逆 FT。
- 显示去噪图像和中间图像。
使用的函数:
- imread( ) 内置函数用于读取图像。
- imtool( ) 内置函数用于显示图像。
- rgb2gray( ) 内置函数用于将 RGB 图像转换为灰度图像。
- randn( ) 内置函数用于创建指定标准偏差的随机噪声。
- double( ) 内置函数用于将整数值转换为双精度格式。
- fft2( ) 内置函数用于执行二维傅里叶变换。
- fftshift( ) 内置函数用于将角移动到中心。
- meshgrid( ) 内置函数用于创建包含向量坐标的二维网格。
- ifft2( ) 内置函数用于执行傅里叶逆变换。
- sqrt( ) 内置函数用于计算给定输入的平方根。
例子:
Matlab
%MATLAB CODE For
% REMOVAL OF GAUSSIAN
% NOISE IN FREQUENCY DOMAIN.
function RemoveGaussianNoise(img)
%convert into grayscale if not.
[M,N,D]=size(img)
if(D==3)
k=rgb2gray(img);
end
%display image.
imtool(k, []);
%define noise.
n=15*randn(size(k));
kn=double(k)+n;
%display noised image.
imtool(kn,[]);
%Convert into Frequency domain.
ft=fft2(kn);
%display centered FT spectrum.
imtool(abs(log(fftshift(ft))),[]);
% MATLAB Code | Butterworth Low Pass Filter
% Assign the order value
n = 2; % one can change this value accordingly
% Assign Cut-off Frequency
D0 = 20; % one can change this value accordingly
% Designing filter
u = 0:(M-1);
v = 0:(N-1);
idx = find(u > M/2);
u(idx) = u(idx) - M;
idy = find(v > N/2);
v(idy) = v(idy) - N;
% MATLAB library function meshgrid(v, u) returns
% 2D grid which contains the coordinates of vectors
% v and u. Matrix V with each row is a copy of v
% and matrix U with each column is a copy of u
[V, U] = meshgrid(v, u);
% Calculating Euclidean Distance
D = sqrt(U.^2 + V.^2);
% determining the filtering mask
H = 1./(1 + (D./D0).^(2*n));
%Display BLPF.
imtool(fftshift(H),[]);
%Perform element wise multiplication.
res=H.*ft;
%take inverse FT.
dn=ifft2(res);
%Display denoised image.
imtool(dn,[]);
end
%%%%%UTILITY CODE%%%%
img=imread("cameraman.png");
RemoveGaussianNoise(img);
Matlab
% MATLAB CODE
%REMOVAL OF PERIODIC NOISE FROM IMAGE.
function RemovePeriodicNoise(img)
% take FT of image and
% shift corners to center.
Fourier_transform=fft2(img);
Centered_shifted=fftshift(Fourier_transform);
% Block the noise spectrum.
Centered_shifted(1:125,110:130)=0;%for man
Centered_shifted(190:320,110:130)=0;%diagonals
Centered_shifted(120:x,1:100)=0;%for lady with hat.
Centered_shifted(1:100,120:y)=0;%diagonals.
% inverse shift center to
% cornter and take Inverse FT.
Inverse_shifted=ifftshift(Centered_shifted);
Output_image=ifft2(Inverse_shifted);
% display input image.
original_input_image=img;
imtool(original_input_image,[]);
% display FT spectrum.
Centered_shifted_spectrum=abs(log(fftshift(Fourier_transform)));
imtool(Centered_shifted_spectrum,[]);
% display denoised FT.
Noise_free_FT=log(Centered_shifted);
imtool(Noise_free_FT,[]);
% display output image.
imtool(abs(Output_image),[]);
end
%%%UTILITY CODE%%%
k=imread("periodic_noise1.png");
RemovePeriodicNoise(k);
输出:
使用高斯滤波器和 NLM 滤波器在空间域中最好地去除高斯噪声。我们可以尝试使用 Butterworth LPF 来降低频域中的高斯噪声,但结果不是很有效。它确实在一定程度上减少了噪音,但以模糊为代价。生成的图像是无噪声的,但图像中会出现模糊,这使得难以观察图像中更精细的细节。
现在我们看到在频域中从图像中去除了周期性噪声。因此,出现在重复模式中的噪声称为周期性噪声。它被视为图像中的线条。周期性噪声的来源是捕获图像期间的电气或机电干扰。转换为频域后的周期性噪声被视为图像中的离散尖峰。为了消除这种类型的噪声,我们必须在频域中使用陷波滤波器。应用陷波滤波器后,角落仍残留一些噪点。
脚步:
- 阅读图像。
- 计算图像的傅里叶变换。
- 获取居中的 FT 光谱并显示。
- 发现 FT 图像中的周期性噪声模式。
- 阻止 FT 图像中的周期性噪声模式。
- 将图像从频域转换回空间域。
- 计算图像的傅里叶逆变换。
- 显示图像。
句法:
- imread( ) 内置函数用于读取图像。
- imtool( ) 内置函数用于显示图像。
- fft2( ) 内置函数用于执行二维图像的傅立叶变换。
- fftshift( ) 内置函数用于获取居中的 FT 谱。
- ifft2( ) 内置函数用于执行傅里叶逆变换。
- ifftshift( ) 内置函数用于对 FT 谱进行偏心。
- abs( ) 内置函数用于绝对值。
- log( ) 内置函数用于获取值的对数。
例子:
MATLAB
% MATLAB CODE
%REMOVAL OF PERIODIC NOISE FROM IMAGE.
function RemovePeriodicNoise(img)
% take FT of image and
% shift corners to center.
Fourier_transform=fft2(img);
Centered_shifted=fftshift(Fourier_transform);
% Block the noise spectrum.
Centered_shifted(1:125,110:130)=0;%for man
Centered_shifted(190:320,110:130)=0;%diagonals
Centered_shifted(120:x,1:100)=0;%for lady with hat.
Centered_shifted(1:100,120:y)=0;%diagonals.
% inverse shift center to
% cornter and take Inverse FT.
Inverse_shifted=ifftshift(Centered_shifted);
Output_image=ifft2(Inverse_shifted);
% display input image.
original_input_image=img;
imtool(original_input_image,[]);
% display FT spectrum.
Centered_shifted_spectrum=abs(log(fftshift(Fourier_transform)));
imtool(Centered_shifted_spectrum,[]);
% display denoised FT.
Noise_free_FT=log(Centered_shifted);
imtool(Noise_free_FT,[]);
% display output image.
imtool(abs(Output_image),[]);
end
%%%UTILITY CODE%%%
k=imread("periodic_noise1.png");
RemovePeriodicNoise(k);
输出:
空间域中的数字图像无法去除周期性噪声。这是通过将图像转换为频域来去除周期性噪声的唯一方法。唯一的条件是我们需要在傅里叶变换图像中发现噪声模式以获得高质量的图像。