【问题标题】:Numpy Manipulation for Image Processing用于图像处理的 Numpy 操作
【发布时间】:2014-09-15 18:41:59
【问题描述】:

我创建了一个脚本,可以将图像的色调围绕色轮移动任意数量的步骤。

正如你想象的那样,当我导入图像(使用 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))

这似乎不是最有效的方法,所以我的问题是: 如何在不必将数组拆分为块的情况下操作这些维度中的每一个?

【问题讨论】:

    标签: python arrays image-processing numpy


    【解决方案1】:
    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] 之间的区别?
    • hsv[:] 是整个数组hsv 的视图。从hsv[:] is not hsv 的意义上讲,它们不是同一个对象,但它们共享相同的基础数据。 hsv[:].shapehsv.shape 相同。 hsv[:][:] 的情况相同。看看形状,一切都应该清楚了。
    • 很抱歉花了这么长时间才接受这个答案。显然回到那天我不知道这是可能的(或者这个功能可能比这个答案更新?!)
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2015-06-18
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多