Numpy图像处理操作指南

4
我已经创建了一个脚本,可以将图像的色相在色彩轮上循环移位任意次数。
当我使用PIL导入图像并将其转换为Numpy数组时,它会以如下形式呈现:(x, y, (r,g,b))。
我使用Skimage color模块将此数组从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)) 这似乎不是最有效的方法,因此我的问题是: 如何在不必将数组拆分为块的情况下操纵每个维度?
1个回答

4
hsv[:,:,0] *= 0.33

修改hsvh组件。

hsv[:,:,0]hsv的“基本切片”,因此它是原始数组的视图


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]

然后,hsv 将成为 hsv 的视图,并且修改 hsv 将自动影响 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)。这可能会对你的其他代码产生一些影响,但总体而言我认为后者更好。


之前我尝试使用符号'hsv[:][:][0]'做类似的事情时感到特别困惑。你是否知道'hsv[:][:][0]'和'hsv[:,:,0]'之间的区别呢?非常感谢! - sabjorn
hsv[:] 是整个数组 hsv 的视图。从对象的角度来看,它们并不是同一个对象,因为 hsv[:] is not hsv,但它们共享相同的底层数据。hsv[:].shapehsv.shape 是相同的。对于 hsv[:][:] 也是一样的情况。查看它们的形状,一切都会变得清晰明了。 - unutbu
抱歉这么晚才接受这个答案。显然在过去的日子里我不知道这是可能的(或者这个功能比这个答案更新?!) - sabjorn

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