Größe ändern (verkleinern) YUV420sp Bild

7

Ich versuche, ein Bild, das im YUV420sp-Format vorliegt, zu verkleinern (zu verkleinern). Ist es möglich, eine solche Bildgrößenanpassung durchzuführen, ohne sie in RGB zu konvertieren, so dass das YUV420sp-Pixel-Array direkt manipuliert wird? Wo kann ich einen solchen Algorithmus finden?

Danke

    
PerracoLabs 19.06.2013, 09:04
quelle

3 Antworten

13

YUV 4: 2: 0 planar sieht so aus:

%Vor%

wo:

%Vor%

Und die Subsamling verwendet so:

Dies bedeutet, dass jeder Chroma-Pixel-Wert von 4 Luma-Pixeln geteilt wird.

Ein Ansatz besteht darin, Pixel zu entfernen und sicherzustellen, dass die entsprechende Y-Cb-Cr-Beziehung beibehalten / neu berechnet wird.

Etwas in der Nähe der Nächster-Nachbarn-Interpolation , aber umgekehrt.

Ein anderer Ansatz besteht darin, zuerst das 4: 2: 0-Subsampling in 4: 4: 4

umzuwandeln

Hier haben Sie eine 1 zu 1 Zuordnung zwischen Luma und Chroma Daten.

Dies ist der richtige Weg, Chroma zwischen 4: 2: 0 und 4: 2: 2 zu interpolieren (Luma hat bereits die richtige Auflösung) Code in Python, folgen Sie HTML-Link für c-dito. Code ist nicht sehr pythonisch, nur eine direkte Übersetzung der c-Version.

%Vor%

Führen Sie dies zweimal aus, um 4: 4: 4 zu erhalten. Dann müssen nur Zeilen und Spalten entfernt werden.

Oder Sie können die Chroma-Pixel vervierfachen, um von 4: 2: 0 zu 4: 4: 4 zu wechseln, Reihen und Spalten zu entfernen und dann 4 Cb / Cr-Werte in 1 zu mitteln, um zu 4: 2: 0 zurückzukehren es hängt wieder alles davon ab, wie streng Sie sein müssen: -)

    
Fredrik Pihl 19.06.2013, 20:51
quelle
7

Hier ist eine Java-Funktion, mit der ich einen YUV 420 (oder NV21) um einen Faktor zwei verkleinern kann.

Die Funktion nimmt das Bild in einem Byte-Array zusammen mit der Breite und Höhe des ursprünglichen Bildes als Eingabe und gibt ein Bild in einem Byte-Array zurück, das Breite und Höhe gleich der Hälfte der ursprünglichen Breite und Höhe hat.

Als Grundlage für meinen Code habe ich folgendes verwendet: Drehe ein YUV-Byte-Array auf Android

%Vor%     
user1461661 27.04.2014 20:42
quelle
1

YUV420sp hat das Y in einer Ebene und das U & amp; V in einer anderen Ebene. Wenn Sie die U & amp; V in separate Ebenen, Sie können dann die gleiche Skalierungsoperation für jede der 3 Ebenen nacheinander durchführen, ohne zuerst von 4: 2: 0 - & gt; 4: 4: 4.

Sehen Sie sich den Quellcode für libyuv an; Es skaliert nur die Ebenen: Ссылка

    
G Huxley 05.06.2015 05:49
quelle

Tags und Links