cv.COLOR_BGR2LAB дает неправильный диапазон

В следующем коде я использую изображение PNG 4096*4096 пикселей, которое включает все возможные цвета RGB (не в два раза больше одного пикселя, можно найти здесь http://allrgb.com/starry-night). Затем я преобразую значения RGB в LAB значения и я проверяю диапазон каждого из каналов

import cv2 as cv
import numpy as np

im=cv.imread('allrgb.png')


im=im.astype(np.uint8)

colors_lab=cv.cvtColor(im,cv.COLOR_BGR2LAB)

m=np.amin(colors_lab[...,...,0])    

Результаты следующие:

если исходное изображение имеет тип uint8, R[0,255],G[0,255],B[0,255] дает L[0,255],A[42,226],B[20,223]

если исходное изображение имеет тип float32, R[0,1],G[0,1],B[0,1] дает L[0,100],A[-86,1813,98.2351],B[-107,862,94.4758]

В любом случае, диапазон Lab никогда не является ожидаемым, что определяется открытой документацией CV.

Есть идеи, как это объяснить?

1 ответ

Решение

Вы правы, значения LAB, возвращаемые из OpenCV, никогда не будут лежать вне диапазона 0-100, 0-255, 0-255. Но: гамма цветового пространства LAB превышает цветовую гамму RGB, см., Например, второй абзац в статье в Википедии о LAB.

Таким образом, когда вы конвертируете из RGB/BGR в LAB, вы никогда не получите полный диапазон LAB, поскольку LAB содержит цвета, которые не могут быть представлены в RGB.

Другие вопросы по тегам