前面博文已经有了霍夫找直线的算法这里再补充一下:
第一,程序调试成功后,真实的hough图像对比原图像:
第二,其实(p,)是可以转换(k,b)的,转换关系如下:因为两条直线垂直,斜率k*sin
/cos
=-1,所以,k=-cos
/sin
,b=p/sin(
),这样你就又有了一幅kb图像,其结果与hough图像差不多,原图像两条直线,那么结果就是两个闪亮的星星,为什么不是闪亮的点呢?看到下面结果就明白了:
因为直线不是两条,而是两直线簇。画直线的算法如下:
void DrawLine(BYTE** imageBuf, int w, int h, int a/*=*/,int p)
{
//在此找出直線起點,終點
double k,b;
int x,y;
if(a!=90) //此处处理太绝对 //如果斜率存在,这里使用的是角度,非弧度
{
//计算直线方程的参数
b=p/cos(a*3.1415926535/180);//为了应付p=xsin+ycos
这个错误的公式,此处处理太牵强,怪怪的!
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,)和直线y=kx+b不是同一条直线,是相互垂直的关系,我在这里的认知翻过车!
为什么最后一幅图不是原图像?原因是当初为了加快计算p,,图像进行了canny处理,这样其实反而变慢了,但你收获了canny算法的喜悦,实际可以用sobel图像(我们用的是梯度图像),就可以使得边缘不相干像素就过滤掉了,速度就起来了。
实质hough找线计算量很大,自然很慢,我们机器视觉中,会用它吗?显然不会,但学习,要过此关。
有机会用时间测一下hough算子,canny算子,就一目了然了,否则,机器视觉怎么会走感兴趣区域这条路?发明那么多感兴趣工具?