2次元フーリエ変換と周波数フィルタをTypeScriptで実装する【画像処理100本ノック】
約 2 分
目次
概要
Q.32〜35では、2次元離散フーリエ変換で画像を周波数成分へ分解し、周波数領域で ローパス、ハイパス、バンドパスフィルタを適用します。
2次元DFTと逆DFT(Q.32)
各周波数(u, v)に対して全画素(x, y)を走査し、実部と虚部を求めます。
const angle = -2 * Math.PI * (x * u / width + y * v / height);
real += value * Math.cos(angle);
imag += value * Math.sin(angle);
逆変換では角度の符号を反転し、画素数で割って空間画像へ戻します。この実装は仕組みを 追いやすい一方で計算量が大きく、画像サイズによっては完了まで時間がかかります。
周波数領域の読み方
低周波成分は画像全体の緩やかな明るさの変化、高周波成分は輪郭や細かな模様に対応します。 実装ではスペクトルをシフトし、低周波が画像中央へ来るようにしてから円形のマスクを作ります。
周波数フィルタ
| 問題 | 残す成分 | 出力の特徴 |
|---|---|---|
| Q.33 ローパス | 中心付近の低周波 | 細部やノイズが減り、ぼける |
| Q.34 ハイパス | 中心から遠い高周波 | 輪郭や細かな模様が残る |
| Q.35 バンドパス | 指定した半径の帯域 | 特定スケールの模様を抽出する |
フィルタ処理そのものは、通過させない周波数の実部と虚部を0にする処理です。その後に逆DFTを 行うと、周波数マスクの効果を空間画像として確認できます。
空間フィルタとの関係
ガウシアンフィルタによるぼかしは、周波数領域では高周波を弱める処理と考えられます。 Sobelなどのエッジ検出は高周波を強調します。空間領域と周波数領域の結果を比較すると、 別々に見えるフィルタが同じ性質を扱っていることが分かります。
おすすめの記事
最新の記事
よく読まれている記事
タグから探す
- javascript129
- typescript66
- node.js54
- linux54
- 画像処理48
- amazon-aws47
- アルゴリズム37
- canvas35
- html529
- 画像処理100本ノック27
- php24
- centos24
- python22
- 競技プログラミング21
- mac21
- mysql20
- opencv17
- 雑談16
- 機械学習16
- docker16
- wordpress15
- atcoder14
- apache12
- データベース12
- amazon-s312
- red-hat12
- prisma12
- ubuntu11
- github10
- git10
- react10
- mariadb10
- vue.js9
- aws-cdk9
- css38
- 可視化8
- 小ネタ8
- next.js8
- nestjs8
- amazon-lightsail7
- ブログ6
- cms6
- oracle6
- perl6
- gitlab6
- iam5
- amazon-ec25
- 資格試験5
- aws-amplify5
- curl4