簡體   English   中英

從python中的(2,MN)矩陣讀取(M,N)圖像的值

[英]Read values of an (M,N) image from a (2,MN) matrix in python

假設我有一個 (M,N) 圖像 J(形狀為 (M,N,3))。 我有一個 (2,MN) 矩陣 K 像這樣:

0 0 0 ... 0 1 1 1 ... 1 ............. M M M ... M

0 1 2 ... N 1 2 3 ... N ............. 1 2 3 ... N

現在我將上述矩陣乘以一個 2 x 2 的矩陣,得到一個與 K 大小相同的新矩陣 T。

現在我想創建一個新圖像,其中這個新圖像中的像素 (r,s) 等於舊圖像像素的 (R,G,B) 值,該像素位於 r*N+M 列中T。

如果可能,我想以矢量化的方式執行此操作。 我不想使用 for 循環(我已經知道如何使用 for 循環來做到這一點,但它非常慢)。 事實上,我對這個問題的興趣是因為我想以矢量化的方式應用單應變換。

任何幫助表示贊賞。 這是使我想要清楚的循環版本:

for r in range(0,M):
    for s in range(0,N):
        x, y = T[:,r*N+s]
        new_image[r,s] = J[x,y]

由於內部索引的幸運布局,您幾乎可以直接使用索引數組:

import numpy as np

# set up dummy input
M,N = 300,400
J = np.random.rand(M, N, 3)
T = np.array([np.random.randint(0, M, M*N), np.random.randint(0, N, M*N)])

# original    
new_image = np.empty_like(J)
for r in range(0,M):
    for s in range(0,N):
        x, y = T[:,r*N+s]
        new_image[r,s] = J[x,y]

# vectorized new
new_image_vect = J[tuple(T)].reshape(J.shape)

查看:

>>> np.array_equal(new_image, new_image_vect)
True

上述工作方式並非完全微不足道,因為高級索引是一件善變的事情 我上面寫的相當於

J[(T[0,...], T[1,...])].reshape(J.shape) -> J[T[0,...], T[1,...]].reshape(J.shape)

現在第一部分更清楚了:取T第一行中的每個元素並將其用作J的第一個索引,然后取T的第二行中對應的元素並將其用作J對應的第二個索引。 這部分涵蓋了循環版本中的J[x,y]

但是,由於我們實際上是用長度為M*N數組來索引數組,因此生成的數組的形狀也將沿其第一維(以及大小為 3 的尾隨維度)具有M*N形狀。 因此,我們需要將結果reshape(M,N,3)

所有這些只能直接起作用,因為T中的索引是根據 C 連續內存順序存儲的。 如果不是這種情況,我們就必須來transpose我們的數組,以便生成具有正確布局的結果數組。

暫無
暫無

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

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