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; }
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); }
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(); }
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(); }
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 } }