C#で画像を高速フーリエ変換 AForge.NET
C#で画像の高速フーリエ変換(FFT)を行う.コンピュータビジョン等のライブラリであるAForge.NET Frameworkを使う.
AForge.NETのインストール
Nuget経由でインストール可能.プロジェクトを右クリックして「NuGetパッケージの管理」を選択する.オンラインから「AForge」で検索.「AForge.Imaging」を選択してインストール.
ComplexImageクラス
AForge.NETのComplexImageクラスを使うと画像のFFTおよび逆FFTが出来る.入力する画像はグレースケールで解像度が2のべき乗になっている必要がある.
ソースコード
画像のグレースケール化はGrayscaleクラスを使った.
// 入力画像 var img = new Bitmap(@"Lighthouse.jpg"); pictureBox1.Image = img; // 画像の解像度が2のべき乗になるように調整 var bitWidth = Convert.ToString(img.Width - 1, 2).Length; var bitHeight = Convert.ToString(img.Height - 1, 2).Length; var width = (int)Math.Pow(2, bitWidth); var height = (int)Math.Pow(2, bitHeight); // 隙間の部分はゼロ埋め var imgPadded = new Bitmap(width, height, img.PixelFormat); var graphics = Graphics.FromImage(imgPadded); graphics.DrawImage(img, 0, 0); graphics.Dispose(); // グレースケール化 var gray = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721).Apply(imgPadded); pictureBox2.Image = gray; // FFT var complexImage = AForge.Imaging.ComplexImage.FromBitmap(gray); complexImage.ForwardFourierTransform(); pictureBox3.Image = complexImage.ToBitmap();
結果画像
FFT後の値
ComplexImageクラスのDataプロパティは2次元配列でFFT後の値が格納されている.また,BackwardFourierTransformメソッドで逆FFTを行える.