예제 #1
0
        /// <summary>
        /// Applies Gaussian Filter on the Image Data
        /// </summary>
        /// <param name="FFTData">FFT of the Image</param>
        /// <param name="rL">Lower Homomrphic Threshold</param>
        /// <param name="rH">Upper Homomrphic Threshold</param>
        /// <param name="Sigma"> Spread of the Gaussian</param>
        /// <param name="Slope">Slope of the Sharpness of the Gaussian Filter</param>
        /// <returns></returns>

        public static COMPLEX[,] ApplyFilterHMMFreqDomain(COMPLEX[,] FFTData, float rH, float rL, float Sigma, float Slope)
        {
            COMPLEX[,] Output = new COMPLEX[FFTData.GetLength(0), FFTData.GetLength(1)];
            int i, j, W, H;

            W = FFTData.GetLength(0);
            H = FFTData.GetLength(1);

            double Weight;

            //Taking FFT of Gaussian HPF
            double[,] GaussianHPF = GenerateGaussianKernelHPF(FFTData.GetLength(0), Sigma, Slope, out Weight);

            //Variables for FFT of Gaussian Filter
            COMPLEX[,] GaussianHPFFFT;
            // FFT GaussianFFTObject;

            for (i = 0; i <= GaussianHPF.GetLength(0) - 1; i++)
            {
                for (j = 0; j <= GaussianHPF.GetLength(1) - 1; j++)
                {
                    GaussianHPF[i, j] = GaussianHPF[i, j];// / Weight;
                }
            }

            FFT GaussianFFTObject = new FFT(GaussianHPF);

            GaussianFFTObject.ForwardFFT(GaussianHPF);
            //Shifting FFT for Filtering
            GaussianFFTObject.FFTShift();


            GaussianHPFFFT = GaussianFFTObject.FFTShifted;
            for (i = 0; i <= GaussianHPF.GetLength(0) - 1; i++)
            {
                for (j = 0; j <= GaussianHPF.GetLength(1) - 1; j++)
                {
                    GaussianHPFFFT[i, j].real = (rH - rL) * GaussianHPFFFT[i, j].real + rL;
                    GaussianHPFFFT[i, j].imag = (rH - rL) * GaussianHPFFFT[i, j].imag + rL;
                }
            }

            // Applying Filter on the FFT of the Log Image by Multiplying in Frequency Domain
            Output = MultiplyFFTMatrices(GaussianHPFFFT, FFTData);


            return(Output);
        }
예제 #2
0
        private void button1_Click(object sender, EventArgs e)
        {
            //Reading Image
            int[, ,] ImageDataRGB = HomomorphicFilterObject.ReadImageRGB(imagetogausian);                                            // Reading Colour Image Object
            //Output Image
            int[, ,] HMMFilteredImageRGB = new int[ImageDataRGB.GetLength(0), ImageDataRGB.GetLength(1), ImageDataRGB.GetLength(2)]; // Output Image
            int i, j, Width, Height;

            float rL, rH;

            rL = 0.68f;
            rH = 1.11f;

            float Sigma, Slope;

            Sigma = (float)Convert.ToDouble(Mean_Width.Text);
            Slope = 1.0f;

            COMPLEX[,] FFTData;
            int[,] HMMFilteredImage;

            FFT FFTObject;

            //Reading Selected Image Width & Height
            Width            = ImageDataRGB.GetLength(1);
            Height           = ImageDataRGB.GetLength(2);
            int[,] ImageData = new int[Width, Height];


            //Reading B  Components
            for (i = 0; i <= Width - 1; i++)
            {
                for (j = 0; j <= Height - 1; j++)
                {
                    ImageData[i, j] = ImageDataRGB[0, i, j];
                }
            }

            //Processing B Comonent of the Image
            //Log of Image
            //LogImage = HomomorphicFilterObject.LogofImage(ImageData);
            //FFT of the LOG Image
            FFTObject = new FFT(ImageData);
            FFTObject.ForwardFFT();
            //Shifting FFT for Filtering
            FFTObject.FFTShift();
            // Applying Filter on the FFT of the Log Image
            FFTData = HomomorphicFilterObject.ApplyFilterHMMFreqDomain(FFTObject.FFTShifted, rH, rL, Sigma, Slope);
            //Inverse FFT of the COMPLEX Data
            FFTObject = new FFT(FFTData);
            //Removing FFT SHIFT
            FFTObject.FFTShifted = FFTData;
            FFTObject.RemoveFFTShift();
            //Inverse FFT
            FFTObject.InverseFFT(FFTObject.FFTNormal);
            // Inverse Log of Image
            HMMFilteredImage = FFTObject.GreyImage;
            //Copying B Component to Processed Image Array
            for (i = 0; i <= Width - 1; i++)
            {
                for (j = 0; j <= Height - 1; j++)
                {
                    HMMFilteredImageRGB[0, i, j] = HMMFilteredImage[i, j];
                }
            }

            //Reading G  Components
            for (i = 0; i <= Width - 1; i++)
            {
                for (j = 0; j <= Height - 1; j++)
                {
                    ImageData[i, j] = ImageDataRGB[1, i, j];
                }
            }

            //Processing B Comonent of the Image
            //Log of Image
            //LogImage = HomomorphicFilterObject.LogofImage(ImageData);
            //FFT of the LOG Image
            FFTObject = new FFT(ImageData);
            FFTObject.ForwardFFT();
            //Shifting FFT for Filtering
            FFTObject.FFTShift();
            // Applying Filter on the FFT of the Log Image
            FFTData = HomomorphicFilterObject.ApplyFilterHMMFreqDomain(FFTObject.FFTShifted, rH, rL, Sigma, Slope);
            //Inverse FFT of the COMPLEX Data
            FFTObject = new FFT(FFTData);
            //Removing FFT SHIFT
            FFTObject.FFTShifted = FFTData;
            FFTObject.RemoveFFTShift();
            //Inverse FFT
            FFTObject.InverseFFT(FFTObject.FFTNormal);
            // Inverse Log of Image
            HMMFilteredImage = FFTObject.GreyImage;
            //Copying B Component to Processed Image Array
            for (i = 0; i <= Width - 1; i++)
            {
                for (j = 0; j <= Height - 1; j++)
                {
                    HMMFilteredImageRGB[1, i, j] = HMMFilteredImage[i, j];
                }
            }

            //Reading R  Components
            for (i = 0; i <= Width - 1; i++)
            {
                for (j = 0; j <= Height - 1; j++)
                {
                    ImageData[i, j] = ImageDataRGB[2, i, j];
                }
            }

            //Processing R Comonent of the Image
            //Log of Image
            //LogImage = HomomorphicFilterObject.LogofImage(ImageData);
            //FFT of the LOG Image
            FFTObject = new FFT(ImageData);
            FFTObject.ForwardFFT();
            //Shifting FFT for Filtering
            FFTObject.FFTShift();
            // Applying Filter on the FFT of the Log Image
            FFTData = HomomorphicFilterObject.ApplyFilterHMMFreqDomain(FFTObject.FFTShifted, rH, rL, Sigma, Slope);
            //Inverse FFT of the COMPLEX Data
            FFTObject = new FFT(FFTData);
            //Removing FFT SHIFT
            FFTObject.FFTShifted = FFTData;
            FFTObject.RemoveFFTShift();
            //Inverse FFT
            FFTObject.InverseFFT(FFTObject.FFTNormal);
            // Inverse Log of Image
            HMMFilteredImage = FFTObject.GreyImage;
            //Copying B Component to Processed Image Array
            for (i = 0; i <= Width - 1; i++)
            {
                for (j = 0; j <= Height - 1; j++)
                {
                    HMMFilteredImageRGB[2, i, j] = HMMFilteredImage[i, j];
                }
            }


            //Display Image
            pictureBox2.Image = HomomorphicFilterObject.Displayimage(HMMFilteredImageRGB);
            filteredimage     = new Bitmap(pictureBox2.Image);
            //Displaying Gaussian Kernel Used for Filtering
            double WeightHPF;

            double[,] GaussianKernelHPF = HomomorphicFilterObject.GenerateGaussianKernelHPF(256, Sigma, Slope, out WeightHPF);
            Width  = GaussianKernelHPF.GetLength(0);
            Height = GaussianKernelHPF.GetLength(1);
            int[,] GaussianImage = new int[Width, Height];
            for (i = 0; i <= Width - 1; i++)
            {
                for (j = 0; j <= Height - 1; j++)
                {
                    GaussianImage[i, j] = (int)(255 * GaussianKernelHPF[i, j]);
                }
            }
            pictureBox1.Image = HomomorphicFilterObject.DisplayGaussianPlot(GaussianImage);
        }