public GetLineUseCanny(Canny parameter)//带参数的构造函数 { this.parameter = parameter; HOperatorSet.GenEmptyObj(out ho_SelectedRegions); function = "边缘拟合线"; }
public GetLineUseCanny()//构造函数 { parameter = new Canny(); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); function = "边缘拟合线"; }
private void EdgeDetect() { if (_image != null) { try { if (_isChecked) { _progressValue = 0; base.OnPropertyChanged("ProgressValue"); Bitmap _bmpImage = BitmapConvert.BitmapImageToBitmap(_image); Bitmap edge; Canny.DetectCannyEdges(_bmpImage, out edge, _kernelSize, _sigma, _thrHigh, _thrLow); _cannyImage = BitmapConvert.toBitmapImage(edge); base.OnPropertyChanged("CannyImage"); Bitmap gf, np, se, we; Canny.GaussianFilter(_bmpImage, out gf, _kernelSize, _sigma); _GFImage = BitmapConvert.toBitmapImage(gf); base.OnPropertyChanged("GFImage"); Canny.Suppression(_bmpImage, out np, _kernelSize, _sigma); _NMSImage = BitmapConvert.toBitmapImage(np); base.OnPropertyChanged("NMSImage"); Canny.Threshold(_bmpImage, out se, out we, _kernelSize, _sigma, _thrHigh, _thrLow); _WEImage = BitmapConvert.toBitmapImage(we); base.OnPropertyChanged("WEImage"); _SEImage = BitmapConvert.toBitmapImage(se); base.OnPropertyChanged("SEImage"); } else { Bitmap _bmpImage = BitmapConvert.BitmapImageToBitmap(_image); //获得灰度图 Image <Gray, byte> grayFrame = new Image <Gray, byte>(_bmpImage); if (_equalizeHist) { grayFrame._EqualizeHist();//autocontrast } //高斯平滑 Image <Gray, byte> smoothedGrayFrame = grayFrame.PyrDown(); smoothedGrayFrame = smoothedGrayFrame.PyrUp(); //canny Image <Gray, byte> cannyFrame = null; if (_smooth) { cannyFrame = smoothedGrayFrame.Canny(_thresh, _threshLinking); grayFrame = smoothedGrayFrame; } else { grayFrame = grayFrame.Canny(_thresh, _threshLinking); } //局部自适应阈值二值化,阈值本身作为了一个变量,检测更有效 //CvInvoke.cvAdaptiveThreshold(grayFrame, grayFrame, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, adaptiveThresholdBlockSize + adaptiveThresholdBlockSize % 2 + 1, adaptiveThresholdParameter); CvInvoke.AdaptiveThreshold(grayFrame, grayFrame, 255, Emgu.CV.CvEnum.AdaptiveThresholdType.MeanC, Emgu.CV.CvEnum.ThresholdType.Binary, _blockSize + _blockSize % 2 + 1, _parameter); // grayFrame._Not(); // if (cannyFrame != null) { grayFrame._Or(cannyFrame); //试验了一下,这样轮廓会更加明显 } _cannyImage = BitmapConvert.toBitmapImage(grayFrame.ToBitmap()); base.OnPropertyChanged("CannyImage"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
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); } }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { IGH_Goo goo = null; Image image = new Image(); if (!DA.GetData(0, ref goo)) { return; } if (!goo.TryGetImage(ref image)) { return; } int mode = 0; DA.GetData(1, ref mode); double numValA = 1.0; DA.GetData(2, ref numValA); int numValB = 1; DA.GetData(3, ref numValB); int numValC = 1; DA.GetData(4, ref numValC); int numValD = 1; DA.GetData(5, ref numValD); Filter filter = new Filter(); int[] indices = new int[] { 2, 3, 4, 5 }; switch ((FilterModes)mode) { case FilterModes.Canny: SetParameter(2, "X", "Sigma", "Gaussian sigma"); SetParameter(3, "S", "Size", "Gaussian size"); SetParameter(4, "L", "Low Threshold", "High threshold value used for hysteresis"); SetParameter(5, "H", "High Threshold", "Low threshold value used for hysteresis"); filter = new Canny(numValA, numValB, numValC, numValD); image.Filters.Add(new Canny()); break; case FilterModes.Difference: ClearParameter(indices); filter = new Difference(); image.Filters.Add(new Difference()); break; case FilterModes.Homogeneity: ClearParameter(indices); filter = new Homogeneity(); image.Filters.Add(new Homogeneity()); break; case FilterModes.Kirsch: ClearParameter(indices); filter = new Kirsch(); image.Filters.Add(new Kirsch()); break; case FilterModes.Robinson: ClearParameter(indices); filter = new Robinson(); image.Filters.Add(new Robinson()); break; case FilterModes.Sobel: ClearParameter(indices); filter = new Sobel(); image.Filters.Add(new Sobel()); break; } message = ((FilterModes)mode).ToString(); UpdateMessage(); DA.SetData(0, image); DA.SetData(1, filter); }