public void Merge_OverlappingBlobs_OneBlobWithBothBlobs() { // 0 1 // 1 0 var b1 = new Blob(); b1.BoundingBox = new Rectangle(1, 1, 2, 2); b1.Area = 2; b1.Mask = new byte[] { 96 }; // 1 0 // 0 1 var b2 = new Blob(); b2.BoundingBox = new Rectangle(2, 2, 2, 2); b2.Area = 2; b2.Mask = new byte[] { 144 }; var merger = new BlobMerger(); var result = merger.Merge(b1, b2); // 0 1 0 // 1 1 0 // 0 0 1 Assert.AreEqual(4, result.Area); Assert.AreEqual(new Rectangle(1, 1, 3, 3), result.BoundingBox); Assert.AreEqual(88, result.Mask[0]); Assert.AreEqual(128, result.Mask[1]); }
public Blob Merge(Blob a, Blob b) { var result = new Blob(); result.BoundingBox = Rectangle.Union(a.BoundingBox, b.BoundingBox); result.Mask = CreateMergedMask(a, b); result.Area = BitManipulator.CountSetBits(result.Mask); return result; }
public byte[] CreateMergedMask(Blob a, Blob b) { var resultRect = Rectangle.Union(a.BoundingBox, b.BoundingBox); var result = new byte[(int)Math.Ceiling((resultRect.Width * resultRect.Height) / 8.0)]; AddToMask(result, resultRect, a.Mask, a.BoundingBox); AddToMask(result, resultRect, b.Mask, b.BoundingBox); return result; }
public Image Convert(Blob blob) { Bitmap img = new Bitmap(blob.BoundingBox.Width, blob.BoundingBox.Height, PixelFormat.Format24bppRgb); int width = blob.BoundingBox.Width; int height = blob.BoundingBox.Height; for (int y = 0; y < height; y++) for (int x = 0; x < width; x++) img.SetPixel(x, y, (BitManipulator.ToInt32(blob.Mask, y * width + x) == 0) ? Color.White : Color.Black); return img; }
private Blob Merge(Blob a, Blob b) { Trace.WriteLineIf(IsVerbose, string.Format("BlobDistanceMerge: Sammanslagning av {0} och {1}.", a.BoundingBox, b.BoundingBox)); return Merger.Merge(a, b); }