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

       

  • 相关阅读:
    Delphi 10.3.3解决Android 11闪退
    QuickCore
    Delphi 10.4.1使用传统代码提示方案
    LINUX SHELL条件判断
    C#程序集使用强名字(Strong Name)签名/强名称签名
    ASP.NET Core环境变量和启动设置的配置教程
    ASP.NET Core MVC获取请求的参数方法示例
    Fluentvalidation的基本使用
    netstat & crontab
    Linux/Centos下多种方法查看系统block size大小
  • 原文地址:https://www.cnblogs.com/fx-blog/p/9055101.html
Copyright © 2020-2023  润新知