예제 #1
0
        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]);
        }
예제 #2
0
 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;
 }
예제 #3
0
        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;
        }
예제 #4
0
        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;
        }
예제 #5
0
 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);
 }