利用Hough变换实现直线检测的代码

vc图像处理程序中经常要用到直线检测,常用的直线检测方法是Hough变换。

    Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。

    简而言之,Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。

    以下代码实现了最简单的Hough变换直线检测,输入为width*height的二值图(背景为0,前景为255),存放在矩阵src中,iThreshold为判断为直线的域值。输出pR为原点到直线的距离,pTh为直线的角度。

复制内容到剪贴板 程序代码 程序代码

void Hough(BYTE *src,int width,int height, int *pR, int *pTh, int iThreshold) 

    int *pArray;
    int iRMax = (int)sqrt(width * width + height * height) + 1;
    int iThMax = 361;
    int iTh = 0;
    int iR;
    int iMax = -1;
    int iThMaxIndex = -1;
    int iRMaxIndex = -1;

    pArray = new int[iRMax * iThMax]; 
    memset(pArray, 0, sizeof(int) * iRMax * iThMax);

    float fRate = (float)(PI/180);

    for (int y = 0; y < height; y++) 
    { 
        for (int x = 0; x < width; x++) 
        { 
            if(*src == 255)
            {
                for(iTh = 0; iTh < iThMax; iTh += 1)
                {
                    iR = (int)(x * cos(iTh * fRate) + y * sin(iTh * fRate));

                    if(iR > 0)
                    {
                        pArray[iR/1 * iThMax + iTh]++;
                    }
                }
            }

            src++; 
        } // x 
    } // y 

    for(iR = 0; iR < iRMax; iR++)
    {
        for(iTh = 0; iTh < iThMax; iTh++)
        {
            int iCount = pArray[iR * iThMax + iTh];
            if(iCount > iMax)
            {
                iMax = iCount;
                iRMaxIndex = iR;
                iThMaxIndex = iTh;
            }
        }
    }

    if(iMax >= iThreshold)
    {
        *pR = iRMaxIndex;
        *pTh = iThMaxIndex;
    }

    delete []pArray;

    return; 
} // end of Hough
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值