64,701
社区成员
发帖
与我相关
我的任务
分享
void MYCImage::DFT(CString PathName)//this 即为傅里叶图像的输出
{
MYCImage src;
src.Load(PathName);//读入原图
if(IsNull())
return;
this->Destroy();
if(src.GetBPP()==32)
{
this->Create(src.GetWidth(),src.GetHeight(),src.GetBPP(),1);
}
else
{
this->Create(src.GetWidth(),src.GetHeight(),src.GetBPP(),0);
}
int maxY=src.GetHeight();
int maxX=src.GetWidth();
int size = maxX * maxY;
double max_value = 0.0;
complex point;
complex max;
max.imag = 0;
max.real = 0;
for(int i = 0;i<maxX;i++){
for(int j = 0;j<maxY;j++){
point.real = 0;
point.imag = 0;
for(int x=0;x<maxX;x++)
{
for(int y=0;y<maxY;y++)
{
//进行DFT计算
//傅里叶运算的频域结果序列的值(复数)
complex part;
part.real = cos((-1.000) * ( 1.00000 * x * i / maxX + 1.00000 * y * j / maxY) * 2.0 * PI);
part.imag = sin((-1.000) * ( 1.00000 * x * i / maxX + 1.000000 * y * j / maxY) * 2.0 * PI);
COLORREF pixel;
byte r,g,b;
int gray;
pixel=src.GetPixel(x,y);
r=GetRValue(pixel);
g=GetGValue(pixel);
b=GetBValue(pixel);
gray = 0.28965 * r + 0.60581 * g + 0.10454 * b;
if(i == 0 && j == 0){//求最大值
max.real = max.real + part.real * gray;
max.imag = max.imag + part.imag * gray;
}
point.real = point.real + part.real * gray * pow(-1.0,x+y);//中心化
point.imag = point.imag + part.imag * gray * pow(-1.0,x+y);
}
}
double data_per_pixel = sqrt((double)point.real * (double)point.real + (double)point.imag * (double)point.imag)/ maxY / maxX;
max_value = sqrt((double)max.real * (double)max.real + (double)max.imag * (double)max.imag)/ maxY / maxX;//求最大值
data_per_pixel = log(data_per_pixel+1);//进行log变换
max_value = log(max_value+1);//对最大值进行log变换
if(max_value >= 255)
data_per_pixel = data_per_pixel / max_value * 255.0;
else
data_per_pixel = data_per_pixel * 255.0 / max_value;
this->SetPixelRGB(i,j, data_per_pixel, data_per_pixel, data_per_pixel);
}
}
}