Я пытаюсь понять смысл T.871 для преобразования между RGB и YCbCr для 16-битных входов. Уравнения тривиальны для 8-битного сигнала. Если мы проверим T.871 § 7, стр. 4, то получим:
Y = Min( Max( 0, Round( 255 * E'Y ) ), 255 )
Cb = Min( Max( 0, Round( 255 * E'Cb + 128 ) ), 255 )
Cb = Min( Max( 0, Round( 255 * E'Cr + 128 ) ), 255 )
[...]
Y = Min(Max( 0, Round( 0.299 * R + 0.587 * G + 0.114 * B)), 255 )
Cb = Min(Max( 0, Round(( -0.299 * R - 0.587 * G + 0.886 * B)/1.772 + 128 )), 255 )
Cr = Min(Max( 0, Round(( 0.701 * R - 0.587 * G - 0.114 * B)/1.402 + 128 )), 255 )
, которые с точностью до четвертого десятичного знака могутбыть аппроксимированным:
Y = Min(Max( 0, Round( 0.299 * R + 0.587 * G + 0.114 * B)), 255 )
Cb = Min(Max( 0, Round( -0.1687 * R - 0.3313 * G + 0.5 * B + 128 )), 255 )
Cr = Min(Max( 0, Round( 0.5 * R - 0.4187 * G - 0.0813 * B + 128 )), 255 )
Я могу проверить уравнение E'Y, E'Cb & E'Cr в разделе BT.601 § 2.5.5 2.5.1 Построение яркости [. ..]:
E'Y = 0.299 * E'R + 0.587 * E'G + 0.114 * E'B
И раздел §2.5.2 Построение перенормированных цветоразностных сигналов [...]:
E'Cr = ( 0.701 * E'R - 0.587 * E'G - 0.114 * E'B) / 1.402
E'Cb = (-0.299 * E'R - 0.587 * E'G + 0.886 * E'B) / 1.772
Итак, моя (наивная) интерпретация для 16-битного сигнала проста:
Y = Min(Max( 0, Round( 0.299 * R + 0.587 * G + 0.114 * B)), 65535 )
Cb = Min(Max( 0, Round(( -0.299 * R - 0.587 * G + 0.886 * B)/1.772 + 32768 )), 65535 )
Cr = Min(Max( 0, Round(( 0.701 * R - 0.587 * G - 0.114 * B)/1.402 + 32768 )), 65535 )
Я попробовал быстрый C-код, чтобы проверить это, но, похоже, приведенные выше уравнения не верны.
Итак, мой вопрос: каковы уравнения для преобразования 16-битного сигнала RGB в YCbCr?
Ссылки:
Обновление: я написал:
Я попробовал быстрый C-код, чтобы проверить это, но этокажется, что приведенные выше уравнения не верны.
Чтобы проверить преобразование, я инкапсулировал сгенерированный поток битов в файл DICOM (используя gdcmimg), а затем преобразовал файл DICOM в PPM, используя DCMTK:
$ dcmj2pnm ybr16.dcm ybr16.ppm
Поскольку мой файл шаблона DICOM был объявлен с 16-битным выделенным битом, но только 12-битный хранимый dcmj2pnm отбросил бы старшие биты всего, что превышает 12-битное максимальное значение, что в конечном итоге превратилось бы в зеленоватый фон.
Итак, подведем итог: уравнения верны, моего теста не было.