3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

文字のエッジ座標をトレースして取り出す話

Posted at

もう過ぎちゃいましたが 3/14 といえば Happy $\pi$ (pi) day ということで、これ。

image_0.gif

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')

untitled1.png

座標軸が邪魔なので消します。

axis off

untitled2.png

そして画像として出力

% 画像出力
exportgraphics(h_fig,'pi_image.png');

画像からのエッジ抽出

画像を読み込んで2値化します。

% 画像読み込み
I = imread('pi_image.png');
BW = im2gray(I);
figure
imshow(BW);

figure_3.png

エッジ抽出は edge 関数

% 二値化してエッジ検出
BW_edge = edge(BW);
imshow(BW_edge)

figure_4.png

% 位置検出

find 関数で true (= 白) の位置を見つけることができますが、このままだと隣接したピクセルを並べて取ってくれることを保証しないので・・

[row,col] = find(BW_edge);

figure
plot(col,row)
set(gca,'YDir','reverse') % 画像データは y 軸が逆

figure_5.png

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')

figure_6.png

mat ファイルに保存しておくと、上で紹介したフーリエ変換のアニメ化するコードでそのまま使用できます。

File Exchange: Visualization of the Complex Fourier Transform

save('R_pi.mat','R');

Have fun!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?