📄 fretrans.cpp
字号:
// 行
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
// 计算频谱
dTemp = sqrt(TD[j * h + i].real() * TD[j * h + i].real() +
TD[j * h + i].imag() * TD[j * h + i].imag());
// 判断是否超过255
if (dTemp > 255)
{
// 对于超过的,直接设置为255
dTemp = 255;
}
// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
// 此处不直接取i和j,是为了将变换后的原点移到中心
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
//lpSrc = (unsigned char*)lpDIBBits + lLineBytes *
//(lHeight - 1 - (i<h/2 ? i+h/2 : i-h/2)) + (j<w/2 ? j+w/2 : j-w/2);
// 更新源图像
* (lpSrc) = (BYTE)(dTemp);
}
}
// 删除临时变量
delete TD;
delete FD;
// 返回
return TRUE;
}
/*************************************************************************
*
* 函数名称:
* BTWSLP()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用来对图像进行付立叶变换。
*
************************************************************************/
BOOL WINAPI BTWSLP(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
unsigned char* lpSrc;
// 中间变量
double dTemp;
// 循环变量
LONG i;
LONG j;
// 进行付立叶变换的宽度和高度(2的整数次方)
LONG w;
LONG h;
int wp;
int hp;
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 赋初值
w = 1;
h = 1;
wp = 0;
hp = 0;
// 计算进行付立叶变换的宽度和高度(2的整数次方)
while(w * 2 <= lWidth)
{
w *= 2;
wp++;
}
while(h * 2 <= lHeight)
{
h *= 2;
hp++;
}
// 分配内存
complex<double> *TD = new complex<double>[w * h];
complex<double> *FD = new complex<double>[w * h];
// 行
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
// 指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 给时域赋值
TD[j + w * i] = complex<double>(*(lpSrc), 0);
}
}
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶变换
FFT(&TD[w * i], &FD[w * i], wp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
TD[i + h * j] = FD[j + w * i];
}
}
for(i = 0; i < w; i++)
{
// 对x方向进行快速付立叶变换
FFT(&TD[i * h], &FD[i * h], hp);
}
/////////////////////////对傅立叶变换结果进行转置
complex<double> *FD11 = new complex<double>[w * h];
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD11[i + w * j] = FD[j + w * i];
}
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD[j + w * i] = FD11[j + w * i];
}
}
//delete FD11;
/////////////////////////////自己加的平移
int ii,jj;
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
ii=i<h/2 ? i+h/2 : i-h/2;
jj=j<w/2 ? j+w/2 : j-w/2;
FD11[jj+ w * ii] = FD[j + w * i];
}
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD[i+ w * j] = FD11[i+ w * j];
}
}
delete FD11;
//////////////////////////////////////////////////////自己加的平移
////////////////////zjbian
float D1;
float D0=50.0;
float HT;
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
D1=(float)sqrt((i-h/2)*(i-h/2)+(j-w/2)*(j-w/2));
HT=1.0/(1+(D1/D0)*(D1/D0));// 一阶巴特沃斯
FD[i+j*h]*=HT;
}
}
///////////
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶逆变换
IFFT(&FD[w * i], &TD[w * i], wp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD[i + h * j] = TD[j + w * i];
}
}
for(i = 0; i < w; i++)
{
// 对x方向进行快速付立逆叶变换
IFFT(&FD[i * h], &TD[i * h], hp);
}
// 行
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
// 计算频谱
dTemp = sqrt(TD[j * h + i].real() * TD[j * h + i].real() +
TD[j * h + i].imag() * TD[j * h + i].imag());
// 判断是否超过255
if (dTemp > 255)
{
// 对于超过的,直接设置为255
dTemp = 255;
}
// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
// 此处不直接取i和j,是为了将变换后的原点移到中心
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
//lpSrc = (unsigned char*)lpDIBBits + lLineBytes *
//(lHeight - 1 - (i<h/2 ? i+h/2 : i-h/2)) + (j<w/2 ? j+w/2 : j-w/2);
// 更新源图像
* (lpSrc) = (BYTE)(dTemp);
}
}
// 删除临时变量
delete TD;
delete FD;
// 返回
return TRUE;
}
/*************************************************************************
*
* 函数名称:
* RELATIVITY()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
*
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用来对图像进行付立叶变换。
*
************************************************************************/
BOOL WINAPI RELATIVITY(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
unsigned char* lpSrc;
// 中间变量
double dTemp;
// 循环变量
LONG i;
LONG j;
// 进行付立叶变换的宽度和高度(2的整数次方)
LONG w;
LONG h;
int wp;
int hp;
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 赋初值
w = 1;
h = 1;
wp = 0;
hp = 0;
// 计算进行付立叶变换的宽度和高度(2的整数次方)
while(w * 2 <= lWidth)
{
w *= 2;
wp++;
}
while(h * 2 <= lHeight)
{
h *= 2;
hp++;
}
// 分配内存
complex<double> *TD = new complex<double>[w * h];
complex<double> *FD = new complex<double>[w * h];
// 行
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
// 指向DIB第i行,第j个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
// 给时域赋值
TD[j + w * i] = complex<double>(*(lpSrc), 0);
}
}
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶变换
FFT(&TD[w * i], &FD[w * i], wp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
TD[i + h * j] = FD[j + w * i];
}
}
for(i = 0; i < w; i++)
{
// 对x方向进行快速付立叶变换
FFT(&TD[i * h], &FD[i * h], hp);
}
/////////////////////////对傅立叶变换结果进行转置
complex<double> *FD11 = new complex<double>[w * h];
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD11[i + w * j] = FD[j + w * i];
}
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD[j + w * i] = FD11[j + w * i];
}
}
//delete FD11;
/////////////////////////////自己加的平移
int ii,jj;
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
ii=i<h/2 ? i+h/2 : i-h/2;
jj=j<w/2 ? j+w/2 : j-w/2;
FD11[jj+ w * ii] = FD[j + w * i];
}
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD[i+ w * j] = FD11[i+ w * j];
}
}
delete FD11;
//////////////////////////////////////////////////////自己加的平移
// 分配内存
complex<double> *TDH = new complex<double>[w * h];
complex<double> *FDH = new complex<double>[w * h];
// 行
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
if((i>=(h-3)/2&&i<=(h+1)/2)&&(j>=(w-3)/2&&j<=(w+1)/2))
{
TDH[j + w * i] = 1/9;
}
else
{
TDH[j + w * i] = 0;
}
}
}
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶变换
FFT(&TDH[w * i], &FDH[w * i], wp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
TDH[i + h * j] = FDH[j + w * i];
}
}
for(i = 0; i < w; i++)
{
// 对x方向进行快速付立叶变换
FFT(&TDH[i * h], &FDH[i * h], hp);
}
/////////////////////////对傅立叶变换结果进行转置
complex<double> *FD22 = new complex<double>[w * h];
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD22[i + w * j] = FDH[j + w * i];
}
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FDH[j + w * i] = FD22[j + w * i];
}
}
//delete FD22;
/////////////////////////////自己加的平移
int iii,jjj;
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
iii=i<h/2 ? i+h/2 : i-h/2;
jjj=j<w/2 ? j+w/2 : j-w/2;
FD22[jjj+ w * iii] = FDH[j + w * i];
}
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FDH[i+ w * j] = FD22[i+ w * j];
}
}
delete FD22;
//////////////////////////////////////////////////////自己加的平移
///////////////////////////////////////////////////////////频域乘积
//complex<double> *FD33 = new complex<double>[w * h];
double fResult1=0,fResult2=0;
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
/** for(j=0; j < w;j++)
{
fResult+=(FD[j+w*i].real ())+(FDH[i+w*j].imag() ) ;
}
;*/
fResult1= FD[j+w*i].real() *FDH[i+w*j].real()-FD[j+w*i].imag() *FDH[i+w*j].imag();
fResult2=FD[j+w*i].real() *FDH[i+w*j].imag()+FD[j+w*i].imag() *FDH[i+w*j].real();
FD[j + w * i] = complex<double>(fResult1, fResult2);
}
}
/*for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD[i+ w * j] = FD33[i+ w * j];
}
}
delete FD33;*/
///////////////////////////////////////////////////////////////
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶逆变换
IFFT(&FD[w * i], &TD[w * i], wp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD[i + h * j] = TD[j + w * i];
}
}
for(i = 0; i < w; i++)
{
// 对x方向进行快速付立逆叶变换
IFFT(&FD[i * h], &TD[i * h], hp);
}
// 行
for(i = 0; i < h; i++)
{
// 列
for(j = 0; j < w; j++)
{
// 计算频谱
dTemp = sqrt(TD[j * h + i].real() * TD[j * h + i].real() +
TD[j * h + i].imag() * TD[j * h + i].imag());
// 判断是否超过255
if (dTemp > 255)
{
// 对于超过的,直接设置为255
dTemp = 255;
}
// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
// 此处不直接取i和j,是为了将变换后的原点移到中心
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
//lpSrc = (unsigned char*)lpDIBBits + lLineBytes *
//(lHeight - 1 - (i<h/2 ? i+h/2 : i-h/2)) + (j<w/2 ? j+w/2 : j-w/2);
// 更新源图像
* (lpSrc) = (BYTE)(dTemp);
}
}
// 删除临时变量
delete TD;
delete FD;
delete TDH;
delete FDH;
// 返回
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -