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

       

  • 相关阅读:
    oracle分页查询sql写法
    查询一张表的id,不在另外一张表的某个字段的数据
    PowerDesigner 使用详解
    java JUC多线程高并发编程
    npm node-sass安装失败解决方法
    Vue中展示二级路由的默认模块 若依框架 自定义指令权限的使用说明
    vue 2.6以后slot 的变化使用
    java中 List<? extends T>与List<? super T> 表示的意思和区别
    java springboot自定义注解 和 时间加一天 一个月 一年方式
    js中||与&&的用法以及every()与some()的用法
  • 原文地址:https://www.cnblogs.com/fx-blog/p/9055101.html
Copyright © 2011-2022 走看看