Otsu 3 : Amoeba
forked from Otsu Psychedelic (diff: 13)
( ..or ' how life emerged from a bug ' )
ActionScript3 source code
/**
* Copyright FLASHMAFIA ( http://wonderfl.net/user/FLASHMAFIA )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/9Bm4
*/
package//
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.filters.ColorMatrixFilter;
import flash.filters.ConvolutionFilter;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.media.Camera;
import flash.media.Video;
public class OtsuPsychoThresholding3 extends Sprite//
{
private var cam : Camera;
private var dst : BitmapData;
private var ofscr : BitmapData;
private var schmoof : BlurFilter = new BlurFilter(64, 64, 1);
private var edge3 : ConvolutionFilter = new ConvolutionFilter(3, 3, [0, 1, 0, 1, -4, 1, 0, 1, 0]);
private var graysc : ColorMatrixFilter = new ColorMatrixFilter([0.3, 0.59, 0.11, 0, 0, 0.3, 0.59, 0.11, 0, 0, 0.3, 0.59, 0.11, 0, 0, 0, 0, 0, 1, 0]);
private var sums : Vector.<Number> = new Vector.<Number>(256, true);
private var hmul : Vector.<Number> = new Vector.<Number>(256, true);
private var fcnt : int;
function OtsuPsychoThresholding3()//
{
stage.scaleMode = 'noScale';
stage.align = 'TL';
stage.quality = 'low';
stage.frameRate = 8;
stage.stageFocusRect = mouseEnabled = mouseChildren = tabEnabled = tabChildren = false;
opaqueBackground = 0x0;
addChild(new Bitmap(new BitmapData(465, 465, false, 0x0)));
cam = Camera.getCamera();
cam.setMode(512, 384, stage.frameRate);
var vid : Video = new Video(512, 384);
vid.attachCamera(cam);
var bm : Bitmap = new Bitmap(dst = new BitmapData(512, 384, false));
bm.opaqueBackground = 0x0;
bm.x = (465 - 512) >> 1;
bm.y = (465 - 384) >> 1;
addChild(bm);
ofscr = dst.clone();
stage.addEventListener(Event.ENTER_FRAME, oef);
}
private function oef(e : Event) : void//
{
fcnt++;
var rect : Rectangle = dst.rect;
var dstp : Point = rect.topLeft;
dst.lock();
cam.drawToBitmapData(dst);
dst.applyFilter(dst, rect, dstp, graysc);
dst.applyFilter(dst, rect, dstp, schmoof);
// \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ OTSU
var threshold : uint = 0;
var histo0 : Vector.<Number> = dst.histogram() [0];
var npix : int = dst.width * dst.height;
var wb : Number = 0.0;
var sum : Number = 0.0;
var i : uint = 256;
while (i--)//
{
var d : Number = i * histo0 [i];
hmul[i] = d;
sum += d;
sums[i] = sum;
}
d = 0.0;
sum = 0.0;
i = 256;
while (i--)//
{
wb += histo0[i];
if (wb == 0.0) continue;
var wf : Number = npix - wb;
if (wf == 0.0) break;
sum += hmul[i];
var mean : Number = (sum / wb) - ((sums[i] - sum) / wf);
var v : Number = wb * wf * mean * mean;
if (v > d)//
{
d = v;
threshold = i;
}
}
ofscr.copyPixels(dst, rect, dstp);
dst.fillRect(rect, 0xFF000000);
dst.threshold(ofscr, rect, dstp, '>', threshold, 0xFFFFFFFF, 0x000000FF, false);
dst.applyFilter(dst, rect, dstp, edge3);
dst.unlock();
}
}
}