在Python中,如何将第二个循环依赖于第一个循环的嵌套for循环矢量化?

2024-06-16 10:46:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我对使用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是存储所有连接点和端点的列表

lenejend_junc_points的长度

lenjjunc_points的长度

point_junc存储e2()返回的像素坐标

adj是一个邻接矩阵

我之所以需要这样做,是因为我试图从骨架化图像的端点和连接点绘制一个关键点图。adj存储该图形

我用Python的一种非常基本的方式编写了代码。正如你所理解的,这不是有效和缓慢的,这就是为什么我需要矢量化。除了矢量化,请告诉我任何函数或使用骨架图像库,这将有助于我优化我的代码。你知道吗

我很欣赏我的代码看起来很模糊,我尽量解释一切。我没有给出完整代码的原因是,代码的其他部分也有相同的内容,我希望能够自己完成这些内容,这就是为什么我只要求一部分的帮助,因为了解如何矢量化这可能也会帮助我完成其余的工作。你知道吗

编辑:添加输入输出。你知道吗

对于此图像

enter image description here

这是形成的骨骼图像

enter image description here

在运行一段代码时,我会找出端点和连接点,在本例中就是这样

enter image description here

没有端点,自然地,这些连接点和端点继续作为这段代码的输入,它应该形成一个邻接矩阵来将它转换成一个图。为该图像形成的图形(由邻接矩阵表示)为:

enter image description here

我希望这能消除人们对投入和产出的疑虑


Tags: 代码图像内容forifa1像素condition