C#とAForge.NETを用いて、画像を高速フーリエ変換する方法(ソースコード付き)について紹介します。
高速フーリエ変換(C#)
高速フーリエ変換(Fast Fourier Transform; FFT)とは、離散フーリエ変換の計算量を減らして高速にフーリエ変換を行う手法です。
C#では、科学計算ライブラリであるAForge.NET FrameworkのComplexImageクラスを使うことで、画像のFFTや逆FFTが出来ます。
(※ComplexImageクラスに入力する画像はグレースケールで解像度が2のべき乗になする必要がある)
今回は、それを試してみました。
– | 参考文献 |
---|---|
1 | フーリエ変換の原理 |
2 | 高速フーリエ変換の原理 |
3 | C#で画像を高速フーリエ変換 AForge.NET |
ソースコード
プログラムのソースコードです。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Accord; namespace Test { class Program { static void Main(string[] args) { // 画像の取得 var img = new Bitmap(@"src.jpg"); // 画像の解像度が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); // 高速フーリエ変換 var complex = AForge.Imaging.ComplexImage.FromBitmap(gray); complex.ForwardFourierTransform(); // 保存 Bitmap img2 = complex.ToBitmap(); img2.Save(@"dst.jpg"); img2.Dispose(); } } }
実行結果
プログラムの実行結果は下記の通りです。
【出力画像(dst.jpg)】
コメント