2014-01-27 3 views
2

Я не очень хорошо знаком с моделью памяти массивов Numpy. Есть ли более эффективный способ (или «лучший способ») вычисления нормализованной версии изображения? То есть изображение такое, что для каждого пикселя r+g+b == 1.Хороший способ реализовать фильтр нормализации в numpy

Возможно использование более ориентированного на матрицу подхода? У такого фильтра есть имя?

Вот код, который я до сих пор (игнорируя деление на ноль ошибок):

def normalize(image): 
    lines, columns, depth = image.shape 
    normalized = np.zeros(image.shape) 
    for i in range(lines): 
      for j in range(columns): 
        normalized[i,j] = image[i,j]/float(np.sum(image[i,j])) 
    return normalized 

Где изображение является np.array глубины 3.

Благодарности

ответ

4

Это будет сделано гораздо более эффективно используя numpy's broadcasting rules

>>> import numpy as np 
>>> image = np.random.random(size=(3,4,5)) 
>>> sums = image.sum(axis=2) 
>>> sums.shape 
... (3, 4) 
>>> normalized = image/sums[:, :, None] #same as image/sums[:, :, np.newaxis] 
>>> normalized.sum(axis=2) 
... array([[ 1., 1., 1., 1.], 
...  [ 1., 1., 1., 1.], 
...  [ 1., 1., 1., 1.]]) 

Если вы беспокоитесь о памяти, и не нуждаются в исходное изображение, которое вы можете нормализовать его на месте

>>> image /= image.sum(axis=2)[:, :, None] 

В функции:

def normalize(image, inplace=False): 
    if inplace: 
     image /= image.sum(axis=2)[:, :, None] 
    else: 
     return image/image.sum(axis=2)[:, :, None] 
+0

Ницца! Это именно то, что я имел в виду. Обратите внимание, что можно использовать 'np.float64 (image)', чтобы избежать целочисленного деления. – fouronnes

Смежные вопросы