我是使用NumPy的新手,我对Python的了解有限,也是处理图像的新手。请不要无缘无故地投票。我请求帮助,因为我不明白如何做到这一点,堆栈溢出是我用来检查我的疑虑的唯一资源。
我需要知道如何在python中对嵌套的for循环进行向量化,其中第二个循环依赖于第一个循环。 示例:
for(condition)
{ //
if (condition)
{ //
for(condition)
{ //
}
}
}
让我给出上下文和一段代码,以便更容易解释我正在寻找的内容。
我找到了骨架化图像的端点(只有一个相邻像素的像素)和连接点(具有三个或更多相邻像素的像素),在此代码片段中,代码试图找到任何连接在连接点之间或连接点和端点之间。
#FOR JUNCTION POINTS TO OTHER JUNCTION POINTS OR END POINTS
for i in xrange(lenj):
a=junc_points[i]
point_junc=en2(a[0],a[1],skeleton,point)
point.append(a)
for c in point_junc:
a1=c
point.append(a1)
while True:
flag=0
a2=en1(a1[0],a1[1],skeleton,point)
a1=a2[1:]
if a2[0]==0:
break
else:
point.append(a1)
for j in xrange(lenej):
b=end_junc_points[j]
if a1==b:
#print(a," is connected to ",b)
flag=1
adj[i][j]=1
break
if flag==1:
break
point
是一个列表变量,用于存储所有先前访问过的像素坐标
e2()
返回点a
的所有相邻像素,以便遍历每个分支以查找端点或交接点
e1()
如果已经访问了某个像素,则会返回[0]
,否则返回[1,x,y]
,其中x和y就是前面的像素
junc_points
是一个存储所有连接点的列表
end_junc_points
是一个存储所有结点和终点的列表
lenej
的长度为end_junc_points
lenj
的长度为junc_points
point_junc
存储e2()
adj
是一个邻接矩阵
我需要这个的原因是因为我试图从骨架化图像中的端点和连接点制作关键点图。 adj
存储该图表
我在python中以非常基本的方式编写代码。你可以理解,这不是有效和缓慢的,这就是我需要矢量化的原因。除了矢量化之外,如果有任何函数或库可以指向我使用镂空图像来帮助我优化代码,那对我来说真的很有帮助。
如果我的代码看起来很模糊,我很抱歉,我试着尽可能多地解释一切。我没有提供完整代码的原因是因为代码的其他部分具有相同的内容,我希望能够自己完成这些,这就是为什么我只求一个部分的帮助,了解如何矢量化这可能有助于我做其余的事情。
如果您不明白,请发表评论,我会解释。不要贬低,以免我最终得到解决方案。
提前感谢您的帮助。
编辑:添加输入输出。
对于此图片
这是形成的骨架图像
在运行一段代码时,我找到了端点和连接点,在这种情况下是
没有端点,当然,这些连接点和端点继续作为此代码片段的输入,并且它应该形成一个邻接矩阵以将其转换为图形。为该图像形成的图形(由邻接矩阵表示)是:
我希望这可以消除对输入和输出的疑虑