Пример #1
0
        private void FindPointButton_Click(object sender, EventArgs e)
        {
            MinValueHarris = Convert.ToDouble(txb_minValue.Text);
            WindowSize     = Convert.ToInt32(txb_WindowSize.Text);
            int maxPoints;
            int gridSize  = Convert.ToInt32(txb_gridSize.Text);
            int cellSize  = Convert.ToInt32(txb_cellSize.Text);
            int binsCount = Convert.ToInt32(txb_binsCount.Text);

            if (filter_checkBox.Checked == true)
            {
                maxPoints = Convert.ToInt32(txb_Filter.Text);
            }
            else
            {
                maxPoints = 5000;
            }

            List <InterestingPoint> pointsA =
                NonMaximumSuppression.FilterA(imageA, Harris.DoHarris(MinValueHarris, WindowSize, imageA), maxPoints);
            List <InterestingPoint> pointsB =
                NonMaximumSuppression.FilterA(imageB, Harris.DoHarris(MinValueHarris, WindowSize, imageB), maxPoints);

            List <ForDescriptor.Descriptor> descriptorsA = RotationInvariant.Calculate(imageA, pointsA);
            List <ForDescriptor.Descriptor> descriptorsB = RotationInvariant.Calculate(imageB, pointsB);

            List <ValueTuple <ForDescriptor.Descriptor, ForDescriptor.Descriptor> > match;

            if (rbt_usual.Checked == true)
            {
                match = DescriptorMatcher.Match(descriptorsA, descriptorsB);
            }
            else if (rbt_NNDR.Checked == true)
            {
                match = DescriptorMatcher.Nndr(descriptorsA, descriptorsB);
            }
            else
            {
                match = DescriptorMatcher.Match(descriptorsA, descriptorsB);
            }

            lbl_findPoints1.Text = "Найдено интересных точек(1): " + pointsA.Count;
            lbl_findPoints2.Text = "Найдено интересных точек(2): " + pointsB.Count;
            lbl_PairCount.Text   = "Найдено пар точек: " + match.Count;

            var image = DrawHelper.DrawTwoImages(
                DrawHelper.DrawPoints(imageA, pointsA), DrawHelper.DrawPoints(imageB, pointsB), match);

            IOHelper.WriteImageToFile(image, "..\\..\\..\\..\\Output\\OutputPicture.png");

            pictureBox1.Image = image;
        }
Пример #2
0
        private static List <InterestingPoint> FindPoints(Pyramid pyramid)
        {
            var blobs = new List <InterestingPoint>();

            for (var octave = 0; octave < Pyramid.Depth; octave++)
            {
                var firstImage = pyramid.GetLayer(octave, 0);             // Берем первую картинку в октаве

                for (var layer = 1; layer <= pyramid.OctaveSize; layer++) //
                {
                    var prev = pyramid.GetDoG(octave, layer - 1);
                    var cur  = pyramid.GetDoG(octave, layer); // Берем Dog на двух соседних урвнях одной октавы
                    var next = pyramid.GetDoG(octave, layer + 1);


                    //   IOHelper.WriteImageToFile(DrawHelper.DrawPoints(pyramid.GetDoG(octave, layer), new List<InterestingPoint>()),
                    //         "..\\..\\..\\..\\Output\\Октава " + octave + " Уровень " + layer);

                    var radius = Math.Ceiling(pyramid.GetLayer(octave, layer).LocalSigma *Math.Sqrt(2));  // Считаем радиус блобов на каждой октаве

                    for (var x = ImageBorder; x < cur.Width - ImageBorder; x++)
                    {
                        for (var y = ImageBorder; y < cur.Height - ImageBorder; y++)
                        {
                            if (IsLocalMaxOrMin(x, y, prev, cur, next))                         // Отбрасываем не нужные блобы
                            {
                                var harrisValue = Harris.FindAt(firstImage, (int)radius, x, y); // Считаем значение Харриса для данной точки

                                if (harrisValue > MinHarris)
                                {
                                    blobs.Add(new InterestingPoint(
                                                  GetCoordinate(x, octave),
                                                  GetCoordinate(y, octave),
                                                  StartSigma * Math.Pow(2, 1 + octave + (layer - 1.0) / OctaveSize), // Радиус, который в итоге рисуем
                                                  harrisValue,
                                                  octave
                                                  ));
                                }
                            }
                        }
                    }
                }
            }
            return(blobs);
        }
Пример #3
0
        private void HarrisCornerDetection()
        {
            swHarris.Reset();             // Used for timing functions. (good for testing changes in optimisation)
            swHarris.Start();
            HarrisCornerProperties hp = ControlPanel.Controls[0] as HarrisCornerProperties;

            processing = new FrmProcessing("Conducting Harris Corner Detection");
            processing.Show();
            Log("Conducting Harris Corner Detection");
            SetStatus("Please wait for corner detection");
            Harris h = new Harris(CurrentImage);

            h.ImageComplete += h_ImageComplete;

            Task ht = new Task(() => h.GetCorners(hp.Threshold, hp.Sigma));

            ht.Start();
        }
Пример #4
0
        private void HarrisCornerDetection()
        {
            swHarris.Reset(); // Used for timing functions. (good for testing changes in optimisation)
            swHarris.Start();


            if (ModificationPropertiesLog != null)
            {
                ModificationPropertiesLog("Conducting Harris Corner Detection");
            }

            Harris h = new Harris(CurrentImage);

            h.ImageComplete += h_ImageComplete;

            Task ht = new Task(() => h.GetCorners(hp.Threshold, hp.Sigma));

            ht.Start();
        }
Пример #5
0
        static void Main(string[] args)
        {
            //var readLine = Console.ReadLine();
            //if (readLine == null) return;
            //var args = readLine.Split(' ');
            //var args = new[] { "house2.bmp", "house222.bmp", "canny", "1", "0,25", "0,1" };

            //task1
            //Инверсия значений пикселей изображения
            if (args.Length == 3 && args[2] == "invert")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                Inversion.InversionProcess(image);
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Отражение изображения по вертикали и по горизонтали
            if (args.Length == 4 && args[2] == "mirror")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                if (args[3] == "x")
                {
                    Reflection.FlipHorizontal(image);
                }
                if (args[3] == "y")
                {
                    Reflection.FlipVertical(image);
                }
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Поворот изображений по и против часовой стрелки на 90, 180 и 270 градусов(на произвольный угол)
            if (args.Length == 5 && args[2] == "rotate")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                if (args[3] == "cw")
                {
                    image = Rotate.ClockWiseRotate(image, angle: int.Parse(args[4]));
                }
                if (args[3] == "ccw")
                {
                    image = Rotate.CounterClockWiseRotate(image, angle: int.Parse(args[4]));
                }
                ImageIO.ImageToFile(image, outputFileName);
            }
            //фильтр Превитта
            if (args.Length == 4 && args[2] == "prewitt")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                if (args[3] == "x")
                {
                    image = MedianFiltering.Convolution(image, Filters.PrewittHorizontal(), 3, 2);
                }
                if (args[3] == "y")
                {
                    image = MedianFiltering.Convolution(image, Filters.PrewittVertical(), 3, 2);
                }
                ImageIO.ImageToFile(image, outputFileName);
            }
            //фильтр Собеля
            if (args.Length == 4 && args[2] == "sobel")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                if (args[3] == "x")
                {
                    image = MedianFiltering.Convolution(image, Filters.SobelHorizontal(), 3);
                }
                if (args[3] == "y")
                {
                    image = MedianFiltering.Convolution(image, Filters.SobelVertical(), 3);
                }
                ImageIO.ImageToFile(image, outputFileName);
            }
            //фильтр Робертса
            if (args.Length == 4 && args[2] == "roberts")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                if (args[3] == "1")
                {
                    image = MedianFiltering.Convolution(image, Filters.RobertsMainDiagonal(), 2, 2);
                }
                if (args[3] == "2")
                {
                    image = MedianFiltering.Convolution(image, Filters.RobertsAdditionalDiagonal(), 2, 2);
                }
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Медианная фильтрация с квадратным окном произвольного размера
            if (args.Length == 4 && args[2] == "median")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                image = MedianFiltering.MedianFilter(image, kernelSize: int.Parse(args[3]));
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Свёртка с фильтром Гаусса с произвольным выбором параметра — радиуса σ
            if (args.Length == 4 && args[2] == "gauss")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image    = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                var data     = new double[image.rawdata.Length];
                var template = new double[image.rawdata.Length];
                for (var i = 0; i < image.rawdata.Length; i++)
                {
                    data[i] = Convert.ToDouble(image.rawdata[i]);
                }
                ConvolutionGauss.GaussProcess(data, image.Width, image.Height, sigma: double.Parse(args[3]), windowSize: 9, temp: template, dest: data);
                for (var i = 0; i < image.rawdata.Length; i++)
                {
                    image.rawdata[i] = Convert.ToSingle(data[i]);
                }
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Вычисление модуля градиента как корень из суммы квадратов свёрток с первой производной фильтра Гаусса по горизонтали и вертикали
            if (args.Length == 4 && args[2] == "gradient")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                ConvolutionGauss.GradientProcess(image.rawdata, image.Width, image.Height, double.Parse(args[3]), (int)(double.Parse(args[3]) * 6), image.rawdata);
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Фильтр Габора с произвольными параметрами
            if (args.Length == 8 && args[2] == "gabor")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                image = ConvolutionGauss.Gabor(image, Filters.Gabor((int)(6 * double.Parse(args[3])), double.Parse(args[3]), double.Parse(args[6]), double.Parse(args[5]), double.Parse(args[4]), double.Parse(args[6])), (int)(6 * double.Parse(args[3])), (int)(6 * double.Parse(args[3])), int.Parse(args[7]));
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Обнаружение сосудов на изображениях глазного дна с помощью фильтров Габора
            if (args.Length == 4 && args[2] == "vessels")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                image = ConvolutionGauss.Vessels(image, (int)(6 * Convert.ToDouble(args[3])), Convert.ToDouble(args[3]));
                ImageIO.ImageToFile(image, outputFileName);
            }
            //task2
            //Увеличение изображений в вещественное число раз с помощью билинейной интерполяции
            if (args.Length == 4 && args[2] == "up_bilinear")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);

                image = ImageResolution.Bilinear(image, Convert.ToDouble(args[3]));
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Увеличение изображений в вещественное число раз с помощью бикубической интерполяции
            if (args.Length == 4 && args[2] == "up_bicubic")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);

                var resultImage = ImageResolution.Bicubic(image, Convert.ToDouble(args[3]));
                ImageIO.ImageToFile(resultImage, outputFileName);
            }
            //Понижение разрешения изображений в вещественное число раз
            if (args.Length == 4 && args[2] == "downsample")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);

                image = ImageResolution.DownBilinear(image, Convert.ToDouble(args[3]));
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Вычисление метрик сравнения изображений(MSE и PSNR, SSIM и MSSIM)
            if (args.Length == 4 && args[2] == "metric")
            {
                string inputFileName = args[0], inputFileName2 = args[1];
                if (!File.Exists(inputFileName) || !File.Exists(inputFileName2))
                {
                    return;
                }
                var    image  = ImageIO.FileToGrayscaleFloatImage(inputFileName);
                var    image2 = ImageIO.FileToGrayscaleFloatImage(inputFileName2);
                double result;
                switch (args[3])
                {
                case "mse":
                    result = Metrics.Mse(image, image2);
                    Console.WriteLine(result);
                    Console.ReadKey();
                    break;

                case "psnr":
                    result = Metrics.Psnr(image, image2);
                    Console.WriteLine(result);
                    Console.ReadKey();
                    break;

                case "ssim":
                    result = Metrics.Ssim(image.rawdata, image2.rawdata, image.Width, image.Height);
                    Console.WriteLine(result);
                    Console.ReadKey();
                    break;

                case "mssim":
                    result = Metrics.Mssim(image.rawdata, image2.rawdata, image.Width, image.Height);
                    Console.WriteLine(result);
                    Console.ReadKey();
                    break;
                }
            }
            //task3
            //Алгоритм детектирования границ Канни
            if (args.Length == 6 && args[2] == "canny")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);

                var image2 = Canny.Process(image, Convert.ToSingle(args[3]), Convert.ToSingle(args[4]), Convert.ToSingle(args[5]));
                ImageIO.ImageToFile(image2, outputFileName);
            }
            //Алгоритм Харриса для детектирования углов
            if (args.Length == 4 && args[2] == "harris")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);

                image = Harris.Process(image, double.Parse(args[3]));
                ImageIO.ImageToFile(image, outputFileName);
            }
            //Билатеральная фильтрация изображений
            if (args.Length == 5 && args[2] == "bilateral")
            {
                string inputFileName = args[0], outputFileName = args[1];
                if (!File.Exists(inputFileName))
                {
                    return;
                }
                var image = ImageIO.FileToGrayscaleFloatImage(inputFileName);

                image = Bilateral.Process(image, double.Parse(args[3]), double.Parse(args[3]));
                ImageIO.ImageToFile(image, outputFileName);
            }
        }
        private void FindPointButton_Click(object sender, EventArgs e)
        {
            if (RB_DoMoravec.Checked == true)
            {
                double minValue     = Convert.ToDouble(textBox1.Text);
                int    windowSize   = Convert.ToInt32(textBox2.Text);
                int    shiftSize    = Convert.ToInt32(textBox3.Text);
                int    locMaxRadius = Convert.ToInt32(textBox4.Text);

                List <InterestingPoint> MoravecMatrix = Moravec.DoMoravec(minValue, windowSize, shiftSize, locMaxRadius, _image);

                if (filter_checkBox.Checked == true)
                {
                    int maxCountPoints = Convert.ToInt32(textBox7.Text);
                    List <InterestingPoint> subList = NonMaximumSuppression.FilterA(_image, MoravecMatrix, maxCountPoints); // Фильтр точек
                    label9.Text  = "Найдено интересных точек: " + MoravecMatrix.Count;
                    label10.Text = "Отображенно интересных точек: " + subList.Count;
                    DrawPoints(subList);
                }
                else
                {
                    label10.Text = "Отображенно интересных точек: " + MoravecMatrix.Count;
                    label9.Text  = "Найдено интересных точек: " + MoravecMatrix.Count;
                    DrawPoints(MoravecMatrix);
                }
            }

            if (RB_DoHarris.Checked == true)
            {
                double minValue   = Convert.ToDouble(textBox5.Text);
                int    windowSize = Convert.ToInt32(textBox6.Text);
                List <InterestingPoint> HarrisMatrix = Harris.DoHarris(minValue, windowSize, _image);

                ///////////
                #region Отклик кнопок
                if (checkBox2.Checked == true)
                {
                    List <InterestingPoint> SubHarrisMatrix = Harris.DoHarris(minValue, windowSize, _image);
                    label9.Text = "Найдено откликов: " + SubHarrisMatrix.Count;
                    DrawMap(SubHarrisMatrix, _image);
                }
                else
                if (checkBox1.Checked == true)
                {
                    List <InterestingPoint> SubHarrisMatrix = Harris.DoHarris(minValue, windowSize, _image);
                    DrawMap(SubHarrisMatrix, _image);
                    label9.Text = "Найдено локальных максимумов: " + SubHarrisMatrix.Count;
                }

                else if (filter_checkBox.Checked == true)
                {
                    int maxCountPoints = Convert.ToInt32(textBox7.Text);
                    List <InterestingPoint> subList = NonMaximumSuppression.FilterB(
                        HarrisMatrix,
                        maxCountPoints
                        ); // Фильтр точек
                    DrawPoints(subList);
                    label9.Text  = "Найдено интересных точек: " + HarrisMatrix.Count;
                    label10.Text = "Отображенно интересных точек: " + subList.Count;
                }
                else
                {
                    label10.Text = "Отображенно интересных точек: " + HarrisMatrix.Count;
                    label9.Text  = "Найдено интересных точек: " + HarrisMatrix.Count;
                    DrawPoints(HarrisMatrix);
                }

                #endregion
            }
        }