已知二维数组的数据,T[i][j],i表示行数,一行一行的数据进行边缘检测,找到边缘点,还要记下它所对应的i,j的值。请高手指点!边缘检测有好多种方法,最好给出一个相对简单点的算法,同时也能保证精度的。谢谢!

解决方案 »

  1.   

    使用梯度算子、Sobel边缘检测、拉普拉斯算子、kirscsh算子等等,有很多。看你要选什么算法。
    这些算子实际上就是对以像素f(i,j)为中心的3*3领域作卷积交换(即对应元素相乘),结果赋予f(i,j)(检测后的像素值)
    拉普拉斯算子的卷积核为
    |0 -1 0 |
    |-1 5 -1|
    |0 -1 0 |.其他算法的卷积核可以上网查
      

  2.   

    int h[9]={0,-1,0,-1,5,-1,0,-1,0};//定义卷积核
      int value[9];
     for(i=0;i<2048;i++)
        for(j=0;j<ln;j++)
        { t1[i][j]=T1[i][j];//原始数据
         value[0]=T1[i-1][j-1];
         value[1]=T1[i-1][j];
         value[2]=T1[i-1][j+1];
         value[3]=T1[i][j-1];
         value[4]=T1[i][j];
         value[5]=T1[i][j+1];
         value[6]=T1[i+1][j-1];
         value[7]=T1[i+1][j];
         value[8]=T1[i+1][j+1]; 
        for(int m=0;m<9;m++)
        { 
         t1[i][j]=t1[i][j]+value[m]*h[m];
        }   
       }
    但我实际上还要找出边缘点,这只是把处理后的结果显示了,并不知道哪些是边缘点啊。如何把边缘点找出来呢?
      

  3.   

    结果都出来了,还不容易找边缘点吗??
    首先你要定义一个和图像一样尺度的bool型数组,来记录边界,还要有个判断是不是边缘的门限才行(相当于二值化),比如threshold=100,当大于threshold时为边界:int h[9]={0,-1,0,-1,5,-1,0,-1,0};//定义卷积核 
      int value[9]; 
    for(i=0;i <2048;i++) 
      for(j=0;j <ln;j++) 
      { 
        t1[i][j]=T1[i][j];//原始数据 
         value[0]=T1[i-1][j-1]; 
         value[1]=T1[i-1][j]; 
         value[2]=T1[i-1][j+1]; 
         value[3]=T1[i][j-1]; 
         value[4]=T1[i][j]; 
         value[5]=T1[i][j+1]; 
         value[6]=T1[i+1][j-1]; 
         value[7]=T1[i+1][j]; 
         value[8]=T1[i+1][j+1];  
        for(int m=0;m <9;m++) 
        {  
         t1[i][j]=t1[i][j]+value[m]*h[m]; 
        }
        if (t1[i][j]>threshold) edge[i][j]=true;//记录边界   
       } 当然了,门限的选择还可以有很多方法,就看你怎么用了!!