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.

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.