Verwenden von ffmpeg zum Decodieren des DICOM-Abbilds YBR_FULL_422

468
malat

Ich versuche, ffmpeg zu verwenden, um einen Bildpuffer aus einem DICOM-Bild unter Verwendung der YBR_FULL_422-Kodierung zu dekodieren. Nach der Definition:

Es werden zwei Y-Werte gespeichert, gefolgt von einem CB und einem CR-Wert. Die CB- und CR-Werte werden am Ort des ersten der beiden Y-Werte abgetastet. Für jede Pixelreihe müssen sich die ersten CB- und CR-Abtastwerte am Ort des ersten Y-Abtastwerts befinden. Die nächsten CB- und CR-Proben müssen am Ort der dritten Y-Probe usw. sein.

Nehmen wir an, ich habe:

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

Also habe ich einfach versucht, den Rohpuffer zu extrahieren:

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

Welches ist mit der Größe des Bildes kompatibel: 600 * 430 * 2 = 516000

Ich kann es aber nicht in reguläres rgb24 konvertieren:

$ 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 

Das Ausgabebild ist grünlich mit schwarzen Schritten.

2

1 Antwort auf die Frage

3
Gyan

yuv422pist ein planares Format, dh alle Y für einen Frame, gefolgt von allen Cb, dann Cr..etc. Sie möchten ein gepacktes Format. FFmpeg unterstützt drei von ihnen mit 8-Bit - Tiefe und 4: 2: 2 - Subsampling: yuyv422, uyvy422und yvyu422. Da Cb zuerst gespeichert wird, schließt dies den letzten aus. Versuchen Sie es mit den ersten beiden.


yyuv422Versuchen Sie, da das Pixelformat " " zu sein scheint

 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 
Viel bessere Ausgabe. Aber noch funktionierte keiner von ihnen (versuchte: yuyv422 yuv422p yuvj422p uyvy422 yuv440p yuvj440p yvyu422). malat vor 6 Jahren 0
* Es sollen zwei Y-Werte gespeichert werden, gefolgt von einem CB und einem CR-Wert. * -> klingt, als sollte es "yyuv422" sein. Hast du das Werkzeug `dd`? Gyan vor 6 Jahren 0
Das ist die Aufgabe, aber der Speicher bezieht sich auf den von mir genannten Teil. Gyan vor 6 Jahren 0
Sie haben recht, wenn Sie dd verwenden, sehe ich "yyuv422" als auf der Festplatte gespeichert. malat vor 6 Jahren 0
Versuchen Sie den hinzugefügten Befehl. Gyan vor 6 Jahren 0