2009-04-10 5 views
2

Ich habe ein Array von Raw rgb Daten auf einem 16-Bit-Display mit der Dimension von 320 * 480. Die Größe des Arrays ist 320 * 480 * 4 = 6144000.Wie kann ich ein Array von Raw rgb Daten auf einem 16-Bit-Display verkleinern

Ich würde gerne wissen, wie kann ich diese (80 * 120) nach unten skalieren, ohne die Bildqualität zu verlieren?

Ich habe diesen Link über Skalierung Bild in 2D-Array gefunden, aber wie kann ich das auf meine Array von 16-Bit-Display anwenden? Es ist kein 2D-Array (weil es 16 Bit Farbe hat).

Image scaling and rotating in C/C++

Danke.

+0

Wenn es 16 Bit Farbe ist, warum ist jedes Pixel 32 Bits? –

+0

Normalerweise sind 32-Bit-Pixel entweder 24-Bit-Farbe + 8 Bit Alpha oder 24 Bit Farbe +8 Bit verschwendeter Speicherplatz. – tylerl

+0

Es sieht so aus, als wäre das Display 16-farbig, nicht 16-bit? –

Antwort

2

Es gibt viele Möglichkeiten, Bilder zu verkleinern, aber keine kann garantieren, dass sie nicht "Qualität" verlieren. Letztendlich gehen Informationen während des Neuskalierungsprozesses verloren.

0

Sie haben 16bit Farben = 2 Bytes, aber in Ihren Berechnungen verwenden Sie 4 Multiplikator.
Vielleicht brauchen Sie die Bildgröße nicht zu reduzieren?

im Allgemeinen ist es unmöglich, Rasterbild zu skalieren, ohne die Qualität zu verlieren. Einige Algorithmen machen eine Skalierung fast ohne sichtbare Qualität möglich.

+0

Guter Punkt. Hier sind die Informationen, die ich erhalten: * die Größe des rohen RGB-Puffer ist 614.400 * die Größe des Displays beträgt 320 * 480 * es ist ein 16-Bit-Display Ich weiß, die oben sind richtig, weil ich diesen folgen http://docs.blackfin.uclinux.org/doku.php?id=framebuffer und mein Ergebnis zeigt korrekt – lucius

+0

Und jetzt weiß ich nicht, warum die Größe des Puffers 614400 ist. Ich versuche, das Reverse-Engineering, warum es war so groß von der Tatsache, dass mein Display 320 * 480 ist. – lucius

+0

Hm. In den von Ihnen erwähnten Dokumenten zeigen sie Perl-Skript, das Rohdaten in rgb konvertiert. – bayda

5

Wenn Sie ein großes Bild auf ein kleineres verkleinern, verlieren Sie die Bildqualität.

Die Frage ist also, wie man diesen Verlust minimieren kann.

Es gibt viele Algorithmen, die dies tun, jeder mit Stärken und Schwächen.

Normalerweise werden Sie eine Art Filter auf Ihr Bild anwenden, wie Bilinear oder Nearest Neighbour. Here is a discussion solcher Filter im Kontext von ImageMagick. Wenn die Ausgabe weniger als 16 Bit pro Pixel beträgt, müssen Sie eine Form von Color Quantization eingeben.

0

Da Sie um einen Faktor von 4 herunterskalieren, entspricht jeder 4x4 Pixelblock in Ihrem Originalbild einem einzelnen Pixel in Ihrem Ausgabebild. Sie können dann jeden 4x4-Block im Originalbild durchlaufen und dann auf ein einzelnes Pixel reduzieren. Ein einfacher Weg (vielleicht nicht der beste Weg), um diese Reduktion durchzuführen, könnte darin bestehen, den Durchschnitt oder Median der RGB-Komponenten zu nehmen.

Sie sollten beachten, dass Sie keine Bildskalierung durchführen können, ohne die Bildqualität zu verlieren, es sei denn, für alle Blöcke im Originalbild hat jedes Pixel die exakt gleiche Farbe (was unwahrscheinlich ist).

+0

Es sieht so aus, als ob das OP in jeder Dimension einen Faktor von 4 bedeutet. Sie möchten also 4x4 Blöcke von Quellpixeln, nicht 2x2, für eine Gesamtgrößenänderung von einem Faktor 16 multiplizieren. – RBerteig

+0

Echte, editierte Antwort, um das zu reflektieren – MahlerFive

3

Ich nehme an, dass Sie eine 16-Bit-RGB-Anzeige, nicht eine Anzeige, die jede Farbe (rot, grün und blau) als 16 Bit bedeutet. Ich nehme auch an, Sie wissen, wie Ihre r, g, und b-Werte in diesem 16-Bit-Raum codiert sind, denn es gibt two possibilities.

Wenn Sie also wissen, wie Sie Ihren Farbraum aufteilen, können Sie jetzt eine Reihe von Byte-Arrays verwenden, um Ihre Daten darzustellen. Was zu einer schwierigen Entscheidung wird, ist, ob man mit Byte-Arrays gehen soll, weil man eine Reihe von Algorithmen hat, die bereits die Arbeit an diesen Arrays erledigen können, aber ein paar zusätzliche Bits pro Byte kosten, die man nicht ausgeben kann oder muss halte alles in diesem 16-Bit-Format und arbeite dann an den entsprechenden Bits jedes 16-Bit-Pixels. Nur du kannst diese Frage wirklich beantworten; Wenn Sie den Speicher haben, würde ich mich für den Byte-Array-Ansatz entscheiden, weil es wahrscheinlich schneller ist und Sie ein wenig extra Präzision bekommen, um die Bilder am Ende glatter zu machen.

Angesichts dieser Annahmen ist die Frage wirklich rechenschaftspflichtig, wie viel Zeit Sie auf Ihrem Gerät haben. Wenn Sie ein sehr schnelles Gerät haben, können Sie eine Lanczos resampling implementieren. Wenn Sie ein weniger schnelles Gerät haben, funktioniert bicubic interpolation auch sehr gut. Wenn Sie ein noch langsameres Gerät haben, ist bilinear interpolation Ihr Freund.

Wenn Sie wirklich keine Geschwindigkeit haben, würde ich die Reskalierung in einer externen Anwendung wie Photoshop durchführen und eine Reihe von Bitmaps speichern, die Sie laden, wie Sie sie brauchen.

Verwandte Themen