package {
import __AS3__.vec.Vector;
import flash.display.*;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.utils.getTimer;
public class Test extends Sprite {
[Embed(source = './assets/gray.jpg')] // グレースケール画像
private var EmbedImage:Class;
private var srcBmp:Bitmap;
private var imgData:BitmapData;
private var buffData:BitmapData;
private var fftTest:FFT;
private var re:Vector.<Number>;
private var im:Vector.<Number>;
private var max:Number = 0.0;
private var data:Number = 0.0;
private var w:int = 0;
private var h:int = 0;
public function Test() {
srcBmp = new EmbedImage() as Bitmap;
imgData = srcBmp.bitmapData.clone();
w = imgData.width;
h = imgData.height;
fftTest = new FFT(w);
re = new Vector.<Number>(w*h, true);
im = re.concat();
// 画像データの直列化
for(var y:int=0; y<h; y++) {
for(var x:int=0; x<w; x++) {
re[x + y*w] = imgData.getPixel(x, y) & 0xff;
}
}
var ts:int = getTimer();
// 二次元離散フーリエ変換
fftTest.fft2d(re, im);
var te:int = getTimer();
trace("time FFT: "+(te-ts)+" ms");
// スペクトルの振幅を計算
for(var i:int=0; i<w*h; i++) {
re[i] = Math.log(Math.sqrt(re[i]*re[i] + im[i]*im[i]));
if(re[i] > max) max = re[i];
}
// 正規化
for(var i:int=0; i<w*h; i++) {
re[i] = re[i]*255/max;
}
// 振幅画像の生成
for(var y:int=0; y<h; y++) {
for(var x:int=0; x<w; x++) {
data = re[x + y*w];
if(data>255) data = 255;
if(data<0) data = 0;
var color:uint = data<<16 | data<<8 | data;
imgData.setPixel(x, y, color);
}
}
// 象限の入れ替え
buffData = new BitmapData(w, h, false);
buffData.copyPixels(imgData, new Rectangle(w/2, 0, w/2, h/2), new Point(0, h/2)); // 1 -> 3
buffData.copyPixels(imgData, new Rectangle(0, 0, w/2, h/2), new Point(w/2, h/2)); // 2 -> 4
buffData.copyPixels(imgData, new Rectangle(0, h/2, w/2, h/2), new Point(w/2, 0)); // 3 -> 1
buffData.copyPixels(imgData, new Rectangle(w/2, h/2, w/2, h/2), new Point(0, 0)); // 4 -> 2
imgData = buffData.clone();
buffData.dispose();
addChild(new Bitmap(imgData));
}
}
}