11#include " stdafx.h"
22#include " BmpCommonOp.h"
3-
3+
44
55
66
@@ -12,6 +12,14 @@ BmpCommonOp::BmpCommonOp()
1212
1313BmpCommonOp::~BmpCommonOp ()
1414{
15+ delete [] m_TimeDomain;
16+ delete[] m_TimeDomainB;
17+ delete[] m_TimeDomainG;
18+ delete[] m_TimeDomainR;
19+ delete[] m_FrequencyDomain;
20+ delete[] m_FrequencyDomainB;
21+ delete[] m_FrequencyDomainG;
22+ delete[] m_FrequencyDomainR;
1523}
1624
1725
@@ -294,15 +302,15 @@ void BmpCommonOp::WriteTextOnScreen(CDC *pDC,int Position_x, int Position_y) {
294302* Returns: 得到FFT变换后的频域数据 作为该类的成员变量
295303*
296304************************************************************************/
297- void BmpCommonOp::ImgFourierInit (int ImageWidth, int ImageHeight, int BitCount, int LineByte ) {
305+ void BmpCommonOp::ImgFourierInit (int ImageWidth, int ImageHeight, int BitCount) {
298306
299307 m_bFourierinit = 1 ;
300308 // 图像宽高非2的整数幂时需要进行补0操作
301309 m_nImageWidth = 1 , m_nImageHeight = 1 ;
302310 // FFT需要的宽度和高度(2的整数次方)
303- while (m_nImageWidth < ImageWidth)
311+ while (m_nImageWidth < 2 * ImageWidth )
304312 m_nImageWidth *= 2 ;
305- while (m_nImageHeight < ImageHeight)
313+ while (m_nImageHeight < 2 * ImageHeight)
306314 m_nImageHeight *= 2 ;
307315
308316 /*
@@ -349,7 +357,7 @@ void BmpCommonOp::ImgFFT(BYTE* Image, int ImageWidth, int ImageHeight, int BitCo
349357
350358 Fourier fourier;
351359
352- ImgFourierInit (ImageWidth, ImageHeight, BitCount, LineByte );
360+ ImgFourierInit (ImageWidth, ImageHeight, BitCount);
353361
354362 // 8bit BMP 处理
355363 if (BitCount==8 ) {
@@ -416,7 +424,9 @@ void BmpCommonOp::ImgFFT(BYTE* Image, int ImageWidth, int ImageHeight, int BitCo
416424 fourier.FFT2 (m_TimeDomainR, m_FrequencyDomainR, m_nImageWidth, m_nImageHeight); // FFT2 R
417425
418426 // 内存释放
419- delete[] newImageB, newImageG, newImageR;
427+ delete[] newImageB;
428+ delete[] newImageG;
429+ delete[] newImageR;
420430
421431
422432 }// end 24bit
@@ -459,7 +469,8 @@ void BmpCommonOp::ImgIFFT(BYTE* DstImage, int ImageWidth, int ImageHeight, int B
459469 }
460470
461471 // 内存释放
462- delete[] Temp, TimeDomain;
472+ delete[] Temp;
473+ delete[] TimeDomain;
463474
464475 }// end 8bit
465476
@@ -485,7 +496,10 @@ void BmpCommonOp::ImgIFFT(BYTE* DstImage, int ImageWidth, int ImageHeight, int B
485496 }
486497
487498 // 内存释放
488- delete[] Temp, TimeDomainB, TimeDomainG, TimeDomainR;
499+ delete[] Temp;
500+ delete[] TimeDomainB;
501+ delete[] TimeDomainG;
502+ delete[] TimeDomainR;
489503
490504 }// end 24bit
491505
@@ -539,6 +553,7 @@ void BmpCommonOp::GetAmplitudespectrum(complex<double> * src, BYTE * DstImage,
539553
540554 //
541555 delete[] dst;
556+
542557
543558}
544559
@@ -789,13 +804,16 @@ void BmpCommonOp::ImgGaussianPassFilter(BYTE* DstImage, int Sigma, int HLFlag, i
789804void BmpCommonOp::ImgHomomorphicFilter (BYTE* Image, BYTE* DstImage, int Sigma, double c, double GammaH, double GammaL, int ImageWidth, int ImageHeight, int BitCount, int LineByte)
790805{
791806
792- Fourier fourier;
793-
794- ImgFourierInit (ImageWidth, ImageHeight, BitCount, LineByte);
807+ // Fourier fourier;
808+ Fourier *fourier = new Fourier ();
809+ if (!m_bFourierinit) {// 尚未img宽高初始化
810+ ImgFourierInit (ImageWidth, ImageHeight, BitCount);
811+ }
812+
795813
796814 // 滤波处理 采用改进的高斯高通滤波器
797815 // 生成滤波函数
798- double *Filter = new double [m_nImageWidth*m_nImageHeight];
816+ /* double *Filter = new double[m_nImageWidth*m_nImageHeight];
799817 int position;
800818 double distance;
801819 for (int j = 0; j < m_nImageHeight; j++) {
@@ -805,7 +823,7 @@ void BmpCommonOp::ImgHomomorphicFilter(BYTE* Image, BYTE* DstImage, int Sigma, d
805823 Filter[position] = 1 - exp((-c)*pow(distance, 2) / (2 * pow(Sigma, 2)));
806824 Filter[position] = (GammaH - GammaL)*Filter[position] + GammaL;
807825 }
808- }
826+ }*/
809827
810828
811829
@@ -827,22 +845,27 @@ void BmpCommonOp::ImgHomomorphicFilter(BYTE* Image, BYTE* DstImage, int Sigma, d
827845 for (int i = 0 ; i<m_nImageSize; i++) {
828846 m_TimeDomain[i] = complex <double >(newImage[i], 0 );
829847 }
830- fourier. FFT2 (m_TimeDomain, m_FrequencyDomain, m_nImageWidth, m_nImageHeight); // FFT2
848+ fourier-> FFT2 (m_TimeDomain, m_FrequencyDomain, m_nImageWidth, m_nImageHeight); // FFT2
831849 /* ---------------End FFT---------------*/
832850
833851 /* --------------滤波 IFFT 指数变换 获得频谱----------------*/
834852 int position;
853+ double distance, filter;
835854 for (int j = 0 ; j < m_nImageHeight; j++) {
836855 for (int i = 0 ; i < m_nImageWidth; i++) {
837856 position = j*m_nImageWidth + i;
838- m_FrequencyDomain[position] = m_FrequencyDomain[position] * Filter[position]; // 滤波
857+ distance = sqrt ((i - m_nImageWidth / 2 )*(i - m_nImageWidth / 2 ) + (j - m_nImageHeight / 2 )*(j - m_nImageHeight / 2 ));
858+ filter = 1 - exp ((-c)*pow (distance, 2 ) / (2 * pow (Sigma, 2 )));
859+ filter = (GammaH - GammaL)*filter + GammaL;
860+
861+ m_FrequencyDomain[position] = m_FrequencyDomain[position] * filter; // 滤波
839862 }
840863 }
841864
842865 // ImgIFFT
843866 complex <double > *TimeDomain = new complex <double >[m_nImageWidth*m_nImageHeight]; // 空间域
844- fourier. IFFT2 (m_FrequencyDomain, TimeDomain, m_nImageWidth, m_nImageHeight); // IFFT2
845-
867+ fourier-> IFFT2 (m_FrequencyDomain, TimeDomain, m_nImageWidth, m_nImageHeight); // IFFT2
868+ delete fourier;
846869 // EXP
847870 for (int j = 0 ; j < m_nImageHeight; j++) {
848871 for (int i = 0 ; i < m_nImageWidth; i++) {
@@ -862,7 +885,10 @@ void BmpCommonOp::ImgHomomorphicFilter(BYTE* Image, BYTE* DstImage, int Sigma, d
862885 }
863886 }
864887
865- delete[] Filter, newImage, TimeDomain, Temp;
888+ // delete[] Filter;
889+ delete[] newImage;
890+ delete[] TimeDomain;
891+ delete[] Temp;
866892
867893 }// end 8bit
868894
@@ -903,33 +929,40 @@ void BmpCommonOp::ImgHomomorphicFilter(BYTE* Image, BYTE* DstImage, int Sigma, d
903929 m_TimeDomainR[i] = complex <double >(newImageR[i], 0 );
904930 }
905931 // FFT2
906- fourier. FFT2 (m_TimeDomainB, m_FrequencyDomainB, m_nImageWidth, m_nImageHeight); // FFT2 B
907- fourier. FFT2 (m_TimeDomainG, m_FrequencyDomainG, m_nImageWidth, m_nImageHeight); // FFT2 G
908- fourier. FFT2 (m_TimeDomainR, m_FrequencyDomainR, m_nImageWidth, m_nImageHeight); // FFT2 R
932+ fourier-> FFT2 (m_TimeDomainB, m_FrequencyDomainB, m_nImageWidth, m_nImageHeight); // FFT2 B
933+ fourier-> FFT2 (m_TimeDomainG, m_FrequencyDomainG, m_nImageWidth, m_nImageHeight); // FFT2 G
934+ fourier-> FFT2 (m_TimeDomainR, m_FrequencyDomainR, m_nImageWidth, m_nImageHeight); // FFT2 R
909935 /* ---------------End FFT---------------*/
910-
936+
911937 /* --------------滤波 IFFT 指数变换 获得频谱----------------*/
912938 int position;
939+ double distance, filter;
913940 for (int j = 0 ; j < m_nImageHeight; j++) {
914941 for (int i = 0 ; i < m_nImageWidth; i++) {
915942 position = j*m_nImageWidth + i; // 各个通道单独处理
916- m_FrequencyDomainB[position] = m_FrequencyDomainB[position] * Filter[position];
917- m_FrequencyDomainG[position] = m_FrequencyDomainG[position] * Filter[position];
918- m_FrequencyDomainR[position] = m_FrequencyDomainR[position] * Filter[position];
943+ // 滤波函数
944+ distance = sqrt ((i - m_nImageWidth / 2 )*(i - m_nImageWidth / 2 ) + (j - m_nImageHeight / 2 )*(j - m_nImageHeight / 2 ));
945+ filter = 1 - exp ((-c)*distance*distance / (2 * Sigma*Sigma ));
946+ filter = (GammaH - GammaL)*filter + GammaL;
947+
948+ m_FrequencyDomainB[position] = m_FrequencyDomainB[position] * filter ;
949+ m_FrequencyDomainG[position] = m_FrequencyDomainG[position] * filter ;
950+ m_FrequencyDomainR[position] = m_FrequencyDomainR[position] * filter;
919951
920952 }
921953 }
922954
923955 // ImgIFFT
924956 // ImgIFFT(DstImage, ImageWidth, ImageHeight, BitCount, LineByte);
925- complex <double > *TimeDomainB = new complex <double >[m_nImageWidth*m_nImageHeight ];
926- complex <double > *TimeDomainG = new complex <double >[m_nImageWidth*m_nImageHeight ];
927- complex <double > *TimeDomainR = new complex <double >[m_nImageWidth*m_nImageHeight ];
957+ complex <double > *TimeDomainB = new complex <double >[m_nImageSizePer ];
958+ complex <double > *TimeDomainG = new complex <double >[m_nImageSizePer ];
959+ complex <double > *TimeDomainR = new complex <double >[m_nImageSizePer ];
928960 // IFFT
929- fourier.IFFT2 (m_FrequencyDomainB, TimeDomainB, m_nImageWidth, m_nImageHeight); // IFFT2
930- fourier.IFFT2 (m_FrequencyDomainG, TimeDomainG, m_nImageWidth, m_nImageHeight); // IFFT2
931- fourier.IFFT2 (m_FrequencyDomainR, TimeDomainR, m_nImageWidth, m_nImageHeight); // IFFT2
932- // EXP
961+ fourier->IFFT2 (m_FrequencyDomainB, TimeDomainB, m_nImageWidth, m_nImageHeight); // IFFT2
962+ fourier->IFFT2 (m_FrequencyDomainG, TimeDomainG, m_nImageWidth, m_nImageHeight); // IFFT2
963+ fourier->IFFT2 (m_FrequencyDomainR, TimeDomainR, m_nImageWidth, m_nImageHeight); // IFFT2
964+ delete fourier;
965+ // EXP
933966 for (int j = 0 ; j < m_nImageHeight; j++) {
934967 for (int i = 0 ; i < m_nImageWidth; i++) {
935968 position = j*m_nImageWidth + i;
@@ -951,18 +984,19 @@ void BmpCommonOp::ImgHomomorphicFilter(BYTE* Image, BYTE* DstImage, int Sigma, d
951984 }
952985
953986 // 内存释放
954- delete[] Filter,newImageB, newImageG, newImageR, TimeDomainB, TimeDomainG, TimeDomainR, Temp ;
987+ // delete[] Filter;
988+ delete[] newImageB;
989+ delete[] newImageG;
990+ delete[] newImageR;
991+ delete[] TimeDomainB;
992+ delete[] TimeDomainG;
993+ delete[] TimeDomainR;
994+ delete[] Temp;
955995
956996 }// end 24bit
957997
958998
959999
960-
961-
962-
963-
964-
965-
966-
1000+
9671001
9681002}
0 commit comments