Skip to content

Commit 490d960

Browse files
committed
内存优化
1 parent ac6395d commit 490d960

8 files changed

Lines changed: 136 additions & 52 deletions

File tree

ImageProcess/BmpCommonOp.cpp

Lines changed: 74 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "stdafx.h"
22
#include "BmpCommonOp.h"
3-
3+
44

55

66

@@ -12,6 +12,14 @@ BmpCommonOp::BmpCommonOp()
1212

1313
BmpCommonOp::~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
789804
void 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
}

ImageProcess/BmpCommonOp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class BmpCommonOp :
4848
void ShowBmpImage(CDC *cdc,BYTE* Image, int Position_x, int Position_y, int ImageWidth, int ImageHeight, int BitCount, int LineByte);//显示BMP图像
4949
void WriteTextOnScreen(CDC *pDC, int Position_x, int Position_y);
5050

51-
void ImgFourierInit(int ImageWidth, int ImageHeight, int BitCount, int LineByte);
51+
void ImgFourierInit(int ImageWidth, int ImageHeight, int BitCount);
5252
void ImgFFT(BYTE* Image, int ImageWidth, int ImageHeight, int BitCount, int LineByte);
5353
void ImgIFFT( BYTE* DstImage, int ImageWidth, int ImageHeight, int BitCount, int LineByte);
5454
void GetAmplitudespectrum(complex<double> * src, BYTE * DstImage, int width, int height, int BitCount, int ShitFlag); //获取图像的频谱图 8bit

ImageProcess/Common.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,19 @@ float * Common::SplitString(CString str, CString split)
149149
LPCSTR tempstrTemp = (LPCSTR)T2A(strTemp);
150150
pStrSplit[iNums] = atof(tempstrTemp);
151151
return pStrSplit;
152+
}
153+
154+
155+
156+
/*************************************************************************
157+
* Function: GetConfig()
158+
*
159+
* Description: 获取软件配置信息
160+
*
161+
* Input:
162+
*
163+
* Returns:
164+
************************************************************************/
165+
void Common::GetConfig() {
166+
152167
}

ImageProcess/Common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,8 @@ class Common
99
int GetMedian(int array[], int n);// 获取数据的中位数
1010
void CStringToArray(CString string, float *arr);//CString转换为数组
1111
float * SplitString(CString str, CString split);
12+
13+
14+
void GetConfig();//获取软件配置信息
1215
};
1316

ImageProcess/Fourier.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Fourier::Fourier()
99

1010
Fourier::~Fourier()
1111
{
12+
1213
}
1314

1415

@@ -48,7 +49,9 @@ void Fourier::FFT2(complex<double> * TimeDomain, complex<double> * FrequencyDoma
4849

4950
memcpy(FrequencyDomain, Input, sizeof(complex<double>)*width*height);
5051

51-
delete[]Input, Temp;
52+
delete[]Input;
53+
delete[]Temp;
54+
delete[]Temp2;
5255
}
5356

5457

@@ -87,7 +90,8 @@ void Fourier::IFFT2(complex<double> * FrequencyDomain, complex<double> * TimeDom
8790
}
8891

8992
memcpy(TimeDomain, Input, sizeof(complex<double>)*width*height);
90-
delete[]Input, Temp;
93+
delete[]Input;
94+
delete[]Temp;
9195
}
9296

9397

@@ -151,7 +155,8 @@ void Fourier::FFT(complex<double> * TimeDomain, complex<double> * FrequencyDomai
151155
// 释放内存
152156
delete[] Wn;
153157
delete[] Temp1;
154-
delete[] Temp2;
158+
delete[]Temp2;
159+
155160

156161

157162
}
@@ -188,6 +193,8 @@ void Fourier::IFFT(complex<double> * FrequencyDomain, complex<double> * TimeDoma
188193
TimeDomain[i] = complex<double>(Output[i].real() / n, -Output[i].imag() / n);
189194
}
190195

196+
delete[] Input;
197+
delete[]Output;
191198
}
192199

193200

ImageProcess/FrequencyDlg.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ BOOL CFrequencyDlg::OnInitDialog()
6363
GetDlgItem(IDC_EDIT_GAMMAL)->ShowWindow(SW_SHOW);
6464
GetDlgItem(IDC_EDIT_HOMOC)->ShowWindow(SW_SHOW);
6565
GetDlgItem(IDC_STATIC_HOMOC)->ShowWindow(SW_SHOW);
66+
67+
GetDlgItem(IDC_EDIT_GAMMAH)->SetWindowText(_T("2.5"));
68+
GetDlgItem(IDC_EDIT_GAMMAL)->SetWindowText(_T("0.2"));
69+
GetDlgItem(IDC_EDIT_HOMOC)->SetWindowText(_T("0.2"));
70+
GetDlgItem(IDC_EDIT_FREQUENCY_CUT)->SetWindowText(_T("600"));
71+
6672
}
6773

6874
return TRUE;

0 commit comments

Comments
 (0)