2017-09-14 115 views
1

我想指定圖像中的某些區域。Python,Cv2,numpy來指示圖片/圖像中的區域

要指定1個區我可以這樣做:

import cv2 
import numpy as np 

the_picture = cv2.imread("c:\\picture.jpg") 

target_area = the_picture[300:360, 130:280] 

類型target_area的類型是 'numpy.ndarray'。

但是座標列表是一個問題。我正努力將座標列表轉換爲所需的值。

我想要做的是:

the_picture = cv2.imread("c:\\picture.jpg") 

list_of_areas = [ 
[300:360 , 130:280] 
[300:360 , 440:540] 
[400:460 , 0:130] 
[400:460 , 250:400] 
[400:460 , 560:740] 

For area in list_of_areas: 
    the_picture(area)  ### failed 

這裏有座標:

 x y  x1 y1 

Area1 130 300  280 360 
Area2 440 300  540 360 
Area3 0 400  130 460 
Area4 250 400  400 460 
Area5 560 400  740 460 

我試着給一個列表如下圖所示,但它不工作。我也試圖讓他們在列表中的字符串,改變方括號變成圓括號既不工作。

SyntaxError: invalid syntax 

給出座標的正確方法是什麼?

+1

您的術語有點奇怪,所以很難確切地解決您的問題。你想要什麼輸出,或者至少你想要它做什麼,到底是什麼? –

+0

@DanielF,謝謝你的評論。我想要達到圖片中的所有5個區域。 (該帖子已被編輯) –

+0

'list_of_areas'目前沒有逗號和一個開括號。當然這是一個'syntaxError'! –

回答

2

如果我理解正確的是你想要做的,如果我錯了,請糾正我,你可以通過保存和檢索區域座標作爲單個值來解決你的問題,而不是成對的。

the_picture = cv2.imread("c:\\picture.jpg") 

list_of_areas = [ 
[300, 360, 130, 280], 
[300, 360, 440, 540], 
[400, 460, 0, 130], 
[400, 460 , 250, 400], 
[400, 460, 560, 740]] 

For y,y1,x,x1 in list_of_areas: 
    the_picture[y:y1, x:x1] 
+0

太棒了!從來沒有想過這個問題可以用這麼簡單的方法解決!你再一次讓學習的世界變得美麗! –

1

認爲這是你想要的。 (由逗號和關閉您的括號內)

list_of_areas = [np.index_exp[300:360 , 130:280], 
np.index_exp[300:360 , 440:540], 
np.index_exp[400:460 , 0:130], 
np.index_exp[400:460 , 250:400], 
np.index_exp[400:460 , 560:740]] 

,讓你切片的元組對象的列表

list_of_areas 

[(slice(300, 360, None), slice(130, 280, None)), 
(slice(300, 360, None), slice(440, 540, None)), 
(slice(400, 460, None), slice(0, 130, None)), 
(slice(400, 460, None), slice(250, 400, None)), 
(slice(400, 460, None), slice(560, 740, None))] 

現在,讓你的子陣

test = np.random.randint(0,255,(480,960,3)) # random RGB 
out = [test[area] for area in list_of_areas] 
+0

謝謝。你能解釋一下最後兩行代碼嗎?我不明白。 –

+0

這只是我測試腳本。它提取子數組並將它們放在列表 –

+0

中,我如何將它應用於list_of_areas中的區域: the_picture(area)? –