最小二乘算法的延伸...(离散点拟合十字线)

xinaideren2002 2007-01-16 11:31:10
目前问题描述:
一字线:由若干个离散的点组成一条直线(可由最小二乘算法拟合而成直线方程式)
十字线:由若干个离散的点组成一把叉(十字线,交叉线)

问题来了:
1.怎么确定十字线离散点的四个顶点.....
2.如何将十字线的离散点分成二条一字线(估计无法分离开来)
3.最终目的是,将十字形式的离散点,转换成两条相交直线方程式)

敬请各位提出宝贵意见,分不够,再加!
...全文
747 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_feeling 2007-04-09
  • 打赏
  • 举报
回复
gz
chehw 2007-01-18
  • 打赏
  • 举报
回复
注:
算法实现时可使用 θ=arctan(k) 替代k值,使取值范围收敛于(-π/2, π/2)
此时,θ(n)-θ(1)有两种情况,
1、约等于0: 标记为第一条直线上的点;
2、不约等于0:标记为第二条直线上的点。
xinaideren2002 2007-01-18
  • 打赏
  • 举报
回复
chehw(chehw) 的算法看起来应该可以行得通...
先试试...
xinaideren2002 2007-01-18
  • 打赏
  • 举报
回复
HUNTON(追求完美):
这样的话,取到交点时,就不知道往哪个方向走了....(四个方向都有离散点)

我有以下几个想法:
1.取出十字线的交点(根据交点上下左右都有点的特征),然后再取任意点与交点构成的斜率(将会产生两个近似值)约等于K1时,属于Line1,约等于K2时,属于Line2;

2.取出十字线的交点,再以同心圆的方式去切,切出四点或四点以上(1,3组合构成直线)(2,4结合构成直线)
chehw 2007-01-17
  • 打赏
  • 举报
回复
此方法不适用于二条直线夹角过小的情况.
chehw 2007-01-17
  • 打赏
  • 举报
回复
恐怕很难拟合出一个函数,没法用最小二乘法

如果数据点不算太多(几千个以内),可尝试用穷举法,
定义一结构如下,
#define NUMS 4096
struct {
POINT pt;
BOOL fVisited;
} points[NUMS];

double k[NUMS]; //保存斜率
1、将所有点写入结构数组并标记fVisited=FALSE;
2、先任取一点,依次求出与其他各点的斜率,存入k中。
3、定义一查找算法(可重载operator ==),计数斜率值近似相同点, 将最多的一个k值对应的点fVisited标记为TRUE. 并用最小二乘法拟合出一条直线。
4、取fVisited为FALSE的所有点,用最小二乘法拟合第二条直线

xinaideren2002 2007-01-17
  • 打赏
  • 举报
回复
会出现这种情况,十字线不垂直,长度也不一定相等.......

就是激光十字线打到传感器接收到的数据,然后把它模拟出来成两条直线......
HUNTON 2007-01-17
  • 打赏
  • 举报
回复
我的一个想法,如果干扰不是很强的话,看看可行不。
先在离散点中取一点A,其它点与A的关系可以分成共线和不共线两种。判定其它的与A是否共线的方法是,将AB连线,如果直线AB附近有较多其它的离散点,则说明AB共线,否则不共线。当然这里的附近和较多都是比较模糊的,要根据具体的判断应该怎么取值。
aj3423 2007-01-16
  • 打赏
  • 举报
回复
[0 0 0 0 0 0 f 0 0 0 0 0 0 0 0 ]
[0 0 0 0 a 0 0 0 0 0 0 0 0 0 0 ]
[0 0 0 0 0 1 0 0 b 0 0 0 0 0 0 ]
[0 0 t 0 0 0 e 1 0 0 0 0 z 0 0 ]
[0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ]
[0 0 0 0 0 c 0 0 1 0 0 0 0 0 0 ]
[0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ]
[0 0 0 0 0 0 x 0 0 0 1 0 0 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 d ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]

我的意思是,距离最远的是 a和d吧,然后求ad直线下方所有的点到ad距离,距离最大的是c,ad上方距离最大的是b
然后角平分线是^fet,^fez,^xet,^xez,4个角把点都划分开了,把2个对立角包含的点组一起就好求直线了(落在角平分线上的就算在这个角里)

不知道你的直线会不会是这种情况
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
[0 0 0 0 0 0 0 0 b 0 0 0 0 0 0 ]
[0 0 0 0 0 a 0 1 0 0 0 0 0 0 0 ]
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ]
[0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 ]
[0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ]
[0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ]
[0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ]
[0 c 0 0 0 0 0 0 0 0 0 1 0 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 d ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
xinaideren2002 2007-01-16
  • 打赏
  • 举报
回复
To:syy64(太平洋)
关键是怎么区分出哪些点属于第一条线,哪些点又分配到第二条线....
离散点无法确定哪一条线时,还不能做拟合处理啊.....
xinaideren2002 2007-01-16
  • 打赏
  • 举报
回复
首先,非常感谢两位的思路...

不过,问题是,十字线也由离散点组成,且存在不对称,不垂直性质...

To:aj3423(a.j.)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
[0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ]
[0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 ]
[0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ]
[0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ]
[0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 ]
[0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ]
[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
其中为1构成十字线,这样能保证你获取到的是四个顶点吗?
这个问题,其实忽略计算的话,只要求出四个顶点,就可以计算出两条直线方程式...

aj3423 2007-01-16
  • 打赏
  • 举报
回复
1。
2点间距离= 根号(x差平方+y差平方)
2点间距离最大的肯定是1组顶点
根据这2点确定一条直线,然后用点到直线距离公式算所有点到这条直线的距离,距离最大的就是另外2个顶点

2。
用4个顶点大致做2条直线, 求出交点, 然后做4条角平分线,根据角平分线来分离所有点

3。分别根据2组点做最小二乘
syy64 2007-01-16
  • 打赏
  • 举报
回复
1、首先拟合一条直线,再以该直线的垂直方向作为方向拟合第二条直线;
2、如果第二条直线拟合误差比较大,再在该方向的附近进行拟合一条直线;
3、根据第一条和第二条直线求夹角是90度的两条直线。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧