2015-10-05 63 views
1

我是一个Python初学者,但我想我有一个简单的问题。我使用图像处理来检测的图像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 
+0

'slope'是否需要成为同一阵列的一部分?不能只是另一个阵列吗?在你的'循环'中,什么是'#do stuff'?它是在单个数字上还是在151个数值上操作? – hpaulj

+0

'for x in lines:'在数组的第一维上迭代。 'lines [:,:, - 1]'给出数组的最后'列'(连接后的'slope'列)。 – hpaulj

+0

最终,我想用(大致)相同的斜率和位置取所有线,并删除它们,直到每个位置有一条线。 (我应该只在我的照片中找到4行,但houghlinesp找到了151行,其中大部分行紧密或重叠)。因此,不必从斜线和线条中删除元素,我只需从行中删除即可。 – thunderjolt

回答

0

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

根据您的意见,这是我的猜测,你应该做的:

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] 

或者,您可以将lines延伸为np.hstack([lines, np.zeros((151,1))])(或者在轴1上连接)。但是,如果Jason认为linesdtypeintslope必须是float,那将不起作用。你必须使用他的缩放解决方案。

你也可以使用结构化数组来将ints和float列组合成一个数组。为什么要这样保持slope作为单独的变量一样容易?