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

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(坎尼?)告一段落!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值