如何在python中使用numpy提取图像中的线条(3个带)?

2024-05-20 09:10:24 发布

您现在位置:Python中文网/ 问答频道 /正文

为了修改图像中特定垂直线的值,我想提取图像的3波段垂直线

当我是二维数组时,我使用以下代码提取垂直线:

vertical_line = array[:,[1]]

我试图在3d阵列图像中使用此代码,但失败了

#image shape(b,g,r) (100,100,3)
# my try
vertical_line_try_1 = image[:,[1]][3]#result => [[255,255,255]]
vertical_line_try_2 = image[:,[1][3]]#result => IndexError: list index out of range
vertical_line_try_3 = image[:,[1],[3]]#result => IndexError: index 3 is out of bounds for axis 2 with size 3

如何在不写循环的情况下一次提取三个波段的垂直线


Tags: of代码图像imageindex波段line数组
1条回答
网友
1楼 · 发布于 2024-05-20 09:10:24

当您使用切片进行索引时,相应的维度将保持不变(因为您可以获得一个可能的跨越范围的值)。另一方面,当您使用单个数字进行索引时,该维度将消失

例:

a = np.random.randn(4,5)

# Let's get the third column in the matrix
print(a[:, 2].shape)   # prints `(4,)` -> we get a vector
print(a[:, 2:3].shape) # prints `(4,1)` -> we keep the result as a column matrix

从您的二维示例来看,似乎您正在使用高级索引作为保持维度的一种方式。如果这是真的,那么使用一个包含单个元素的切片(如我所示)会更干净(我的观点)和更快(用IPython中的%timeit测试)

现在,回到你的问题上来。看起来您想要提取第二维度索引等于1的所有值,类似于下图中的红色部分

Indexing the second dimension

如果是这种情况,那么只要使用image[:,1, :](或者只使用image[:,1])就可以获得矩阵形式的值,或者使用image[:,1:2, :]就可以获得三维数组


了解失败的尝试实际上在做什么也很有用

  1. image[:,[1]][3]:这实际上是同一行中的两个索引操作。 首先,image[:,[1]]将返回一个100x1x3数组,然后使用[3]的第二个索引将使用第四行。由于第二个索引是一个常规的索引(不是花哨的,也不是一个切片),因此索引的维度将消失,最终得到一个1x3数组
  2. image[:,[1][3]]:这一次我真的不确定它在做什么
  3. image[:,[1],[3]]:这意味着“获取第一维度的所有值,但仅获取第一维度的第二个索引和第三维度的第四个索引的值。由于第三维度只有“size”3,因此尝试获取第四个索引会导致越界错误

相关问题 更多 >