Utilisation de ffmpeg pour décoder l'image DICOM YBR_FULL_422

2

J'essaie d'utiliser ffmpeg pour décoder un tampon d'image à partir d'une image DICOM en utilisant le codage YBR_FULL_422. Selon la définition:

Deux valeurs Y doivent être mémorisées, suivies d'une valeur CB et d'une valeur CR. le   Les valeurs CB et CR doivent être échantillonnées à l'emplacement du premier des   deux valeurs Y. Pour chaque rangée de pixels, les premiers échantillons CB et CR   doit être à l'emplacement du premier échantillon Y. Le prochain CB et CR   les échantillons doivent être à l'emplacement du troisième échantillon Y, etc.

Supposons que j'ai:

$ 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
...

J'ai donc simplement essayé d'extraire le tampon brut:

$ gdcmraw YBR_FULL_422.dcm YBR_FULL_422.raw
$ du -sb YBR_FULL_422.raw
516000  YBR_FULL_422.raw

Qui est compatible avec la taille de l'image: 600 * 430 * 2 = 516000

Mais je ne peux pas le convertir en rgb24 normal:

$ 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

L'image de sortie est verdâtre avec des foulées noires.

malat
la source

Réponses:

3

yuv422p est un format plan, c’est-à-dire tout Y pour une image suivie de tout Cb, puis Cr..etc. Vous voulez un format compact. FFmpeg en prend en charge trois avec une profondeur de 8 bits et un sous-échantillonnage 4: 2: 2: yuyv422, uyvy422 et yvyu422. Cb étant stocké en premier, cela élimine le dernier. Essayez les deux premiers.


Puisque le format de pixel semble être " yyuv422 ", essayez

 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
Gyan
la source
Bien meilleure sortie en effet. Mais aucun d'entre eux ne fonctionnait encore (essayé: yuyv422 yuv422p yuvj422p uyvy422 yuv440p yuvj440p yvyu422).
malat
Deux valeurs Y doivent être enregistrées, suivies d'une valeur CB et d'une valeur CR. - & gt; ça sonne comme ça devrait être "yyuv422". Avez-vous l'outil dd?
Gyan
C’est la tâche à accomplir, mais le stockage correspond à la partie mentionnée.
Gyan
Vous avez raison, en utilisant dd, je vois "yyuv422" stocké sur le disque.
malat
Essayez la commande ajoutée.
Gyan