簡體   English   中英

如何在python中使用numpy提取圖像(3bands)中的線條?

[英]how to extract line in images(3bands) using numpy in 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

如何在不編寫循環的情況下一次提取三個波段的垂直線?

當您使用切片進行索引時,會保留相應的維度(因為您會獲得可能的跨值范圍)。 另一方面,當您使用單個數字進行索引時,該維度就會消失。

前任:

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的值,類似於下圖中的紅色部分。

索引第二個維度

如果是這種情況,則只需使用image[:,1, :] (或僅使用image[:,1] )如果您將值作為矩陣獲取,或者使用image[:,1:2, :]如果你想要一個 3D 陣列。


了解失敗的嘗試實際上在做什么也很有用。

  1. image[:,[1]][3] :這實際上是同一行中的兩個索引操作。 首先, image[:,[1]]將返回一個100x1x3數組,然后使用[3]的第二個索引將占用第四行。 由於第二個索引是常規索引(不是花哨的,也不是切片),因此索引維度消失,最后得到一個1x3數組
  2. image[:,[1][3]] :這個我不太確定它在做什么
  3. image[:,[1],[3]] :這意味着“從第一個維度中獲取所有值,但僅從第一個維度的第二個索引和第三個維度的第四個索引中獲取。由於只有第三個維度具有“大小”3,然后嘗試獲取第四個索引會導致越界錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM