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))

   

转载于:https://www.cnblogs.com/fx-blog/p/9055101.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值