在numpy中实现规范化过滤器的好方法

时间:2014-01-27 13:47:03

标签: python image-processing numpy scipy

我对Numpy数组的内存模型不太熟悉。是否有更有效的方法(或“更好的练习”方式)来计算图像的标准化版本?也就是说,图像使得每个像素r+g+b == 1

也许使用更多面向矩阵的方法?这样的过滤器有名字吗?

这是我到目前为止的代码(忽略除零错误):

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

图像是深度为3的np.array

由于

1 个答案:

答案 0 :(得分:4)

利用numpy的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]