zoukankan      html  css  js  c++  java
  • OpenCV

      图片霍夫变换拟合得到直线后,怎样获得直线上的像素点坐标?

      这是我今天在图像处理学习中遇到的问题,霍夫变换采用的概率霍夫变换,所以拟合得到的直线信息其实是直线的两个端点的坐标,这样一个比较直接的思路就是利用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))

       

  • 相关阅读:
    Codeforces 877 C. Slava and tanks
    Codeforces 877 D. Olya and Energy Drinks
    2017 10.25 NOIP模拟赛
    2017 国庆湖南 Day1
    UVA 12113 Overlapping Squares
    学大伟业 国庆Day2
    51nod 1629 B君的圆锥
    51nod 1381 硬币游戏
    [JSOI2010]满汉全席
    学大伟业 2017 国庆 Day1
  • 原文地址:https://www.cnblogs.com/fx-blog/p/9055101.html
Copyright © 2011-2022 走看看