2017-03-31 110 views
0

我需要讀取圖像,然後對每個像素執行一項功能,然後將其另存爲新圖像。我使用scikit-image作爲第一部分和最後一部分(閱讀和寫作),但在快速執行第二個操作(實際轉換)時遇到問題。scikit-image像素逐像素操作

scikit-image中的讀取操作的結果是形狀(WIDTH,HEIGHT,N_CHANNELS)的numpy數組,其中WIDTH和HEIGHT是圖像的寬度,N_CHANNELS是3或4.我需要應用函數例如將像素從[R,G,B]轉換爲[R - B,G - B,B - R]到每個像素的單獨像素。

我已經花了幾天的時間試圖讓這個工作,但我迄今爲止唯一的工作解決方案是循環遍歷每一行和列並執行計算。這需要很長時間才能完成。

我試圖向量化數組,但結果是一維數組,並且不可能使用它。有沒有其他表演方式來完成這件事?

def calculate_ndvi(nir, red): 
    if red == 0 and nir == 0: 
     return 0.5 
    else: 
     num = int(nir) - int(red) 
     den = int(nir) + int(red) 
     return num/den 


zero_uint = numpy.uint8(0) 


def process_color(clr): 
    ndvi = calculate_ndvi(clr[2], clr[0]) 
    return [-ndvi, ndvi, zero_uint] 


def save_ndvi_file(): 
    image = io.imread(input_path) 

    rows = image.shape[0] 
    cols = image.shape[1] 

    out = numpy.empty(shape=(rows, cols, 3)) 
    for i in range(rows): 
     for j in range(cols): 
      out[i][j] = process_color(image[i][j]) 

    io.imsave('output.jpg', out) 
+0

沒有看到你的代碼,我們能做的最好的就是猜測。請準備[mcve]。在25MP文件上應用該功能不應該花很長時間,所以你可能做錯了什麼。 –

回答

2

您可以通過使用多維操作廣播來對此進行矢量化。這裏是你的函數的一個版本,做一個量化的方式一切:

def save_ndvi_file(): 
    image = io.imread(input_path) 

    nir = image[:, :, 2] 
    red = image[:, :, 0] 
    ndvi = (nir - red)/(nir + red) 
    ndvi[(nir == 0) & (red == 0)] = 0.5 
    out = ndvi[:, :, np.newaxis] * np.array([[[-1, 1, 0]]]) 

    io.imsave('output.jpg', out) 

注意,你已經在循環的東西通過廣播numpy的操作現在完成了,而不是通過遍歷外部函數調用。以這種方式編寫代碼需要對算法進行稍微不同的思考方式,但一旦習慣了它,它就非常直觀。