对于NumPy数组的均值像素减法

3

我有一个灰度图像的numpy数组。该数组的形状为

imgs.shape
(100, 1, 300, 300)

这段代码代表了100张灰度图像(1个通道)且大小为300x300。

我想对这个数组进行平均像素值减法操作。也就是说,我想从所有图像中减去平均像素值。

我想要所有图像的平均值。

对于单个图像,可以使用以下代码:

X_mean = X.mean(0)
X -= X_mean

如何对我的数组进行操作?

你想要所有图像的平均值,还是每个图像分别的平均值? - Willem Van Onsem
@WillemVanOnsem 所有图像的平均值 - spore234
1个回答

2
如果每次只处理一张图像,我们可以计算最后两个轴上的平均值并保留维度(这样可以简化以后减法代码的实现),然后从原始输入中减去该平均值,就像这样 -
imgs -= imgs.mean(axis=(-2,-1),keepdims=1)

如果要跨所有图像计算,则也包括第一轴 -
imgs -= imgs.mean(axis=(0,-2,-1),keepdims=1)

请注意,默认情况下, mean 值将作为浮点值。 因此,如果 imgs 不是浮点类型,则需要将其复制为浮点dtype,然后再减去它,或将 mean 值转换为与 imgs 相同的dtype,然后再减去。
示例运行 -
In [188]: imgs = np.random.randint(0, 255,(10,1,30,30))

In [189]: out = imgs - imgs.mean(axis=(0,-2,-1),keepdims=1)

In [190]: out.shape
Out[190]: (10, 1, 30, 30)

In [191]: out.dtype
Out[191]: dtype('float64')

这是所有图像的平均值吗? - spore234
@spore234 这意味着对每个图像进行平均,然后从每个图像中减去该平均值。 - Divakar
请计算所有图像的平均值,并从每个图像中减去此平均值。抱歉没有表述清楚。 - spore234
抱歉,但我认为这是错误的。例如,x = np.random.randint(11,99,(100,1,300,300)),那么你们两个的解决方案都会导致错误的形状。形状应该被保留,只有值应该被“居中”。 - spore234
@spore234 不确定我是否正确理解了那个评论。所以,使用 imgs -= imgs.mean(axis=(0,-2,-1),keepdims=1)imgs 的形状会出错吗?还是说对于 imgs 来说,imgs.mean(axis=(0,-2,-1),keepdims=1) 基本上是一个标量 (100, 1, 300, 300) 是错误的? - Divakar
imgs = np.random.randint(0, 255,(100,1,300,300)) 成为我的数据。这是一个形状为 (100,1,300,300) 的 numpy 数组,其 int 值从 0 到 255,就像我的真实数据一样。你能提供一个可行的例子吗?我认为它与你所描述的整数问题有关。 - spore234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接