|
|
发表于 2005-8-3 22:00:00
|
显示全部楼层
Re:高斯模糊具体算法是怎样的呀?哪位大虾给说说
这个是时域上的gauss, o- 大了肯定速度慢。
最近正在搞fftw, 从频域上用gauss,效果也不错。
速度不好说,但肯定稳定。
void _make_h(float pN[7][7], ZCF pH[256][256]){
for(long i=0; i<7; i++){
for(long j=0; j<7; j++){
pH[j].real(pN[j]/1003.0f);
}
}
}
void _init(){
fft.Init_(256, 256);
D3DLOCKED_RECT r;
if(mpTex1->LockRect(0, &r, NULL, 0)<0)return;
BYTE* pBuf = NULL;
pBuf= (BYTE*)r.pBits;
ZCF* ts = new ZCF[256*256];
ZCF hs[256][256];
ZCF* hs11 = new ZCF[256*256];
ZCF* pTS = (ZCF*)ts;
ZCF* pHS = (ZCF*)hs;
ZCF (*hs1)[256] = (ZCF(*)[256])hs11;
/// hs 付值
memset(hs, 0, sizeof(hs));
pHS = (ZCF*)hs;
hs[0][0].real(1);
float a = 1003.0f;
float pN[7][7] = {
0,0,1,2,1,0,0,
0,3,13,22,13,3,0,
1,13,59,97,59,13,1,
2,22,97,159,97,22,2,
1,13,59,97,59,13,1,
0,3,13,22,13,3,0,
0,0,1,2,1,0,0,
};
///_make_h(pN, hs);
fft.FFT_(hs, hs);
///memset(hs1, 0, sizeof(hs));
//fft.FFT_(hs1, hs1);
//fft.Mul_(hs, hs, hs1);
long count = 256*256;
{
pBuf= (BYTE*)r.pBits;
ZCF* pTS = (ZCF*)ts;
////ts 付值
for(long i=0; i<count; i++){
pTS->real(*pBuf); pTS->imag(0);
pTS++; pBuf+=4;
}
//// FFT;
fft.FFT_(ts, ts);
//// mul
fft.Mul_(ts, hs, ts);
//// InvFFT;
fft.InvFFT_(ts, ts);
pBuf = (BYTE*)r.pBits;
pTS = (ZCF*)ts;
for(i=0; i<count; i++){
long rr = (long)pTS->real();
if(rr>0xff)rr = 0xff; if(rr<0)rr = 0;
*pBuf = rr;
pBuf+=4; pTS++;
}
}
{
pBuf= (BYTE*)r.pBits;
ZCF* pTS = (ZCF*)ts;
////ts 付值
for(long i=0; i<count; i++){
pBuf++;
pTS->real(*pBuf); pTS->imag(0);
pTS++; pBuf+=3;
}
//// FFT;
fft.FFT_(ts, ts);
//// mul
fft.Mul_(ts, hs, ts);
//// InvFFT;
fft.InvFFT_(ts, ts);
pBuf = (BYTE*)r.pBits;
pTS = (ZCF*)ts;
for(i=0; i<count; i++){
pBuf++;
long rr = (long)pTS->real();
if(rr>0xff)rr = 0xff; if(rr<0)rr = 0;
*pBuf = rr;
pBuf+=3; pTS++;
}
}
{
pBuf= (BYTE*)r.pBits;
ZCF* pTS = (ZCF*)ts;
////ts 付值
for(long i=0; i<count; i++){
pBuf+=2;
pTS->real(*pBuf); pTS->imag(0);
pTS++; pBuf+=2;
}
//// FFT;
fft.FFT_(ts, ts);
//// mul
fft.Mul_(ts, hs, ts);
//// InvFFT;
fft.InvFFT_(ts, ts);
pBuf = (BYTE*)r.pBits;
pTS = (ZCF*)ts;
for(i=0; i<count; i++){
pBuf+=2;
long rr = (long)pTS->real();
if(rr>0xff)rr = 0xff; if(rr<0)rr = 0;
*pBuf = rr;
pBuf+=2; pTS++;
}
}
delete [] ts;
mpTex1->UnlockRect(0); |
|