函数一:
void CDeleteCloud::DeleteCloud(BYTE *B1,BYTE *B2,BYTE *B3,int Height,int Width)
{
int i,j;
for (i=0;i<Height;i++)//Height
{
for (j=0;j<Width;j++)//Width
{
int a = i*Width - 2,b = j - 2;
if (B1[(a+2) + ( b+2)] >80 || B1[(a+2) + ( b+2)] <10)
{
int m,n;
for (m=0;m<5;m++)//////周围5个像素需要替换,循环遍历条件像元周围需要像素。
{
for (n=0;n<5;n++)
B3[(a+m) + (b+n)] = B2[(a+m) + (b+n)];
} }
else
{
B3[(a+2) + ( b+2)] = B1[(a+2) + ( b+2)];
}
}
}
}
函数二:
void CDeleteCloud::DeleteCloud(BYTE *B1,BYTE *B2,BYTE *B3,int Height,int Width)
{
int i,j;
for (i=0;i<Height;i++)
{
for (j=0;j<Width;j++)
{
int offset = i*Width + j;
if (B1[i*Width + j] >80 || B1[i*Width + j] <10)
{
B3[i*Width + j] = B2[i*Width + j]; B3[i*Width + (j-1)] = B2[i*Width + (j-1)];
B3[i*Width + (j+1)] = B2[i*Width + (j+1)];
B3[(i*Width-1) + j] = B2[(i*Width-1) + j];
B3[(i*Width+1) + j] = B2[(i*Width+1) + j];
B3[(i*Width-1) + (j-1)] = B2[(i*Width-1) + (j-1)];
B3[(i*Width-1) + (j+1)] = B2[(i*Width-1) + (j+1)];
B3[(i*Width+1) + (j+1)] = B2[(i*Width+1) + (j+1)];
B3[(i*Width+1) + (j-1)] = B2[(i*Width+1) + (j-1)]; B3[(i*Width-2) + (j+1)] = B2[(i*Width-2) + (j+1)];
B3[(i*Width+2) + (j+1)] = B2[(i*Width+2) + (j+1)];
B3[(i*Width-2) + j] = B2[(i*Width-2) + j];
B3[(i*Width+2) + j] = B2[(i*Width+2) + j];
B3[(i*Width-2) + (j-1)] = B2[(i*Width-2) + (j-1)];
B3[(i*Width+2) + (j-1)] = B2[(i*Width+2) + (j-1)];
B3[(i*Width-1) + (j+2)] = B2[(i*Width-1) + (j+2)];
B3[(i*Width-2) + (j+2)] = B2[(i*Width-2) + (j+2)];
B3[i*Width + (j+2)] = B2[i*Width + (j+2)];
B3[(i*Width+1) + (j+2)] = B2[(i*Width+1) + (j+2)];
B3[(i*Width+2) + (j+2)] = B2[(i*Width+2) + (j+2)];
B3[(i*Width-2) + (j-2)] = B2[(i*Width-2) + (j-2)];
B3[(i*Width-1) + (j-2)] = B2[(i*Width-1) + (j-2)];
B3[i*Width + (j-2)] = B2[i*Width + (j-2)];
B3[(i*Width+1) + (j-2)] = B2[(i*Width+1) + (j-2)];
B3[(i*Width+2) + (j-2)] = B2[(i*Width+2) + (j-2)];
}
else
{
B3[i*Width + j] = B1[i*Width + j];
}
}
}
}
上面的函数无非是用循环去遍历像元矩阵,是循环中的循环,现在是直接列举出矩阵元素。但是在执行结果上却不一样。图像像元被替换后,下面的结果明显好于上面求解:)
void CDeleteCloud::DeleteCloud(BYTE *B1,BYTE *B2,BYTE *B3,int Height,int Width)
{
int i,j;
for (i=0;i<Height;i++)//Height
{
for (j=0;j<Width;j++)//Width
{
int a = i*Width - 2,b = j - 2;
if (B1[(a+2) + ( b+2)] >80 || B1[(a+2) + ( b+2)] <10)
{
int m,n;
for (m=0;m<5;m++)//////周围5个像素需要替换,循环遍历条件像元周围需要像素。
{
for (n=0;n<5;n++)
B3[(a+m) + (b+n)] = B2[(a+m) + (b+n)];
} }
else
{
B3[(a+2) + ( b+2)] = B1[(a+2) + ( b+2)];
}
}
}
}
函数二:
void CDeleteCloud::DeleteCloud(BYTE *B1,BYTE *B2,BYTE *B3,int Height,int Width)
{
int i,j;
for (i=0;i<Height;i++)
{
for (j=0;j<Width;j++)
{
int offset = i*Width + j;
if (B1[i*Width + j] >80 || B1[i*Width + j] <10)
{
B3[i*Width + j] = B2[i*Width + j]; B3[i*Width + (j-1)] = B2[i*Width + (j-1)];
B3[i*Width + (j+1)] = B2[i*Width + (j+1)];
B3[(i*Width-1) + j] = B2[(i*Width-1) + j];
B3[(i*Width+1) + j] = B2[(i*Width+1) + j];
B3[(i*Width-1) + (j-1)] = B2[(i*Width-1) + (j-1)];
B3[(i*Width-1) + (j+1)] = B2[(i*Width-1) + (j+1)];
B3[(i*Width+1) + (j+1)] = B2[(i*Width+1) + (j+1)];
B3[(i*Width+1) + (j-1)] = B2[(i*Width+1) + (j-1)]; B3[(i*Width-2) + (j+1)] = B2[(i*Width-2) + (j+1)];
B3[(i*Width+2) + (j+1)] = B2[(i*Width+2) + (j+1)];
B3[(i*Width-2) + j] = B2[(i*Width-2) + j];
B3[(i*Width+2) + j] = B2[(i*Width+2) + j];
B3[(i*Width-2) + (j-1)] = B2[(i*Width-2) + (j-1)];
B3[(i*Width+2) + (j-1)] = B2[(i*Width+2) + (j-1)];
B3[(i*Width-1) + (j+2)] = B2[(i*Width-1) + (j+2)];
B3[(i*Width-2) + (j+2)] = B2[(i*Width-2) + (j+2)];
B3[i*Width + (j+2)] = B2[i*Width + (j+2)];
B3[(i*Width+1) + (j+2)] = B2[(i*Width+1) + (j+2)];
B3[(i*Width+2) + (j+2)] = B2[(i*Width+2) + (j+2)];
B3[(i*Width-2) + (j-2)] = B2[(i*Width-2) + (j-2)];
B3[(i*Width-1) + (j-2)] = B2[(i*Width-1) + (j-2)];
B3[i*Width + (j-2)] = B2[i*Width + (j-2)];
B3[(i*Width+1) + (j-2)] = B2[(i*Width+1) + (j-2)];
B3[(i*Width+2) + (j-2)] = B2[(i*Width+2) + (j-2)];
}
else
{
B3[i*Width + j] = B1[i*Width + j];
}
}
}
}
上面的函数无非是用循环去遍历像元矩阵,是循环中的循环,现在是直接列举出矩阵元素。但是在执行结果上却不一样。图像像元被替换后,下面的结果明显好于上面求解:)
如:B3[(i*Width-2) + (j+2)]就和B3[(i*Width) + j]是同一个地方...........按我的推测,你的矩阵应该是这个样子吧:
B3[(i-2)*Width + (j+2)]....
m,n循环里面因该是:
B3[(i-2+m)*Width+(j-2+n)] = B2[(i-2+m)*Width+(j-2+n)] ;
B3[(i*Width-2) + (j+2)]就和B3[(i*Width) + j]怎么是同一个地方呀?B3[(i*Width) + j]是矩阵的中心嘛,B3[(i*Width-2) + (j+2)]是一个顶点嘛。B3[(i-2)*Width + (j+2)]这样写就错了,程序就不执行,内存溢出,得不到预期结果,必须是B3[(i*Width-2)+ (j+2)]...才有预期的结果
void CDeleteCloud::DeleteCloud(BYTE *B1,BYTE *B2,BYTE *B3,int Height,int Width)
{
int i,j;
for (i=0;i<Height;i++)
{
for (j=0;j<Width;j++)
{
int q = i*Width + j;
if (B1[q] >65 || B1[q] <20)
{
B3[q] = B2[q];
}
else
{
B3[q] = B1[q];
}
}
}}
但是精度不够,处理的图像的衔接有问题,所以改为判断一个像元是需要的以后,替换以这个像元为中心的一个5*5矩阵的像元,以提高边缘的效果。可以以上的2个函数结果却不一样