我正在从事一个使用OpenCV和python的项目,但一直在解决这个小问题
我在列表中存储了许多行的端点坐标。有时出现一种情况,即从一个点检测到多条线。从这些线条中,我想保留最短长度的线条,并消除所有其他线条,这样我的图像将不包含从其中绘制多条线条的点
我的变量存储最初检测到的所有线的信息(两个端点的坐标),如下所示:
var = [[Line1_EndPoint1, Line1_EndPoint2],
[Line2_EndPoint1, Line2_EndPoint2],
[Line3_EndPoint1, Line3_EndPoint2],
[Line4_EndPoint1, Line4_EndPoint2],
[Line5_EndPoint1, Line5_EndPoint2]]
其中,LineX_endopy(线号“X”,该线的端点“Y”)为[X,Y]类型,其中X和Y是图像中该点的坐标
有人能建议我如何解决这个问题吗
您可以修改行数据的存储方式。如果修改,请解释您的数据结构及其创建方式
此类数据的示例:
[[[551, 752], [541, 730]],
[[548, 738], [723, 548]],
[[285, 682], [226, 676]],
[[416, 679], [345, 678]],
[[345, 678], [388, 674]],
[[249, 679], [226, 676]],
[[270, 678], [388, 674]],
[[472, 650], [751, 473]],
[[751, 473], [716, 561]],
[[731, 529], [751, 473]]]
Python代码将是可观的
我认为基于熊猫编写解决方案更容易。 原因是:
进行如下工作:
将var转换为数据帧:
行的初始部分为:
计算每条线长度的平方:
我故意在长度为的正方形处“停止”,因为它是 足够比较长度(计算根不会改变 比较结果)
还要注意的是,需要列上的第一级多索引 只是为了更容易地表达感兴趣的列。此外,他们将 不需要,所以我把它扔了
这次我把行的全部内容放到:
下一步是计算点数据帧,其中所有点(开始和结束 每行的末尾)以及(平方)的长度位于相同的列中 对应的行:
现在,我使用iloc来指定列(第一次用于起始点) 第二个是终点)。 为了更容易阅读这个数据帧,我传递了键,以包含“origin” 然后我对行进行排序
内容是:
注意,例如,点226676出现两次。第一次发生的时候 直线5和第二直线2(直线var和直线中的指数)
要查找要删除的行的索引,请运行:
为了更容易理解这段代码是如何工作的,请一步一步地运行它 检查每个步骤的结果
结果是:
请注意,上面的左列只是索引(这无关紧要)。 真正的信息在右边的列(值)中
要显示应保留的行,请运行:
获取:
上述结果不包含,例如:
只有这些行(2和3)被删除,因为它们是 比第二条提到的两条线都长(参见前面的部分结果)
也许这就足够了,或者如果您需要从 var(原始的Numpy数组),并将结果保存到另一个数组中 变量,运行:
ANumpy解决方案
与我的第一个答案相同的结果可以通过单独 在Numpy上
首先定义两个函数中的一个:
计算直线长度的平方:
将向量(1D数组)转换为列数组(a2D数组) 使用单个列:
两者都将在以后使用
然后进行如下操作:
获取行数:
生成线索引(在点数组中lineInd列的内容 (稍后将创建)):
生成“原始指标”(1-开始,2-结束),以便于分析 对于任何中间打印输出:
计算线长度(点中lgth列的内容):
创建包含一些附加数据(连续数据)的点列表 列包含origin、lineInd、x、y和lgth):
计算要排序的“标准数组”:
排序点(按x、y和lgth):
计算点的“反向唯一索引”:
将inv移动1个位置:
将在下一步中使用,以获取上一个元素
生成要删除的行索引列表:
行索引(在点数组中)是重复点(元素)的索引 在inv中等于上一个元素)
列索引(1)-指定lineInd列
整个结果(toDrop)是“拥有”行的索引列表 (包含重复的点)
生成结果:var从 上一步:
要打印减少的行列表,可以运行:
结果是:
要完全理解此代码的工作原理,请执行以下操作:
有时,即使是一些表达式,单独打印也是有意义的 (部分说明),例如
var.reshape(-1, 2)
-转换 var(形状为(10,2,2))转换为2D点阵列(每行为 一点)当然,整个结果与我第一个回答中的结果一样, 但正如你所写,你在熊猫方面几乎没有经验,现在你可以了 比较两种方法并查看熊猫允许执行的情况 更简单、更直观的东西
例如,按某些列排序或查找重复的行。 在熊猫中,这是一个单一指令的问题,具有适当的 参数,而在Numpy中,您必须使用更多指令 并知道各种细节和技巧如何做到同样
相关问题 更多 >
编程相关推荐