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)】

 

コメント