我对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
。
由于
答案 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]