Да, удалите бит astype('uint8')
в своем коде, и разница должна исчезнуть, если преобразование выполнено правильно.
Уравнения для преобразования можно посмотреть в Википедии .Там нет ничего необратимого, преобразования являются совершенными противоположностями друг другу.
Однако это преобразование содержит мощность 3 rd , которая значительно растягивает некоторые значения.Округление преобразования в целое число может привести к значительному изменению цвета.
Кроме того, область Luv очень нерегулярна, и может быть нелегко проверить, что значения Luv приведут к значимому значению RGB.Ваше утверждение «Я проверил, что в luv1 есть записи, все из которых попадают в допустимые диапазоны ввода», заставляет меня поверить, что вы думаете, что домен Luv - это поле.Это не.Диапазоны для u и v изменяются с L .Хорошее упражнение - начать с выборки куба RGB и сопоставить их с Luv, затем нанести эти точки на график, чтобы увидеть форму домена Luv.В Википедии есть пример того, как это может выглядеть для гаммы sRGB .
Функция OpenCV cvtColor
будет ограничивать значения RGB в диапазоне [0,1] (если тип float32
), что приводит к необратимым изменениям цвета, если входные данные находятся за пределами гаммы.
Вот пример, который показывает, что преобразование является обратимым.Я начинаю со значений RGB, поскольку их легко проверить как действительные:
import numpy as np
import cv2
rgb1 = np.array([[[1.0,1.0,1.0],[0.5,1.0,0.5],[0.0,0.5,0.5],[0.0,0.0,0.0]]], 'float32')
luv1 = cv2.cvtColor(rgb1, cv2.COLOR_RGB2Luv)
rgb2 = cv2.cvtColor(luv1, cv2.COLOR_Luv2RGB)
np.max(np.abs(rgb2-rgb1))
Возвращает 2.8897537e-06
, что является числовой точностью для 32-разрядных чисел с плавающей запятой.