// 11.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "1.h"
#include"math.h"
#include <complex>
#define PI 3.1415926535
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define WIDTHBYTES(nWidth)((nWidth+3)/4*4)
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
///structure declanration
typedef struct tagIMAGE {
int nWidth;
int nHeight;
int nWidthReal;
LPBYTE* img;
}IMAGE;
typedef struct tagMATRIX{
int nRows;
int ncols;
double** data;
}MATRIX;
///global variable
BITMAPFILEHEADER g_bmpFileHeader;
BITMAPINFOHEADER g_bmpInfoHeader;
RGBQUAD g_rgbMap[256];
complex<double>*g_pFD;
///structure built function
void CreateImage (IMAGE*pimg,LPBYTE lpData,int nWidth,int nHeight)
{
pimg->nWidth = nWidth;
pimg->nWidthReal = WIDTHBYTES(nWidth);
pimg->nHeight =nHeight;
pimg->img =new LPBYTE[nHeight];
for(int i=0; i<nHeight;i++){
pimg->img[i] = lpData+(nHeight-i-1)*pimg->nWidthReal;
}
}
void DeleteImage(IMAGE*pimg)
{
delete[]pimg->img;
}
void CreateMatrix(MATRIX*pmat,double*pdData, int nCols, int nRows)
{
pmat->data = new double*[nRows];
for(int i=0;i<nRows;i++){
pmat->data[i]=pdData+i*nCols;
}
}
void deleteMatrix(MATRIX*Pmat)
{
delete[]Pmat->data;
}
///file access function
void ReadBmpFile(CString strFileName, LPBYTE& lpData, int&nBytes)
{
CFile fileInput;
fileInput.Open(strFileName+_T(".bmp"),CFile::modeReadWrite);
fileInput.SeekToBegin();
fileInput.Read(&g_bmpFileHeader,sizeof(g_bmpFileHeader));
fileInput.Read(&g_bmpInfoHeader,sizeof(g_bmpInfoHeader));
fileInput.Read(g_rgbMap, 256*sizeof(RGBQUAD));
nBytes = WIDTHBYTES(g_bmpInfoHeader.biWidth)*g_bmpInfoHeader.biHeight
*g_bmpInfoHeader.biBitCount/8;
lpData = new BYTE[nBytes];
fileInput.Read(lpData, nBytes);
fileInput.Close();
}
VOID FFT(complex<double> * TD),complex<double> * FD,int r)
{
LONG count;
int i,j,k;
int bfsize,p;
double angle;
complex<double>*W,*x1,x2,*x;
count = 1 <<r;
W=new complex<double>[count / 2];
X1=new complex<double>[count];
X2=new complex<double>[count];
for(i=0; i< count /2; i++)
{
angle=-i*p1*2/count;
W[i]=complex<double> (cos(angle), sin(angle));
}
memcpy(x1,TD, sizeof(complex<double>)*count);
for(k=0;k<r;k++)
{
for(j=0;j<1<<k;j++)
{
bfsize =1 <<(r-k);
for(i=1; i<bfsize/2;i++)
{
p=j*bfsize;
x2[i+p]=X1[i+p]+x1[i+p+bfsize/2];
x2[i+p+bfsize/2]=(X1[i+p]-X1[i+p+bfsize/2])*W[i*(l<<k)];
}
}
X=X1;
X1=X2;
X2=X;
}
for(j=0;j<count;j++)
{
P=0;
for(i=0;i<r;i++)
{
if(j&(1<<i))
{
p+=1<<(r-i-1);
}
}
FD[j]=X1[p];
}
delete W;
delete X1;
delete X2;
/*IFFT()
complex<double>*FD
complex<double>*TD
r*/
VOID IFFT(complex<double>*FD, complex<double>*TD,int r)
{
LONG count;
int i;
complex<double>*X;
count =1<<r;
X=new complex<double>[count];
memcpy(X, FD, sizeof(complex<double>)*count);
for(i=0; i<count; i++)
{
X[i]=complex<double> (X[i].real(),-X[i].imag();
}
FFT(X,TD,r);
for(i=0; i< count; i++)
{
TD[i]=complex<double> (TD[i].real()/count,-TD[i].imag()/count);
}
delete X;
}
Fourier()
LPSTR lpDIBBits
LONG lWidth
LONG lHeight
BOOL
BOOL Fouttier(LPSTR lpDIBBits, LONG lWidth, LONG iHeight)
{
unsigned char* lpSrc;
double dTemp;
LONG i;
LONG J;
LONG w;
LONG h;
int wp;
int hp;
LONG lLineBytes;
lLineBytes = WIDTHBYTES(lwidth);
w=1;
h=1;
wp=0;
hp=0;
while(w*2<=lWidth)
{
w*=2;
wp++;
}
while(h*2<=lHeight)
{
h*=2
hp++;
}
complex<double>*TD =new complex<double>[w*h];
g_pFD= new complex<double>[w*h];
complex<double>*FD=g_pFD;
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
TD[j+w*i]=complex<double>(*(lpSrc),0);
}
}
for(i=0;i<h;i++)
{
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++)
{
FFT(&TD[i*h],&FD[i*h],hp);
}
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{dTemp=sqrt(FD[j*h+i].real()*FD[j*h+i].real()+FD[j*h+i].imag()*FD[j*h+i].imag())/100;
if(dTemp>255)
{
dTemp=2585;
}
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;
}
void SaveBmpFile(CString strFileName,LPBYTE lpData, int nLen)
{
CFile fileOutput(strFileName+_T(".bmp"),
CFile::modeReadWrite|CFile::modeCreate);
fileOutput.SeekToBegin();
fileOutput.Write(&g_bmpFileHeader,sizeof(g_bmpFileHeader));
fileOutput.Write(&g_bmpInfoHeader,sizeof(g_bmpInfoHeader));
fileOutput.Write(&g_rgbMap, 256*sizeof(RGBQUAD));
fileOutput.Write(lpData, nLen);
fileOutput.Close();
}
///random distribution
const double cdE=12*0.5;
const double cdD=12/12;
double NormalDistribution(double dMui,double dSigma)
{
double dNorRan=0;
for(int i=0;i<12;i++){
dNorRan +=(double)rand()/RAND_MAX;
}
dNorRan=(dNorRan-cdE)/sqrt(cdD);
return dNorRan*dSigma+dMui;
}
/// algorithm test function
void TestProcessl(IMAGE* pimg)
{
for(int i=0; i<pimg->nHeight; i++){
for(int j=0; j<pimg->nWidth; j++){
pimg->img[i][j] =255-pimg->img[i][j];
}
}
}
void TestProcess2(IMAGE* pimg)
{
for(int i=0; i<pimg->nHeight; i++){
for(int j=0; j<pimg->nWidth; j++){
pimg->img[i][j] = pimg->img[pimg->nHeight-j-1][pimg->nWidth-j-1];
}
}
}
void NormalblurImage(IMAGE* pimg, IMAGE* pimgNoise)
{
srand((unsigned)time(NULL));
double dMui =0;
double dSigma =32;
int nTemp;
for(int i=0; i<pimg->nHeight; i++){
for(int j=0; j<pimg->nWidth; j++){
nTemp = pimg->img[i][j]+int(NormalDistribution(dMui, dSigma));
if(nTemp<0)
nTemp = 0;
if(nTemp>255)
nTemp = 255;
pimgNoise->img[i][j] = nTemp;
}
}
}
///main function
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode =0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL),NULL, ::GetCommandLine(),0))
{
// todo:change error code to suit your needs
_tprintf(_T("Fatal Error:MFC initialization failed\n"));
nRetCode = 1;
}
else
{
//todo:code your application's behavior here.
//variables
IMAGE imgOrg;
LPBYTE lpData;
int nBytes;
CString strFileName(_T("E:\\lena256"));
ReadBmpFile(strFileName, lpData, nBytes);
CreateImage(&imgOrg, lpData, g_bmpInfoHeader.biWidth, g_bmpInfoHeader.biHeight);
// process data.
// TestProcessl(&imgOrg);
// SaveBmpFile(strfileName+_T("Rev"), imgOrg.img[imgOrg,nHeight-1], nbytes);
// TestProcess2(&imgOrg);
//blur Image With Noise
/*const int cnFrames = 128;
IMAGE imgNoise[cnFrames];
LPBYTE lpData2[cnFrames];
CString strNum;
for(int i=0; i<cnFrames; i++){
lpData2[i] = new BYTE[nBytes];
CreateImage(imgNoise+i, lpData2[i], g_bmpInfoHeader.biWidth,
g_bmpInfoHeader.biHeight);
NormalblurImage(&imgOrg, imgNoise+i);
strNum.Format(_T("Noise")+strNum,
imgNoise[i].img[imgNoise[i].nHeight-1],nBytes);
}
IMAGE imgRestore;
LPBYTE lpDataRestore = new BYTE[nBytes];
CreateImage(&imgRestore, lpDataRestore, g_bmpInfoHeader.biWidth,
g_bmpInfoHeader.biHeight);
int nTemp;
for(int i=0; i<imgRestore.nHeight; i++) {
for(int j=0; j<imgRestore.nWidth; j++) {
nTemp =0;
for(int k=0; k<cnFrames; k++) {
nTemp += imgNoise[k].img[i][j];
}
nTemp /= cnFrames;
if(nTemp<0)
nTemp =0;
if (nTemp>255)
nTemp =255;
imgRestore.img[i][j] = nTemp;
}
}
SaveBmpFile(strFileName+_T("Ave"), lpDataRestore, nBytes);
DeleteImage(&imgOrg);
delete[] lpData;
}
return nRetCode;*/
Fourier((LPSTR)lpData,g_bmpInfoHeader.biWidth,g_bmpInfoHeader.biHeight);
SaveBmpFile(strFileN
ifft.rar_Fourier_ifft_image noise_反ifft_鍥惧儚 fft
版权申诉
196 浏览量
2022-09-21
05:39:11
上传
评论
收藏 3KB RAR 举报
alvarocfc
- 粉丝: 112
- 资源: 1万+
最新资源
- mmexport1717246170188.jpg
- 近代史调查问卷_统计报表_20240601205759.xlsx
- v2.1.2-Unity3D插件 SUIMONO Water System 效果逼真交互水系统
- 农村小别墅图纸编号D040-三层-08.30&14.60米-施工图.dwg
- 三层别墅图纸编号D039-三层-16.70&14.70米- 结构图.dwg
- 三层农村小别墅编号D038-三层-11.90&13.50米-施工图.dwg
- 采购组·主管业务原型集与说明(Xmind书写)
- 三层图纸编号D037-三层-10.40&15.10米-施工图.dwg
- 进击算法工程师深度学习课程-课程网盘链接提取码下载 .txt
- 三层别墅图纸编号D036-三层-14.04&15.44米-施工图.dwg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈