package { /** * @author nicoptere */ import flash.display.*; public class Thinning { public static var W : int; public static var H : int; public static var L : int; public static var str : String = ''; public static var output : String = ''; public function Thinning () { } static public function thin ( b : BitmapData, kernel : Array ) : BitmapData { var i : int; var j : int; var it : int; var result : Array = new Array( ); W = b.width; H = b.height; L = W * H; if( str == '' ) { b.lock( ); for( i = 0; i < H ; ++i ) { for( j = 0; j < W ; ++j ) { if( b.getPixel( j, i ) == 0xFFFFFF ) { str += '1'; }else { str += '0'; } } } b.unlock( ); } result = HitMiss( kernel ); it = result.length; while(it--) { i = result[it]; str = str.substr( 0, i ) + '0' + str.substr( i + 1, str.length ); } output = str; return b; } static function fromString ( x : int, y : int ) : int { var i : int = int( str.charAt( ( y * W ) + x % W ) ); return i; } static function HitMiss ( kernel : Array ) : Array { var output : Array = new Array( ); var i : int; var X : int; var Y : int; for( i = 0; i < L ; i++ ) { if( str.charAt( i ) == '1') { X = i % W; Y = int( i / W ); if( kernelMatch( X, Y, kernel ) ) { output.push( ( Y * W ) + X % W ); } } } return output; } static function kernelMatch ( x : int, y : int, kernel : Array ) : Boolean { var matched : int = 0; var X : int; var Y : int; var ID : int; //table index for( var i : int = -1; i < 2 ; ++i ) { for( var j : int = -1; j < 2 ; ++j ) { X = x + i; Y = y + j; if( X >= 0 && X < W && Y >= 0 && Y < H ) { ID = fromString( X, Y ); if( ( kernel[ ( ( j + 1 ) * 3 ) + ( i + 1 ) ] == 2 ) || ( ( ID == 1 ) && ( kernel[ ((j + 1) * 3) + (i + 1) ] == 1 ) || ( ID == 0 ) && kernel[ ((j + 1) * 3) + (i + 1) ] == 0 ) ) { ++matched; } } } } if( matched == 9 ) { return true; } return false; } } }