圖像上兩個像素點可以確定一條直線,可如何通過直線方程把這些像素位置找出來呢?大家都會想到用直線方程來算,可是圖像上像素位置的坐標都是整數值,通過y = k*x+b計算出來的y很可能是小數,即使將y做取整運算,也不能很好的描述直線上的點,很可能導致描述出來的直線呈“虛線”形式,如 直線方程y = 0.2*x + 0.3:
0.5 = 0.2*1 + 0.3, 坐標(1,0.5);
0.7 = 0.2*2 + 0.3, 坐標(2,0.7);
0.9 = 0.2*3 + 0.3, 坐標(3.0.9)。
描述出來的直線往往如下圖所示,如下圖所示。
常用方法畫的直線 matlab的line函數畫的直線
當初也覺得這是個很容易解決的問題,描出來的直線卻不盡人意,粗略搜了一下網上關於這方面的資料也很少。因此,作者在此給出一個方便快捷的計算方法,將這些直線上的像素位置給找出來。
我們已知A(x1,y1)、B(x2,y2)兩個點,可以確定AB斜率k以及直線方程y = k*x+b的坐標值截距b;
算法步驟:
1.分別計算兩點之間的橫坐標和縱坐標差值:
deltaH = abs(y1 - y2);
deltaW = abs(x1 - x2);
2.設置循環變量范圍,如果deltaH < deltaW,則自變量范圍是[x1,x2](假設x1<x2),反之自變量范圍是[y1,y2];
3. 當deltaH < deltaW時,選擇A、B中任意一點做起始點,分別計算當橫坐標自變量為j、縱坐標為i時,根據直線方程得到的截距Tmpb和b之間的差值,差值最小時對應的自變量i即為縱坐標位置,代碼是(代碼中的Coor保存的是直線上像素點位置):
for j = x1 : x2 Hb = y1 - 1; %以A點為起點 He = y1 + 1; H = 0; W = 0; Min = 1000; for i = Hb : He Tmpb = i - k*j; delta = abs(b - Tmpb); if delta < Min Min = delta; H = i; W = j; end end if H ~= 0 && W ~= 0 Num = Num + 1; %直線上像素點個數 Coor(Num,1) = H; %直線上像素點位置坐標 Coor(Num,2) = W; y1 = H; end end
當deltaH > deltaW時
for i = y1 : y2 Min = 1000; H = 0; W = 0; Wb = x1 - 4; %自變量變化范圍可根據直線特征設定 We = x1 + 4; for j = Wb : We Tmpb = i - k*j; delta = abs(b - Tmpb); if delta < Min Min = delta; H = i; W = j; end end if H ~= 0 && W ~= 0 Num = Num + 1; Coor(Num,1) = H; Coor(Num,2) = W; x1 = W; end end
本文方法畫的直線