使用 ffmpeg 解码 YBR_FULL_422 DICOM 图像

使用 ffmpeg 解码 YBR_FULL_422 DICOM 图像

我正在尝试使用 ffmpeg 使用 YBR_FULL_422 编码从 DICOM 图像解码图像缓冲区。根据定义:

应存储两个 Y 值,后面跟着一个 CB 值和一个 CR 值。应在两个 Y 值中的第一个位置对 CB 值和 CR 值进行采样。对于每行像素,第一个 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

输出图像呈绿色,带有黑色条纹。

答案1

yuv422p是一种平面格式,即一帧中所有 Y 后跟所有 Cb,然后是 Cr..等等。您需要一种打包格式。FFmpeg 支持其中三种具有 8 位深度和 4:2:2 子采样的格式:yuyv422和。由于 Cb 首先存储,因此排除了最后一个。尝试前两个。uyvy422yvyu422


由于像素格式显示为“ yyuv422”,请尝试

 ffmpeg -y -f rawvideo -pix_fmt yuyv422 -video_size 600x430 -i YBR_FULL_422.raw -vf format=yuv422p,geq=lum='if(mod(X,2),cb((X-1)/2,Y),p(X,Y))':cb='lum(X*2+1,Y)':cr='p(X,Y)' rgb24.ppm

相关内容