【问题标题】:Custom grey scale image with numpy, openCV and python使用 numpy、openCV 和 python 自定义灰度图像
【发布时间】:2019-10-01 04:18:23
【问题描述】:

我想平均一个 numpy 数组的切片(它是一个图像)。

目前我正在迭代每个像素,但速度非常慢。我知道有更好的方法,但我无法解决。它可能是 numpy 花式索引,但我被卡住了。

我使用 openCV 将图像读入一个形状为 640,480,3 的 numpy 数组,我想将最后一位(即 [123,121,234])更改为每个 640x480 的切片的平均值。

您不必给我答案,但朝正确的方向推动会有所帮助。

这对我来说很慢:

 def bw_image_arr(self):

    for x in self.images:
        for y in x:
            for z in y:
                z = z.mean()

【问题讨论】:

  • 对.mean使用轴参数。
  • 你想计算每个RGB通道的平均值吗?
  • 我正在试验,我想将所有 3 个值更改为平均值。我需要把 3 个频道留在那里。它实际上是这种格式的图像数组。 50,640,480,3
  • 最终输出的形状是什么?
  • 50,640,480,3 与之前相同,但原来 [251,145,125] 的 ,3 将变为 [174,174,174]

标签: python image numpy opencv


【解决方案1】:

使用axis argument沿最后一个轴进行均值缩减,然后使用np.broadcast_to广播到原始形状-

np.broadcast_to(images.mean(axis=-1,keepdims=True),images.shape)

np.broadcast_to 通过为我们提供平均阵列的原始形状视图来帮助我们实现内存效率。如果您需要具有自己的内存空间的最终输出,请附加.copy() -

np.broadcast_to(images.mean(axis=-1,keepdims=True),images.shape).copy()

或者,我们可以使用np.repeat -

images.mean(axis=-1,keepdims=True).repeat(images.shape[-1],axis=-1)

发布的解决方案适用于通用维度的 ndarray。因此,将处理一个图像或一组图像,沿最后一个轴的平均期望结果被广播/复制/重复。

另外,请注意最终输出将是float dtype。因此,对于 unsigned-int dtype 输出的通常 image-dtype,我们可能希望将或/和舍入转换为 int。

【讨论】:

  • 这正是我想要的结果。非常感谢您的回答。我想我需要对此进行一些阅读。
【解决方案2】:

您需要在 x 轴和 y 轴上进行平均。在您的情况下,轴 1 和轴 2(您可以在 numpy.mean 中将其作为元组输入)。然后,如果您在第一维示例中有 50 张图像,您将得到 (50, 3) 形状的数组。

【讨论】:

  • 感谢您的指导。我很难理解,但只要有足够的修补,我就会到达那里。我发现自己解决这个问题有助于我更好地掌握这个概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多