В моем приложении для редактирования изображений У меня есть функция преобразования 32-битного изображения с плавающей точкой из sRGB в линейное цветовое пространство. Формула:Векторизация sRGB для правильного линейного преобразования в Numpy
if value <= 0.04045: (value/12.92)
if value > 0.04045: ((value + 0.055)/1.055)^2.4)
Мое изображение является трехмерным numpy.ndarray имени img32.
Моя реализация до сих пор:
boolarray = img32 <= 0.04045
lower = (img32/12.92) * boolarray.astype(np.int)
upper = np.power(((img32 + 0.055)/1.055), 2.4) * np.invert(boolarray).astype(np.int)
img32 = lower + upper
Итак, я создаю новый массив boolarray со значениями истинности для < = 0.04045 и умножить на это.
Что было бы лучшим решением?
Я пытался что-то вроде:
img32[img32 < 0.04045] = img32/12.92
, который работает на первом этапе, но терпит неудачу на второй:
img32[img32 >= 0.04045] = np.power(((img32 + 0.055)/1.055), 2.4)
вероятно потому, что он не работает, когда обернутый в np.power Функция
Любая помощь приветствуется.
'лучше solution' - Лучше как? Память или производительность? – Divakar
Что-то более чистое, потому что это кажется мне чем-то вроде взлома. Я в значительной степени ищу стандартный способ сделать это. Еще не проверял скорость (это достаточно быстро), но я думаю, что это определенно пустая трата памяти? Извините за неясность. – tde