Exemplo n.º 1
0
        public static GrayscaleFloatImage DownBilinear(GrayscaleFloatImage image, double n)
        {
            var width  = (int)(image.Width / n);
            var height = (int)(image.Height / n);
            var result = new GrayscaleFloatImage(width, height);
            //
            var sigma    = Math.Sqrt(n * n - 1);
            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: sigma, windowSize: (int)(sigma * 3), temp: template, dest: data);
            //
            for (var i = 0; i < image.rawdata.Length; i++)
            {
                image.rawdata[i] = Convert.ToSingle(data[i]);
            }
            for (var y = 0; y < height; y++)
            {
                var dy = y * n;
                for (var x = 0; x < width; x++)
                {
                    var dx = x * n;
                    if ((Math.Abs(dx % 1) <= 0) || (Math.Abs(dy % 1) <= 0))
                    {
                        result[x, y] = image[(int)dx, (int)dy];
                    }
                    else
                    {
                        var x1 = (int)dx;
                        var y1 = (int)dy;
                        result[x, y] = (float)((dy - y1) * ((x1 + 1 - dx) * image[x1, y1 + 1] + (dx - x1) * image[x1 + 1, y1 + 1]) +
                                               (y1 + 1 - dy) * ((x1 + 1 - dx) * image[x1, y1] + (dx - x1) * image[x1 + 1, y1]));
                    }
                }
            }
            return(result);
        }
Exemplo n.º 2
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);
            }
        }