2017-09-14 95 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)? –