我创建了一个脚本来通过任意数量的步骤改变色轮周围图像的色调。

正如您可能想象的那样,当我导入图像(使用 PIL)并将其转换为 Numpy 数组时,它是这样的形状:(x, y, (r,g,b))。

我使用 Skimage 颜色模块将此数组从 RGB 转换为 HSV 颜色空间(在将 RGB 值缩放到范围 [0,1.0] 之后)。

我遇到的问题是仅操作所有像素的 HSV 值之一(H、S 或 V)。我想为数组中的每个“像素”有效地添加、乘以或减去这三个维度中的任何一个。

我通过将 HSV 值拆分为三个单独的数组来使其工作:h,s,v = np.dsplit(hsv,3)
以我想要的方式操作数组:h_new = np.multiply(h,.33)
然后重新组装阵列:hsv_new = np.stack((h_new,s,v))
这似乎不是最有效的方法,所以我的问题是:
如何在不必将数组拆分成块的情况下操作这些维度中的每一个?

最佳答案

hsv[:,:,0] *= 0.33

就地修改 hhsv 组件。
hsv[:,:,0]hsv 的“基本切片”,因此是原始数组的 View 。
h, s, v = np.dsplit(hsv, 3)

创建 3 个新数组, hsv ,它们从 hsv 复制数据。修改 hsv 不会影响 hsv 。所以修改 h 然后需要重建 hsv 。因此,这更慢。

为了符号方便,您可以替换
h,s,v = np.dsplit(hsv, 3)


h, s, v = hsv[:,:,0], hsv[:,:,1], hsv[:,:,2]

那么 h , s , v 就是 hsv 的 View ,修改 h , s , v 会自动影响 hsv 本身。 (所以不需要 hsv_new = np.stack((h_new,s,v)) )。

另请注意, h,s,v = np.dsplit(hsv, 3) 使 hsv 具有 (n, m, 1) 形状。然而
h, s, v = hsv[:,:,0], hsv[:,:,1], hsv[:,:,2]

使 hsv 具有 (n, m) 形状。这可能会稍微影响您的其他代码,但总的来说我认为后者更好。

关于python - 用于图像处理的 Numpy 操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25854709/

10-12 14:36