Вы создали изображение в порядке RGB, поэтому это
array = cv2.cvtColor(array, cv2.COLOR_BGR2LAB)
должно быть:
array = cv2.cvtColor(array, cv2.COLOR_RGB2LAB)
Если вы отображаете его с помощью OpenCV cv2.imshow(array)
и cv2.waitKey()
вы увидите OpenCV считает его синим.
Что касается несоответствия, которое вы видите между онлайн-конвертером и OpenCV , я могу только предположить, что это как-то связано с ошибками округления, возникающими из-за использования uint8
для значений RGB. Если преобразовать в тип float
, проблема исчезнет:
Lab = cv2.cvtColor(array.astype(np.float32), cv2.COLOR_RGB2LAB)
# Result
array([[[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125]],
[[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125],
[53.240967, 80.09375 , 67.203125]]], dtype=float32)
В стороне, отмечу, что scikit-image
выбирает автоматически возвращать вам float
, когда вы его передаете uint8
:
from skimage import color
import numpy as np
# Make a rather small red image
array = np.full((1, 1, 3), [255,0,0], dtype=np.uint8)
# Convert to Lab with scikit-image
Lab = color.rgb2lab(array)
# Result
array([[[53.24058794, 80.09230823, 67.20275104]]])
Просто для удовольствия, пока мы занимаемся этим, проверьте, что ImageMagick делает это:
magick xc:red -colorspace lab txt:
# ImageMagick pixel enumeration: 1,1,65535,cielab
0,0: (34891.4,53351.7,17270.9) #884BD068C376 cielab(53.2408,80.0943,67.202)