我创建了一个脚本来通过任意数量的步骤改变色轮周围图像的色调。
正如您可能想象的那样,当我导入图像(使用 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
就地修改
h
的 hsv
组件。hsv[:,:,0]
是 hsv
的“基本切片”,因此是原始数组的 View 。h, s, v = np.dsplit(hsv, 3)
创建 3 个新数组,
h
, s
, v
,它们从 hsv
复制数据。修改 h
、 s
、 v
不会影响 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)
使 h
、 s
和 v
具有 (n, m, 1)
形状。然而h, s, v = hsv[:,:,0], hsv[:,:,1], hsv[:,:,2]
使
h
、 s
和 v
具有 (n, m)
形状。这可能会稍微影响您的其他代码,但总的来说我认为后者更好。关于python - 用于图像处理的 Numpy 操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25854709/