檢測兩點所確定直線上的像素坐標


  圖像上兩個像素點可以確定一條直線,可如何通過直線方程把這些像素位置找出來呢?大家都會想到用直線方程來算,可是圖像上像素位置的坐標都是整數值,通過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

本文方法畫的直線


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM