もう過ぎちゃいましたが 3/14 といえば Happy $\pi$ (pi) day ということで、これ。
File Exchange: Visualization of the Complex Fourier Transform
↑のフーリエ変換のアニメ化をするコードを使って描いていますが、元になる文字の座標点を用意する必要があります。
そこで、文字(ここでは $\pi$ )のエッジを抽出した方法を記録に残しておきます。
まず文字の画像を作成
text 関数で文字を表示させて画像として出力します。
h_fig = figure;
% text を figure に表示
text2plot = '\pi';
text(0.5,0.5,text2plot, ...
FontSize=200,... % 大きめの文字サイズ
HorizontalAlignment='center',...
VerticalAlignment='middle')
座標軸が邪魔なので消します。
axis off
そして画像として出力
% 画像出力
exportgraphics(h_fig,'pi_image.png');
画像からのエッジ抽出
画像を読み込んで2値化します。
% 画像読み込み
I = imread('pi_image.png');
BW = im2gray(I);
figure
imshow(BW);
エッジ抽出は edge 関数
% 二値化してエッジ検出
BW_edge = edge(BW);
imshow(BW_edge)
% 位置検出
find 関数で true (= 白) の位置を見つけることができますが、このままだと隣接したピクセルを並べて取ってくれることを保証しないので・・
[row,col] = find(BW_edge);
figure
plot(col,row)
set(gca,'YDir','reverse') % 画像データは y 軸が逆
plot するとこんな感じになります。隣り合っていないエッジの座標点が線で繋がっている様子がわかります。
エッジのトレース
エッジをなぞる順に並べるにはトレース開始位置を指定して bwtraceboundary 関数。開始位置と次のピクセル探索方向を指定しますが、探索方向は外れててもなんとかしてくれるようです。開始位置は先ほど見つけた row/col の1要素目でいきます。
% 探索初期方向 "NW" は外れてもまぁOK
R = bwtraceboundary(BW_edge,[row(1),col(1)],"NW");
プロットしてみます。
figure
R = R(:,[2,1]);% 行と列を入れ替えておく
plot(R(:,1),R(:,2))
set(gca,'YDir','reverse')
mat ファイルに保存しておくと、上で紹介したフーリエ変換のアニメ化するコードでそのまま使用できます。
File Exchange: Visualization of the Complex Fourier Transform
save('R_pi.mat','R');
Have fun!