示例#1
0
        private void button7_Click(object sender, EventArgs e)
        {
            float[,] filtreHomemade =
            {
                { (float)numericUpDown1.Value, (float)numericUpDown2.Value, (float)numericUpDown3.Value },
                { (float)numericUpDown6.Value, (float)numericUpDown5.Value, (float)numericUpDown4.Value },
                { (float)numericUpDown9.Value, (float)numericUpDown8.Value, (float)numericUpDown7.Value }
            };
            Mat    img           = CvInvoke.Imread(FilePath, ImreadModes.AnyColor);
            Mat    ImgDest       = new Mat();
            string ImgDestString = textBox1.Text;
            Point  point         = new Point(0, 0);
            Size   size          = new Size(9, 9);

            if (!img.IsEmpty)
            {
                ConvolutionKernelF kernel = new ConvolutionKernelF(filtreHomemade);
                ImgDest = img;
                CvInvoke.Filter2D(img, ImgDest, kernel, point);

                if (ImgDestString != "")
                {
                    CvInvoke.Imwrite(ImgDestString, ImgDest);
                    pictureBox2.ImageLocation = textBox1.Text;
                }
                else
                {
                    CvInvoke.Imwrite("NoName.jpg", ImgDest);
                    pictureBox2.ImageLocation = "NoName.jpg";
                }

                CvInvoke.WaitKey(0);
            }
        }
示例#2
0
        ///<summary>
        ///Performs a convolution using the specific <paramref name="kernel"/>
        ///</summary>
        ///<param name="kernel">The convolution kernel</param>
        ///<returns>The result of the convolution</returns>
        public OclImage <TColor, Byte> Convolution(ConvolutionKernelF kernel)
        {
            OclImage <TColor, Byte> result = new OclImage <TColor, Byte>(Size);

            OclInvoke.Filter2D(_ptr, result, kernel, kernel.Center, CvEnum.BORDER_TYPE.REFLECT101);
            return(result);
        }
示例#3
0
        ///<summary>
        ///Performs a convolution using the specific <paramref name="kernel"/>
        ///</summary>
        ///<param name="kernel">The convolution kernel</param>
        ///<returns>The result of the convolution</returns>
        public GpuImage <TColor, Single> Convolution(ConvolutionKernelF kernel)
        {
            GpuImage <TColor, Single> result = new GpuImage <TColor, float>(Size);

            GpuInvoke.Filter2D(_ptr, result, kernel, kernel.Center);
            return(result);
        }
示例#4
0
        static public IFilter New()
        {
            float[,] kernal_array = { { 0, -1, 0 }, { -1, 5, -1 }, { 0, -1, 0 } };
            var convol_colution = new ConvolutionKernelF(kernal_array);

            return(new Test(convol_colution));
        }
示例#5
0
        private void Execute_Click(object sender, EventArgs e)
        {
            if (image == null)
            {
                MessageBox.Show("You didn't pick an image!");
                return;
            }


            float[,] k = Filter3x3();

            if (RadioButton5X5.Checked)
            {
                k = Filter5x5();
            }
            if (RadioButton7X7.Checked)
            {
                Filter7x7();
            }

            ConvolutionKernelF kernel        = new ConvolutionKernelF(k);
            Image <Gray, byte> imageFiltered = new Image <Gray, byte>(image.Width, image.Height);
            Image <Gray, byte> imageGray     = image.Convert <Gray, byte>();

            CvInvoke.Filter2D(imageGray, imageFiltered, kernel, new Point(-1, -1), 0, borderType);

            MasksPictureBox.Image = imageFiltered.ToBitmap();

            Tools.Histogram(MasksChart, (Bitmap)MasksPictureBox.Image);
        }
示例#6
0
        public GpuImage <TColor, Single> Convolution(ConvolutionKernelF kernel, Stream stream)
        {
            GpuImage <TColor, Single> result = new GpuImage <TColor, float>(Size);

            GpuInvoke.Filter2D(_ptr, result, kernel, kernel.Center, CvEnum.BORDER_TYPE.REFLECT101, stream);
            return(result);
        }
示例#7
0
        private void button6_Click(object sender, EventArgs e)
        {
            Mat    img           = CvInvoke.Imread(FilePath, ImreadModes.AnyColor);
            Mat    ImgDest       = new Mat();
            string ImgDestString = textBox1.Text;
            Point  point         = new Point(0, 0);
            Size   size          = new Size(9, 9);

            if (!img.IsEmpty)
            {
                ConvolutionKernelF kernel = new ConvolutionKernelF(filtreCustom);
                ImgDest = img;
                CvInvoke.Filter2D(img, ImgDest, kernel, point);

                if (ImgDestString != "")
                {
                    CvInvoke.Imwrite(ImgDestString, ImgDest);
                    pictureBox2.ImageLocation = textBox1.Text;
                }
                else
                {
                    CvInvoke.Imwrite("NoName.jpg", ImgDest);
                    pictureBox2.ImageLocation = "NoName.jpg";
                }

                CvInvoke.WaitKey(0);
            }
        }
示例#8
0
        public void TestConvolutionAndLaplace()
        {
            if (CudaInvoke.HasCuda)
            {
                Image <Gray, Byte> image = new Image <Gray, byte>(300, 400);
                image.SetRandUniform(new MCvScalar(0.0), new MCvScalar(255.0));

                float[,] k = { { 0,  1, 0 },
                               { 1, -4, 1 },
                               { 0,  1, 0 } };
                using (ConvolutionKernelF kernel = new ConvolutionKernelF(k))
                    using (Stream s = new Stream())
                        using (GpuMat cudaImg = new GpuMat(image))
                            using (GpuMat cudaLaplace = new GpuMat())
                                using (CudaLinearFilter cudaLinear = new CudaLinearFilter(DepthType.Cv8U, 1, DepthType.Cv8U, 1, kernel, kernel.Center))
                                    using (GpuMat cudaConv = new GpuMat())
                                        using (CudaLaplacianFilter laplacian = new CudaLaplacianFilter(DepthType.Cv8U, 1, DepthType.Cv8U, 1, 1, 1.0))
                                        {
                                            cudaLinear.Apply(cudaImg, cudaConv, s);
                                            laplacian.Apply(cudaImg, cudaLaplace, s);
                                            s.WaitForCompletion();
                                            Assert.IsTrue(cudaLaplace.Equals(cudaConv));
                                        }
            }
        }
示例#9
0
        private void btnWord_Click(object sender, EventArgs e)
        {
            float[,] matrixKernel = new float[3, 3] {
                { 0, -1, 0 },
                { -1, 5, -1 },
                { 0, -1, 0 }
            };

            ConvolutionKernelF kernel = new ConvolutionKernelF(matrixKernel);

            Image <Gray, float> result = img.Convert <Gray, float>().Convolution(kernel);

            Image <Gray, Byte> GRAYResult = result.Convert <Gray, Byte>();

            imageBox2.Image = GRAYResult;

            //file to d:

            StreamWriter sw = File.CreateText(datapath);

            for (int y = 0; y < GRAYResult.Cols; y++)
            {
                for (int x = 0; x < GRAYResult.Rows; x++)
                {
                    string pixel = GRAYResult.Data[x, y, 0].ToString() + ";";

                    sw.Write(pixel);
                }
            }

            sw.Close();
        }
示例#10
0
        public void TestConvolutionAndLaplace()
        {
            Mat image = new Mat(new Size(300, 400), DepthType.Cv8U, 1);

            CvInvoke.Randu(image, new MCvScalar(0.0), new MCvScalar(255.0));
            Mat laplacian = new Mat();

            CvInvoke.Laplacian(image, laplacian, DepthType.Cv8U);

            float[,] k = { { 0,  1, 0 },
                           { 1, -4, 1 },
                           { 0,  1, 0 } };
            ConvolutionKernelF kernel = new ConvolutionKernelF(k);
            Mat convoluted            = new Mat(image.Size, DepthType.Cv8U, 1);

            CvInvoke.Filter2D(image, convoluted, kernel, kernel.Center);

            Mat absDiff = new Mat();

            CvInvoke.AbsDiff(laplacian, convoluted, absDiff);
            int nonZeroPixelCount = CvInvoke.CountNonZero(absDiff);

            EmguAssert.IsTrue(nonZeroPixelCount == 0);

            //Emgu.CV.UI.ImageViewer.Show(absDiff);
        }
示例#11
0
        /// <summary>
        /// Процедура вызывается постоянно и отвечает за обработку кадров
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="arg"></param>
        private void ProcessFrame(object sender, EventArgs arg)
        {
            DateTime DTTest = DateTime.Now; //Время сейчас

            if (KernelOfGabor != null)      //Если ядро для преобразования Габбора заданно
            /////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            {
                if ((DateTime.Now - LastFrame).TotalMilliseconds >= 100)                                         // ОГРАНИЧЕНИЕ НА ЧАСТОТУ - поставленно принудительно, чтобы частота не выползада в 30 фпс и всё не висло
                {
                    persec++;                                                                                    //Счётчик ФПСа
                    LastFrame = DateTime.Now;                                                                    //Время захвата
                    Image <Bgr, float> image = _capture.QueryFrame().Convert <Bgr, float>().PyrDown().PyrDown(); //Захватываем, уменьшая изображение в 4 раза по каждой стороне
                    imageBox4.Image = image.Clone();                                                             //Отобразим на экране


                    //Сделаем сdёртку с ядром
                    Point _center = new Point(KernelOfGabor.Rows / 2 + 1, KernelOfGabor.Cols / 2 + 1);
                    ConvolutionKernelF _kernel;
                    _kernel = new ConvolutionKernelF(KernelOfGabor, _center);
                    Image <Bgr, float> _conv = image.Convolution(_kernel);

                    //Прибавим счётчик
                    CurrentCapturePosition++;
                    if (CurrentCapturePosition == LengthOfCapture) //Если заполнили массив - печещёлкиваем счётчик
                    {
                        CurrentCapturePosition = 0;                //Перещёлкнем счётчик на ноль
                        IsStackFull            = true;             //Объявим о начале работы
                        started   = true;
                        this.Text = "In Work";
                    }
                    //Загрузим изображения в массивы
                    if (Ic[CurrentCapturePosition] == null)
                    {
                        Ic[CurrentCapturePosition]       = new ImageCaptured(_conv);
                        Irealpic[CurrentCapturePosition] = new ImageCaptured(image);
                    }
                    else
                    {
                        lock (Ic[CurrentCapturePosition].locker)
                        {
                            Ic[CurrentCapturePosition].I = _conv.Clone();
                            lock (Irealpic[CurrentCapturePosition].locker)
                            {
                                Irealpic[CurrentCapturePosition].I = image.Clone();
                            }
                            Ic[CurrentCapturePosition].DT = DateTime.Now;
                        }
                    }
                    if ((started) && (!done))
                    {
                        done = true;
                    }
                }
            }
            label2.Text = (DateTime.Now - DTTest).TotalMilliseconds.ToString(); //Счётчик времени исполнения процедуры
        }
示例#12
0
        private void button8_Click(object sender, EventArgs e)
        {
            Random rnd     = new Random();
            float  Nombre1 = rnd.Next(-20, 20);
            float  Nombre2 = rnd.Next(-20, 20);
            float  Nombre3 = rnd.Next(-20, 20);
            float  Nombre4 = rnd.Next(-20, 20);
            float  Nombre5 = rnd.Next(-20, 20);
            float  Nombre6 = rnd.Next(-20, 20);
            float  Nombre7 = rnd.Next(-20, 20);
            float  Nombre8 = rnd.Next(-20, 20);
            float  Nombre9 = rnd.Next(-20, 20);

            numericUpDown1.Value = (decimal)Nombre1;
            numericUpDown2.Value = (decimal)Nombre2;
            numericUpDown3.Value = (decimal)Nombre3;
            numericUpDown4.Value = (decimal)Nombre6;
            numericUpDown5.Value = (decimal)Nombre5;
            numericUpDown6.Value = (decimal)Nombre4;
            numericUpDown7.Value = (decimal)Nombre9;
            numericUpDown8.Value = (decimal)Nombre8;
            numericUpDown9.Value = (decimal)Nombre7;

            float[,] filtreRandom =
            {
                { Nombre1, Nombre2, Nombre3 },
                { Nombre4, Nombre5, Nombre6 },
                { Nombre7, Nombre8, Nombre9 }
            };
            Mat    img           = CvInvoke.Imread(FilePath, ImreadModes.AnyColor);
            Mat    ImgDest       = new Mat();
            string ImgDestString = textBox1.Text;
            Point  point         = new Point(0, 0);
            Size   size          = new Size(9, 9);

            if (!img.IsEmpty)
            {
                ConvolutionKernelF kernel = new ConvolutionKernelF(filtreRandom);
                ImgDest = img;
                CvInvoke.Filter2D(img, ImgDest, kernel, point);

                if (ImgDestString != "")
                {
                    CvInvoke.Imwrite(ImgDestString, ImgDest);
                    pictureBox2.ImageLocation = textBox1.Text;
                }
                else
                {
                    CvInvoke.Imwrite("NoName.jpg", ImgDest);
                    pictureBox2.ImageLocation = "NoName.jpg";
                }

                CvInvoke.WaitKey(0);
            }
        }
示例#13
0
        ///<summary>
        ///Performs a convolution using the specific <paramref name="kernel"/>
        ///</summary>
        ///<param name="kernel">The convolution kernel</param>
        /// <param name="stream">Use a Stream to call the function asynchronously (non-blocking) or null to call the function synchronously (blocking).</param>
        ///<returns>The result of the convolution</returns>
        public GpuImage <TColor, TDepth> Convolution(ConvolutionKernelF kernel, Stream stream)
        {
            GpuImage <TColor, TDepth> result = new GpuImage <TColor, TDepth>(Size);

            using (GpuLinearFilter <TColor, TDepth> linearFilter = new GpuLinearFilter <TColor, TDepth>(kernel, kernel.Center, CvEnum.BORDER_TYPE.REFLECT101, new MCvScalar()))
            {
                linearFilter.Apply(this, result, stream);
            }

            return(result);
        }
示例#14
0
        // не работает, дебаг
        public static Image <Gray, Byte> LineBasedDetection(Image <Gray, Byte> inputImg)
        {
            Image <Gray, Byte> smoothedImg = inputImg.SmoothMedian(3);

            //CvInvoke.CLAHE(smoothedImg, 40, new System.Drawing.Size(16, 16), smoothedImg);
            CvInvoke.BilateralFilter(inputImg.SmoothMedian(3), smoothedImg, 50, 140, -1);
            smoothedImg = smoothedImg.ThresholdToZero(new Gray(30));

            #region Kernels and stuff
            float[,] TopKernelMatrix = new float[, ] {
                { 0, -1, 0 },
                { 0, 0, 0 },
                { 0, 1, 0, }
            };
            float[,] BottomKernelMatrix = new float[, ] {
                { 0, 1, 0 },
                { 0, 0, 0 },
                { 0, -1, 0, }
            };
            float[,] LeftKernelMatrix = new float[, ] {
                { 0, 0, 0 },
                { 1, 0, -1 },
                { 0, 0, 0, }
            };
            float[,] RightKernelMatrix = new float[, ] {
                { 0, 0, 0 },
                { -1, 0, 1 },
                { 0, 0, 0, }
            };
            ConvolutionKernelF TopKernel    = new ConvolutionKernelF(TopKernelMatrix);
            ConvolutionKernelF BottomKernel = new ConvolutionKernelF(BottomKernelMatrix);
            ConvolutionKernelF LeftKernel   = new ConvolutionKernelF(LeftKernelMatrix);
            ConvolutionKernelF RightKernel  = new ConvolutionKernelF(RightKernelMatrix);
            #endregion

            #region Craft top / bottom / left and right images with borders
            Image <Gray, Byte> TopImg    = new Image <Gray, byte>(inputImg.Size);
            Image <Gray, Byte> BottomImg = new Image <Gray, byte>(inputImg.Size);
            Image <Gray, Byte> LeftImg   = new Image <Gray, byte>(inputImg.Size);
            Image <Gray, Byte> RightImg  = new Image <Gray, byte>(inputImg.Size);


            CvInvoke.Filter2D(smoothedImg, TopImg, TopKernel, new Point(1, 1));
            CvInvoke.Filter2D(smoothedImg, BottomImg, BottomKernel, new Point(1, 1));
            CvInvoke.Filter2D(smoothedImg, LeftImg, LeftKernel, new Point(1, 1));
            CvInvoke.Filter2D(smoothedImg, RightImg, RightKernel, new Point(1, 1));

            TopImg    = TopImg.ThresholdBinary(new Gray(15), new Gray(255));
            BottomImg = BottomImg.ThresholdBinary(new Gray(15), new Gray(255));
            LeftImg   = LeftImg.ThresholdBinary(new Gray(15), new Gray(255));
            RightImg  = RightImg.ThresholdBinary(new Gray(15), new Gray(255));
            #endregion

            # region Находим контуры для всех 4х изображений
示例#15
0
        private void PrewittCalc(float[,] matrix)
        {
            ConvolutionKernelF kernel = new ConvolutionKernelF(matrix);

            var img    = ((Bitmap)pictureList[tabControl.SelectedIndex].Image).ToImage <Bgr, byte>();
            var imgDst = new Image <Bgr, byte>(pictureList[tabControl.SelectedIndex].Image.Width,
                                               pictureList[tabControl.SelectedIndex].Image.Height, new Bgr(0, 0, 0));

            Emgu.CV.CvInvoke.Filter2D(img, imgDst, kernel, new Point(-1, 1), 0, borderType: Emgu.CV.CvEnum.BorderType.Replicate);
            pictureList[tabControl.SelectedIndex].Image = imgDst.ToBitmap();
            GC.Collect();
        }
示例#16
0
        private void WLiniowePreset3_Click(object sender, EventArgs e)
        {
            float[,] matrix = { { 1, -2, 1 }, { -2, 4, -2 }, { 1, -2, 1 } };
            ConvolutionKernelF kernel = new ConvolutionKernelF(matrix);

            var img    = ((Bitmap)PictureList[tabControl1.SelectedIndex].Image).ToImage <Bgr, byte>();
            var imgDst = new Image <Bgr, byte>(PictureList[tabControl1.SelectedIndex].Image.Width,
                                               PictureList[tabControl1.SelectedIndex].Image.Height, new Bgr(0, 0, 0));

            Emgu.CV.CvInvoke.Filter2D(img, imgDst, kernel, new Point(-1, -1), 0, borderType: Emgu.CV.CvEnum.BorderType.Replicate);
            PictureList[tabControl1.SelectedIndex].Image = imgDst.ToBitmap();
        }
示例#17
0
        private Image <Bgr, byte> Sepia(Image <Bgr, byte> image)
        {
            float[,] array = { { 0.272f, 0.534f, 0.131f }, { 0.349f, 0.686f, 0.168f }, { 0.393f, 0.769f, 0.189f } };

            Image <Bgr, byte> img = image.Copy();

            ConvolutionKernelF kernel = new ConvolutionKernelF(array);

            CvInvoke.Transform(img.Mat, img.Mat, kernel);

            return(img);
        }
示例#18
0
        public static Image <Gray, float> Sharpen(Image <Gray, Byte> image)
        {
            float[,] k = { { 0,  1, 0 },
                           { 1, -4, 1 },
                           { 0,  1, 0 } };
            ConvolutionKernelF kernel = new ConvolutionKernelF(k);

            image.SetRandUniform(new MCvScalar(0.0), new MCvScalar(255.0));
            Image <Gray, float> laplace = image.Laplace(1);
            Image <Gray, float> output  = image * kernel;

            return(output);
        }
示例#19
0
        private ImageData Operation(ImageForm_Service service, List <int> args)
        {
            if (args == null)
            {
                return(null);
            }

            if (args.Count < 1)
            {
                return(null);
            }

            int kSize = args[0];

            float[,] k = new float[kSize, kSize];

            int c = 0;

            for (int i = 1; i < args.Count;)
            {
                int r = 0;
                for ( ; r < kSize; ++r, ++i)
                {
                    k[c, r] = args[i];
                }
                ++c;
            }

            try
            {
                Image <Bgra, byte> image = new Image <Bgra, byte>(service.data.LastData().Bitmap);
                Image <Gray, byte> gray  = image.Convert <Gray, byte>();

                //Image<Gray, Byte> image = new Image<Gray, byte>(300, 400);
                //gray.SetRandUniform(new MCvScalar(0.0), new MCvScalar(255.0)); // <<<<<<<<<<< Ciekawe

                //int apertureSize = 11;
                //Image<Gray, float> laplace = gray.Laplace(apertureSize);


                ConvolutionKernelF  kernel     = new ConvolutionKernelF(k);
                Image <Gray, float> convoluted = gray * kernel;
                //Image<Bgra, float> convoluted = image * kernel;

                return(new ImageData(convoluted.Bitmap, service.data.LastData().ID));
            }
            catch
            {
                return(null);
            }
        }
示例#20
0
        public static Bitmap Filter2D(Bitmap bmp, float[,] mask)
        {
            string             file1  = Utility.SaveBmpTmp(bmp);
            Image <Bgr, float> img    = new Image <Bgr, float>(file1),
                               dst    = new Image <Bgr, float>(img.Size);
            ConvolutionKernelF kernel = new ConvolutionKernelF(mask);

            CvInvoke.Filter2D(img, dst, kernel, new Point(-1, -1));
            dst.Save(file1);
            Bitmap tmpBmp = Utility.BmpFromFile(file1);

            File.Delete(file1);
            return(tmpBmp);
        }
示例#21
0
        public ConvolutionKernelF GetEmguKernel()
        {
            var emguKernel = new ConvolutionKernelF(this.kernelSize, this.kernelSize);

            for (int i = 0; i < this.kernelSize; i++)
            {
                for (int j = 0; j < this.kernelSize; j++)
                {
                    emguKernel.Data[i, j] = this.data[i, j];
                }
            }

            return(emguKernel);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            float[,] kernel;
            Image <Gray, float> _img = img;
            var grayImg = img.Convert <Gray, float>();


            kernel = mask1;

            ConvolutionKernelF ker = new ConvolutionKernelF(kernel);

            Image <Gray, float> convoluted = grayImg * ker;


            form.SetImage(new Image <Bgr, byte>(convoluted.Bitmap));
            form.Refresh();
        }
        private void button4_Click(object sender, EventArgs e)
        {
            float[,] kernel;
            Image <Gray, float> _img = img;
            var grayImg = img.Convert <Gray, float>();


            kernel = GetMatrixByKValue((int)numericUpDown1.Value);


            ConvolutionKernelF ker = new ConvolutionKernelF(kernel);

            Image <Gray, float> convoluted = grayImg * ker;


            form.SetImage(new Image <Bgr, byte>(convoluted.Bitmap));
            form.Refresh();
        }
示例#24
0
        private Image <Gray, float> OrientedHighPass(Image <Gray, byte> image)
        {
            Image <Gray, float> filtered = new Image <Gray, float>(image.Size);
            Image <Gray, float> final    = new Image <Gray, float>(image.Size);

            // import parameters
            int smoothOpSize = 1;
            int filterLength = 22;
            int angleStep    = 1;

            // construct the kernel
            float[,,] k3 = new float[1, 5, 1]
            {
                { { -1 }, { -1 }, { 4 }, { -1 }, { -1 } },
            };
            Image <Gray, float> kRow           = new Image <Gray, float>(k3);
            Image <Gray, float> kImageOriginal = kRow;

            for (int l = 0; l < filterLength - 1; ++l)
            {
                kImageOriginal = kImageOriginal.ConcateVertical(kRow);
            }

            // first step, smooth image
            image._SmoothGaussian(smoothOpSize);

            for (int angle = 0; angle < 180; angle += angleStep)
            {
                // Create convolution kernel
                Image <Gray, float> kImage = kImageOriginal.Rotate(angle, new Gray(0), false);
                // make sure the average of the kernel stays zero
                kImage = kImage - (kImage.GetSum().Intensity / (kImage.Width * kImage.Height));

                float[,] k = new float[kImage.Height, kImage.Width];
                Buffer.BlockCopy(kImage.Data, 0, k, 0, k.Length * sizeof(float));
                ConvolutionKernelF kernel = new ConvolutionKernelF(k);

                filtered = image.Convolution(kernel);

                final = filtered.Max(final);
            }

            return(final);
        }
示例#25
0
        private void BuildConvolution()
        {
            int   kernelHeight      = 1;
            int   kernelWidth       = 32;
            float kernelTotalWeight = 0;
            float kernelSize        = kernelWidth * kernelHeight;

            float[,] kernelValues = new float[kernelHeight, kernelWidth];

            for (int i = 0; i < kernelHeight; i++)
            {
                for (int j = 0; j < kernelWidth; j++)
                {
                    float weight         = 0f;
                    int   distFromCentre = Math.Abs(j - (kernelWidth / 2 - 1));

                    if (distFromCentre < 3)
                    {
                        weight = Math.Abs(distFromCentre) * 20;
                    }
                    else if (distFromCentre < 10)
                    {
                        weight = 0;
                    }
                    else
                    {
                        weight = -Math.Abs(distFromCentre);
                    }

                    kernelValues[i, j] = weight;
                    kernelTotalWeight += weight;
                }
            }

            for (int i = 0; i < kernelHeight; i++)
            {
                for (int j = 0; j < kernelWidth; j++)
                {
                    kernelValues[i, j] = kernelValues[i, j] / Math.Abs(kernelTotalWeight);
                }
            }

            m_KernelPole = new ConvolutionKernelF(kernelValues);
        }
示例#26
0
        private void btnClick_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "" || textBox4.Text == "" || textBox5.Text == "" ||
                textBox6.Text == "" || textBox7.Text == "" || textBox8.Text == "" || textBox9.Text == "")
            {
                ErrorForm errorForm = new ErrorForm("Macierz nie została wypełniona w całości!");
                return;
            }
            float[,] k = new float[, ] {
                { float.Parse(textBox1.Text, CultureInfo.InvariantCulture.NumberFormat), float.Parse(textBox2.Text, CultureInfo.InvariantCulture.NumberFormat), float.Parse(textBox3.Text, CultureInfo.InvariantCulture.NumberFormat) },
                { float.Parse(textBox4.Text, CultureInfo.InvariantCulture.NumberFormat), float.Parse(textBox5.Text, CultureInfo.InvariantCulture.NumberFormat), float.Parse(textBox6.Text, CultureInfo.InvariantCulture.NumberFormat) },
                { float.Parse(textBox7.Text, CultureInfo.InvariantCulture.NumberFormat), float.Parse(textBox8.Text, CultureInfo.InvariantCulture.NumberFormat), float.Parse(textBox9.Text, CultureInfo.InvariantCulture.NumberFormat) }
            };
            ConvolutionKernelF kernel = new ConvolutionKernelF(k);
            var img    = ((Bitmap)pictureList[tabControl.SelectedIndex].Image).ToImage <Bgr, byte>();
            var imgDst = new Image <Bgr, byte>(pictureList[tabControl.SelectedIndex].Image.Width,
                                               pictureList[tabControl.SelectedIndex].Image.Height, new Bgr(0, 0, 0));

            Emgu.CV.CvInvoke.Filter2D(img, imgDst, kernel, new Point(-1, -1), 0, borderType: Emgu.CV.CvEnum.BorderType.Replicate);
            pictureList[tabControl.SelectedIndex].Image = imgDst.ToBitmap();
        }
示例#27
0
        //фильтр Прюитта
        private Image <Bgr, byte> Prewitt(Image <Bgr, byte> img, int aperture)
        {
            // двумерные массивы для инициализации ядер оператора Прюитта
            float[,] arrayX = new float[, ] {
                { -1, 0, 1 }, { -1, 0, 1 }, { -1, 0, 1 },
            };
            float[,] arrayY = new float[, ] {
                { -1, -1, -1 }, { 0, 0, 0 }, { 1, 1, 1 }
            };

            // горизонтальное ядро
            ConvolutionKernelF kernelX = new ConvolutionKernelF(arrayX);
            // пертикальное ядро
            ConvolutionKernelF kernelY = new ConvolutionKernelF(arrayY);

            // Получаем ч/б изображение
            Image <Gray, byte> grayImage = new Image <Gray, byte>(img.Bitmap);
            // Изображения для размытия по гауссу
            Image <Gray, float> gauss = new Image <Gray, float>(img.Size);
            // результирующее изображение
            Image <Bgr, byte> finalImage = new Image <Bgr, byte>(img.Size);

            //применяем фильтр гаусса с заданной апертурой
            CvInvoke.GaussianBlur(grayImage.Mat, gauss.Mat, new Size(aperture, aperture), 0);
            // применяем ядра к полученному размытому изображению
            Image <Gray, float> imageX = gauss * kernelY;
            Image <Gray, float> imageY = gauss * kernelX;

            // складываем X и Y составляющую изображения
            finalImage = (imageX + imageY).AbsDiff(new Gray(0.0)).Convert <Bgr, byte>();

            // очищаем память
            imageX.Dispose();
            imageY.Dispose();
            gauss.Dispose();
            grayImage.Dispose();

            // возвращаем изображение
            return(finalImage);
        }
示例#28
0
        static Image <Gray, Byte> reducenoise(Image <Gray, Byte> image)
        {
            Int32 biperagain = 75;

            float mid    = 0.7F;
            float margin = (1 - mid) / 8;

            float[,] matrixKernel = new float[3, 3] {
                { margin, margin, margin },
                { margin, mid, margin },
                { margin, margin, margin }
            };


            //float[,] matrixKernel = new float[7, 7] { { 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F},
            //                                         { 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F},
            //                                          { 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F},
            //                                         { 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F},
            //                                         { 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F},
            //                                        { 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F},
            //                                        { 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F, 0.02F} };

            //float[,] matrixKernel = new float[3, 3] {{ 0,-1, 0 },{-1, 5,-1 },{ 0,-1, 0 }};


            ConvolutionKernelF matrix = new ConvolutionKernelF(matrixKernel);
            //Image<Bgr, float> result = new Image<Bgr, float>(image.Width, image.Height);
            Image <Gray, float> result = new Image <Gray, float>(image.Width, image.Height);

            CvInvoke.Filter2D(image, result, matrix, new Point(0, 0));
            //Image<Bgr, Byte> BGRResult = result.Convert<Bgr, Byte>();
            //Image<Bgr, Byte> BGRResult = result.ConvertScale<byte>(1, 0);
            Image <Gray, Byte> BGRResult = result.ConvertScale <byte>(1, 0);


            Image <Gray, Byte> BGRResult2 = grayturnbinary(BGRResult, biperagain);

            return(BGRResult2);
        }
示例#29
0
        private void button1_Click(object sender, EventArgs e)
        {
            float[,] kernel;
            Image <Gray, float> B = img[2];
            Image <Gray, float> G = img[1];
            Image <Gray, float> R = img[0];


            if (radioButton1.Checked)
            {
                kernel = mask1;
            }
            else if (radioButton2.Checked)
            {
                kernel = mask2;
            }
            else
            {
                kernel = mask3;
            }


            ConvolutionKernelF ker = new ConvolutionKernelF(kernel);

            Image <Gray, float> convolutedR = R * ker;
            Image <Gray, float> convolutedG = G * ker;
            Image <Gray, float> convolutedB = B * ker;

            Image <Bgr, float> afterSharpening = img;

            afterSharpening[0] = convolutedR;
            afterSharpening[1] = convolutedG;
            afterSharpening[2] = convolutedB;

            form.SetImage(new Image <Bgr, byte>(afterSharpening.Bitmap));
            form.Refresh();
        }
示例#30
0
文件: Form1.cs 项目: CR-Ko/testFilter
        private void button3_Click(object sender, EventArgs e)
        {
            int W = Train_I.Width;
            int H = Train_I.Height;        
            Image<Gray, Double> gaborResult_R = new Image<Gray, Double>(W, H);     
            double[, ,] gaborResult_R2 = new double[m, n, 1];        
            float[] gF_R_One_back = new float[m*n];         
            float[,] gF_R_back = new float[m, n];
            double[,] gaborResult_R3 = new double[H, W];
            double[] gaborResult_R3_One = new double[H * W];
            double[,] gaborResult_R_Mat = new double[W * H, 40];

            Image<Gray, Double> gaborResult_I = new Image<Gray, Double>(W, H);
            double[, ,] gaborResult_I2 = new double[m, n, 1];
            float[] gF_I_One_back = new float[m * n];
            float[,] gF_I_back = new float[m, n];
            double[,] gaborResult_I3 = new double[H, W];
            double[] gaborResult_I3_One = new double[H * W];
            double[,] gaborResult_I_Mat = new double[W * H, 40];

            for(int p = 0; p < u*v ; p++)
            {
           // gF_R_One_back = PickUpFilterFloat(gF_R_Mat, p);


            gF_R_back = OneToTwoFloat(gF_R_One_back);
            ConvolutionKernelF matrix_R = new ConvolutionKernelF(gF_R_back);
            CvInvoke.cvFilter2D(Train_I, gaborResult_R, matrix_R, new Point(0, 0));           
            gaborResult_R2 = gaborResult_R.Data;
            gaborResult_R3 = ArrayDownDim(gaborResult_R2);
           
                
           gaborResult_R3_One = PickUpResultDouble(gaborResult_R3,p);

           // gF_I_One_back = PickUpFilterFloat(gF_I_Mat, p);
            gF_I_back = OneToTwoFloat(gF_I_One_back);
            ConvolutionKernelF matrix_I = new ConvolutionKernelF(gF_I_back);
            CvInvoke.cvFilter2D(Train_I, gaborResult_I, matrix_I, new Point(0, 0));
            gaborResult_I2 = gaborResult_I.Data;
            gaborResult_I3 = ArrayDownDim(gaborResult_I2);
            gaborResult_I3_One = PickUpResultDouble(gaborResult_I3,p);
            

                for (int q = 0; q < H ; q++)
                {
                     
                      //System.Console.WriteLine(" q= " + q);
                      gaborResult_R_Mat[ q , p] = gaborResult_R3_One[q];
                      gaborResult_I_Mat[  q , p] = gaborResult_I3_One[q];
                     // System.Console.WriteLine(" gaborResult_R_Mat = " + gaborResult_I_Mat[q, p]);
                }
            }         
                int aa = 100;
               System.Console.WriteLine(" j = " + aa);
        }
示例#31
0
        private void button1_Click(object sender, EventArgs e)
        {
            if (op.ShowDialog() == DialogResult.OK)
            {
                //แปลงภาพเป็น สีเทา

                image1 = new Image <Bgr, byte>(op.FileName);
                image1 = image1.Resize(1200, 800, Emgu.CV.CvEnum.Inter.Linear, true);

                Image <Gray, byte> Gray = image1.Convert <Gray, byte>();
                //----------------------------------------------
                //เบลอภาพด้วย SmoothGaussian
                Gray = Gray.SmoothGaussian(9);
                //ทำการEqualize
                Gray._EqualizeHist();
                imageBox2.Image = Gray;
                //---------------------------------------------


                //------
                // การทำBinarization เป็นภาพแบบ ไบนารี่
                Binarization = new Image <Gray, byte>(Gray.Width, Gray.Height, new Gray(0));
                //เป็นการทำ Otsu Threshold
                CvInvoke.Threshold(Gray, Binarization, 0, 255, Emgu.CV.CvEnum.ThresholdType.Otsu | Emgu.CV.CvEnum.ThresholdType.Binary);
                //ในlaw บอกว่าต้องใช่Otsu ร่วมกับ Binary ด้วย
                imageBox3.Image = Binarization;
                histogramBox3.ClearHistogram();
                histogramBox3.GenerateHistograms(Gray, 256);
                histogramBox3.Refresh();
                //---------------------------------------------------------
                // หาขอบภาพด้วย canny edge detection
                cny = Binarization.Canny(180, 120);

                //-----------------การขยายภาพDilate----------------
                cny._Dilate(3);


                // -----ทำการConvolution ภาพ

                ConvolutionKernelF convolutionKernelF = new ConvolutionKernelF(3, 3);

                cny.Convolution(convolutionKernelF);

                imageBox1.Image = cny;

                //---------------------วาดภาพ ---------------------------------


                //Call HoughCircles (Canny included)

                CircleF[] circleFs = cny.HoughCircles(
                    new Gray(180), //cannyThreshold
                    new Gray(450), //accumulatorThreshold
                    6.0,           //dp
                    15.0,          //minDist
                    5,             //minRadius
                    0              //maxRadius
                    )[0];
                // Draw circles
                int outputva = 0; //ตัวแปรนับเหรียญ
                Image <Bgr, Byte> imageCircles = new Image <Bgr, byte>(cny.Size);
                foreach (CircleF circle in circleFs)
                {
                    imageCircles.Draw(circle, new Bgr(Color.Red), 5);
                    outputva++;
                }

                //show
                imageBox4.Image = imageCircles;
                textBox1.Text   = outputva.ToString();
            }
        }
示例#32
0
      public void TestConvolutionAndLaplace()
      {
         if (CudaInvoke.HasCuda)
         {
            Image<Gray, Byte> image = new Image<Gray, byte>(300, 400);
            image.SetRandUniform(new MCvScalar(0.0), new MCvScalar(255.0));

            float[,] k = { {0, 1, 0},
                        {1, -4, 1},
                        {0, 1, 0}};
            using (ConvolutionKernelF kernel = new ConvolutionKernelF(k))
            using (Stream s = new Stream())
            using (GpuMat cudaImg = new GpuMat(image))
            using (GpuMat cudaLaplace = new GpuMat())
            using (CudaLinearFilter cudaLinear = new CudaLinearFilter(DepthType.Cv8U, 1, DepthType.Cv8U, 1, kernel, kernel.Center))
            using (GpuMat cudaConv = new GpuMat())
            using (CudaLaplacianFilter laplacian = new CudaLaplacianFilter(DepthType.Cv8U, 1, DepthType.Cv8U, 1, 1, 1.0))
            {
               cudaLinear.Apply(cudaImg, cudaConv, s);
               laplacian.Apply(cudaImg, cudaLaplace, s);
               s.WaitForCompletion();
               Assert.IsTrue(cudaLaplace.Equals(cudaConv));
            }
         }
      }
示例#33
0
文件: Form1.cs 项目: CR-Ko/testFilter
        }  // End of the function 'singleGaborFilter_Imag'

        private void button3_Click(object sender, EventArgs e)
        {
            int W = Train_I.Width;
            int H = Train_I.Height;
            double[, ,] t = new double[H, W, 1];
            double[,] img = new double[H, W];
            t = Train_Img.Data;
            img = ArrayDownDim(t);

            Image<Gray, Double> gaborResult_R = new Image<Gray, Double>(W, H);
            Image<Gray, Double> gaborResult_I = new Image<Gray, Double>(W, H);
            double[, ,] gaborResult_R2 = new double[m, n, 1];
            double[, ,] gaborResult_I2 = new double[m, n, 1];
            ConvolutionKernelF matrix_R = new ConvolutionKernelF((float)a);
            ConvolutionKernelF matrix_I = new ConvolutionKernelF(gFilterImag);
            CvInvoke.cvFilter2D(Train_I, gaborResult_R, matrix_R, new Point(0, 0));
            CvInvoke.cvFilter2D(Train_I, gaborResult_I, matrix_I, new Point(0, 0));
            gaborResult_R2 = gaborResult_R.Data;
            gaborResult_I2 = gaborResult_I.Data;
            double[,] gaborResult_R3 = new double[m, n];
            double[,] gaborResult_I3 = new double[m, n];
        }
示例#34
0
文件: Form1.cs 项目: CR-Ko/testFilter
        private void button2_Click(object sender, EventArgs e)
        {

            // Image<Gray, float> image;

            //Point anchor = new Point(-1, -1);
            float[,] kernel = new float[5, 5] {
                                            { 0, 1, 0 ,1,0 }, 
                                            { 1, -4, 1 ,0,1},
                                            { 0, 1, 0 ,1, 1} ,
                                            { 1, -4, 1 ,0,1},
                                             { 0, 1, 0 ,1,0 }, 
            };

            double[,] test = new double[3, 3] {
                                            { 0, 1, 0 }, 
                                            { 1, -4, 1 },
                                            { 0, 1, 0 } ,                                                                     
            };
     
            int u = 3; float v = 5.0F; float j = 1.0F;
            int m = 39; int n = 39;
            //int m = 2; int n = 2;
            
            const float PI = (float)Math.PI;
            float tetav = (j * PI)/(v + 1) ;
            float fmax = 0.25F;
            float gama = (float)Math.Sqrt(2);
            float eta = (float)Math.Sqrt(2);
            float fu = (float)(fmax / Math.Pow((Math.Sqrt(2)), u-1));
            float alpha = fu / gama;
            float beta = fu / eta;
            
            float[,] gFilterReal = new float[m, n];
            float[,] gFilterImag = new float[m, n];

            ////
            for (int x = 0; x < m; x++)
            {
                for (int y = 0; y < n; y++)
                {
                    //double a1 = Math.Cos(tetav);
                    //double a2 = (x + 1 - (0.5 * (m + 1)));
                    //double a3 = (y + 1 - (0.5 * (m + 1)));
                    float xprime = (float)((x + 1 - (0.5 * (m + 1))) * Math.Cos(tetav) + ((y + 1 - (0.5 * (n + 1)))) * Math.Sin(tetav));
                    float yprime = (float)((-1.0) * (  (x + 1 - (0.5 * (m + 1))) * Math.Sin(tetav) +
                                                                       (y + 1 - (0.5 * (n + 1))) * Math.Cos(tetav)

                                                                    )
                                                      );


                    float Con = (float)((Math.Pow(fu, 2)) / (PI * gama * eta));
                    float Gauss = (float)(Con * Math.Exp(-((Math.Pow(alpha, 2) * Math.Pow(xprime, 2)) +
                                                                                                (Math.Pow(beta, 2) * Math.Pow(yprime, 2))
                                                                                      )
                                                                                    )
                                                       );
                    Complex z = new Complex(Gauss * Math.Cos(2 * PI * fu * xprime), Gauss * Math.Sin(2 * PI * fu * xprime));
                    gFilterReal[x, y] = (float)z.Real;
                    gFilterImag[x, y] = (float)z.Imaginary;

                }
            }

            ///    debug
             //int x = 1;
             //int y = 1;
             //       double a1 = Math.Cos(tetav);
             //       double a2 = (x + 1 - (0.5 * (m + 1)));
             //       double a3 = (y + 1 - (0.5 * (m + 1)));
             //       float xprime = (float)((x + 1 - (0.5 * (m + 1))) * Math.Cos(tetav) + ((y + 1 - (0.5 * (n + 1)))) * Math.Sin(tetav));

             //       float yprime = (float)((-1.0) * ((x + 1 - (0.5 * (m + 1))) * Math.Sin(tetav) + (y + 1 - (0.5 * (n + 1))) * Math.Cos(tetav)
                                                                               
             //                                                       )
             //                                         );


             //       float Con = (float)((Math.Pow(fu, 2)) / (PI * gama * eta));
             //       float Gauss = (float)( Math.Exp(-((Math.Pow(alpha, 2) * Math.Pow(xprime, 2)) +
             //                                                                                   (Math.Pow(beta, 2) * Math.Pow(yprime, 2))
             //                                                                         )
             //                                                                       )
             //                                          );
             //       Complex z = new Complex(Con*Gauss * Math.Cos(2 * PI * fu * xprime),Con* Gauss * Math.Sin(2 * PI * fu * xprime));
             //       gFilterReal[x, y] = (float)z.Real;
             //       gFilterImag[x, y] = (float)z.Imaginary;


             //       double yy = Con*Gauss * Math.Sin(2 * PI * fu * xprime);
              
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    double scale = 0.5;
                    //Image<Gray, Byte> image = new Image<Gray, byte>(ofd.FileName);
                    Train_I = new Image<Gray, byte>(ofd.FileName).Resize(scale, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR); //////原影像                  

                    //CvInvoke.cvShowImage("Image<Bgr, Byte>", Train_I);
                    Train_Img = Train_I.Convert<Gray,double>() ;
                 
                    int W = Train_I.Width;
                    int H = Train_I.Height;
                    double[,,] t = new double[H, W,1];
                    double[,] img = new double[H, W];
                    t = Train_Img.Data;
                    img = ArrayDownDim(t);

                    Image<Gray, Double> gaborResult_R = new Image<Gray, Double>(W, H);
                    Image<Gray, Double> gaborResult_I = new Image<Gray, Double>(W, H);
                    double[,,] gaborResult_R2 = new double[m,n,1];
                    double[,,] gaborResult_I2 = new double[m, n, 1];
                    //gFilterReal;
                    //gFilterImag;
                    ConvolutionKernelF matrix_R = new ConvolutionKernelF(gFilterReal);
                    ConvolutionKernelF matrix_I = new ConvolutionKernelF(gFilterImag);
                    CvInvoke.cvFilter2D(Train_I, gaborResult_R, matrix_R, new Point(0, 0));
                    CvInvoke.cvFilter2D(Train_I, gaborResult_I, matrix_I, new Point(0, 0));
                    gaborResult_R2 =  gaborResult_R.Data;
                    gaborResult_I2 = gaborResult_I.Data;
                    double[,] gaborResult_R3 = new double[m, n];
                    double[,] gaborResult_I3 = new double[m, n];
                    //Matrix<double> M = new Matrix<double>(m, n);
                    //double min, max;
                    //Point point1, point2;
                    //M.MinMax(out min, out max, out point1, out point2);

                    //Image<Bgr, byte> I = new Image<Bgr, byte>(M.Size);
                    //M.Convert<byte>().CopyTo(I);
                    //I.Save(@"D:\程式區\output.bmp");
                    gaborResult_R3 = ArrayDownDim(gaborResult_R2);
                    gaborResult_I3 = ArrayDownDim(gaborResult_I2);

                    double[,] gaborAbs = new double[m, n];
                    double[] gaborAbsDone = new double[m * n];
                    double[] gaborAbsOne = new double[m * n];
                    double gaborAbsOneStd, gaborAbsOneMean;
                    gaborAbs = ComplexAbs(gaborResult_R3, gaborResult_I3);             
                    gaborAbsOne = TwoToOne(gaborAbs);
                    gaborAbsOneStd = StandardDeviation(gaborAbsOne);
                    gaborAbsOneMean = Average(gaborAbsOne);
                    gaborAbsDone = ArrayMultip(ArrayAdd(gaborAbsOne, gaborAbsOneMean), gaborAbsOneStd);

                    //CvInvoke.cvShowImage("Image<Gray, Byte>", result_I);

                    /// Excel

                    string pathFile = @"D:\程式區\gaborResultRealCS05j0F";
                    //string pathFile = @"D:\程式區\gaborResultRealCS05j1F";
                    //string pathFile = @"D:\程式區\gaborResultImagCS05j1F";
                    //string pathFile = @"D:\程式區\gaborAbsCS05j1F";
                    //string pathFile = @"D:\程式區\gaborAbsOneCS05j1F";
                   // string pathFile = @"D:\程式區\gFilterR_CS05j1F";
                  // string pathFile = @"D:\程式區\gFilterI_CS05j1F";
                    Excel.Application excelApp;
                    Excel._Workbook wBook;
                    Excel._Worksheet wSheet;
                    Excel.Range wRange;

                    // 開啟一個新的應用程式
                    excelApp = new Excel.Application();

                    // 讓Excel文件可見
                    excelApp.Visible = true;

                    // 停用警告訊息
                    excelApp.DisplayAlerts = false;

                    // 加入新的活頁簿
                    excelApp.Workbooks.Add(Type.Missing);

                    // 引用第一個活頁簿
                    wBook = excelApp.Workbooks[1];

                    // 設定活頁簿焦點
                    wBook.Activate();

                    try
                    {
                        // 引用第一個工作表
                        wSheet = (Excel._Worksheet)wBook.Worksheets[1];

                        // 命名工作表的名稱
                        wSheet.Name = "Resize";

                        // 設定工作表焦點
                        wSheet.Activate();

                        //excelApp.Cells[1, 1] =img[0,0];
                        // 設定第1列資料
                       // excelApp.Cells[1, 1] = "名稱";
                        //excelApp.Cells[1, 2] = kernel[1, 1];


                        for (int q = 0; q < W; q++)
                        {
                            for (int p = 0; p < H; p++)
                            {
                                //System.Console.WriteLine(p);
                                // System.Console.WriteLine(q); 
                                //excelApp.Cells[p + 1, q + 1] = gaborAbs[p, q];                      
                              // excelApp.Cells[p + 1, q + 1] = gaborResult_R3[p, q];
                               // excelApp.Cells[p + 1, q + 1] = gaborResult_I3[p, q];
                               // excelApp.Cells[p + 1, q + 1] = gaborAbs[p, q];
                            }
                        }


                        for (int q = 0; q < n; q++)
                        {
                            for (int p = 0; p < m; p++)
                            {
                              //   excelApp.Cells[p + 1, q + 1] = gFilterReal[p, q];
                               excelApp.Cells[p + 1, q + 1] = gFilterImag[p, q];
                               //excelApp.Cells[p + 1, q + 1] = matrix_R[p, q];
                               //excelApp.Cells[p + 1, q + 1] = matrix_I[p, q];
                            }
                        }


                        //for (int q = 0; q < W*H; q++)
                        //{
                        //        excelApp.Cells[q+1 , 1] = gaborAbsOne[q];
                        //}           


                        // 設定第1列顏色
                        wRange = wSheet.Range[wSheet.Cells[1, 1], wSheet.Cells[1, 2]];
                        wRange.Select();
                        wRange.Font.Color = ColorTranslator.ToOle(Color.White);
                        wRange.Interior.Color = ColorTranslator.ToOle(Color.DimGray);

                        // 設定第2列資料
                        //excelApp.Cells[2, 1] = "AA";
                        //excelApp.Cells[2, 2] = "10";

                        // 設定第3列資料
                        //excelApp.Cells[3, 1] = "BB";
                        //excelApp.Cells[3, 2] = "20";

                        // 設定第4列資料
                        //excelApp.Cells[4, 1] = "CC";
                        //excelApp.Cells[4, 2] = "30";

                        // 設定第5列資料
                        //excelApp.Cells[5, 1] = "總計";
                        // 設定總和公式 =SUM(B2:B4)
                       // excelApp.Cells[5, 2].Formula = string.Format("=SUM(B{0}:B{1})", 2, 4);
                        // 設定第5列顏色
                        wRange = wSheet.Range[wSheet.Cells[5, 1], wSheet.Cells[5, 2]];
                        wRange.Select();
                        wRange.Font.Color = ColorTranslator.ToOle(Color.Red);
                        wRange.Interior.Color = ColorTranslator.ToOle(Color.Yellow);

                        // 自動調整欄寬
                        wRange = wSheet.Range[wSheet.Cells[1, 1], wSheet.Cells[5, 2]];
                        wRange.Select();
                        wRange.Columns.AutoFit();

                        try
                        {
                            //另存活頁簿
                            wBook.SaveAs(pathFile, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                            Console.WriteLine("儲存文件於 " + Environment.NewLine + pathFile);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("儲存檔案出錯,檔案可能正在使用" + Environment.NewLine + ex.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("產生報表時出錯!" + Environment.NewLine + ex.Message);
                    }

                    //關閉活頁簿
                    wBook.Close(false, Type.Missing, Type.Missing);

                    //關閉Excel
                    excelApp.Quit();

                    //釋放Excel資源
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                    wBook = null;
                    wSheet = null;
                    wRange = null;
                    excelApp = null;
                    GC.Collect();

                    Console.Read();
                    /// Excel end

                }
            }
        }
示例#35
0
        private void BuildConvolution()
        {
            int kernelHeight = 1;
            int kernelWidth = 32;
            float kernelTotalWeight = 0;
            float kernelSize = kernelWidth * kernelHeight;
            float[,] kernelValues = new float[kernelHeight, kernelWidth];

            for (int i = 0; i < kernelHeight; i++)
                for (int j = 0; j < kernelWidth; j++)
                {
                    float weight = 0f;
                    int distFromCentre = Math.Abs(j - (kernelWidth / 2 - 1));

                    if (distFromCentre < 3)
                        weight = Math.Abs(distFromCentre) * 20;
                    else if (distFromCentre < 10)
                        weight = 0;
                    else
                        weight = -Math.Abs(distFromCentre);

                    kernelValues[i, j] = weight;
                    kernelTotalWeight += weight;
                }

            for (int i = 0; i < kernelHeight; i++)
                for (int j = 0; j < kernelWidth; j++)
                {
                    kernelValues[i, j] = kernelValues[i, j] / Math.Abs(kernelTotalWeight);
                }

            m_KernelPole = new ConvolutionKernelF(kernelValues);
        }
示例#36
0
      public void TestConvolutionAndLaplace()
      {
         Image<Gray, Byte> image = new Image<Gray, byte>(300, 400);
         image.SetRandUniform(new MCvScalar(0.0), new MCvScalar(255.0));

         Image<Gray, float> laplace = image.Laplace(1);

         float[,] k = { {0, 1, 0},
                        {1, -4, 1},
                        {0, 1, 0}};
         ConvolutionKernelF kernel = new ConvolutionKernelF(k);

         Image<Gray, float> convoluted = image * kernel;

         Image<Gray, float> absDiff = new Image<Gray, float>(convoluted.Size);
         CvInvoke.AbsDiff(laplace, convoluted, absDiff);
         //Emgu.CV.UI.ImageViewer.Show(absDiff.Convert<Gray, byte>());
         EmguAssert.IsTrue(laplace.Equals(convoluted));

         /*
         try
         {
            Matrix<float> kernel1D = new Matrix<float>(new float[] { 1.0f, -2.0f, 1.0f });
            Image<Gray, float> result = new Image<Gray, float>(image.Width, image.Height);
            CvInvoke.cvFilter2D(image, result, kernel1D, new MCvPoint(0, 1));
         }
         catch (Exception e)
         {
            throw e;
         }*/
      }
示例#37
0
        /// <summary>
        /// claculates gradient
        /// </summary>
        /// <param name="crop">should crop image. (calculate gradient only for center.)</param>
        /// <returns>integer that represents gradient value</returns>
        public static int calcGradiant(bool crop)
        {
            Image<Gray, float> imgGradiant = _imageGray.Convert<Gray, float>();
            if (crop)
            {
                Rectangle sizeToCrop = new Rectangle(_imageGray.Cols / 4, _imageGray.Rows / 4, _imageGray.Cols /2, _imageGray.Rows /2);
            // Crop face
                imgGradiant = _imageGray.Convert<Gray, float>().Copy(sizeToCrop);
                //    imgGradiant.Save("C:\\img\\crp.jpg");

            }

            //smooth the image a little bit
            imgGradiant.SmoothGaussian(3);

            //create filters for differential by X and by Y
            float[,] filterY = {{ 1, 1, 1},
                                {-1,-1,-1}};
            float[,] filterX = {{1,-1},
                                {1,-1},
                                {1,-1}};

            ConvolutionKernelF convFilterY = new ConvolutionKernelF(filterY),
                               convFilterX = new ConvolutionKernelF(filterX);

            Image<Gray, float> diffY = imgGradiant.Convolution(convFilterY);//.Pow(2);
            Image<Gray, float> diffX = imgGradiant.Convolution(convFilterX);//.Pow(2);

            abs(ref diffX, ref diffY);
            // abs(ref diffY);
            imgGradiant = diffX.Add(diffY);

            /*     imgGradiant.Save("C:\\img\\notsharpGradient1.JPG");
                 ////display the image
              ImageViewer viewer = new ImageViewer(); //create an image viewer
                 viewer.Image = imgGradiant;
                 viewer.Show();//show the image viewer
             */

            //calculates the integral of the gradiant image
            MCvScalar sum = CvInvoke.cvSum(imgGradiant);
            int gradientSum = (int)(sum.v0 / (imgGradiant.Rows * imgGradiant.Cols));

            //dealllocate image
            if (imgGradiant != null)
            {
                imgGradiant.Dispose();
            }
            if (diffY != null)
            {
                diffY.Dispose();
            }
            if (diffX != null)
            {
                diffX.Dispose();
            }
            imgGradiant = null;
            diffX = null;
            diffY = null;
            GC.Collect();

            return gradientSum;
        }
        public Image<Bgr, byte> GetHighBoostFilteredImage(Image<Bgr, byte> sourceImage, float allFactor, MaskType type)
        {
            Image<Bgr, byte> returnImage = new Image<Bgr, byte>(sourceImage.Width, sourceImage.Height);
            float[,] firstTypeMatrix = new float[3, 3]
            {
                {0, -1, 0},
                { -1, allFactor + 4, -1},
                { 0, -1, 0}
            };
            float[,] secondTypeMatrix = new float[3, 3]
            {
                {-1, -1, -1},
                { -1, allFactor + 8, -1},
                {-1, -1, -1}
            };

            ConvolutionKernelF matrix = null;
            switch (type)
            {
                case MaskType.Type1:
                    matrix = new ConvolutionKernelF(firstTypeMatrix);
                    break;
                case MaskType.Type2:
                    matrix = new ConvolutionKernelF(secondTypeMatrix);
                    break;
            }

            CvInvoke.Filter2D(sourceImage, returnImage, matrix, new Point(0, 0));

            return returnImage;
        }
示例#39
0
文件: Form1.cs 项目: CR-Ko/testFilter
       // double[,] gR_Magnitude_Mat;
        
        private void button3_Click(object sender, EventArgs e)
        {
          
            int scanFilterNum=0;
            int W = Train_I.Width;
            int H = Train_I.Height;  
            // Real part
            Image<Gray, Double> gR_R = new Image<Gray, Double>(W, H);
            gR_R2 = new double[m, n, 1];
            gF_R_One_back = new float[m * n];
            gF_R_back = new float[m, n];
            gR_R3 = new double[H, W];
            gR_R3_One = new double[H * W];
           // Ouput
            gR_R_Mat = new double[H * W, u * v];
            // Ouput
            gR_R_Picked = new Matrix<double>(H, W);  
            gR_R_Picked_Map = new Matrix<double>(H, W);
            gR_R_One_Picked = new double[H * W];
            gR_R_Picked_CS = new double[H, W];
            // Imag part
            Image<Gray, Double> gR_I = new Image<Gray, Double>(W, H);
            double[, ,] gR_I2 = new double[m, n, 1];
            float[] gF_I_One_back = new float[m * n];
            float[,] gF_I_back = new float[m, n];
            double[,] gR_I3 = new double[H, W];
            double[] gR_I3_One = new double[H*W];
            // Ouput
            double[,] gR_I_Mat = new double[H*W, u*v];
            // Ouput
            Matrix<double> gR_I_Picked = new Matrix<double>(H, W);
            Matrix<double> gR_I_Picked_Map = new Matrix<double>(H, W);
            double[] gR_I_One_Picked = new double[H * W];
            double[,] gR_I_Picked_CS = new double[H, W];
            Matrix<double> t = new Matrix<double>(H, W);
            ///////////////  Filtered and save as gR_R_Mat / gR_I_Mat //////////////
            for (scanFilterNum = 0; scanFilterNum < u * v; scanFilterNum++)
            {
                System.Console.WriteLine(scanFilterNum);
                // Real part
                gF_R_One_back = PickUpFilterFloat(gF_R_Mat.Data, scanFilterNum);    
                gF_R_back = OneToTwoFloat(gF_R_One_back, m, n);  // OK
                ConvolutionKernelF matrix_R = new ConvolutionKernelF(gF_R_back);
                CvInvoke.cvFilter2D(Train_I, gR_R, matrix_R, new Point(0, 0));
                gR_R2 = gR_R.Data;
                gR_R3 = ArrayDownDim(gR_R2);
                gR_R3_One = TwoToOneDouble(gR_R3);
                // Imag part
                gF_I_One_back = PickUpFilterFloat(gF_I_Mat.Data, pickFilterNum);
                gF_I_back = OneToTwoFloat(gF_I_One_back, m, n);
                ConvolutionKernelF matrix_I = new ConvolutionKernelF(gF_I_back);
                CvInvoke.cvFilter2D(Train_I, gR_I, matrix_I, new Point(0, 0));
                gR_I2 = gR_I.Data;
                gR_I3 = ArrayDownDim(gR_I2);
                gR_I3_One = TwoToOneDouble(gR_I3);
                // Put into Mat
                for (int q = 0; q < H * W; q++)
                {
                    gR_R_Mat[q, scanFilterNum] = gR_R3_One[q];
                    gR_I_Mat[q, scanFilterNum] = gR_I3_One[q];

                   // gR_Magnitude_Mat[q, scanFilterNum] = Math.Sqrt((Math.Pow(gR_R3_One[q], 2) + Math.Pow(gR_I3_One[q], 2)));
                 }

             }
            ///////////////  END Filtered and save as gR_R_Mat / gR_I_Mat //////////////

                //////////////////////////////////////////////////////////////////// Test  START/////////////////////////////////////////////////////////////////
                double Imin; double Imax; Point IminLoc; Point ImaxLoc;
                t.Data = gR_R3;
                t.MinMax(out Imin, out Imax, out IminLoc, out ImaxLoc);
                double kkk = ((Imax - Imin) / 255);
                int W_gR_R3 = t.Width;
                int H_gR_R3 = t.Height;
                for (int i = 0; i < H_gR_R3; i++)
                {
                    for (int j = 0; j < W_gR_R3; j++)
                    {
                        t.Data[i, j] = (float)(((t.Data[i, j] - (float)Imax) / kkk) + 255);  // Mapping
                    }
                }
                t.Save(@"D:\Code\gF_R_back.bmp");
                pictureBox7.Image = Image.FromFile(@"D:\Code\gF_R_back.bmp");
                //////////////////////////////////////////////////////////////////// Test END /////////////////////////////////////////////////////////////////
               
               
            ///////////////////////////////  Show Real Part ////////////////////////////////
            pickResultNum = 0;
            gR_R_One_Picked = PickUpResultDouble(gR_R_Mat, pickResultNum);   // Choose the p-th Gabor filtered Result 
            gR_R_Picked_CS = OneToTwoDouble(gR_R_One_Picked,H,W);       
            gR_R_Picked.Data = gR_R_Picked_CS;
            // Show the choose filtered Result, mapping pixel value to [0,255]
            double R_Rmin; double R_Rmax; Point R_RminLoc; Point R_RmaxLoc;
            gR_R_Picked.MinMax(out R_Rmin, out R_Rmax, out R_RminLoc, out R_RmaxLoc);          
            double k = ((R_Rmax - R_Rmin) / 255);
            int H_gR_R_Picked = gR_R_Picked.Rows;
            int W_gR_R_Picked = gR_R_Picked.Cols;
            for (int i = 0; i < H_gR_R_Picked; i++)
            {
                for (int j = 0; j < W_gR_R_Picked; j++)
                {
                    gR_R_Picked_Map.Data[i, j] = (( (gR_R_Picked.Data[i, j] - R_Rmin) / k)  );      // Mapping 
                }
            }
            gR_R_Picked_Map.Save(@"D:\Code\gR_R_Picked_Map.bmp");
            pictureBox3.Image = Image.FromFile(@"D:\Code\gR_R_Picked_Map.bmp");
            ///////////////////////////////  Show Imagl Part ////////////////////////////////
            gR_I_One_Picked = PickUpResultDouble(gR_I_Mat, pickResultNum);   // Choose the p-th Gabor filtered Result 
            gR_I_Picked_CS = OneToTwoDouble(gR_I_One_Picked, H, W);
            gR_I_Picked.Data = gR_I_Picked_CS;
            // Show the choose filtered Result, mapping pixel value to [0,255]
            double I_Rmin; double I_Rmax; Point I_RminLoc; Point I_RmaxLoc;
            gR_I_Picked.MinMax(out I_Rmin, out I_Rmax, out I_RminLoc, out I_RmaxLoc);
            double kk = ((I_Rmax - I_Rmin) / 255);
            int H_gR_I_Picked = gR_I_Picked.Rows;
            int W_gR_I_Picked = gR_I_Picked.Cols;
            for (int i = 0; i < H_gR_I_Picked; i++)
            {
                for (int j = 0; j < W_gR_I_Picked; j++)
                {
                    gR_I_Picked_Map.Data[i, j] = (((gR_I_Picked.Data[i, j] - I_Rmin) / kk));      // Mapping 
                }
            }
            gR_I_Picked_Map.Save(@"D:\Code\gR_I_Picked_Map.bmp");
            pictureBox6.Image = Image.FromFile(@"D:\Code\gR_I_Picked_Map.bmp");
            label14.Text = "pickResultNum = " + pickResultNum;          
            System.Console.WriteLine(" END OF button3_Click: Gabor Result");
        }
示例#40
0
        public FeatureRecognizer()
        {
            isTrained = false;

            SVMParameters = new SVMParams();
            SVMParameters.SVMType = Emgu.CV.ML.MlEnum.SVM_TYPE.C_SVC;
            //SVMParameters.SVMType = Emgu.CV.ML.MlEnum.SVM_TYPE.NU_SVC;
            //p.KernelType = Emgu.CV.ML.MlEnum.SVM_KERNEL_TYPE.POLY;
            //SVMParameters.KernelType = Emgu.CV.ML.MlEnum.SVM_KERNEL_TYPE.LINEAR;
            SVMParameters.KernelType = Emgu.CV.ML.MlEnum.SVM_KERNEL_TYPE.POLY;
            //SVMParameters.KernelType = Emgu.CV.ML.MlEnum.SVM_KERNEL_TYPE.RBF;
            SVMParameters.Gamma = 3;
            SVMParameters.Degree = 3;
            SVMParameters.C = 1;
            SVMParameters.TermCrit = new MCvTermCriteria(100, 0.00001);
            //SVMParameters.Nu
            //SVMParameters.P
            //SVMParameters.Coef0 =
            paramsm = new MCvSVMParams();
            paramsm.svm_type = Emgu.CV.ML.MlEnum.SVM_TYPE.C_SVC;
            paramsm.kernel_type = Emgu.CV.ML.MlEnum.SVM_KERNEL_TYPE.LINEAR;
            paramsm.gamma = 2;
            paramsm.degree = 3;
            paramsm.C = 3;
            paramsm.term_crit = new MCvTermCriteria(100, 0.00001);
            //debugImages = new List<DebugImage>();
            debugImages = null;

            //SVMModel = new SVM();
               // foreach(SignShape shape in Enum.GetValues(typeof(SignShape)))
            for (int i = 0;i < signShapeCount;i++)
            {
                SVM model = new SVM();
                SVMModels.Add(model);
            }

            int R = 10;
            int C = 10;
            double v = 2;
            for (int i = 0; i < 8; i++)
            {
                GWOutputImage = GWOutputImage.ConcateHorizontal(GaborWavelet(R, C, i, v));
                Image<Gray, double> GW = GaborWavelet(R, C, i, v);
                ConvolutionKernelF ckernel = new ConvolutionKernelF(10, 10);
                for (int l = 0; l < 10; l++)
                    for (int k = 0; k < 10; k++)
                        ckernel[l, k] = (float)GW[l, k].Intensity / 10000;
                ckernel.Center = new Point(5, 5);
                cKernelList.Add(ckernel);
            }
        }