Python多维数组



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

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

。shape是(151,1,4),这意味着我已经检测到151条线,并且有4个参数x1, y1, x2, y2。

我想做的是在直线上加上另一个因子,称为斜率,从而增加直线。shape to(151,1,5)。我知道我可以在行尾连接一个空的0数组,但是我怎么做才能在for循环或类似的程序中调用它呢?

例如我想写

for slope in lines
   #do stuff

不幸的是,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

根据你的评论,我猜你应该怎么做:

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作为单独的变量?

相关内容

  • 没有找到相关文章

最新更新