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

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

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

机器视觉入门之路(三九,霍夫变换(hough transform)图像,c++)_第1张图片机器视觉入门之路(三九,霍夫变换(hough transform)图像,c++)_第2张图片

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

机器视觉入门之路(三九,霍夫变换(hough transform)图像,c++)_第3张图片机器视觉入门之路(三九,霍夫变换(hough transform)图像,c++)_第4张图片

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

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             {
                y=(int)(k*x+b);
                if(y>=0 && y                 {                 
                    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             {
                x=(int)(y/k-b/k);
                if(x>=0 && x                 {
                    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         {
            if(p>=0&&p             {
            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算子,就一目了然了,否则,机器视觉怎么会走感兴趣区域这条路?发明那么多感兴趣工具?

你可能感兴趣的:(图像处理,机器视觉)