opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标
Posted 夜的那种黑丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标相关的知识,希望对你有一定的参考价值。
图片霍夫变换拟合得到直线后,怎样获得直线上的像素点坐标?
这是我今天在图像处理学习中遇到的问题,霍夫变换采用的概率霍夫变换,所以拟合得到的直线信息其实是直线的两个端点的坐标,这样一个比较直接的思路就是利用DDA算法来获取.
一.算法简介
DDA算法是计算机图形学中最简单的绘制直线算法。其主要思想是由直线公式y = kx + b推导出来的。
我们已知直线段两个端点P0(x0,y0)和P1(x1,y1),就能求出 k 和 b 。
在k,b均求出的条件下,只要知道一个x值,我们就能计算出一个y值。如果x的步进为1(x每次加1,即x = x +1),那么y的步进就为k+b;同样知道一个y值也能计算出x值,此时y的步进为1,x的步进为(1-b)/k。根据计算出的x值和y值,向下取整,得到坐标(x’,y’),并在(x’,y’)处绘制直线段上的一点。
为进一步简化计算,通常可令b取0,将起点看作(0,0)。设当前点为(xi, yi)则用DDA算法求解(xi+1,yi+1)的计算公式可以概括为:
xi+1 = xi + xStep (1)
yi+1 = yi + yStep (2)
我们一般通过计算 Δx 和 Δy 来确定xStep和yStep:
如果 Δx > Δy,说明x轴的最大差值大于y轴的最大差值,x轴方向为步进的主方向,xStep = 1,yStep = k;
如果 Δy > Δx,说明y轴的最大差值大于x轴的最大差值,y轴方向为步进的主方向,yStep = 1,xStep = 1 / k。
根据这个公式,就能通过(xi,yi)迭代计算出(xi+1、yi+1),然后在坐标系中绘制计算出的(x,y)坐标点。
二.代码展示
下面是代码,假设(x1, y1),(x2, y2)为直线的两个端点坐标:
1 xDis = x2 - x1 #x的增量 2 yDis = y2 - y1 #y的增量 3 if(abs(xDis) > abs(yDis)): 4 maxstep = abs(xDis) 5 else: 6 maxstep = abs(yDis) 7 xUnitstep = xDis/maxstep #x每步骤增量 8 yUnitstep = yDis/maxstep #y的每步增量 9 x = x1 10 y = y1 11 for k in range(maxstep): 12 x = x + xUnitstep 13 y = y + yUnitstep 14 print("x: %d, y:%d" % (x, y))
以上是关于opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标的主要内容,如果未能解决你的问题,请参考以下文章