当前位置:   article > 正文

数字图像处理Malab/C++(三)傅里叶变换及频谱图、频域滤波_图像处理fft

图像处理fft

一、Matlab

1、选择任意灰度图像。计算和显示原始图像的频谱振幅和任意因子缩放的同一图像的频谱振幅。

  1. % 1、选择任意灰度图像。计算和显示原始图像的频谱振幅和任意因子缩放的同一图像的频谱振幅。
  2. % 两者之间有什么区别吗,结合课本知识解释这一现象(要求同一窗口显示)?
  3. I = imread('../../std_imgs/lena_gray_256.tif'); %读取灰度图片
  4. I_resize = imresize(I,1/2); %1/2缩放
  5. F = fft2(im2double(I)); F_resize = fft2(im2double(I_resize)); %快速傅里叶变换FFT
  6. F = fftshift(F); F_resize = fftshift(F_resize); %FFT频谱平移
  7. F = abs(F); F_resize = abs(F_resize); %计算幅度谱,
  8. T = log(F+1); T_resize = log(F_resize+1); %频谱对数变换
  9. figure;
  10. subplot(2,2,1),imshow(I);title('原灰度图像');
  11. subplot(2,2,2),imshow(T,[]);title('频谱振幅');
  12. subplot(2,2,3),imshow(I_resize);title('1/2缩放灰度图像');
  13. subplot(2,2,4),imshow(T_resize,[]);title('1/2缩放频谱振幅');

2、选择任意灰度图像。计算和显示原始图像的频谱振幅和任意角度旋转的同一图像的频谱振幅。

  1. % 2、选择任意灰度图像。计算和显示原始图像的频谱振幅和任意角度旋转的同一图像的频谱振幅。
  2. % 两者之间有什么区别,结合课本知识解释这一现象(要求同一窗口显示)?
  3. I = imread('../../std_imgs/lena_gray_256.tif'); %读取灰度图片
  4. I_rotate = imrotate(I, 45);
  5. F = fft2(im2double(I)); F_rotate = fft2(im2double(I_rotate)); %快速傅里叶变换FFT
  6. F = fftshift(F); F_rotate = fftshift(F_rotate); %FFT频谱平移
  7. F = abs(F); F_rotate = abs(F_rotate); %计算幅度谱,
  8. T = log(F+1); T_rotate = log(F_rotate+1); %频谱对数变换
  9. figure;
  10. subplot(2,2,1),imshow(I);title('原灰度图像');
  11. subplot(2,2,2),imshow(T,[]);title('频谱振幅');
  12. subplot(2,2,3),imshow(I_rotate);title('逆时针旋转45度灰度图像');
  13. subplot(2,2,4),imshow(T_rotate,[]);title('逆时针旋转45度频谱振幅');

3、 使用标准Lena灰度图片,添加高斯噪声imnoise(I,‘gaussian’, 0.05) 。请用合适的频域滤波器对图像进行质量提升,获得你认为最好的效果图并计算其峰值信噪比PSNR。(注:PSNR值越高,本题得分越高)

  1. % 3、 使用标准Lena灰度图片,添加高斯噪声imnoise(I,‘gaussian’, 0.05) 。
  2. % 请用合适的频域滤波器对图像进行质量提升,获得你认为最好的效果图并计算其峰值信噪比PSNR。(注:PSNR值越高,本题得分越高)
  3. I = imread('../../std_imgs/lena_gray_256.tif'); %读取标准Lena灰度图片
  4. I_gaussian_noise = imnoise(I,'gaussian', 0.05); %添加高斯噪声
  5. [f_gaussian_noise,revertclass] = tofloat(I_gaussian_noise);
  6. H1 = lpfilter('ideal',256,256,0.18*256); %频域理想低通滤波器
  7. H2 = lpfilter('butterworth',256,256,0.18*256); %频域巴特沃斯低通滤波器
  8. H3 = lpfilter('gaussian',256,256,0.18*256); %频域高斯低通滤波器
  9. %在频域滤波,傅里叶反变换回图象空间
  10. g1 = dftfilt(f_gaussian_noise,H1);
  11. g1 = revertclass(g1);
  12. g2 = dftfilt(f_gaussian_noise,H2);
  13. g2 = revertclass(g2);
  14. g3 = dftfilt(f_gaussian_noise,H3);
  15. g3 = revertclass(g3);
  16. %计算其峰值信噪比PSNR
  17. peaksnr = psnr(I_gaussian_noise,I);
  18. peaksnr1 = psnr(g1,I);peaksnr2 = psnr(g2,I);peaksnr3 = psnr(g3,I);
  19. fprintf('\n The Peak-SNR value is %0.4f', peaksnr);
  20. fprintf('\n The Peak-SNR1 value is %0.4f', peaksnr1);
  21. fprintf('\n The Peak-SNR2 value is %0.4f', peaksnr2);
  22. fprintf('\n The Peak-SNR3 value is %0.4f', peaksnr3);
  23. figure;
  24. subplot(2,3,1),imshow(I);title('标准Lena灰度图片');
  25. subplot(2,3,2),imshow(I_gaussian_noise,[]);title('添加高斯噪声');
  26. subplot(2,3,3),imshow(g1,[]);title('频域理想低通滤波器');
  27. subplot(2,3,4),imshow(g2,[]);title('频域巴特沃斯低通滤波器');
  28. subplot(2,3,5),imshow(g3,[]);title('频域高斯低通滤波器');

4、对标准Lena灰度图片分别使用5x5的高斯核进行空域滤波,结果记为A。实现其对应的频域滤波,结果记为B。分别计算A、B图像的PSNR

  1. % 4、对标准Lena灰度图片分别使用5x5的高斯核进行空域滤波,结果记为A。
  2. % 实现其对应的频域滤波,结果记为B。分别计算A、B图像的PSNR,结合课本知识给出你的结论。
  3. I = imread('../../std_imgs/lena_gray_256.tif'); %读取标准Lena灰度图片
  4. %使用5x5的高斯核进行空域滤波
  5. h1 = fspecial('gaussian',[5 5],0.5);
  6. h2 = fspecial('gaussian',[5 5],1);
  7. h3 = fspecial('gaussian',[5 5],2);
  8. A1 = imfilter(I,h1,'replicate');
  9. A2 = imfilter(I,h2,'replicate');
  10. A3 = imfilter(I,h3,'replicate');
  11. %频域高斯低通滤波
  12. [f,revertclass] = tofloat(I);
  13. H1 = lpfilter('gaussian',256,256,0.15*256);
  14. H2 = lpfilter('gaussian',256,256,0.18*256);
  15. H3 = lpfilter('gaussian',256,256,0.23*256);
  16. g1 = dftfilt(f,H1);
  17. B1 = revertclass(g1);
  18. g2 = dftfilt(f,H2);
  19. B2 = revertclass(g2);
  20. g3 = dftfilt(f,H3);
  21. B3 = revertclass(g3);
  22. %计算其峰值信噪比PSNR
  23. peaksnrA1 = psnr(A1,I);peaksnrA2 = psnr(A2,I);peaksnrA3 = psnr(A3,I);
  24. peaksnrB1 = psnr(B1,I);peaksnrB2 = psnr(B2,I);peaksnrB3 = psnr(B3,I);
  25. fprintf('\n The Peak-SNRA value is %0.4f %0.4f %0.4f', peaksnrA1,peaksnrA2,peaksnrA3);
  26. fprintf('\n The Peak-SNRB value is %0.4f %0.4f %0.4f', peaksnrB1,peaksnrB2,peaksnrB3);
  27. figure;
  28. subplot(1,3,1),imshow(I);title('标准Lena灰度图片');
  29. subplot(1,3,2),imshow(A2,[]);title('5x5的高斯核空域滤波');
  30. subplot(1,3,3),imshow(B2,[]);title('频域高斯低通滤波');

 

二、C++

  1. //1、选择任意灰度图像。计算和显示原始图像的频谱振幅和任意因子缩放的同一图像的频谱振幅。两者之间有什么区别吗,结合课本知识解释这一现象(要求同一窗口显示)?
  2. //2、选择任意灰度图像。计算和显示原始图像的频谱振幅和任意角度旋转的同一图像的频谱振幅。两者之间有什么区别,结合课本知识解释这一现象(要求同一窗口显示)?
  3. //3、 使用标准Lena灰度图片,添加高斯噪声imnoise(I, ‘gaussian’, 0.05) 。请用合适的频域滤波器对图像进行质量提升,获得你认为最好的效果图并计算其峰值信噪比PSNR。(注:PSNR值越高,本题得分越高)
  4. //4、对标准Lena灰度图片分别使用5x5的高斯核进行空域滤波,结果记为A。实现其对应的频域滤波,结果记为B。分别计算A、B图像的PSNR,结合课本知识给出你的结论。
  5. #include<opencv2/opencv.hpp>
  6. #include<iostream>
  7. using namespace cv;
  8. using namespace std;
  9. //定义傅里叶变换函数。input_image:输入图像;output_image:傅里叶频谱图;transform_array:傅里叶变换矩阵(复数)
  10. void My_DFT(Mat input_image, Mat& output_image, Mat& transform_array);
  11. int main()
  12. {
  13. Mat ori_gray_image, out_gray_image1, out_gray_image2, out_gray_image3, out_gray_image4;
  14. ori_gray_image = imread("..\\..\\std_imgs\\lena_gray_256.tif", IMREAD_GRAYSCALE);
  15. //检测图像是否加载成功
  16. if (ori_gray_image.empty())
  17. {
  18. cout << "Could not open or find the image" << endl;
  19. return -1;
  20. }
  21. //显示原图像
  22. imshow("ori_gray_image", ori_gray_image);
  23. //傅里叶变换,image_output为可显示的频谱图,image_transform为傅里叶变换的复数结果
  24. Mat ori_gray_spec, ori_gray_reansform;
  25. My_DFT(ori_gray_image, ori_gray_spec, ori_gray_reansform);
  26. imshow("ori_gray_spec", ori_gray_spec);
  27. //1/8缩放
  28. resize(ori_gray_image, out_gray_image1, Size(), 1.0 / 8, 1.0 / 8);
  29. imshow("out_gray_image1", out_gray_image1);
  30. //旋转
  31. Point2f center(0.5 * ori_gray_image.rows, 0.5 * ori_gray_image.cols);
  32. Mat M = getRotationMatrix2D(center,45.0,0.707); //计算二维旋转的仿射矩阵
  33. warpAffine(ori_gray_image, out_gray_image2, M, Size()); //对图像应用仿射变换。
  34. imshow("out_gray_image2", out_gray_image2);
  35. waitKey(0);
  36. return 0;
  37. }
  38. //傅里叶变换得到频谱图和复数域结果
  39. void My_DFT(Mat input_image, Mat& output_image, Mat& transform_image)
  40. {
  41. //1.扩展图像矩阵,为235的倍数时运算速度快
  42. int m = getOptimalDFTSize(input_image.rows);
  43. int n = getOptimalDFTSize(input_image.cols);
  44. copyMakeBorder(input_image, input_image, 0, m - input_image.rows, 0, n - input_image.cols, BORDER_CONSTANT, Scalar::all(0));
  45. //2.创建一个双通道矩阵planes,用来储存复数的实部与虚部
  46. Mat planes[] = { Mat_<float>(input_image), Mat::zeros(input_image.size(), CV_32F) };
  47. //3.从多个单通道数组中创建一个多通道数组:transform_image。函数Merge将几个数组合并为一个多通道阵列,即输出数组的每个元素将是输入数组元素的级联
  48. merge(planes, 2, transform_image);
  49. //4.进行傅立叶变换
  50. dft(transform_image, transform_image);
  51. //5.计算复数的幅值,保存在output_image(频谱图)
  52. split(transform_image, planes); // 将双通道分为两个单通道,一个表示实部,一个表示虚部
  53. magnitude(planes[0], planes[1], output_image); //计算复数的幅值,保存在output_image(频谱图)
  54. //6.前面得到的频谱图数级过大,不好显示,因此转换
  55. output_image += Scalar(1); // 取对数前将所有的像素都加1,防止log0
  56. log(output_image, output_image); // 取对数
  57. normalize(output_image, output_image, 0, 1, NORM_MINMAX); //归一化
  58. //7.剪切和重分布幅度图像限
  59. output_image = output_image(Rect(0, 0, output_image.cols & -2, output_image.rows & -2));
  60. // 重新排列傅里叶图像中的象限,使原点位于图像中心
  61. int cx = output_image.cols / 2;
  62. int cy = output_image.rows / 2;
  63. Mat q0(output_image, Rect(0, 0, cx, cy)); // 左上区域
  64. Mat q1(output_image, Rect(cx, 0, cx, cy)); // 右上区域
  65. Mat q2(output_image, Rect(0, cy, cx, cy)); // 左下区域
  66. Mat q3(output_image, Rect(cx, cy, cx, cy)); // 右下区域
  67. //交换象限中心化
  68. Mat tmp;
  69. q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3);//左上与右下进行交换
  70. q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2);//右上与左下进行交换
  71. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/72532
推荐阅读
相关标签
  

闽ICP备14008679号