利用DDA算法得到直线上的像素点坐标
圖片霍夫變換擬合得到直線后,怎樣獲得直線上的像素點(diǎn)坐標(biāo)?
這是我今天在圖像處理學(xué)習(xí)中遇到的問題,霍夫變換采用的概率霍夫變換,所以擬合得到的直線信息其實(shí)是直線的兩個(gè)端點(diǎn)的坐標(biāo),這樣一個(gè)比較直接的思路就是利用DDA算法來獲取.
一.算法簡介
DDA算法是計(jì)算機(jī)圖形學(xué)中最簡單的繪制直線算法。其主要思想是由直線公式y(tǒng) = kx + b推導(dǎo)出來的。?
我們已知直線段兩個(gè)端點(diǎn)P0(x0,y0)和P1(x1,y1),就能求出 k 和 b 。
在k,b均求出的條件下,只要知道一個(gè)x值,我們就能計(jì)算出一個(gè)y值。如果x的步進(jìn)為1(x每次加1,即x = x +1),那么y的步進(jìn)就為k+b;同樣知道一個(gè)y值也能計(jì)算出x值,此時(shí)y的步進(jìn)為1,x的步進(jìn)為(1-b)/k。根據(jù)計(jì)算出的x值和y值,向下取整,得到坐標(biāo)(x’,y’),并在(x’,y’)處繪制直線段上的一點(diǎn)。
為進(jìn)一步簡化計(jì)算,通常可令b取0,將起點(diǎn)看作(0,0)。設(shè)當(dāng)前點(diǎn)為(xi, yi)則用DDA算法求解(xi+1,yi+1)的計(jì)算公式可以概括為:
xi+1 = xi + xStep (1)
yi+1 = yi + yStep (2)
我們一般通過計(jì)算 Δx 和 Δy 來確定xStep和yStep:
如果 Δx > Δy,說明x軸的最大差值大于y軸的最大差值,x軸方向?yàn)椴竭M(jìn)的主方向,xStep = 1,yStep = k;
如果 Δy > Δx,說明y軸的最大差值大于x軸的最大差值,y軸方向?yàn)椴竭M(jìn)的主方向,yStep = 1,xStep = 1 / k。
根據(jù)這個(gè)公式,就能通過(xi,yi)迭代計(jì)算出(xi+1、yi+1),然后在坐標(biāo)系中繪制計(jì)算出的(x,y)坐標(biāo)點(diǎn)。
二.代碼展示
下面是代碼,假設(shè)(x1, y1),(x2, y2)為直線的兩個(gè)端點(diǎn)坐標(biāo):
xDis = x2 - x1 #x的增量
yDis = y2 - y1 #y的增量
if(abs(xDis) > abs(yDis)):maxstep = abs(xDis)
else:maxstep = abs(yDis)
xUnitstep = xDis/maxstep #x每步驟增量
yUnitstep = yDis/maxstep #y的每步增量
x = x1
y = y1
for k in range(maxstep):x = x + xUnitstepy = y + yUnitstepprint("x: %d, y:%d" % (x, y))
?
總結(jié)
以上是生活随笔為你收集整理的利用DDA算法得到直线上的像素点坐标的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Atom:Uncaught TypeEr
- 下一篇: opencv 行与列