2017-12-18 132 views
0

我嘗試處理許多圖像表示爲NumPy數組,但它需要很長時間。這就是我嘗試做我如何加快與Python中的NumPy數組的操作2.7

# image is a list with images 
max = np.amax(image[k])# k is current image index in loop 
# here i try to normalize SHORT color to BYTE color and make it fill all range from 0 to 255 
# in images max color value is like 30000 min is usually 0 
i = 0 
while i < len(image[k]): 
    j = 0 
    while j < len(image[k][i]): 
     image[k][i][j] = float(image[k][i][j])/(max) * 255 
     j += 1 
    i += 1 

如果我只看過圖片(共170(圖片512×512是)),而它需要大約7秒,如果我這樣做正常化需要20分鐘。這一切都在代碼中。在這裏,我試圖讓我的圖像着色

maskLoot1=np.zeros([len(mask1), 3*len(mask1[0])]) 
for i in range(len(mask1)): 
    for j in range(len(mask1[0])): 
     maskLoot1[i][j*3]=mask1[i][j] 
     maskLoot1[i][j*3+1]=mask1[i][j] 
     maskLoot1[i][j*3+2]=mask1[i][j] 

接着我嘗試用彩色那些來替換選定的區域中的像素,例如120(灰色) - >(255 40 0)在RGB模型。

  for i in range(len(mask1)): 
       for j in range(len(mask1[0])): 
       #mask is NumPy array with selected pixel painted in white (255) 
        if (mask[i][j] > 250): 
         maskLoot1[i][j * 3] = lootScheme[mask1[i][j]][1] #red chanel 
         maskLoot1[i][j * 3+1] = lootScheme[mask1[i][j]][2] #green chanel 
         maskLoot1[i][j * 3+2] = lootScheme[mask1[i][j]][3] #bluechanel 

而且它也需要很多時間,而不是20分鐘,但長期以來讓我的腳本滯後。認爲這僅僅是我在數組上的很多操作中的2個,而如果是第二種情況,我們可以爲別人使用一些bultin函數是不太可能的。那麼有沒有辦法加快我的節奏?

+3

'image [k] = image [k]/max * 255'? – furas

+0

@furas對於這種情況是的,但我也在試圖做下一步:我有一個座標列表(x,y)代表所選區域,我嘗試用有色區域代替它們,例如120(灰色) - >(255 40 0)in rgb model。我編輯了一個問題。 – tttaaabbb

+2

@tttaaabbb將您的問題逐個填寫,不要將這3-4個問題合併爲一個問答。我沒有看到這些問題之間的關係,以證明他們被放在一個地方。 – Divakar

回答

0

一般來說,for循環比while循環快得多。同樣使用函數

maskLoot1[i][j*3]=mask1[i][j] 
maskLoot1[i][j*3+1]=mask1[i][j] 
maskLoot1[i][j*3+2]=mask1[i][j] 

並且在循環中調用函數應該會顯着加快進程。

1

爲了您的掩模製造代碼試試這個更換,以循環:

maskLoot1 = np.dstack(3*[mask1]).reshape((mask1.shape[0],3*mask1.shape[1])) 

還有許多其他的方法/實現上述的變化,例如,

maskLoot1 = np.tile(mask1[:,:,None], 3).reshape((mask1.shape[0],3*mask1.shape[1])) 

至於第一部分你的問題最好的答案是在你的問題的第一評論@furas

1

首先,考慮移動到Python 3. *。 Numpy正在放棄對Python Numpy is dropping support for Python 2.7 from 2020的支持。

對於您的代碼問題。您錯過了下面使用Numpy的要點。 Numpy是從較低級別的庫編譯而來的,運行速度非常快,您不應該在Python中循環索引,而應該將矩陣傳遞給Numpy。

問題1 正常化非常快,使用listcomp和np.array

import numpy as np 
import time 

# create dummy image structure (k, i, j, c) or (k, i, j) 
# k is image index, i is row, j is columns, c is channel RGB 
images = np.random.uniform(0, 30000, size=(170, 512, 512)) 

t_start = time.time() 
norm_images = np.array([(255*images[k, :, :]/images[k, :, :].max()).astype(int) for k in range(170)]) 
t_end = time.time() 

print("Processing time = {} seconds".format(t_end-t_start)) 
print("Input shape = {}".format(images.shape)) 
print("Output shape = {}".format(norm_images.shape)) 
print("Maximum input value = {}".format(images.max())) 
print("Maximum output value = {}".format(norm_images.max())) 

這就產生了如下的輸出

Processing time = 0.2568979263305664 seconds 
Input shape = (170, 512, 512) 
Output shape = (170, 512, 512) 
Maximum input value = 29999.999956185838 
Maximum output value = 255 

它需要0.25秒!

問題2 不知道你在這裏的意思是什麼,但如果你想克隆一個單色圖像的值,RGB值,你可以做這樣的

# coloring (by copying value and keeping your structure) 
color_img = np.array([np.tile(images[k], 3) for k in range(170)]) 
print("Output shape = {}".format(color_img.shape)) 

將會產生

Output shape = (170, 512, 1536) 

如果您想保留一個(c,i,j,k)結構

color_img = np.array([[images[k]]*3 for k in range(170)]) # that creates (170, 3, 512, 512) 
color_img = np.swapaxes(np.swapaxes(color_img, 1,2), 2, 3) # that creates (170, 512, 512, 3) 

這一切都需要0.26秒!

問題3 着色某些區域,我會再次使用函數和listcomp。由於這是一個例子,我使用了默認的顏色(255,40,0),但您可以使用任何東西,包括LUT。

# create mask of zeros and ones 
mask = np.floor(np.random.uniform(0,256, size=(512,512))) 
default_scheme = (255, 40, 0) 

def substitute(cimg, mask, scheme): 
    ind = mask > 250 
    cimg[ind, :] = scheme 
    return cimg 

new_cimg = np.array([substitute(color_img[k], mask, default_scheme) for k in range(170)])