频域是频率信号与该频率信号的幅度的关系,频率也可以看作是图像灰度变化的幅度,如果频率越大,则其灰度变化幅度越大,与相邻灰度值差别越大。一般来说噪声点频率就较大,我们可以使用低通滤波去除噪声点,此外,图像的边缘和细节部分也是高频的,使用高频滤波可以增强图像的边缘和细节。但在进行这些操作之前,我们都需要先做一件事,那就是将图像转化为频域振幅图像,因为普通图像一般都是空间域图像,不能直接对频率进行操作。
1. 图像频域变换
使用傅里叶变换就能将图像的灰度值转化为频率。
在matlab中我们可以使用fft2()函数计算二维快速傅里叶变换,我们读取的图像必须是二维灰度图像,如果不是,则需要进行灰度变换。
imag = imread("C:\Users\林梓烯\Pictures\练习图片\桥.jpg");
imag_gray = rgb2gray(imag);
subplot(1, 2, 1); imshow(imag_gray); title('原图像')
fu = fft2(imag_gray);
subplot(1, 2, 2); imshow(log(abs(fu)), [ ]); title('傅里叶变换后图像')
上述代码中显示频域图像时,由于我们只关心频率的幅度,频率有正有负,因此我们对其取绝对值,同时取绝对值也可以让结果是实数,避免matlab警告,频率有的值可能非常大,这样会导致频率的取值范围很大,一些较小的频率很难被观察到,因此可以将频率值取对数,使其取值范围降低到一个很小的范围。而imshow的第二个参数则是为了将图像的值映射到范围区间中,在图像值为浮点数时,其范围不在可显示范围中,无法正常显示,添加第二个参数后就可以将浮点数映射到可显示范围中。
得出的傅里叶变换后的图像的频谱中心在图像的左上角,这样的分布不利于我们观察图像频率,同时也不便于我们进行滤波器操作,我们可以将图像的频谱中心移到图像的中心。
使用fftshift()函数即可实现这个操作。
imag = imread("C:\Users\林梓烯\Pictures\练习图片\桥.jpg");
imag_gray = rgb2gray(imag);
subplot(1, 2, 1); imshow(imag_gray); title('原图像')
fu = fftshift(fft2(imag_gray));
subplot(1, 2, 2); imshow(log(abs(fu)), [ ]); title('傅里叶变换后图像')
这样得到的频域图像就很直观了
在我们对频域图像处理过后,则需要再将频域图像转换回灰度图像,使用傅里叶反变换即可实现。
在matlab中使用ifft2函数实现傅里叶反变换
在进行反变换前我们需要先将图像的频谱中心移回左上角,否则得出的图像将与原图像不完全相同。
mag = imread("C:\Users\林梓烯\Pictures\练习图片\桥.jpg");
mag_gray = rgb2gray(imag);
ubplot(1, 3, 1); imshow(imag_gray); title('原图像')
u = fftshift(fft2(imag_gray));
ubplot(1, 3, 2); imshow(log(abs(fu)), [ ]); title('傅里叶变换后图像')
mag_x = ifft2(ifftshift(fu));
ubplot(1, 3, 3); imshow(imag_x, []); title('傅里叶反变换图像')
从上图可以看出傅里叶反变换后的图像与原图像是相同的。
2. 低通滤波器
因为噪声和细节通常频率较高,因此使用低通滤波器能够去除噪声和消除一些细节。
经过傅里叶变换后的频率图像中心为低频,越往外频率越高(频谱中心移动到中心后),要实现低通滤波器我们只需要将外围的高频分量去除,保留中心的低频分量即可。
在代码实现上,我们可以使用一个矩阵,其值为0或1,将该矩阵中心一部分区间的值改为1,外围改为0,再使用原频域图像矩阵点乘此矩阵,即可使频域图像矩阵中心低频区间的值保留,外围的值变为0,达到去除高频分量的目的。
imag = imread("C:\Users\林梓烯\Pictures\练习图片\桥.jpg");
imag_gray = rgb2gray(imag);
fu = fftshift(fft2(imag_gray));
[M, N] = size(imag_gray);
H = zeros(M, N);
H(M / 4 : M * 3 / 4, N / 4 : N * 3 / 4) = 1;
LOWPASS = fu .* H;
C=ifft2(ifftshift(LOWPASS));
subplot(2, 1, 1); imshow(imag_gray); title('原图像')
subplot(2, 1, 2); imshow(abs(C), []); title('低通滤波后的灰度图像')
从上图可以看出,使用低通滤波器后,图像变得模糊了一些,一些细节变得不清晰,且亮度也降低了。通过低通滤波器噪声点会去除一些,但在这张图片中不能清楚的看出来。
为了能更方便的更改截止频率,可以将代码改成如下:
imag = imread("C:\Users\林梓烯\Pictures\练习图片\噪声点.png");
imag_gray = rgb2gray(imag);
fu = fftshift(fft2(imag_gray));
[M, N] = size(imag_gray);
f = 100; % 截止频率
[X, Y] = meshgrid(-N/2:N/2-1, -M/2:M/2-1);
H = sqrt(X.^2 + Y.^2) <= f;
LOWPASS = fu .* H;
C=ifft2(ifftshift(LOWPASS));
subplot(1, 2, 1); imshow(imag_gray); title('原图像')
subplot(1, 2, 2); imshow(abs(C), []); title('低通滤波后的灰度图像')
使用上述代码则将通过滤波的频率范围设成了圆形,且能通过直接更改f的值来更改截止频率。
高于截止频率的频率将被去除,低于截止频率的将被保留,如果截止频率较高,则更多的细节被保留,但噪声也会保留很多;如果截止频率设置较低,则能去除更多的噪声,但图像的细节会少很多,很多较高频的信号也会被去除,会变得很模糊。
为了更清晰的看出噪声点的去除,这里使用了一张带有较多噪声点的图片
这里选择的截止频率为100,从上图可以看出噪声点去除了不少,但是图片也变模糊了很多。
现在将截止频率更改为200
使用200的截止频率后,可以看出图片清晰了许多,但是噪声点仍然保留很多
使用150的截止频率较为合适。
因为本图片的噪声点过多,因此很难实现既清晰噪声点又少,只能折中。
3. 高通滤波器
使用高通滤波可以突出显示图片的高频区域,如图片边缘部分和细节部分。
将低频滤波器中的滤波条件从<=f改为>=f可以实现高通滤波器。
高通滤波器截止频率选的低,则能保留大部分信息,但高频部分如边缘和噪声的突出作用就会小很多;如果截止频率选的很高,则基本只保留边缘和噪声,边缘和噪声突出作用很大,但会丢失大量信息。
imag = imread("C:\Users\林梓烯\Pictures\练习图片\噪声点.png");
imag_gray = rgb2gray(imag);
fu = fftshift(fft2(imag_gray));
[M, N] = size(imag_gray);
f = 10; % 截止频率
[X, Y] = meshgrid(-N/2:N/2-1, -M/2:M/2-1);
H = sqrt(X.^2 + Y.^2) >= f;
HIGHPASS = fu .* H;
C=ifft2(ifftshift(HIGHPASS));
subplot(2, 1, 1); imshow(imag_gray); title('原图像')
subplot(2, 1, 2); imshow(abs(C), []); title('低通滤波后的灰度图像')
上图使用的截止频率是10,保留了很多的信息,变化不太明显的边缘和频率较低的噪声都被保留了,边缘和噪声突出作用会小一些。
上图使用较高截止频率50后,则会发现图片丢失了大量信息,仅保留了变化剧烈的边缘和一些高频噪声,对边缘和高频噪声的突出作用很明显。
截止频率的选择还要看实际情况,根据所要保留的信息多少和要突出多高频的区域的要求,进行多次测试后决定。
4. 振幅与相位
对图像进行傅里叶变换后得到的是一个复数矩阵,其中,每个复数值的模对应频率分量的振幅,每个复数值的相位角对应频率分量的相位(e^(iθ)即位相位,θ是相位角)。
使用abs函数求每个频率分量的模(绝对值),使用angle函数求每个频率分量的相位角。
imag = imread("C:\Users\林梓烯\Pictures\练习图片\噪声点.png");
imag_gray = rgb2gray(imag);
fu = fftshift(fft2(imag_gray));
zf = abs(fu);
xw = angle(fu);
imag_zf = real(ifft2(ifftshift(zf)));
imag_xw = real(ifft2(ifftshift(exp(1i*xw))));
figure, subplot(1, 1, 1); imshow(imag_gray)
figure, subplot(1,2,1), imshow(log(zf), []), title('振幅分布')
subplot(1,2,2), imshow(xw, []), title('相位分布')
figure, subplot(1,2,1), imshow(log(imag_zf), []), title('振幅逆变换后的图像')
subplot(1,2,2), imshow(imag_xw, []), title('相位逆变换后的图像')
如上图使用abs计算频率的模,使用angle计算频率的相位角,因为fu是移动过频谱中心的,所以需要使用ifftshift函数移回去,相位角需要乘上虚数i在使用exp函数求e次幂得到相位。real函数是取实数,可以不用,不过不用可能会弹出警告但不影响显示。
原图像:
振幅分布和相位分布:
振幅和相位傅里叶逆变换:
振幅的傅里叶逆变换可以看出一些频率较高的如边缘的区域的轮廓。
相位逆变换后的图像可以看出图像信息的基本轮廓。
振幅的主要显示图像中不同频率的强度和分布。
相位主要显示图像频率的相对位置,包含了图像的整体结构信息。