Exemplo n.º 1
0
Arquivo: Form1.cs Projeto: kutagh/IBV
        private void applyButton_Click(object sender, EventArgs e)
        {
            if (InputImage == null) return;                                 // Get out if no input image
            if (OutputImage != null) {
                OutputImage.Dispose();                 // Reset output image
                OutputImage = null;
            }
            Color[,] image = new Color[InputImage.Size.Width, InputImage.Size.Height]; // Create array to speed-up operations (Bitmap functions are very slow)

            // Setup progress bar
            progressBar.Visible = true;
            progressBar.Minimum = 1;
            progressBar.Maximum = 100;
            progressBar.Value = 33;
            progressBar.Step = 1;

            // Copy input Bitmap to array
            for (int x = 0; x < InputImage.Size.Width; x++) {
                for (int y = 0; y < InputImage.Size.Height; y++) {
                    image[x, y] = InputImage.GetPixel(x, y);                // Set pixel color in array at (x,y)
                }
            }

            //==========================================================================================
            // Start of own code
            //==========================================================================================
            goto Test;
            goto GreenScale;
            goto NegativeThreshold;

            Test:
            var red = image.ColorThresholdFunc(ThresholdValue, 0, c => c.R > 100 && c.G < 50 && c.B < 50);
            var blue = image.ColorThresholdFunc(ThresholdValue, 0, c => c.B > 100 && c.G < 125 && c.R < 50);
            var redblue = Operators.Op(red, blue, (a, b) => a + b);

            redblue = redblue.Dilate(Kernels.DiamondElement5x5);
            redblue = redblue.Erode (Kernels.DiamondElement5x5);
            redblue = redblue.CountObjects();

            var boundz = redblue.BoundingBox();
            var tmp = redblue.ArrayToBitmap();
            using ( Graphics g=Graphics.FromImage( tmp))
                foreach (Color key in boundz.Keys) {
                    g.DrawRectangle(new Pen(Color.Red), boundz[key]);
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                }
            image = tmp.BitmapToArray();
            goto End;
            RedThreshold:
            image = image.ColorThresholdFunc(ThresholdValue, 0, c => c.R > 100 && c.G < 50 && c.B < 50);
            goto End;

            BlueThreshold:
            image = image.ColorThresholdFunc(ThresholdValue, 0, c => c.B > 100 && c.G < 125 && c.R < 50);
            goto End;

            XDerivate:
            image = image.ApplyKernel(Kernels.XDerivateKernel, Functors.KernelSampleToValue.Sum, Functors.DoubleToDouble.Multiply);

            GreenScale:
            image = image.Transform(Functors.ColorToColor.ToGrayScaleGreen);
            goto NegativeThreshold;

            Grayscale:
            // Gray scale
            image = image.Transform(Functors.ColorToColor.ToGrayScale);
            //goto NegativeThreshold;
            goto End;
            goto Dilate;

            NegativeThreshold:
            // Negative threshold
            image = image.Threshold(3, 1, 0);
            //image = image.Threshold(200, 0, 1);
            goto Labelling;
            goto End;
            goto Erode;

            Labelling:
            image = image.CountObjects();

            Dictionary<Color, Tuple<double, double>> centroids = image.Centroids();
            Dictionary<Color, int> area = image.Areas();
            Dictionary<Color, int> momOrder = image.MomentOfOrder(0, 0);
            goto ShowBounds;
            goto End;

            ShowBounds:
            Dictionary<Color, Rectangle> bounds = image.BoundingBox();
            Dictionary<Color, double> rectularties = image.ObjectRectangularity();
            var circularity = image.Circularity();
            Bitmap img = image.ArrayToBitmap();
            // paint
            using ( Graphics g=Graphics.FromImage(img) )
                foreach ( Color key in bounds.Keys ) {
                    g.DrawRectangle(new Pen(Color.Red), bounds[key]);
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    g.DrawString(String.Format("c: {0}", Math.Round(circularity[key], 2).ToString()), new Font("Thaoma", 16), Brushes.Green, bounds[key]);

                }

            /* Circularity range
            Circle:     0.86 - 1.00
            Driehoek:   0.78 - 0.85
            Rectangle:  0.50 - 0.70
            Octagon:    0.95 - 1.00
            Diamond:    0.40 - 0.50

            // Rectangularity range
            Circle:     0.75 - 0.85
            Driehoek:   0.55 - 0.65
            Rectangle:  0.95 - 1.05
            Octagon:    0.70 - 0.80
            Diamond:    0.55 - 0.60
            */

            // convert back
            image = img.BitmapToArray();

            goto End;

            Dilate:
            image = image.Dilate(Kernels.CrossElement3x3);
            goto End;

            Erode:
            image = image.Erode(Kernels.CrossElement3x3);
            goto Dilate;

            End:
            //==========================================================================================
            // End of own code
            //==========================================================================================
            progressBar.Value = 66;
            // Copy array to output Bitmap
            OutputImage = new Bitmap(InputImage.Size.Width, InputImage.Size.Height); // Create new output image
            for (int x = 0; x < InputImage.Size.Width; x++) {
                for (int y = 0; y < InputImage.Size.Height; y++) {
                    OutputImage.SetPixel(x, y, image[x, y]);               // Set the pixel color at coordinate (x,y)
                }
            }
            progressBar.Value = 100;
            pictureBox2.Image = OutputImage;                         // Display output image
            progressBar.Visible = false;                                    // Hide progress bar
        }