【问题标题】:Python multidimensional arrayPython多维数组
【发布时间】:2016-01-01 15:54:41
【问题描述】:

我是 Python 的初学者,但我想我有一个简单的问题。我正在使用图像处理来检测图像中的线条

lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength,maxLineGap)

lines.shape 是 (151, 1, 4) 表示我已经检测到 151 条线,并且有 4 个参数 x1、y1、x2、y2。

我想要做的是向线条添加另一个因素,称为坡度,从而将 lines.shape 增加到 (151, 1, 5)。我知道我可以在行尾连接一个空的零数组,但是我该如何制作它以便我可以在 for 循环等中调用它?

比如我想能够说

for slope in lines
   #do stuff

【问题讨论】:

  • slope 是否需要属于同一个数组?不能只是另一个数组吗?在您的“循环”中,#do stuff 是什么?它是对单个数字还是对 151 个值的数组进行操作?
  • for x in lines: 迭代数组的第一维。 lines[:,:,-1] 给出数组的最后一个“列”(连接后的“斜率”列)。
  • 最终,我想采用(大致)相同坡度和位置的所有线,并将它们删除,直到每个位置都有一条线。 (我应该只在我的图片中找到 4 条线,但 houghlinesp 找到了 151 条,其中大部分是靠近的或彼此重叠的)。因此,不必从坡度和线条中删除元素,我可以从线条中删除。

标签: python-2.7 opencv numpy multidimensional-array


【解决方案1】:

不幸的是,HoughLinesP 函数返回一个 int32 类型的 numpy 数组。不过,我熬夜到就寝时间来解决这个问题,所以无论如何我都会发布它。我只是将斜率乘以 1000,然后像这样将它们放入数组中。希望它对您仍然有用。

slopes = []
for row in lines:
    slopes.append((row[0][1] - row[0][3]) / float(row[0][0] - row[0][2]) * 1000)

new_column = []
for slope in slopes:
    new_column.append([slope])

new_array = np.insert(lines, 4, new_column, axis=2)

print lines
print
print new_array

样本输出:

[[[14 66 24 66]]

 [[37 23 54 56]]

 [[ 7 62 28 21]]

 [[70 61 81 61]]

 [[24 64 42 64]]]

[[[   14    66    24    66     0]]

 [[   37    23    54    56  1941]]

 [[    7    62    28    21 -1952]]

 [[   70    61    81    61     0]]

 [[   24    64    42    64     0]]]

编辑:具有相同输出的更好(和完整)代码

import cv2
import numpy as np

img = cv2.imread('cmake_logo-main.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(img,50,150,apertureSize = 3)
lines = cv2.HoughLinesP(edges,1,np.pi/180,50,3,10)

def slope(xy):
    return (xy[1] - xy[3]) / float(xy[0] - xy[2]) * 1000
new_column = [[slope(row[0])] for row in lines]
new_array = np.insert(lines, 4, new_column, axis=2)

print lines
print
print new_array

【讨论】:

    【解决方案2】:

    根据您的 cmets,这是我对您应该做什么的猜测:

    lines = np.squeeze(lines) 
    # remove the unneeded middle dim, a convenience, but not required
    slope = <some calculation> # expect (151,) array of floats
    mask = np.ones((151,),dtype=bool) # boolean mask
    <assign False to mask for all lines you want to delete>
    <alt start with False, and set True to keepers>
    lines = lines[mask]
    slope = lines[mask]
    

    或者,您可以使用 np.hstack([lines, np.zeros((151,1))]) 扩展 lines(或在轴 1 上连接)。但是如果像Jason 认为的那样,linesdtype int,而slope 必须是float,那是行不通的。您必须使用他的缩放解决方案。

    您还可以使用结构化数组将整数列和浮点列组合成一个数组。如果将 slope 保留为单独的变量同样容易,为什么要这样做?

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 2010-10-05
      相关资源
      最近更新 更多