检测两点所确定直线上的像素坐标

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

本文方法画的直线

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

使用OpenCV从图像上读取像素坐标位置

测试跟踪算法的时候,经常需要一个初始的跟踪框,手动标定这个位置就比较麻烦了 可以采用Matlab或者VS来读取对应点的坐标位置 在这说一个OpenCV的小程序,可以显示点击的坐标位置

flex二次开发中地理经纬度与页面像素坐标之间的转换

地理坐标定义规则:X轴(代表经度)向右递增,Y轴(纬度)向上递增,就好比小学学过的平面坐标。向左、向下的规则。屏幕坐标定义规则:X轴向右递增,Y轴向下递增。         可以看出,地理坐标和屏幕...

MFC 以图像大小打开并显示图像,鼠标左击显示像素坐标

一、创建MFC对话框,类名CDialogDlg,添加按钮IDC_BUTTON1,OnBnClickedButton1()函数如下: CShow *dlg; dlg...

图像处理---关于像素坐标矩阵变换(平移,旋转,缩放,错切)

转载于: http://blog.csdn.net/jarlen/article/details/44877961 图像处理缩放变换旋转矩阵 介绍 坐标变换矩阵是一个3*3的矩...

基于opencv技术获取视频流像素坐标

最近

像素坐标三角板.exe

  • 2017-06-23 10:13
  • 820KB
  • 下载

格子地图 像素坐标 地图坐标 转化

/** * 像素坐标转换为地图坐标 * */ public SpaceToTiled(point: egret.Point): egret.Poin...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)