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