C#で画像をWavelet変換 Accord.NET

C#で画像のWavelet変換を行う.コンピュータビジョン等の.NET向けのオープンソースのライブラリであるAccord.NET Frameworkを使う.

Accord.NETのインストール

NuGet経由でインストール可能.プロジェクトを右クリックして「NuGetパッケージの管理」を選択する.オンラインから「Accord.Imaging」を検索・インストール.

WaveletTransformクラス

Accord.NETのWaveletTransformクラスによってWavelet変換を行える.入力画像はグレースケールで,解像度が2のべき乗でないといけない.

ソースコード

WaveletTransformクラスの初期化時にWavelet母関数を指定する.その引数でWavelet変換のレベルを指定できる.ここではHaar関数でレベル2とした.

// 入力画像
var img = new Bitmap(@"Penguins.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);
// Wavelet変換クラスの作成
//  Harrクラスの初期化時にレベルを指定出来る
var wavelet = new Accord.Imaging.Filters.WaveletTransform(new Accord.Math.Wavelets.Haar(2));
// Wavelet変換
var imgWavelet = wavelet.Apply(gray);
pictureBox1.Image = imgWavelet;

結果

f:id:whoopsidaisies:20141130095415p:plain

逆変換

WaveletTransformクラスのBackwordプロパティをtrueにしてApplyメソッドを実行すると逆変換が出来る.

wavelet.Backward = true;
var gyaku = wavelet.Apply(imgWavelet);