Я пытаюсь использовать ffmpeg для декодирования буфера изображения из изображения DICOM с использованием кодировки YBR_FULL_422. Согласно определению:
Должны быть сохранены два значения Y, за которыми следуют одно значение CB и одно значение CR. Значения CB и CR должны быть выбраны в месте первого из двух значений Y. Для каждой строки пикселей первые выборки CB и CR должны быть в местоположении первой выборки Y. Следующие образцы CB и CR должны находиться в месте третьего образца Y и т.д.
Давайте предположим, что у меня есть:
$ gdcminfo YBR_FULL_422.dcm
MediaStorage is 1.2.840.10008.5.1.4.1.1.7 [Secondary Capture Image Storage]
TransferSyntax is 1.2.840.10008.1.2.1 [Explicit VR Little Endian]
NumberOfDimensions: 2
Dimensions: (600,430,1)
SamplesPerPixel :3
BitsAllocated :8
BitsStored :8
HighBit :7
PixelRepresentation:0
ScalarType found :UINT8
PhotometricInterpretation: YBR_FULL_422
PlanarConfiguration: 0
...
Поэтому я просто попытался извлечь необработанный буфер:
$ gdcmraw YBR_FULL_422.dcm YBR_FULL_422.raw
$ du -sb YBR_FULL_422.raw
516000 YBR_FULL_422.raw
Который совместим с размером изображения: 600 * 430 * 2 = 516000
Но я не могу преобразовать его в обычный rgb24:
$ ffmpeg -y -f rawvideo -pix_fmt yuv422p -s:v 600x430 -i YBR_FULL_422.raw rgb24.ppm
Input #0, rawvideo, from 'YBR_FULL_422.raw':
Duration: 00:00:00.04, start: 0.000000, bitrate: 103200 kb/s
Stream #0:0: Video: rawvideo (Y42B / 0x42323459), yuv422p, 600x430, 103200 kb/s, 25 tbr, 25 tbn, 25 tbc
Output #0, image2, to 'rgb24.ppm':
Metadata:
encoder : Lavf57.56.101
Stream #0:0: Video: ppm, rgb24, 600x430, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc57.64.101 ppm
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> ppm (native))
Press [q] to stop, [?] for help
frame= 1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=36.9x
video:756kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Выходное изображение зеленоватое с черными полосами.