机器视觉入门之路(三九---B,霍夫变换(hough transform)图像,c++)

前面博文已经有了霍夫找直线的算法这里再补充一下:

第一,程序调试成功后,真实的hough图像对比原图像:

第二,其实(p,\Theta)是可以转换(k,b)的,转换关系如下:因为两条直线垂直,斜率k*sin\Theta/cos\Theta=-1,所以,k=-cos\Theta/sin\Theta,b=p/sin(\Theta),这样你就又有了一幅kb图像,其结果与hough图像差不多,原图像两条直线,那么结果就是两个闪亮的星星,为什么不是闪亮的点呢?看到下面结果就明白了:

因为直线不是两条,而是两直线簇。画直线的算法如下:

void DrawLine(BYTE** imageBuf, int w, int h, int a/*=\Theta*/,int p)
{
    //在此找出直線起點,終點
    double k,b;
    int x,y;
    if(a!=90) //此处处理太绝对   //如果斜率存在,这里\Theta使用的是角度,非弧度
    {
        //计算直线方程的参数
        b=p/cos(a*3.1415926535/180);//为了应付p=xsin\Theta+ycos\Theta这个错误的公式,此处处理太牵强,怪怪的!
        k=-sin(a*3.1415926535/180)/cos(a*3.1415926535/180);//此处处理太牵强,怪怪的!
        y=0;
        x=0;
        //斜率小于1的情况
        if(abs(k)<=1)
        {
            for(x=0;x<w-2;x++)
            {
                y=(int)(k*x+b);
                if(y>=0 && y<h-2)
                {                 
                    imageBuf[y][x*4]=0;
                    imageBuf[y][x*4+1]=0;
                    imageBuf[y][x*4+2]=250;//红色
                    imageBuf[y][x*4+3]=255;                  
                }
            }
        }
        //斜率大于1的情况
        else
        {
            for(y=0;y<h-2;y++)
            {
                x=(int)(y/k-b/k);
                if(x>=0 && x<w-2)
                {
                    imageBuf[y][x*4]=0;
                    imageBuf[y][x*4+1]=0;
                    imageBuf[y][x*4+2]=250;//红色
                    imageBuf[y][x*4+3]=255;
                }
            }
        }
    }
    //斜率不存在的情况
    else
    {
        for(y=0;y<h-2;y++)
        {
            if(p>=0&&p<w-2)
            {
            imageBuf[y][p*4]=0;
            imageBuf[y][p*4+1]=0;
            imageBuf[y][p*4+2]=250;//红色
            imageBuf[y][p*4+3]=255;
            }
        }
    }

}

至于kb图像,可以尝试画一下。其实直线(p,\Theta)和直线y=kx+b不是同一条直线,是相互垂直的关系,我在这里的认知翻过车

为什么最后一幅图不是原图像?原因是当初为了加快计算p,\Theta,图像进行了canny处理,这样其实反而变慢了,但你收获了canny算法的喜悦,实际可以用sobel图像(我们用的是梯度图像),就可以使得边缘不相干像素就过滤掉了,速度就起来了。

实质hough找线计算量很大,自然很慢,我们机器视觉中,会用它吗?显然不会,但学习,要过此关。

有机会用时间测一下hough算子,canny算子,就一目了然了,否则,机器视觉怎么会走感兴趣区域这条路?发明那么多感兴趣工具?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值