机器视觉入门之路(三八,经典canny边缘检测(计算机视觉里程碑),c++)

    技术2022-07-12  70

    c#已经注释,这里就省略了注释,可以对比看

    //image0,image1А8ㄧ计8瓜钩矪瞶 void CLineBufProcess::mg_CannySideGrandiant(BYTE* image0, BYTE* image1, int w, int h) {

        int* p=new int[h*w];                     int * q=new int[h*w];                    int   * m=new int[h*w];                          double *t=new double[h*w];          

        memset(p,0,w*h);     memset(q,0,w*h);     memset(m,0,w*h);     memset(t,0,w*h);

        int** P = (int**)malloc(sizeof(int*)*(h));     for(int y=0; y<h; y++)     {         P[y] = p+y*w;      }

        int** Q = (int**)malloc(sizeof(int*)*(h));     for(int y=0; y<h; y++)     {         Q[y] = q+y*w;      }

        int** M = (int**)malloc(sizeof(int*)*(h));     for(int y=0; y<h; y++)     {         M[y] = m+y*w;      }          double** Theta = (double**)malloc(sizeof(double*)*(h));     for(int y=0; y<h; y++)     {         Theta[y] = t+y*w;      }

        for(int y=0; y<(h-1); y++)       {           for(int x=0; x<(w-1); x++)           {             int n = (y*w+x);                           p[y*w+x] = AshCount(image0, n, n+1);//函数在末尾,求x梯度图像             q[y*w+x]= AshCount(image0, n, n+w);//我们只使用了梯度图像,并没有用sobel增强边缘         }     }

        for(int i=0; i<h-1; i++)       {           for(int j=0; j<w-1; j++)           {              m[i*w+j]=p[i*w+j]+q[i*w+j];                      m[i*w+j] = m[i*w+j]>255?255:m[i*w+j];                          Theta[i][j] = atan(Q[i][j]/(P[i][j]*1.0)) * 57.3;               if(Theta[i][j] < 0)                   Theta[i][j] += 360;                       }       }      //┮惠碭璸衡Ч拨獶伐ы

        BYTE* n=new BYTE[w*h];      memset(n,0,w*h);     memcpy(n,image1,w*h);

        BYTE** N = (BYTE**)malloc(sizeof(BYTE*)*(h));     for(int y=0; y<h; y++)     {         N[y] = n+y*w;      }

        int g1=0, g2=0, g3=0, g4=0;                                   double dTmp1=0.0, dTmp2=0.0;                                 double dWeight=0.0;                                               for(int i=0; i<w; i++)       {         N[0][i] = 0;         N[h-1][i] = 0;      }       for(int j=0; j<h; j++)       {           N[j][0] = 0;           N[j][w-1] = 0;      }  

        for(int i=1; i<(w-1); i++)       {           for(int j=1; j<(h-1); j++)           {               //辫0獶娩翴                if(M[j][i] == 0)             {                 N[j][i] = 0;              }             else               {                                  材///                    /       g1  g2                  /                    /           C                   /                    /           g4  g3              /                    /                    if( ((Theta[j][i]>=90)&&(Theta[j][i]<135)) ||                        ((Theta[j][i]>=270)&&(Theta[j][i]<315)))                   {                                              g1 = M[j-1][i-1];                       g2 = M[j-1][i];                       g4 = M[j+1][i];                       g3 = M[j+1][i+1];                       dWeight = abs(P[j][i]/(Q[j][i]*1.0));                      dTmp1 = g1*dWeight+g2*(1-dWeight);                       dTmp2 = g3*dWeight+g4*(1-dWeight);                   }                 材///                    /               g1                      /                    /       g4  C   g2              /                    /       g3              /                    /                  else if( ((Theta[j][i]>=0)&&(Theta[j][i]<45)) ||                        ((Theta[j][i]>=180)&&(Theta[j][i]<225)))                    {   //int nPointIdx = i+j*w;                     g3 = M[j+1][i-1];                       g2 = M[j][i+1];                       g1 = M[j-1][i+1];                       g4 = M[j][i-1];                       dWeight = abs(Q[j][i]/(P[j][i]*1.0));   //                                            dTmp1 = g1*dWeight+g2*(1-dWeight);                       dTmp2 = g3*dWeight+g4*(1-dWeight);  

                    }                   材///                    /           g2  g1              /                    /           C                   /                    /       g3  g4                  /                    /                    else if( ((Theta[j][i]>=45)&&(Theta[j][i]<90)) ||                        ((Theta[j][i]>=225)&&(Theta[j][i]<270)))                   {  //int nPointIdx = i+j*w;                     g2 = M[j-1][i];                       g1 = M[j-1][i+1];                       g4 = M[j+1][i];                       g3 = M[j+1][i-1];                       dWeight = abs(P[j][i]/(Q[j][i]*1.0));   //はタち                                         dTmp1 = g1*dWeight+g2*(1-dWeight);                       dTmp2 = g3*dWeight+g4*(1-dWeight);                   }                   材///                    /       g3              /                    /       g4  C   g2              /                    /               g1                      /                    /                  else if( ((Theta[j][i]>=135)&&(Theta[j][i]<180)) ||                        ((Theta[j][i]>=315)&&(Theta[j][i]<360)))                       {  //int nPointIdx = i+j*w;                     g1 = M[j+1][i+1];                       g2 = M[j][i+1];                       g3 = M[j-1][i-1];                       g4 = M[j][i-1];                       dWeight = abs(Q[j][i]/(P[j][i]*1.0));   //タち                        dTmp1 = g1*dWeight+g2*(1-dWeight);                       dTmp2 = g3*dWeight+g4*(1-dWeight);                     }  

                }                if((M[j][i]>=dTmp1) && (M[j][i]>=dTmp2))              {                 N[j][i] = 128;                               }             else              {                 N[j][i] = 0;                          }         }     }      //N is 0 or 128 gray bitmap     //蔼耬砞﹚     int nHist[361];        int nEdgeNum;                int nMaxMag = 0;             int nHighCount;  

        for(int i=0;i<361;i++)          nHist[i] = 0;       for(int i=0; i<h; i++)       {           for(int j=0; j<w; j++)           {               if(N[i][j]==128)                   nHist[M[i][j]]++;           }       }  

        nEdgeNum = nHist[0];       nMaxMag = 0;                              for(int i=1; i<361; i++)              {           if(nHist[i] != 0)              {               nMaxMag = i;           }              nEdgeNum += nHist[i];        } 

        double  dRatHigh = m_twoThres; ノㄓ絋﹚蔼耬     double  dThrHigh;       int  dThrLow;       double  dRatLow = 0.5;       nHighCount = (int)(dRatHigh * nEdgeNum + 0.5);       int j=1;       nEdgeNum = nHist[1];       while((j<(nMaxMag-1)) && (nEdgeNum < nHighCount))       {           j++;           nEdgeNum += nHist[j];       }       dThrHigh = j;                                     dThrLow = (int)((dThrHigh) * dRatLow + 0.5);   

        SIZE sz;       sz.cx = w;       sz.cy = h;       for(int i=0; i<h; i++)       {           for(int j=0; j<w; j++)           {               if((N[i][j]==128) && (M[i][j] >= dThrHigh))               {                   N[i][j] = 255;                               TraceEdge(i, j, dThrLow, n, m, sz);  //             }           }       }      for(int i=0; i<h; i++)       {           for(int j=0; j<w; j++)           {               if(N[i][j] != 255)               {                   N[i][j]  = 0 ;                                }           }       }       memcpy(image1,n,w*h);     memcpy(image0,n,w*h);     free(P);     free(p);     free(Q);     free(q);

        free(N);     free(M);     free(m);     free(Theta);     free(t);     delete n; }

    /

    int CLineBufProcess::AshCount(BYTE* image0, unsigned int c1, unsigned int c2) {     int dAsh=abs( image0[c1] - image0[c2] );     return dAsh; }

    好,canny(坎尼?)告一段落!

    Processed: 0.022, SQL: 9