1. 程式人生 > >opencv利用hough概率變換擬合得到直線後,利用DDA算法得到直線上的像素點坐標

opencv利用hough概率變換擬合得到直線後,利用DDA算法得到直線上的像素點坐標

步驟 else 每次 xunit pre 差值 一點 假設 color

  圖片霍夫變換擬合得到直線後,怎樣獲得直線上的像素點坐標?

  這是我今天在圖像處理學習中遇到的問題,霍夫變換采用的概率霍夫變換,所以擬合得到的直線信息其實是直線的兩個端點的坐標,這樣一個比較直接的思路就是利用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))

  

opencv利用hough概率變換擬合得到直線後,利用DDA算法得到直線上的像素點坐標