Преобразование ограниченного диапазона YUV в sRGB с помощью ImageMagick - PullRequest
2 голосов
/ 05 июля 2019

Я пытаюсь преобразовать набор необработанных видеокадров из YUV444 в sRGB , используя ImageMagick .

Формат ввода: Raw YUV444 ограниченный диапазон , BT.709 в порядке планарных данных.
Требуемый формат вывода: sRGB (набор PNG изображений).

Основная проблема: ImageMagick преобразование всегда применяется Формула преобразования JPEG .

  • Замечание по поводу " ограниченный диапазон " формат YUV:
    В 8-разрядном формате YUV с ограниченным диапазоном диапазон Y равен [16, 235], а диапазон UV - это [16, 240].(в системах HTDV используется ограниченный диапазон BT.709).
    JPEG использует формат YUV " full range ", где Y, U, V range - [0, 255].
    sRGB -используется в системах ПК, а диапазон R, G, B - полный диапазон [0, 255].
    YUV и YCbCr являются взаимозаменяемыми.

Для тестирования я использовал следующий пример изображения:

  • Образец изображения в формате sRGB (rgb_input.png):
    rgb_input.png

I преобразованобразец в формате YUV444 с использованием FFmpeg :
ffmpeg -y -colorspace bt709 -i rgb_input.png -pix_fmt yuv444p yuv_input.yuv

Следующее изображение иллюстрирует вывод YUV444 (в порядке упорядоченных данных):

  • Входное изображение для ImageMagick в формате YUV444 (yuv_input.yuv иллюстрация порядка планарных данных):
    yuv_input.yuv

Я преобразованyuv_input.yuv до PNG с использованием ImageMagick конвертер (версия 7.0.8-51):
magick -depth 8 -interlace plane -size 128x96 -colorspace Rec709YCbCr -sampling-factor 4:4:4 yuv:yuv_input.yuv rgb_output_magick.png

  • Результат ImageMagick (rgb_output_magick.png):
    rgb_output_magick
    Если вы внимательно посмотритеВы видите, что изображение отличается от rgb_input.png.

То же преобразование с использованием FFmpeg (используется для справки):
ffmpeg -y -s 128x96 -colorspace bt709 -pix_fmt yuv444p -i yuv_input.yuv -pix_fmt rgb24 rgb_output_ffmpeg.png

  • Результат FFmpeg (rgb_output_ffmpeg.png):
    rgb_output_ffmpeg.png
    Примечание. Истинный формат моих необработанных входных видеокадров не позволяет мне использовать FFmpeg.

Формула преобразования из 8-разрядного ограниченного диапазона YUV BT.709 в sRGB:
R = 1.1644*Y + 0.00000*U + 1.79270*V - 248.10
G = 1.1644*Y - 0.21325*U - 0.53291*V + 76.878
B = 1.1644*Y + 2.11240*U + 0.00000*V - 289.02

Как я могусделать вышеупомянутое преобразование, используя ImageMagick конвертер?

1 Ответ

0 голосов
/ 05 июля 2019

Как вы и просили, это будет команда цветовой матрицы ImageMagick для вашего преобразования, , если она имеет смысл . Значения цветовой матрицы ImageMagick нормализуются в диапазоне от 0 до 1, включая смещение (крайнее правое). Я предполагаю, что ваши смещения находятся в диапазоне от 0 до 255 (8 бит). Поэтому я не уверен, имеет ли это смысл. Тем не менее, вот как это будет выглядеть.

magick input -color-matrix \
"1.1644 0.00000 1.79270 0, 0, -0.9729 \
1.1644 -0.21325 -0.53291 0, 0, 0.30148 \
1.1644 2.11240 0.00000 0, 0, -1.1334 \
0 0 0 1, 0, 0 \
0 0 0 0, 1, 0 \
0 0 0 0, 0, 1" output


Смотри http://www.adobetutorialz.com/articles/1987/1/Color-Matrix

...