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();

結果画像

f:id:whoopsidaisies:20141130083904p:plain

FFT後の値

ComplexImageクラスのDataプロパティは2次元配列でFFT後の値が格納されている.また,BackwardFourierTransformメソッドで逆FFTを行える.