コード例 #1
0
        /// <summary>
        /// Calculates LBP from 2D array
        /// Enter array, radius and neighbours.
        /// </summary>
        public static void PipelineLBP(double[,] image, Parameters param,
                                       out double[,] result, out int[] histogram)
        {
            // Create instance of LBPApplication and set input variables
            LBPApplication LBPapp = new LBPApplication
            {
                Image = image,
                Param = param,
                MRE   = false // Don't use MRELBP methods
            };

            // Result image size
            LBPapp.d     = LBPapp.Param.Radius;
            LBPapp.xSize = image.GetLength(0) - 2 * LBPapp.d;
            LBPapp.ySize = image.GetLength(1) - 2 * LBPapp.d;

            // Calculate mapping and LBP image
            LBPapp.GetMapping();
            LBPapp.CalculateImage();

            // Calculate histogram
            LBPapp.GetHistogram();

            // output variables
            result    = LBPapp.LBPISMapped; // Mapping
            histogram = LBPapp.histS;
        }
コード例 #2
0
        /// <summary>
        /// Calculates MRELBP from 2D array
        /// Enter array and parameters class including small and large radius, neighbours and kernel weights.
        /// Weights are for center pixels (w_c), small (w_r[0]) and large (w_r[1]) radius.
        /// </summary>
        public static void PipelineMRELBP(double[,] image, Parameters param,
                                          out double[,] LBPIL, out double[,] LBPIS, out double[,] LBPIR, out int[] histL, out int[] histS, out int[] histR, out int[] histCenter)
        {
            // Create instance of LBPApplication and set input variables
            LBPApplication MRELBPapp = new LBPApplication
            {
                Image = image,
                Param = param,
                d     = param.LargeRadius + (param.W_r[0] - 1) / 2,
                MRE   = true // Median robust extended LBP
            };

            // Calculate mapping
            MRELBPapp.GetMapping();

            // Result image size
            MRELBPapp.xSize = image.GetLength(0) - 2 * MRELBPapp.d;
            MRELBPapp.ySize = image.GetLength(1) - 2 * MRELBPapp.d;

            // Scale image
            MRELBPapp.Scaling();

            // Median filtering using given weights
            MRELBPapp.FilterImage();

            // Calculate LBP image
            MRELBPapp.CalculateImage();

            // Calculate histogram
            MRELBPapp.GetHistogram();

            // output variables
            //LBPIL = MRELBPapp.LBPILMapped; // Mapping
            //LBPIS = MRELBPapp.LBPISMapped;
            //LBPIR = MRELBPapp.LBPIRMapped;
            LBPIL = MRELBPapp.LBPIL; // No mapping
            LBPIS = MRELBPapp.LBPIS;
            LBPIR = MRELBPapp.LBPIR;


            histL      = MRELBPapp.histL;
            histS      = MRELBPapp.histS;
            histR      = MRELBPapp.histR;
            histCenter = MRELBPapp.histCenter;
        }
コード例 #3
0
        /// <summary>
        /// Calculate single LBP image. For LBP image, path and savepath should be defined first.
        /// For MRELBP image meanpath, stdpath and savepath should be defined first.
        /// </summary>
        public void CalculateSingle()
        {
            // Timer
            var time = Stopwatch.StartNew();

            // Load image
            double[,] image, imagemean, imagestd;
            if (param.Meanstd)
            {
                if (param.ImageType == ".dat" && meanpath.EndsWith(".dat") && stdpath.EndsWith(".dat"))
                {
                    lbpreader.ReadLBPFeatures(param.Precision, meanpath); // Read binary image
                    imagemean = lbpreader.image_double;
                    lbpreader.ReadLBPFeatures(param.Precision, stdpath);  // Read binary image
                    imagestd = lbpreader.image_double;
                    image    = imagemean.Add(imagestd);                   // Combine mean and std images
                }
                else if ((meanpath.EndsWith(".png") && stdpath.EndsWith(".png")) || (meanpath.EndsWith(".bmp") && stdpath.EndsWith(".png")))
                {
                    imagemean = Functions.Load(meanpath).ToDouble();
                    imagestd  = Functions.Load(stdpath).ToDouble();
                    image     = imagemean.Add(imagestd); // Combine mean and std images
                }
                else
                {
                    Console.WriteLine("One of image types not compatible.\n");
                    return;
                }
            }
            else
            {
                if (param.ImageType == ".dat" && path.EndsWith(".dat"))
                {
                    lbpreader.ReadLBPFeatures(param.Precision, path); // Read binary image
                    image = lbpreader.image_double;
                }
                else if (path.EndsWith(".png") || path.EndsWith(".bmp"))
                {
                    image = Functions.Load(path).ToDouble();
                }
                else
                {
                    Console.WriteLine("Image type not compatible.\n");
                    return;
                }
            }


            // LBP
            if (param.Mre)
            {
                if (param.Stand)
                {
                    // Grayscale normalization (weights and sigmas from parameters class)
                    var standrd = new LocalStandardization(param.W_stand[0], param.W_stand[1], param.W_stand[2], param.W_stand[3]);
                    standrd.Standardize(ref image, "Reflect"); // standardize given image
                }

                // Run MRELBP
                Console.WriteLine("\nRunning MRELBP:\n");
                LBPApplication.PipelineMRELBP(image, param,
                                              out double[,] LBPIL, out double[,] LBPIS, out double[,] LBPIR, out int[] histL, out int[] histS, out int[] histR, out int[] histCenter);

                if (param.Meanstd) // update save path for mean and std images
                {
                    path = meanpath;
                }
                if (param.Save && savepath != null) // Save images
                {
                    Functions.Save(savepath + "\\" + Path.GetFileName(path).Replace(Path.GetExtension(path), "") + "_LBPIL.png", LBPIL, param.Scale);
                    Functions.Save(savepath + "\\" + Path.GetFileName(path).Replace(Path.GetExtension(path), "") + "_LBPIS.png", LBPIS, param.Scale);
                    Functions.Save(savepath + "\\" + Path.GetFileName(path).Replace(Path.GetExtension(path), "") + "_LBPIR.png", LBPIR, param.Scale);
                }

                // Concatenate histograms
                f = Matrix.Concatenate(histCenter, Matrix.Concatenate(histL, Matrix.Concatenate(histS, histR)));
            }
            else
            {
                // Run LBP
                Console.WriteLine("\nRunning LBP:\n");
                LBPApplication.PipelineLBP(image, param,
                                           out double[,] LBPresult, out int[] LBPhistogram); // Get LBP for test image;

                if (param.Save)                                                              // Save images
                {
                    Functions.Save(savepath + "\\" + Path.GetFileName(path).Replace(Path.GetExtension(path), "") + "_LBP.png", LBPresult, param.Scale);
                }

                f = LBPhistogram;
            }

            // Results
            features = Matrix.Concatenate(features, f);

            if (savepath != null)
            {
                // Write features to csv
                Functions.WriteCSV(features.ToSingle(), savepath + "\\features.csv");

                // Write features to binary file
                var binwriter = new BinaryWriterApp()
                {
                    filename = savepath + "\\features.dat"
                };
                binwriter.SaveBinary(features);
            }

            Console.WriteLine("LBP images calculated and results saved.\nElapsed time: {0}min {1}sec", time.Elapsed.Minutes, time.Elapsed.Seconds);
            time.Stop();
        }
コード例 #4
0
        /// <summary>
        /// Calculate all images from given path directory with selected extension.
        /// Savepath sould also be defined.
        /// </summary>
        public void CalculateBatch()
        {
            // Timer
            var time     = Stopwatch.StartNew();
            var timeFull = Stopwatch.StartNew();

            // Get files from sample directory
            string[] dir;
            if (param.ImageType == ".dat")
            {
                dir = Directory.GetFiles(path, "*.dat");
            }
            else
            {
                dir = Directory.GetFiles(path, "*.png");
            }
            Array.Sort(dir);

            if (param.Mre)
            {
                // Loop for calculating MRELBP for whole dataset
                for (int k = 0; k < dir.Length; k++)
                {
                    // Load images
                    double[,] imagemean, imagestd, image = null;
                    if (param.ImageType == ".dat" && param.Meanstd)
                    {
                        lbpreader.ReadLBPFeatures(param.Precision, dir[k]); // Read binary mean image
                        imagemean = lbpreader.image_double;
                        k++;
                        lbpreader.ReadLBPFeatures(param.Precision, dir[k]); // Read binary std image
                        imagestd = lbpreader.image_double;
                        image    = imagemean.Add(imagestd);                 // Combine mean and std images
                    }
                    else if (param.Meanstd)                                 // Check whether to sum two adjacent images
                    {
                        imagemean = Functions.Load(dir[k]).ToDouble();
                        k++;
                        imagestd = Functions.Load(dir[k]).ToDouble();
                        image    = imagemean.Add(imagestd);                 // Combine mean and std images
                    }
                    else if (param.ImageType == ".dat" && !param.Meanstd)   // Don't combine images
                    {
                        lbpreader.ReadLBPFeatures(param.Precision, dir[k]); // Read binary mean image
                        image = lbpreader.image_double;
                    }
                    else if (!param.Meanstd)
                    {
                        image = Functions.Load(dir[k]).ToDouble();
                    }

                    if (param.Stand)
                    {
                        // Grayscale normalization (weights and sigmas from parameters class)
                        var standrd = new LocalStandardization(param.W_stand[0], param.W_stand[1], param.W_stand[2], param.W_stand[3]);
                        standrd.Standardize(ref image, "Reflect"); // standardize given image
                    }

                    // Calculate MRELBP
                    LBPApplication.PipelineMRELBP(image, param,
                                                  out double[,] LBPIL, out double[,] LBPIS, out double[,] LBPIR, out int[] histL, out int[] histS, out int[] histR, out int[] histCenter);

                    // Concatenate histograms
                    f        = Matrix.Concatenate(histCenter, Matrix.Concatenate(histL, Matrix.Concatenate(histS, histR)));
                    features = Matrix.Concatenate(features, f);

                    if (param.Save && savepath != null) // Save LBP image
                    {
                        Functions.Save(savepath + "\\" + Path.GetFileName(dir[k]).Replace(Path.GetExtension(dir[k]), "") + "_small.png", LBPIS, param.Scale);
                        Functions.Save(savepath + "\\" + Path.GetFileName(dir[k]).Replace(Path.GetExtension(dir[k]), "") + "_large.png", LBPIL, param.Scale);
                        Functions.Save(savepath + "\\" + Path.GetFileName(dir[k]).Replace(Path.GetExtension(dir[k]), "") + "_radial.png", LBPIR, param.Scale);
                    }

                    Console.WriteLine("Image: {0}, elapsed time: {1}ms", dir[k], time.ElapsedMilliseconds);
                    time.Restart();
                }
            }
            else
            {
                // Loop for calculating LBP for whole dataset
                for (int k = 0; k < dir.Length; k++)
                {
                    // Load images
                    double[,] image;
                    if (param.ImageType == ".dat")
                    {
                        lbpreader.ReadLBPFeatures(param.Precision, dir[k]); // Read binary image
                        image = lbpreader.image_double;
                    }
                    else
                    {
                        image = Functions.Load(dir[k]).ToDouble(); // Read png or bmp image
                    }
                    LBPApplication.PipelineLBP(image, param,
                                               out double[,] LBPresult, out int[] LBPhistogram); // Get LBP for test image;

                    // Concatenate histograms
                    features = Matrix.Concatenate(features, LBPhistogram);

                    if (param.Save && savepath != null) // Save images
                    {
                        Functions.Save(savepath + "\\" + Path.GetFileName(dir[k]).Replace(Path.GetExtension(dir[k]), "") + "_LBP.png", LBPresult, param.Scale);
                    }

                    Console.WriteLine("Image: {0}, elapsed time: {1}ms", dir[k], time.ElapsedMilliseconds);
                    time.Restart();
                }
            }

            if (savepath != null)
            {
                // Write features to csv
                Functions.WriteCSV(features.ToSingle(), savepath + "\\features.csv");

                // Write features to binary file
                var binwriter = new BinaryWriterApp()
                {
                    filename = savepath + "\\features.dat"
                };
                binwriter.SaveBinary(features);
            }

            Console.WriteLine("All LBP images calculated and results saved.\nElapsed time: {0}min {1}sec", timeFull.Elapsed.Minutes, timeFull.Elapsed.Seconds);
            time.Stop(); timeFull.Stop();
        }