2015-10-05 54 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作爲單獨的變量一樣容易?