函数一:
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];
 }
 }
 }
}
上面的函数无非是用循环去遍历像元矩阵,是循环中的循环,现在是直接列举出矩阵元素。但是在执行结果上却不一样。图像像元被替换后,下面的结果明显好于上面求解:)

解决方案 »

  1.   

    很正常啊,你的25个里面是很多重复的,不同顺序的话会造成最后的结果不同........
    如: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)] ;
      

  2.   

    呵呵,处理图像? Width  不等 数据缓冲区长度,windows 为加快访问速度,采用字对齐方式,字的大小依赖机器
      

  3.   


    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)]...才有预期的结果
      

  4.   

    呵呵,补充一下,最开始我是做图像像元的替换,是单个像素之间替换,函数为:
    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个函数结果却不一样