图像的频域变换

频域是频率信号与该频率信号的幅度的关系,频率也可以看作是图像灰度变化的幅度,如果频率越大,则其灰度变化幅度越大,与相邻灰度值差别越大。一般来说噪声点频率就较大,我们可以使用低通滤波去除噪声点,此外,图像的边缘和细节部分也是高频的,使用高频滤波可以增强图像的边缘和细节。但在进行这些操作之前,我们都需要先做一件事,那就是将图像转化为频域振幅图像,因为普通图像一般都是空间域图像,不能直接对频率进行操作。

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函数是取实数,可以不用,不过不用可能会弹出警告但不影响显示。

原图像:

振幅分布和相位分布:

振幅和相位傅里叶逆变换:

振幅的傅里叶逆变换可以看出一些频率较高的如边缘的区域的轮廓。

相位逆变换后的图像可以看出图像信息的基本轮廓。

振幅的主要显示图像中不同频率的强度和分布。

相位主要显示图像频率的相对位置,包含了图像的整体结构信息。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值