📄 gausslowpass.cpp
字号:
BOOL CDIB::GaussLowPass(unsigned char *lpDIBBits, LONG nWidth, LONG nHeight, int nRadius)
{
unsigned char* lpSrc; // 指向源图像的指针
int y ; // 循环控制变量
int x ; // 循环控制变量
double dTmpOne ; //存放临时变量
double dTmpTwo ; //存放临时变量
double H ; // Gauss 滤波系数
int nTransWidth ; // 傅立叶变换的宽度(2的整数次幂)
int nTransHeight; // 傅立叶变换的高度(2的整数次幂)
double dReal ; // 傅立叶变换的实部
double dImag; // 傅立叶变换的虚部
double unchValue; // 存贮图像各像素灰度的临时变量
CComplex * pCTData ; // 指向时域数据的指针
CComplex * pCFData ; // 指向频域数据的指针
// 计算进行傅立叶变换的点数-横向 (2的整数次幂)
dTmpOne = log(nWidth)/log(2);
dTmpTwo = ceil(dTmpOne) ;
dTmpTwo = pow(2,dTmpTwo);
nTransWidth = (int) dTmpTwo;
// 计算进行傅立叶变换的点数-纵向 (2的整数次幂)
dTmpOne = log(nHeight)/log(2);
dTmpTwo = ceil(dTmpOne) ;
dTmpTwo = pow(2,dTmpTwo);
nTransHeight = (int) dTmpTwo;
pCTData=new CComplex[nTransWidth * nTransHeight]; // 分配内存
pCFData=new CComplex[nTransWidth * nTransHeight]; // 分配内存
// 图像数据的宽和高不一定是2的整数次幂,所以pCTData有一部分数据需要补0
for(y=0; y<nTransHeight; y++)
{
for(x=0; x<nTransWidth; x++)
{
pCTData[y*nTransWidth + x].Real=0; // 补零
pCTData[y*nTransWidth + x].Image=0;
}
}
for(y=0; y<nHeight; y++) // 把图像数据传给pCTData
{
for(x=0; x<nWidth; x++)
{
// 指向DIB第y行,第x个象素的指针
lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;
unchValue = *lpSrc;
unchValue = unchValue*pow(-1,nHeight+nWidth);
pCTData[y*nTransWidth + x].Real=unchValue;
pCTData[y*nTransWidth + x].Image=0;
}
}
FFT_2D(pCTData, nWidth, nHeight, pCFData) ; // 傅立叶正变换
for(y=0; y<nTransHeight; y++) // 开始实施ButterWorth低通滤波
{
for(x=0; x<nTransWidth; x++)
{
H = (double)(y*y+x*x) ;
H = -H / (nRadius * nRadius)/2.0f;
H = exp(H) ; // 求H值
pCFData[y*nTransWidth + x].Real=pCFData[y*nTransWidth + x].Real*H;
pCFData[y*nTransWidth + x].Image=pCFData[y*nTransWidth + x].Image*H;
}
}
// 经过ButterWorth低通滤波的图象进行反变换
IFFT_2D(pCFData, pCTData, nWidth, nHeight);
for(y=0; y<nHeight; y++) // 反变换的数据传给lpDIBBits
{
for(x=0; x<nWidth; x++)
{
dReal = pCTData[y*nTransWidth + x].Real ;
dImag = pCTData[y*nTransWidth + x].Image ;
unchValue = max(0,min(255,sqrt(dReal*dReal+dImag*dImag) ));
// 指向DIB第y行,第x个象素的指针
unchValue = unchValue*pow(-1,nHeight+nWidth);
lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;
*lpSrc =unchValue ;
}
}
delete []pCTData; // 释放内存
delete []pCFData; // 释放内存
pCTData = NULL;
pCFData = NULL;
return true; //返回结果
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -