我在尝试使用此paper实现NLMEANS算法时遇到问题。 我应用算法的区域输出图像完全黑暗。 对于图像输入和输出,使用名为diblook-vs10的框架。
这是我的源代码:
void CDibView::OnProcessingNl()
{
// TODO: Add your command handler code here
int mat[400][400];
int dif[8];
for(int i=0;i<400;i++)
for(int j=0;j<400;j++)
mat[i][j]=0;
BEGIN_PROCESSING();
BYTE red,green,blue;
for(int r=dwHeight-2;r>=0;r--)
{
for(int c=1;c<dwWidth-1;c++){
mat[r][c]=lpSrc[r*w+c];
}
}
float z=0; // Z(i)
float nlVi=0.0; // NL[V](i)
for(int i=100;i>=0;i--) // searching for grey level similarities
for(int j=1;j<100;j++)
{
float num=0.0; //
for(int r=100;r>=0;r--)
{
for(int c=1;c<100;c++){
dif[0]=mat[i][j+1]-mat[r][c+1];
dif[1]=mat[i-1][j+1]-mat[r-1][c+1];
dif[2]=mat[i-1][j]-mat[r-1][c];
dif[3]=mat[i-1][j-1]-mat[r-1][c-1];
dif[4]=mat[i][j-1]-mat[r][c-1];
dif[5]=mat[i+1][j-1]-mat[r+1][c-1];
dif[6]=mat[i+1][j]-mat[r+1][j];
dif[7]=mat[i+1][j+1]-mat[r+1][c+1];
dif[0]=dif[0]*dif[0]; // || V(Ni) - V(Nj) || ^ 2
dif[1]=dif[1]*dif[1];
dif[2]=dif[2]*dif[2];
dif[3]=dif[3]*dif[3];
dif[4]=dif[4]*dif[4];
dif[5]=dif[5]*dif[5];
dif[6]=dif[6]*dif[6];
dif[7]=dif[7]*dif[7];
int sum=0;
float sume=0.0;
float eLaDif=0.0;
for(int cont=0;cont<=7;cont++)
{
float putere=0.0;
putere=((float) dif[cont])/4; //h=4
eLaDif=exp(-putere);
sume=sume+eLaDif;
}
float varweight=sume;
num=num+varweight*mat[r][c];
z=z+varweight;
}
}
nlVi=num/z;
lpDst[i*w+j]= nlVi;
}
END_PROCESSING("NL_MEANS");
}