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
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: -)
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%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: Ссылка
Tags und Links image-resizing yuv