zoukankan      html  css  js  c++  java
  • 检测两点所确定直线上的像素坐标

      图像上两个像素点可以确定一条直线,可如何通过直线方程把这些像素位置找出来呢?大家都会想到用直线方程来算,可是图像上像素位置的坐标都是整数值,通过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

    本文方法画的直线

  • 相关阅读:
    一题多解(六)—— 一个数二进制形式 1 的个数
    心算技巧
    心算技巧
    位运算应用及其注意事项
    位运算应用及其注意事项
    辨异 —— 不同的编程语言(编译型语言、解释型语言、动态语言、静态语言)
    C#POP3协议实现SSL验证登陆GMAIL
    PB学习笔记(一)
    24点计算 --- 庞果
    JAVA网站高并发解决方案
  • 原文地址:https://www.cnblogs.com/ImageVision/p/2775196.html
Copyright © 2011-2022 走看看