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

时间: 2024-08-28 08:53:07

opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标的相关文章

《图形学》实验三:DDA算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用DDA算法画直线. 实验结果: 代码: 1 #include <gl/glut.h> 2 #include <math.h> 3 4 #define WIDTH 500 //窗口宽度 5 #define HEIGHT 500 //窗口高度 6 7 #define DRAWLINE1 DDALine(100,200,200,100); //画直线 8 #define DRAWLINE2 DDALine(200,100,450,

Hough线变换

算法核心思想 任何一条直线斜截式表达式y=a*x+b,可以转换成参数空间的表达式b=y-a*x.所以,图像空间的任何一条直线有固定的a和b来确定,转换成参数空间都是一个点(a, b):同时,图像空间中经过任何一点(x0,y0)的所有直线在参数空间就是一条直线.Hough变换就是将图像中每一个点转换成参数空间的一条直线,这样,参数空间中如果两条直线相交于一点(a0,b0),就说明这两条直线对应的图像空间中的点在同一条直线上,并且这条直线的方程为y=a0*x+b. 实际应用中,因为斜截式不好表示竖线

利用等概率Rand5产生等概率Rand3

转自http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.gocalf.com%2Fblog%2Funbalanced-coin.html 利用等概率Rand5产生等概率Rand3 问题本身很明确,但不知道起个什么题目好,姑且先这么说吧. 问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使用任何能产生随机数的函数或数据源),生成等概率的[0, 3)范围内的随机整数. 我

光栅图形学(一):直线段的扫描转换算法

前言 在数学上,理想的直线是没有宽度的,它是由无数个点构成的集合.对直线进行光栅化时,只能在显示器说给定的有限个像素组成的矩阵中,确定最佳逼近于该直线的一组像素,并且按扫描线顺序. 本节介绍绘制线宽为一个像素的直线的三个常用算法:数值微分,中点画线和Bresenham算法. 数值微分法 已知过端点 P0(x0, y0),P1(x1, y1) 的直线段 L(P0, P1):直线斜率为 k = (y1 - y0) / (x1 - x0). 于是 yi+1 = kxi+1 + b. 于是,x每增加1,

小车PID算法跑直线

#include<stm32f10x.h> #include"sys.h" extern unsigned char Rec_Dat_U1; extern unsigned char Rec_String_U1[200]; extern int conut_flag_1; #define in_1(x)    x?GPIO_ResetBits(GPIOC , GPIO_Pin_0): GPIO_SetBits(GPIOC , GPIO_Pin_0) #define in_2

《图形学》实验五:改进的Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE ProBresenham(100,100,400,400); //画直线 8 9 #pr

《图形学》实验四:中点Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE1 MidpointBresenham(100,200,200,100); //画直线 8

计算机图形学 直线反走样Wu算法(4)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40048285 本文通过一个完整的实例来演示,直线反走样Wu算法. 1)创建CP2类 头文件:P2.h // P2.h: interface for the CP2 class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_P2_H__DD2

利用src.rpm包修改源码后重新制作rpm包

1. 下载 .src.rpm包.例:https://repos.fedorapeople.org/repos/openstack/EOL/openstack-grizzly/epel-6/openstack-quantum-2013.1.4-4.el6.src.rpm 2. 使用" rpm -ivh "解压源码包.例:rpm -ivh openstack-quantum-2013.1.4-4.el6.src.rpm  (--root=xxx 指定路径)解压的结果放在 /root/rpm