在我的图像编辑应用程序中,我有一个将32位浮点图像从sRGB转换为线性颜色空间的函数。公式为:
if value <= 0.04045: (value / 12.92)
if value > 0.04045: ((value + 0.055) / 1.055)^2.4)
我的形象是三维的努比·恩达雷命名为img32。在
我目前的实施情况:
^{pr2}$因此,我创建了一个新的数组boolarray,其真值为<;=0.04045并乘以该值。在
什么是更好的解决方案?在
我试过这样的方法:
img32[img32 < 0.04045] = img32 / 12.92
第一步有效,第二步失败:
img32[img32 >= 0.04045] = np.power(((img32 + 0.055) / 1.055), 2.4)
可能是因为它在np.功率功能
感谢任何帮助。在
一个干净的方法是使用^{} ,它允许我们根据掩码在两个值之间进行选择。在我们的例子中,掩码可以是
img32 >= 0.04045
,当True
时,我们将选择((img32 + 0.055) / 1.055)**2.4
,否则使用img32/12.92
。所以,我们会有这样的实现-
如果您非常关心内存,并且希望将结果写回输入数组中,您可以通过创建和有选择地设置与这两个条件相对应的元素,分三步完成,如-
^{pr2}$示例案例-
因此,我们避免创建一个输出数组,该数组将消耗我们
80
字节,而是在掩码上使用20
字节。因此,在内存上保存输入数组大小的75%
。请注意,这可能会导致性能略有下降。您还可以使用numpy.piecewise:
相关问题 更多 >
编程相关推荐