C#で画像の高速フーリエ変換

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

コメント