Advertisement
phy_bunny

Drawing Using Fourier Transform

Nov 16th, 2023
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.77 KB | None | 0 0
  1. %获取图像边缘
  2. clear
  3. impath = 'C:\Users\phy chen\Desktop\傅里叶画图\best OW.png';%输入图片地址
  4. msizex = 500; %更改图片大小
  5. msizey = 500;
  6. img = imread(impath);%读取图像
  7. grey = rgb2gray(img);
  8. resizeGrey = imresize(grey, [msizex, msizey]);%调整图像大小
  9. eg = edge(resizeGrey, 'canny');%获取图像边缘
  10. [x, y] = find(eg);%查找边缘矩阵中为零的数据并给出位置(行和列)
  11. imshow(eg);
  12.  
  13.  
  14. %将图像分解为多个连续图像,并将坐标变换为复数储存在path里面
  15. global Path G;
  16. Path = [];
  17. G = rot90(eg, 3) ;%逆时针旋转数组270°
  18. XSN = struct('path', {});%第一个为设置变量名,第二个设置为空数组
  19. % 如果某个位置为图像边缘(即为白色),
  20. % 则寻找通过dfs函数找到这一连续图像的其他边缘像素,
  21. % 将这些边缘像素坐标转化为复数储存在path,XSN有多少个path证明一个图像有多少个数据
  22. % 然后将原本的这些边缘像素归零,防止对下一图像的数据造成干扰
  23. for i = 1:msizex
  24.     for j = 1:msizey
  25.         if G(i, j) ~= 0
  26.             dfs(i, j);
  27.             % imshow(G);
  28.             % Path
  29.             XSN(end + 1).path = Path;
  30.             Path = [];
  31.         end
  32.     end
  33. end
  34.  
  35. %傅里叶变换
  36. XnSet = struct('Xn', {}, 'XnSum', {});
  37. for k = 1:length(XSN)
  38.     tmp = fft(XSN(k).path);%将坐标信息xn变换为复数频率向量Xk
  39.     A = exp(-2i * pi .* ([0:length(tmp) - 1]' * [0:length(tmp) - 1]) ./ length(tmp)) ./ length(tmp);%制作一个对称矩阵,其数据为Xk变换为xn的统一前缀Ak
  40.     for j = 1:length(A(:, 1))
  41.         A(j, :) = tmp .* A(j, :);%Ak*Xk=xn 复数频率向量Xk变换为坐标信息xn
  42.     end
  43.     XnSet(end + 1).Xn = A;
  44.     XnSet(end).XnSum = cumsum(A, 2);%对行求累计和,最后一列为坐标向量,其中第j行表示在此之前的频率向量叠加
  45. end
  46.  
  47. %画图
  48. figure
  49. for i = 1:length(XnSet)
  50.     for j=1:1:(length(XnSet(i).XnSum))/2
  51.         clf       %清空图窗
  52.         hold on   %添加新绘图时保留当前绘图
  53.         plot(XnSet(i).XnSum(j, :));                %只画频率向量叠加
  54.        
  55.         if i > 1
  56.             for k = 1:i - 1
  57.                 plot(XnSet(k).XnSum(:,end),'-r')  
  58.             end
  59.         end
  60.  
  61.         plot(XnSet(i).XnSum(1:j,end),'-r')         %画坐标向量
  62.         hold off
  63.  
  64.         xlim([0,500]);ylim([0,500])                %画框大小
  65.         pause(0.01)
  66.     end
  67. end
  68.  
  69. function [] = dfs(x, y)
  70.     global Path G;
  71.     dx = [0, 0, 1, 1, 1, -1, -1, -1];
  72.     dy = [1, -1, 0, -1, 1, 0, 1, -1];
  73.     G(x, y) = 0;
  74.     Path(end + 1) = x + y * 1i;
  75.     for i = 1:8
  76.         if G(x + dx(i), y + dy(i)) ~= 0
  77.             dfs(x + dx(i), y + dy(i));
  78.             Path(end + 1) = x + y * 1i;
  79.         end
  80.        
  81.     end
  82. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement