Почему Y, преобразованный rgb2ycbcr в Matlab, находится в диапазоне [16, 235]?

В справочном документе rgb2ycbcr в Matlab сказано, что

Если вводом является uint8, YCBCR - это uint8, где Y находится в диапазоне [16 235], а Cb и Cr находятся в диапазоне [16 240].

Как я знаю, формула преобразования из RGB в YCbCr

Y   =     0.299  R + 0.587  G + 0.114  B
Cb  =   - 0.1687 R - 0.3313 G + 0.5    B + 128
Cr  =     0.5    R - 0.4187 G - 0.0813 B + 128

Пусть R=0, G=0 и B=0, мы получаем Y = 0, которого нет в диапазоне [16,235]. И пусть R=255, G=255 и B=0, мы получаем Cb = 0,5, что тоже не входит в диапазон [16, 240].

Почему rgb2ycbcr делает Y в диапазоне [16,235] и делает Cb/Cr в диапазоне [16,240]?

1 ответ

Решение

Как сказал @jucestain, есть ответ из Википедии:

Y' values are conventionally shifted and scaled to the range [16, 235] (referred to as 
studio swing) rather than using the full range of [0, 255] (referred to as full swing).
This  confusing practice derives from the MPEG standards and explains why 16 is added to
Y' and why the Y' coefficients in the basic transform sum to 220 instead of 255. U and V 
values, which may be positive or negative, are summed with 128 to make them always positive.
Другие вопросы по тегам