/// <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); }
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); }