package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.utils.ByteArray; public class LabelMap { private var imageData:BitmapData; //was imageData private var labelMap:Array=new Array; //same size as image, 0=background, other=label, adress as labelMap[y][x] private var inBytes:ByteArray; //note bytes organised A,R,G,B; A,R,G,B etc. //arrays to store Bounding Box info (e.g. bbl[4]= left side of bounding box for region 4) public static const MAXLABELS:int=10000; public var bbl:Array=new Array; public var bbr:Array=new Array; public var bbt:Array=new Array; public var bbb:Array=new Array; public var labelUsed:Array=new Array; public function LabelMap() { } public function loadBitmap(bm:Bitmap):void{ imageData=bm.bitmapData; inBytes = imageData.getPixels(imageData.rect); } public function performLabeling():void{ //breaks image up into regions, labels them and caculated the bounding boxes var w:int=imageData.width; var w4:int=w*4; var h:int=imageData.height; var i:int=0; var i4:int=0; var nPix:int=h*w; for (i=0; i150 && green>200 && blue>150) labelMap[y][x]=0; //have background else { //have found a sticky so check for previous labels if (labelMap[y][x-1]>0) labelMap[y][x]=labelMap[y][x-1]; //check middle left else if (labelMap[y-1][x-1]>0) labelMap[y][x]=labelMap[y-1][x-1]; //check top left else if (labelMap[y-1][x]>0) labelMap[y][x]=labelMap[y-1][x]; //check top middle else if (labelMap[y-1][x+1]>0) labelMap[y][x]=labelMap[y-1][x+1]; //check top right else {currentLabel++; labelMap[y][x]=currentLabel; } //new component } } i+=2; i4=4*i; //make i4 index skip last and first pixel of each line } //Printout labelMap //if(debugPrint) for (y=0; y=1; y--){ for (x=w-2; x>=1; x--){ if(labelMap[y][x]>0) { //have found a sticky so sheck for multiple labels and adjust if necessary if (labelMap[y+1][x]!=0) labelMap[y][x]= labelMap[y+1][x]; //bottom middle else if (labelMap[y+1][x+1]!=0) labelMap[y][x]= labelMap[y+1][x+1]; //bottom rt else if (labelMap[y+1][x-1]!=0) labelMap[y][x]= labelMap[y+1][x-1]; //bottom left else if (labelMap[y][x+1]!=0) labelMap[y][x]= labelMap[y][x+1]; //middle right var l:int=labelMap[y][x]; //if (l>=MAXLABELS) Alert.show("MAXLABELS of: "+MAXLABELS+" exceeded", "ERROR"); //Record region bounding box extremities //if(y*w+x!=i) Alert.show("index decrement wrong", "Error"); if (xbbr[l]) bbr[l]=x; if (ybbb[l]) bbb[l]=y; labelUsed[l]=true; } } } } public function printMap():String{ var message:String, x:int, y:int; var w:int=imageData.width; var h:int=imageData.height; for (var i:int=1; i