visual C++ 2008 的代碼,逆濾波后影像出現了白色斑點,怎樣可以去掉又不影響恢復的效果?
uj5u.com熱心網友回復:
濾波演算法有問題或者逆濾波演算法有問題,出現了極點什么的。看看你的演算法有沒有問題。uj5u.com熱心網友回復:
這是逆濾波的view.cpp程式。各位看看有問題嗎?可以幫我改一下嗎?BOOL WINAPI DIBInverseFilter (Cdib *pDib)
{
BYTE * lpSrc; //指向源影像的指標
LONG lWidth; //影像的寬度
LONG lHeight; //影像的高度
LONG lLineBytes; //影像每行位元組數
//得到影像的寬度和高度
Csize SizeDim;
SizeDim=pDib->GetDimensions();
lWidth=SizeDim.cx;
lHeight=SizeDim.cy;
//得到實際的Dib影像的大小
Csize sizeRealDim;
SizeRealDim=pDib->GetDibSaveDim();
lLineBytes=SizeRealDim.cx; // 計算影像每行的位元組數
LPBYTE lpDIBBits=pDib->m_lpImage; //影像資料的指標
//回圈變數
long i;
long j;
double tempre, tempim,a,b,c,d; //臨時變數
//實際進行傅里葉變換的寬度和高度
LONG lW=1;
LONG LH=1;
int wp=0;
int hp=0;
//保證離散傅里葉變化的寬度和高度為2的整數冪
While(lW*2<=lLineBytes)
{
lW=lW*2;
wp++;
}
while(lH*2<=lHeight)
{
lH=lH*2;
hp++;
}
complex<double>*pCTSrc,*PCTH; //用來存盤源影像和變換核的時域資料
complex<double>*pCFSrc,*PCFH; //用來存盤源影像和變換核的頻域資料
double MaxNum; //影像歸一化因子
//輸入退化影像的長和寬必須為2的整數倍
if(lW!=(int) lLineBytes)
{
return false;
}
if(lH!=(int) lHeight)
{
return false;
}
//為時域和頻域的陣列分配空間
pCTSrc=https://bbs.csdn.net/topics/new complex
pCTH=new complex<double> [lHeight*lLineBytes];
pCFSrc=https://bbs.csdn.net/topics/new complex
pCFH=new complex<double> [lHeight*lLineBytes];
//將退化影像資料存入時域陣列
for(j=0;j<lHeight;j++)
{
for(i=0;i<lLineBytes;i++)
{
//指向退化影像倒數第j行、第i個像素指標
lpSrc=https://bbs.csdn.net/topics/(unsigned char*)lpDIBBits+lLineBytes*j+i;
pCTSrc[lLineBytes*j+i]=complex<double>((double)*lpSrc,0);
pCFSrc[lLineBytes*j+i]= complex<double>(0.0,0.0);
if(i<5&&j<5)
{
pCTH[lLineBytes*j+i]=complex<double>(0.04,0.0);
}
else
{
pCTH[lLineBytes*j+i]=complex<double>(0.0,0.0);
}
pCFH[lLineBytes*j+i]=complex<double>(0.0,0.0);
}
}
//呼叫傅里葉變換函式,對退化影像進行傅里葉變換
::DIBFFT_2D(pCTSrc,lLineBytes,lHeight,pCFSrc);
//呼叫傅里葉變換函式,對點擴散函式進行傅里葉變換
::DIBFFT_2D(pCTH,lLineBytes,lHeight,pCFH);
//頻域相除
for(i=0;i<lHeight*lLineBytes;i++)
{
a=pCFSrc[i].real();
b=pCFSrc[i].image();
c=pCFH[i].real();
d=pCFH[i].image();
//如果頻域值太小,不予考慮
if(c*c+d*d>le-3)
{
tempre=(a*c+b*d)/(c*c+d*d);
tempim=(b*c-a*d)/(c*c+d*d)
}
pCFSrc[i]=complex<double>(tempre,tempim);
}
//呼叫反傅里葉變換函式,對復原影像進行反傅里葉變換
IFFT_2D(pCFSrc,pCTSrc,lLineBytes,lHeight,);
MaxNum=300;//確定歸一化因子
//轉化為復原影像
for(j=0;j<lHeight;j++)
{
for(i=0;i<lLineBytes;i++)
{ //指向復原影像倒數第j行、第i個像素的指標
lpSrc=https://bbs.csdn.net/topics/(unsigned char *)lpDIBBits+lLineBytes*j+i;
*lpSrc=https://bbs.csdn.net/topics/(unsigned char) (pCTSrc[(lLineBytes)*j+i].real()*255.0/MaxNum);
}
}
//釋放存盤空間
delete pCTSrc;
delete pCTH;
delete pCFSrc;
delete pCFH;
return true;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/123281.html
標籤:基礎類
上一篇:并列資料排序的問題,急急急
