画像の周波数表現(1)— フーリエ変換の考え方 | 第5回 | GRAPHY-Nextで学ぶ医用画像処理

これまでの連載では、医用画像を「画素値」の集まりとして空間的に捉えてきました。しかし、画像処理の世界には、同じ画像をまったく異なる視点から捉える強力な道具があります。それが「フーリエ変換」です。画像は、実はさまざまな「縞模様」(波)が足し合わされてできていると考えることができます。フーリエ変換は、この複雑な足し算を「どのような縞模様が、どれくらいの強さで画像に含まれているか」という一覧に書き換えるツールであり、この見方を変えても情報は増えも減りもしません。今回は、GRAPHY-Next v0.2.13を使って、この画像の周波数表現の世界への扉を開きます。
この回で学ぶこと
- フーリエ変換が画像を周波数成分の集合として捉える概念を、具体的な波の重ね合わせの例を通して理解できる。
- GRAPHY-Next v0.2.13のフーリエ解析機能を使って、画像のスペクトルを生成し、縞模様の細かさや方向とスペクトルの関係を視覚的に確認できる。
- 周波数フィルタリングの原理を理解し、GRAPHY-Nextを用いて低周波成分や高周波成分を画像から抽出し、その効果を医用画像に応用して説明できる。
- ナイキスト周波数とエイリアシングの概念を説明し、それがデジタル画像の品質に与える影響を理解できる。
- GRAPHY-Nextで保存したフーリエ係数をImageJで逆変換し、GRAPHY-Nextの処理結果の信頼性を検証できる。
この記事は GRAPHY-Next v0.2.13 の画面で解説しています。 GRAPHY-Next は研究用途のソフトウェアで、診断には使用できません。
動画で見る
解説
Voxel:みんな、今日も「GRAPHY-Nextで学ぶ医用画像処理」の時間だぜ!
Voxel:今回はすげー話を聞いたんだ。画像って、実はもっと別の見方ができるらしいんだよ!
Beyond先生:このチャンネルでは、GRAPHY-Nextを使って実践的な画像処理や解析を紹介していきます。面白いと思ったら、チャンネル登録・高評価、よろしくお願いします。
Beyond先生:はじめに一つお伝えします。GRAPHY-Nextは、WindowsとLinuxでの利用を推奨しています。
Beyond先生:はい、Voxelくん。今回は「フーリエ変換」という強力なツールを使って、画像をまったく異なる視点から捉える方法を学びましょう。
Voxel:フーリエ変換…なんか難しそうな名前だけど、何それ?
Beyond先生:簡単に言うと、画像は様々な「縞模様」、つまり波が足し合わされてできている、と考えることができるんです。
Voxel:画像が縞模様?まじか。
Beyond先生:ええ。フーリエ変換は、その複雑な足し算を、「どのような縞模様が、どれくらいの強さで画像に含まれているか」という一覧に書き換えるツールなんですよ。
Beyond先生:まるで、ピアノの和音を弾いたときに、私たちの耳が「ド・ミ・ソ」とそれぞれの音を聞き分けられるのに似ています。
Voxel:なるほど!複雑な音が、単純な音の波の重ね合わせでできてるってことか!
Beyond先生:その通りです。画像の場合、明るさの変化が縞模様になり、その縞模様の細かさを「空間周波数」と呼びます。
Beyond先生:空間周波数が低い縞模様は、画像のおおまかな形を表し、高い縞模様は、輪郭や細部、ノイズといった細かい構造を表します。
Voxel:ふむふむ。で、フーリエ変換すると、その縞模様の一覧が見れるってこと?
Beyond先生:はい。それが「スペクトル」と呼ばれるもので、GRAPHY-Nextでは低周波成分が中央に集まるように表示されます。
Voxel:よし、じゃあ早速GRAPHY-Nextでそのスペクトルってやつを見てみたいぜ!
Beyond先生:では、まずはフーリエ変換の教材用に自作された「phantom-fourier」というシリーズデータを使ってみましょう。これは7枚のスライスで構成されています。
Beyond先生:GRAPHY-Nextの2Dビューアで「Analysis」メニューから「Fourier Analysis…」を選んでください。
GRAPHY-Nextの「Analysis」メニューから「Fourier Analysis…」を選択
Voxel:お、出た!「フーリエ解析」ダイアログ!
Voxel:スライス1の縦縞4周期の画像だと、スペクトルの中央から左右に点が2つ現れてる!
縦縞4周期の画像をフーリエ変換すると、中央から左右に2つの点が現れる
Beyond先生:それは画像に、特定の周波数と向きの縞模様が含まれていることを示しています。
Voxel:じゃあ、この縞が細かくなるとどうなるんだろ?
Beyond先生:2Dビューアでスライスを「2」(縦縞16周期)に変更して、「Reload current image」をクリックしてみてください。
Voxel:うおお!点が中央からさらに外側に離れた!これって、縞が細かくなるほど高周波数成分が強くなるってことか!
縞が細かくなると、スペクトルの点は中央から遠ざかる
Beyond先生:その通りです。では、スライスを「3」(斜めの縞)に変更して、もう一度「Reload current image」をクリックしてみましょう。
Voxel:すげー!今度は点が斜めに並んだ!点の向きが縞の向きに対応してるんだな。
斜めの縞は、スペクトル上でも点が斜めに並ぶ
Beyond先生:そうですね。スペクトルの「Basis functions」タブに切り替えて、スペクトル上の任意の点をクリックしてみてください。
Voxel:クリック…おお!左下に、その点に対応する純粋な縞模様が表示された!まじか、スペクトルの1点が一枚の縞模様になってる!
スペクトルの1つの点は、1枚の縞模様(基底関数)に対応する
Beyond先生:「基底関数」と呼ばれる、その周波数と方向を持つ縞模様です。画像がこれらの縞模様の足し算でできていることが実感できますね。
Voxel:そ、それな!じゃあ、いろんな縞模様が混ざってたらどうなるんだ?
Beyond先生:では、スライスを「5」(縦・横・斜めの縞が合成された画像)に変更して、「Reload current image」をクリックしてみましょう。
Voxel:わー!今度は色んな方向に点がたくさん出た!画像が複雑になるほど、スペクトルも複雑になるんだな。
縦・横・斜めの縞を合成した画像のスペクトル
Beyond先生:はい。このように、フーリエ変換で画像が様々な周波数成分の集合体であることが分かれば、特定の周波数成分だけを抽出することもできるんです。これが「周波数フィルタリング」です。
Beyond先生:GRAPHY-Nextのフーリエ解析ダイアログの「Filter」タブを使います。スライス4(縦縞4+16+48周期の合成)を選んでみましょう。
Voxel:フィルタ…なるほど。どんなことができるんだ?
Beyond先生:「Circle」と「∧ keep inside」を選び、Size (radius)を「30」に設定してください。スペクトルの中央、つまり低周波数成分だけを残す「ローパスフィルタ」になります。
Voxel:わ!右側の「2D inverse DFT」の画像が変わったぞ!細かい縞模様が消えて、ゆっくりした縞だけになったぞ。
ローパスフィルタで低周波成分だけを残すと、48周期の細かい縞が消える
Beyond先生:細部が高周波数成分に含まれていることを示していますね。では次に「!∧ remove inside」を選んでみましょう。今度は高周波数成分だけを残す「ハイパスフィルタ」です。
Voxel:おお!今度は細かい縞模様だけが残って、おおまかな形が消えた!面白いなあ。
ハイパスフィルタで高周波成分だけを残すと、細かい縞模様が残る
Beyond先生:医用画像でも試してみましょう。2Dビューアでシリーズを「phantom-ct-basic」に切り替えて、スライス1を選び、「Reload current image」をクリックしてください。
Voxel:ローパスフィルタをかけると…CTファントムの輪郭がぼけて、ノイズも減った!
Voxel:逆にハイパスフィルタだと、輪郭だけが強調された画像になった!すごい!
CTファントムに周波数フィルタを適用。低周波でぼかし、高周波で輪郭抽出
Beyond先生:低い周波数が画像のおおまかな形を、高い周波数が輪郭や細部を構成していることが視覚的に理解できますね。
Beyond先生:画像を構成する波をさらに直感的に理解できるのが、「3D wave decomposition」タブです。スライス4を選び、「Row」スライダーを「128」に設定してください。
Voxel:なんだこれ!奥に何本も波形が並んでる!そして手前で足し合わせた波形が、元のプロファイルにぴったり重なってるぞ!
画像の1行の明るさを波に分解。奥の波を足すと元の形に戻る
Beyond先生:画像の特定の行の明るさのプロファイルを1次元の波として捉え、それを構成する周波数成分を3次元的に表示しているんです。
Voxel:まさに「画像は波の足し算でできている」ってことか!感動したぜ!
Beyond先生:「Components shown」のスライダーを「1」に減らしてみてください。どうなりますか?
Voxel:手前の「和」の波形が、元のプロファイルから離れちゃった!奥の波も少なくなって、ゆっくりした波だけになったぞ。
表示する成分を1つに減らすと、和は元の形から離れる
Beyond先生:表示する成分の数を減らすと、元の波形から遠ざかるのが分かりますね。スライダーを「3」に戻すと、元のプロファイルに近づくはずです。
Voxel:なるほどー!波の重ね合わせって、こんなに分かりやすいんだな!
Beyond先生:ところで、デジタル画像には表現できる空間周波数に限界があるのを知っていますか?
Voxel:限界?どういうことだ?
Beyond先生:画素が1つおきに明・暗となる、つまり2画素で1周期を構成する縞模様が、デジタル画像で表現できる最も細かい縞です。これ以上細かい縞は、正確に記録できないんです。
Beyond先生:この限界となる空間周波数を「ナイキスト周波数」と呼びます。
Voxel:ナイキスト周波数…。
Beyond先生:GRAPHY-Nextの「Graph」タブを見てみましょう。スライス6(100周期の縦縞)を選んでください。
Voxel:グラフに縦線が立ってる!これがナイキスト周波数か。僕らの使ってるデータだと1 lp/mmって書いてあるぞ。
グラフの縦線がナイキスト周波数。画素間隔0.5mmなら1 lp/mm
Voxel:スペクトルの山は0.781 lp/mmの位置にあるから、ナイキスト周波数の内側にあるんだな。
Beyond先生:では、スライスを「7」(156周期の縦縞)に変更して、「Reload current image」をクリックしてください。これはナイキスト周波数を超える縞模様です。
Voxel:え…?グラフがスライス6と全く同じ形になったぞ!?画像もスライス6と見分けがつかない!
ナイキスト周波数を超えた縞は、より粗い縞に化けて同じ画像になる(エイリアシング)
Beyond先生:これが「エイリアシング」と呼ばれる現象です。ナイキスト周波数を超える細かい縞模様は、消えるのではなく、より粗い、偽の縞模様に化けてしまうんですよ。
Voxel:まじか。これってバグじゃなくて、そういうもんなのか!デジタル画像の限界ってやつだな。
Beyond先生:はい。画像の細部を正確に捉えるためには、このナイキスト周波数の概念を理解することが非常に重要です。
Beyond先生:最後に、GRAPHY-Nextのフーリエ変換が標準的な実装に基づいていることを、ImageJで確認してみましょう。
Beyond先生:「phantom-ct-basic」のスライス1を選び、先ほどと同じローパスフィルタを適用した状態で、ダイアログ下部の「Save 32-bit TIFF:」セクションから「Re/Im stack (signed, ImageJ-invertible)」をクリックしてください。
「Re/Im stack (signed, ImageJ-invertible)」で保存すると、ImageJで逆変換できるTIFFになる
Voxel:よし、保存したぞ!
Beyond先生:ImageJで、今保存したTIFFファイルを開いてみてください。
Voxel:ImageJで開いたら、RealとImaginaryの2枚のスライスからなるスタックとして認識されたぞ。
ImageJで開くと、RealとImaginaryの2枚のスタックになっている
Beyond先生:では、ImageJのメニューバーから「Process」→「FFT」→「Inverse FFT」を選択してください。
Voxel:おお!GRAPHY-Nextの2D inverse DFTで表示された画像と全く同じになった!すげー!
ImageJのInverse FFTで、GRAPHY-Nextの逆変換と同じ画像に戻る
Voxel:GRAPHY-Nextが標準的なフーリエ変換アルゴリズムで正確な結果を出力してるってことだな。これなら安心して使えるぜ!
Beyond先生:今回は、医用画像を「空間周波数」という観点から捉えるフーリエ変換の基本と、GRAPHY-Nextを使った実践的な解析方法を学びました。
Beyond先生:画像は単なる画素の集まりではなく、様々な周波数を持つ縞模様の重ね合わせであるという視点は、医用画像の特性を深く理解する上で不可欠です。
Voxel:空間領域と周波数領域。この2つの視点を自在に行き来できるようになれば、画像からもっと色々な情報が引き出せそうだな!
Beyond先生:次回は、今回のスペクトルの読み方をさらに深掘りし、医用画像における周波数成分の重要性について、より実践的な例を交えながら解説していきますよ。
Voxel:目指すならナンバーワンだろ?次回も楽しみだぜ、先生!
Voxel:このチャンネルでは、GRAPHY-Nextを使って実践的な画像処理や解析を分かりやすく紹介しているぞ!
Voxel:今日の授業が面白かった、ためになったって人は、ぜひチャンネル登録と高評価をお願いします!またね!
操作手順のまとめ
- 2Dビューアからフーリエ解析を開く — 「phantom-fourier」シリーズを2Dビューアで開き、スライス1(縦縞4周期)を表示します。メニューバーの「Analysis」を開くと、「Histogram…」の下に「Fourier Analysis…」が並んでいます。これを選択します。
- メニューを持つのは別ウィンドウの2Dビューアです。メイン画面のプレビューにはありません。
- GRAPHY-Nextで縞模様をフーリエ変換する — 「phantom-fourier」シリーズを選択し、2Dビューアで開きます。メニューバーから「Analysis」→「Fourier Analysis…」を選択します。フーリエ解析ダイアログが表示され、
LGN phantom-fourier — slice 1 · 256×256 → 256×256と表示されていることを確認します。「2D DFT」セクションの中央にスペクトルが表示されることを確認します。- スライス1(縦縞4周期)では、中央の左右に2つの点が現れます。Max imaginary part of inverseの値が極めて小さい値(例: 7.729e-14)であることを確認してください。
- 異なる縞模様の変換を確認する — 2Dビューアでスライスを「2」に変更し、フーリエ解析ダイアログの「Reload current image」をクリックします。スライス2(縦縞16周期)のスペクトルでは、点が中央からより外側に離れることを確認します。同様にスライスを「3」に変更し、再度「Reload current image」をクリックします。スライス3(斜めの縞)のスペクトルでは、斜め方向に点が並ぶことを確認します。
- 縞が細かくなるほど、スペクトルの中央から遠い位置に成分が現れます。斜めの縞ではその向きもスペクトルに反映されます。
- 斜めの縞模様の変換を確認する — 2Dビューアでスライスを「3」(斜めの縞)に送り、「Reload current image」をクリックします。スペクトルに現れる2つの点が、中央をはさんで斜めに並ぶことを確認します。
- 点の並ぶ向きが、そのまま縞の向きを表します。縦縞なら左右、横縞なら上下、斜めの縞なら斜めに点が並びます。
- 基底関数でスペクトルの点と縞の関係を見る — 「Basis functions」タブに切り替え、スペクトル上の任意の点をクリックします。左下のパネルに、その点に対応する純粋な縞模様(基底関数)が表示されます。図では
Coordinateが30098/65536、u = 145 / v = 117、Frequency (u, v) = (17, -11)、|F| = 4.384, phase = -0.490 radと表示され、斜めの細かい縞が現れています。- 「スペクトルの1点が一枚の縞」であることを視覚的に示します。なお
|F|はその縞が元の画像にどれだけ含まれているかを表し、この座標では4.384と小さい値です。つまりこの縞は、いまの画像にはほとんど含まれていません。Weight by coefficientをオンにすると、純粋な縞ではなく、その成分が画像に実際に寄与している分が表示されます。
- 「スペクトルの1点が一枚の縞」であることを視覚的に示します。なお
- 複合縞模様の変換を確認する — さらにスライスを「5」に変更し、「Reload current image」をクリックします。縦縞・横縞・斜めの縞が合成された画像のスペクトルでは、様々な方向の点が表示されることを確認します。
- このスライス5のフィルタなし逆変換の
Max imaginary part of inverse:は約2.94e-13と、極めて小さい値を示しています。
- このスライス5のフィルタなし逆変換の
- 周波数フィルタで低周波成分を抽出する(ローパスフィルタ) — 「phantom-fourier」のスライス4を選択し、フーリエ解析ダイアログを開きます。「Filter」タブを選択し、「Circle」ラジオボタンをクリックします。「∧ keep inside」が選択されていることを確認し、
Size (radius)を「30」に設定します。Edge Gaussian σは「0」のままにしておきます。右側の「2D inverse DFT」パネルの画像が更新され、細かい縞模様が除去された、ぼけた画像になることを確認します。- フィルタ適用後の逆変換の
Max imaginary part of inverse:は約8.885e-14と、フィルタを適用しても虚部は非常に小さいままです。
- フィルタ適用後の逆変換の
- 周波数フィルタで高周波成分を抽出する(ハイパスフィルタ) — 「!∧ remove inside」ラジオボタンをクリックします。逆変換の画像が更新され、48周期の細かい縞模様だけが残ることを確認します。
- これにより、細かい縞模様のみが抽出されます。
- CTファントムで周波数フィルタの効果を見る — 2Dビューアでシリーズを「phantom-ct-basic」に切り替えます。スライス1を選択し、フーリエ解析ダイアログの「Reload current image」をクリックします。「Filter」タブで「Circle」と「∧ keep inside」が選択され、
Size (radius)が「30」、Edge Gaussian σが「0」であることを確認します。逆変換の画像が、CTファントムの輪郭がぼけてノイズが減少した画像になることを確認します。次に「!∧ remove inside」ラジオボタンをクリックします。逆変換の画像が、輪郭だけが残された画像になることを確認します。- このフィルタ適用後の逆変換の
Max imaginary part of inverse:は約5.2e-13前後となります。低い周波数が画像のおおまかな形を、高い周波数が輪郭や細部を構成していることが視覚的に理解できます。
- このフィルタ適用後の逆変換の
- 3D波形分解で波の重ね合わせを確認する — 「phantom-fourier」のスライス4を選択し、フーリエ解析ダイアログを開きます。「3D wave decomposition」タブを選択し、「Row」スライダーを「128」に設定します。中央の行のプロファイルが選択され、分解された波形が3Dビューに表示されます。右側の「Components shown」が3になっていることを確認し、テーブルにはDC成分、k=4, 16, 48の成分がそれぞれ
lp/mm、振幅、位相とともに表示されます。Line length 256 px · Nyquist 1.0000 lp/mmと表示されていることを確認してください。- DC成分は200.000、k=4が299.928、k=16が150.101、k=48が74.921の振幅で表示されます。
- 成分数を減らした際の波形分解を見る — 「Components shown」を「1」に減らします。3Dビューの手前の「和」の波形が、元のプロファイルから離れ、ゆっくりとした波だけが残ることを確認します。テーブルにはDC成分とk=4の成分だけが表示されます。その後「Components shown」を「3」に戻し、波形が元のプロファイルに近づくことを確認します。
- 表示成分が減ると、和が元の波形から離れていきます。
- ナイキスト周波数とエイリアシングを確認する — 「phantom-fourier」のスライス6を選択し、フーリエ解析ダイアログを開きます。「Graph」タブを選択します。グラフには、縦線でナイキスト周波数
Nyquist 1.00 lp/mm (0.5 cycles/px)が表示されます。スペクトルは0.781 lp/mmの位置に山が立つことを確認します。2Dビューアでスライスを「7」に変更し、フーリエ解析ダイアログの「Reload current image」をクリックします。スライス7(156周期)のグラフが、スライス6のグラフと全く同じ形になることを確認します。- フィルタなし逆変換の
Max imaginary part of inverse:は約1.137e-13と、これも非常に小さい値です。スライス7のエイリアシング現象により、スライス6と全く同じグラフが生成されます。
- フィルタなし逆変換の
- スライス7がスライス6と同じ画像になることを確かめる — 2Dビューアでスライスを「7」(156周期)に送り、「Reload current image」をクリックします。
Graphタブの山の位置が0.781 lp/mmのまま変わらず、グラフの形がスライス6と完全に一致することを確認します。Sourceに表示される画像も、スライス6と見分けがつきません。- 156周期は256 − 156 = 100周期として記録されるため、この2枚は1画素も違わない同じ画像になります。細かすぎる縞が消えるのではなく、粗い縞に化けるというエイリアシングの実例です。
- ImageJでフーリエ逆変換用のファイルを保存する — 「phantom-ct-basic」のスライス1を選択し、フーリエ解析ダイアログを開きます。「Filter」タブで「Circle」と「∧ keep inside」が選択され、
Size (radius)が「30」であることを確認します。ダイアログ下部の「Save 32-bit TIFF:」セクションで、「Re/Im stack (signed, ImageJ-invertible)」ボタンをクリックします。任意の名前(例:LGN_phantom-ct-basic_s1_complex_filtered.tif)を付けて保存します。- フィルタ適用後の結果をImageJで検証するために保存します。
- ImageJでGRAPHY-Nextのフーリエ係数を読み込む — ImageJ 1.54pを起動し、保存したTIFFファイルを開きます。ImageJでは、このファイルが
1/2 (Real); 256x256 pixels; 32-bit; 512K(2スライスからなるスタック)として認識されることを確認します。- Realのスライスはほぼ一様な灰色に見えるかもしれません。
- ImageJで逆フーリエ変換を実行する — ImageJのメニューバーから「Process」→「FFT」→「Inverse FFT」を選択します。32-bitの画像が生成され、GRAPHY-Nextの2D inverse DFTで表示された画像と全く同じになることを確認します。
- これにより、GRAPHY-Nextが標準的なフーリエ変換アルゴリズムに基づいて正確な係数を出力していることが検証できます。
用語
| 用語 | 説明 |
|---|---|
| フーリエ変換 | 複雑な波を、様々な周波数を持つ単純な正弦波の集合に分解する数学的手法。画像では、空間的な縞模様の成分を抽出する。 |
| 空間周波数 | 画像における縞模様の細かさや周期の逆数。低周波は画像のおおまかな形、高周波は細部や輪郭を表す。 |
| スペクトル | フーリエ変換によって得られる、画像に含まれる各周波数成分の強さと方向を示す情報。中央が低周波、外側が高周波。 |
| DC成分 | スペクトルの中央に位置する成分で、画像の平均的な明るさ(周波数ゼロの成分)を表す。 |
| 周波数フィルタリング | フーリエ変換によって得られたスペクトルから特定の周波数成分を除去または強調し、逆フーリエ変換で画像を再構成する処理。 |
| ナイキスト周波数 | デジタル画像で表現できる最も高い空間周波数。2画素で1周期を構成する縞に相当し、これを超える周波数は正確に記録できない。 |
| エイリアシング | ナイキスト周波数を超える細かい縞模様が、サンプリングによって本来存在しない粗い縞模様として画像に現れる現象。 |
いまはどうなっているか
現代の医用画像処理では、NumPyのようなライブラリを用いた高速フーリエ変換(FFT)が広く利用され、Python環境で高度な画像解析が行われています。また、GRAPHY-Nextは、ImageJのような伝統的なツールとの相互運用性も考慮されており、フーリエ変換の複素数係数をImageJ形式で出力できるため、既存のワークフローへの統合も容易です。これにより、GRAPHY-Nextは医用画像処理の教育・研究において、最新の技術と伝統的なツールの橋渡しをします。
まとめ
本記事では、医用画像を「空間周波数」の観点から捉えるフーリエ変換の基本を、GRAPHY-Next v0.2.13を用いて解説しました。音の和音から類推し、画像が様々な細かさの「縞模様」の集合体であること、そして周波数フィルタリングで特定成分を抽出できることを実証。ナイキスト周波数とエイリアシングの現象を理解し、ImageJでの逆変換を通じてGRAPHY-Nextの結果が標準的であることを確認しました。この周波数表現の理解は、医用画像の解析と処理において新たな視点をもたらします。
この記事で使ったデータ
フーリエ変換の教材用の格子(7 スライス)。1 縦縞 4 周期 / 2 縦縞 16 周期 / 3 斜め (8,8) / 4 縦縞 4+16+48 の合成 / 5 縦 4・横 12・斜め (20,20) の合成 / 6 縦縞 100 周期 / 7 縦縞 156 周期(ナイキスト超え。6 と同じ画像になる)。すべて cos・整数周期・平均 200(自作 — 商用利用可)
参考文献
- 二次元離散フーリエ変換(Qiita) https://qiita.com/tatsunidas/items/bd5d53b7c73a9fd99f86
- ImageJ User Guide / Process メニュー(FFT)(ImageJ) https://imagej.net/ij/docs/menus/process.html
- NumPy Discrete Fourier Transform (numpy.fft)(NumPy) https://numpy.org/doc/stable/reference/routines.fft.html
VOICEVOX:白上虎太郎/四国めたん
前の回: 第4回 / GRAPHY-Nextで学ぶ医用画像処理 の記事一覧