Forum: FPGA, VHDL & Co. einfache verlustlose Datenkompression


von Kameramann (Gast)


Lesenswert?

Ich habe still Images von etlichen Megapixels zu übertragen und mir geht 
die Bandbreite aus. Daher möchte ich die Daten ohne Verluste 
komprimieren bevor sie rausgehen. Die Daten haben 16 Bit und kommen 
seriell. Ich kann etwa 6 Zeilen mit allen 4000 Pixel speichern und 
verzoegern. Das Lesen und Ausgeben muss aber in Echtzeit erfolgen, was 
auf 297 MHz hinauslaeuft. Optimal waere wenn ich es so komprimieren 
könnte das aus 16bit 10bit wrden womit ich unter 200Mhz am Ausgang hatte

Welches Verfahren wäre denkbar?

von Peter II (Gast)


Lesenswert?

Kameramann schrieb:
> Welches Verfahren wäre denkbar?

kommt auf das Bild an. Wenn recht viele Pixel die gleiche Farbe auf 
einer Zeile haben kann man mit LZW arbeiten.

Bei gleichmäßigen Rauschen ist das aber nicht sinnvoll.

von 🍅🍅 🍅. (tomate)


Lesenswert?

Und was passiert, wenn die Daten gerade mal nicht komprimierbar sind? 
Stürzt dann die Kamera ab? Nehme mal an, dass es sich um eine fixe 
Framerate handelt. Da wäre es doch eigentlich schlauer, einen 
schnelleren Bus zu nehmen

von Wolllaus (Gast)


Lesenswert?

Kameramann schrieb:

> Daher möchte ich die Daten ohne Verluste komprimieren

> könnte das aus 16bit 10bit wrden womit ich unter 200Mhz am Ausgang hatte

Denk mal nach, das kann so mit unbekannten Bilddaten nicht 
funktionieren. Es wäre höchstens bei (bekannten und garantierten!) 
simplen Bildinformationen denkbar - oder eben bei verlustbehafteter 
Kompression.

von derguteweka (Gast)


Lesenswert?

Moin,

Natuerlich teile ich die Bedenken der vorhergehenden Posts, werfe aber 
trotzdem mal ein Huffyuv-codec in den Raum.
Bei 297MHz Ausgangstakt werf' ich weiterhin noch "Tico Lightweight 
compression" und VC-2 hinterher, aber ich glaub', die sind etwas 
verlustbehaftet.

Gruss
WK

von Kameramann (Gast)


Lesenswert?

Das Bandbreitenproblem möchte ich durch einen Fifo lösen.

Dankeschön für die Stichworte

von Pandur S. (jetztnicht)


Lesenswert?

Man koennte sich eine Kompression vorstellen, die mit einer 
nichtlinearen Kennlinie laeuft. Erst wuerd ich aber entrauschen. Dh 
Bild-Entrauschen. Bedeutet aber einen Bildspeicher. Dann einen 
Algorithmus drueber zum Entrauschen, und einen fuer die Kennlinie. 
Natuerlich verlustbehaftet, aber eh noetig. Deswegen verwendet man heute 
Quadcore mit 64 bit.... dh heisst ich wuerde die gesammte 
Bild-Vorbearbeitung in den Controller verschieben. Dass das andere Ende 
nur ein paar Parameter zum anpassen hinsendet.

von J. S. (engineer) Benutzerseite


Lesenswert?

Oder D. schrieb:
> Man koennte sich eine Kompression vorstellen, die mit einer
> nichtlinearen Kennlinie laeuft.
Das hat man bei Audiosamples früher mal gemacht, als Speicher noch teuer 
war und so 16Bit-samples auf 12 Bit gespeichert. Bei Video müsste das 
gehen. Aber:

> Erst wuerd ich aber entrauschen.
Schon das ist nicht mehr verlustfrei möglich.


> Deswegen verwendet man heute
> Quadcore mit 64 bit.... dh heisst ich wuerde die gesammte
> Bild-Vorbearbeitung in den Controller verschieben.
Wenn es eine offline-Bearbeitung ist, die das Bild mehrfach auswerten 
muss, in jedem Fall. Bei allen linearen Verfahren geht es im FPGA 
besser. Da geht durchaus "Hexacore mit 128 bit" wenn es sein muss :-)

von Kameramann in Not (Gast)


Lesenswert?

Nachdem Ich mir die einzelnen Verfahren angesehen habe stelle ich fest 
dass ich entweder mit Verlusten leben muss oder mehr Leitungen brauche. 
Mist.

von Stephan H. (Gast)


Lesenswert?

Ich würd mir ja erst mal anschauen was der Sensor überhaupt an 
sinnvollen Daten liefert.
Keine Vollformat-Spiegelreflex-Digitalkamera ob aktuell oder älteres 
Modell füllt 16 Bit mit sinnvollen Daten.
Da ist Kompression keine Schande...

Was ist es denn für ein Sensor?
4000 Pixel (je Zeile?) hört sich nach 4*3=12MP an. Sensorgröße?

Werden die Bilder irgendwie messtechnisch verarbeitet /mehrere Bilder 
zur Rauschreduzierung übereinandergelegt oder sind sie fürs menschliche 
Auge bestimmt?

Bei fürs Auge:
- man geht von so 200 wahrnehmbaren Helligkeitsabstufungen aus
- mit Reserven für Bayer-Interpolation, empfindliche Augen, etc. sollten 
1000 Abstufungen dick reichen
- je Blendenstufe (doppelte Helligkeit) reichen so 30 Abstufungen (zzgl. 
dick Reserve insgesamt 150)
- die SRGB-Kennlinie (8 Bit) kann da als sinnvoller Anhaltspunkt dienen

Der Sensor:
- Beispiel Canon 1DX, Sensor 36x24mm, 18MP
- max. 90000 Photonen je Pixel Kapazität 
(http://www.clarkvision.com/articles/digital.sensor.performance.summary/#full_well)
- optisches Rauschen bei 90000 Photonen: 300 Photonen 
(Standardabweichung)
- 90000 Photonen = 65535 LSB, +-300 Photonen = +- 219 LSB
- 22500 Photonen (1/4 Beleuchtung) = 16383 LSB, +-150 Photonen = +- 109 
LSB
- 5625 Photonen (1/16 Beleuchtung) = 4095 LSB, +-75 Photonen = +- 55 LSB
- die Rauschwerte von ADC, Verstärker, etc. kommen dazu
Eine Datenspeicherung mit 16 Bit macht hier in den oberen 
Beleuchtungsstufen schlicht keinen Sinn. Die oberste Stufe codiert 
>16000 Werte von denen allerhöchstens 150 Abstufungen wahrnehmbar sind 
und jeder einzelne Wert mit +-155...219 Standardabweichung stochastisch 
schwankt.

Wenn du Quantisierungsschritte mit 1/3 der unvermeidbaren 
Rausch-Standardabweichung machst
erhöhst du das Gesamtrauschen von A auf maximal sqrt(A^2 + 
(A*1/3*0,5)^2) = A * 1,0138 (+1,38%).
Die 0,5 fürs Quantisierungsrauchen sind dabei zu hoch angesetzt. Zu 
lange her...
Bei Schritten mit 1/2 Sensorrauschen sinds <+3,1%.
Bei Schritten mit 1/1 Sensorrauschen sinds <+11,8%.
Die Kompression je nach Readout natürlich angepasst. Das Rauschen hängt 
ja davon ab.

Für den Canon1DX-Sensor und Quantisierung mit 2/5 Sensorrauschen kommst 
du etwa bei 1024 Symbolen je Pixel raus (=10 Bit).
Im hellen Bereich ließen sich wegen der Wahrnehmungsschwelle nochmal 200 
Symbole problemlos einsparen. (zusätzliches Rauschen dadurch im oberen 
Bereich < 10%)
Wenn dein Sensor kleiner / schlechter ist wirds einfacher, weil der 
Rauschanteil noch höher ist.

Funktioniert mit wenig Speicher und "CPU-Power".


Stephan

von Horst (Gast)


Lesenswert?

Hmm, steht an der anderen Seite denn genug Rechenkapazität zur 
Verfügung?!
Wenn ja, möglicherweise gibt es ja Kameras, wo man an die Daten vor 
Bayer-Pattern-Interpolation herankommt und die dann nachher selbst 
durchführt. Spart 2/3 der Bandbreite...

von FPGA-Ingenieur (Gast)


Lesenswert?

Horst schrieb:
> wo man an die Daten vor
> Bayer-Pattern-Interpolation herankommt und die dann nachher selbst
> durchführt. Spart 2/3 der Bandbreite...

Es gibt eine Reihe von Kameras - zumindest Industriekameras - an deren 
Daten man herankommt und in der Tat kann man das Prozessieren auslagern. 
Z.B. lässt sich ein Datenstrom 8x parallel verarbeiten, um 8 
Prozessorplatinen ins Spiel zu bringen.

Aber warum bist Du der Ansicht, dass man 2/3 der Bandbreite einsparen 
könnte? Das Bayerpattern ist ja komplett gefüllt - quasi ein 
Schwarz-Weiss-Bild mit eben besonderen Bedeutungen der Pixelpositionen.

von Horst (Gast)


Lesenswert?

FPGA-Ingenieur schrieb im Beitrag #4337961:
> Aber warum bist Du der Ansicht, dass man 2/3 der Bandbreite einsparen
> könnte? Das Bayerpattern ist ja komplett gefüllt - quasi ein
> Schwarz-Weiss-Bild mit eben besonderen Bedeutungen der Pixelpositionen.

Klar ist das Pattern gefüllt, aber eben mit nur einem Wert quasi. Also 
ich habe für jedes Pixel nur 8/10/12/14 Bit als Helligkeitswert für die 
jeweilige vom Filter durchgelassene Farbe.
Durch die Bayer-Pattern-Interpolation wird aus den umliegenden Pixeln 
jeweils auch für die nicht vom Filter durchgelassenen Farben ein 
Helligkeitswert errechnet, sodass ich dann pro Pixl 3 (RGB) * 8/10/12/14 
Bit habe.

Korrigiert mich, wenn ich falsch liege.

von FPGA-Ingenieur (Gast)


Lesenswert?

Ich erkenne immer noch nicht, wo man etwas weglassen kann und mit welcer 
Begründung. Richtig, ist, dass nicht das komplette Licht in einen Pixel 
fliesst, sondern nur ein "Drittel" oder die Hälfte beim Grün. Von daher 
wird nur ein kleinerer Teil der möglichen Information ausgewertet. Aber 
man darf davon ausgehen, dass der Sensor komplett belichtet wird und 
daher sie Pixel ausgesteuert sind.

Tatsache ist, dass aus dem Sensor ein Wert kommt, und zwar für jeden 
Takt einer. Wie und durch welche Interpretation will man da etwas 
weglassen?

von Horst (Gast)


Lesenswert?

FPGA-Ingenieur schrieb im Beitrag #4339509:
> Ich erkenne immer noch nicht, wo man etwas weglassen kann und mit
> welcer Begründung. Richtig, ist, dass nicht das komplette Licht in einen
> Pixel fliesst, sondern nur ein "Drittel" oder die Hälfte beim Grün. Von
> daher wird nur ein kleinerer Teil der möglichen Information ausgewertet.
> Aber man darf davon ausgehen, dass der Sensor komplett belichtet wird
> und daher sie Pixel ausgesteuert sind.
> Tatsache ist, dass aus dem Sensor ein Wert kommt, und zwar für jeden
> Takt einer. Wie und durch welche Interpretation will man da etwas
> weglassen?

Im Bild nachher sind 3 Werte pro Pixel, nicht nur einer, der tatsächlich 
gemessen wird

von FPGA-Ingenieur (Gast)


Lesenswert?

Aber trotzdem müssen doch diese Rohwerte, aus denen (weiter oben) dann 
noch mehr künstlich erfunden! werden, einmal transportiert werden.

von Kameramann (Gast)


Lesenswert?

Nun hab ich probiert die Bilder zu zippen. Werden etwa auf die Hälfte 
geschrumpft.

Kriegt man das in VHDL hin?

von Sym (Gast)


Lesenswert?

Kameramann schrieb:
> Nun hab ich probiert die Bilder zu zippen. Werden etwa auf die
> Hälfte
> geschrumpft.
>
> Kriegt man das in VHDL hin?

Natürlich kann man das ZIP Format auf deinem FPGA umsetzen, verwendet 
übrigens auch PNG. Von Grund auf neu schreiben, ist möglich, aber ohne 
Vorwissen doch recht zeitaufwändig. Üblich sind Umsetzungen mit 
Hashtabellen, und dann eben die Huffman Codierung.

von Stephan H. (Gast)


Lesenswert?

Kameramann schrieb:
> Nun hab ich probiert die Bilder zu zippen. Werden etwa auf die Hälfte
> geschrumpft.
>
> Kriegt man das in VHDL hin?

Natürlich. Spätestens mit einem Softcore und externem Speicher.
Ohne Speicher läuft das ganze vmtl. auf eine statische Codetabelle raus.

Und Bilddaten können grundsätzlich auch rein zufällig sein. Wenn 1000 
Bilder auf 50% komprimiert werden kann das 1001ste nach Kompression 101% 
Speicher/Bandbreite brauchen - den es nicht gibt.
Grade bei statischen Codetabellen sind Ausreißer auch deutlich nach oben 
(120%) wahrscheinlich.

Aber sag uns doch mal um was für Daten es sich handelt:
- Abmessungen in Pixel
- Farbe / SW
- RGB  RAW  YUV / ...
- Bildfrequenz
- Bild-Sensor oder gar das geheime Kameramodell

Dann kann auch fundiert geholfen werden.

Stephan

von J. S. (engineer) Benutzerseite


Lesenswert?

Kameramann schrieb:
> Nun hab ich probiert die Bilder zu zippen. Werden etwa auf die Hälfte
> geschrumpft.

Der Zipper arbeitet aber auch nicht in Echtzeit, sondern kurvt über 
mehrere Daten, um sie zu reduzieren. Nur beim Auspacken funktioniert das 
in Echtzeit.

Dafür durfte die Zeit nicht reichen, bzw die Fläche im FPGA. Du 
bräuchtest eine Architektur, die parallel alle verfügbaren Symbole 
testet und den hash code ermittelt.

von P. K. (pek)


Lesenswert?

Stephan H. schrieb:
> Und Bilddaten können grundsätzlich auch rein zufällig sein. Wenn 1000
> Bilder auf 50% komprimiert werden kann das 1001ste nach Kompression 101%
> Speicher/Bandbreite brauchen - den es nicht gibt.
> Grade bei statischen Codetabellen sind Ausreißer auch deutlich nach oben
> (120%) wahrscheinlich.

Hier weiss man immer noch zu wenig über das Anwendungsgebiet der Kamera. 
Oben stehende Bedenken treffen auf eine Handykamera sicher zu. Wenn die 
Kamera aber immer ähnliche Bilder aufnimmt (z.B. Produktionsstrasse) 
könnte man durchaus erfolgreich mit fixen Huffman-Tabellen arbeiten.

von Christian B. (casandro)


Lesenswert?

Also wenn es sich um Bewegtbilder geht kannst Du auch mal anschauen was 
zum Beispiel die BBC in den 1980gern gemacht hat.

Die habne ganz grob einen Prädiktionscoder für Video gebaut, und dann 
die Differenz übertragen. Sprich Du hast einen Bildspeicher (oder zur 
Not Zeilenspeicher) aus dem Du für jeden neuen Pixel den Du übertragen 
möchtest einen geschätzten Wert berechnest.

Zum Beispiel könnte der neue Pixel der Durchschnittswert aus dem Pixel 
links davon und dem darüber sein. Dann bestimmst Du die Differenz aus 
diesem Schätzwert und dem realen Pixelwert. In aller Regel wird diese 
Differenz nahe 0 sein, was Du mit einem Huffmanncode mit weniger Bits 
übertragen kannst als den unwahrscheinlich Fall, dass Du ganz grob 
daneben bist.

So was, allerdings noch mit dem vorherigen Bild als Referenz, hat die 
BBC schon in den 1980gern in diskreter Logik und verlustbehaftet gebaut. 
Die kamen damit auf 64 MBit für ein Bild in Fernsehqualität.

von Markus F. (mfro)


Lesenswert?

Verlustfreie Video-Kompression funzt m.E. nicht mit nur einer einzigen, 
simplen Kompressionsstrategie - es kommt drauf an, was auf dem Video 
drauf ist.

Bei einer Überwachungskamera beispielsweise kommt im Wesentlichen immer 
dasselbe Bild. Wenn dann mal ausnahmsweise einer durch selbiges 
schlurft, macht es Sinn, jeweils immer nur die Differenzen zum vorigen 
Frame zu übertragen.

Mit dem Ansatz fliegt man voll auf die Fresse, wenn abwechselnd komplett 
weiße und komplett schwarze Frames übertragen werden sollen, während 
sich solche Bilder (z.B. mit simplem RLE) ganz leicht und effektiv auf 
andere Weise komprimieren lassen.

M.E. müssen deswegen mindestens zwei Strategien angewandt werden und 
eine vernünftige, schnelle Logik dazu, die sich abhängig vom Bildinhalt 
jeweils für die richtige entscheidet.

von Strubi (Gast)


Lesenswert?

Moin,

ZIP-style-kompression (PNG, GIF, etc.) macht auf dem FPGA nicht wirklich 
Spass/Sinn im Vergleich zu JPG zB. Ersteres lässt sich nicht einfach in 
eine Pipeline quetschen und der Bedarf der Code-Tabellen lässt sich 
nicht abschätzen. Du kannst natürlich den Standard verstümmeln...
JPEG-Encoding habe ich auf dem FPGA mal umgesetzt und auch mit anderen 
Verfahren experimentiert. Interessant sind da einige 
Wavelet-Transformationen, die sich ähnlich wie die DCT in ein Pipeline 
quetschen lassen. Hintendran hat man immer den klassischen 
Huffman-Encoder, der prima in Hardware passt. Das Streaming/Bit-Slicing 
ist dann bei gegebener Durchsatzrate knifflig, mit den kleinen FPGAs ist 
da schon mal nix zu holen. Und auch mit was dickeren dürfte es eine 
Multi-Tap-Geschichte werden bei der Bandbreite.
Für Stills würde ich es am ehesten noch mit Wavelets versuchen. Aber: Da 
geht locker mal ein Jahr an Eigenentwicklung drauf, das macht man nicht 
mal eben so. Dementsprechend kostet auch so ein Core.
Was "lossless" angeht: Es gehen immer ein paar Bits verloren und ein 
Sensor rauscht auch mal gerne korreliert (mit anderen Signalen), also 
wäre ich da etwas relaxter..

Grüsse,

- Strubi

von Stephan H. (Gast)


Lesenswert?

Egal wie man es dreht und wendet, Bilddaten können potentiell zu 100% 
stochastisch sein und damit unkomprimierbar.
Solange man nicht Details über die Bilddaten und den Sensor weiß kann 
man da nichts machen / empfehlen.
Nach den bisherigen Vorgaben ist auch eine Mittelwertbetrachtung nicht 
relevant. Die Kompression muss beliebige 6 aufeinanderfolgende 
Bildzeilen auf maximal 62,5% eindampfen, für mehr reicht der Speicher 
nicht.

Ich hatte jedenfalls schon praktische Bilder (Fotos) bei denen die 
16-Bit-Rohdaten (vor Interpolation) sich nicht verlustfrei auf 10-Bit 
oder weniger bringen ließen. Rauschanteil zu hoch...
Und ich kann sagen, dass mit für den Menschen visuell niemals 
wahrnehmbaren Informationsverlusten die 10-Bit-Grenze kein Problem sein 
wird. Auch bei dem begrenzten Speicher.

Für Empfehlungen dazu fehlen aber die Infos ...

Christian B. schrieb:
> Zum Beispiel könnte der neue Pixel der Durchschnittswert aus dem Pixel
> links davon und dem darüber sein. Dann bestimmst Du die Differenz aus
> diesem Schätzwert und dem realen Pixelwert.

Bei Codierung der Differenzen zwischen zwei Pixeln (Nachbarpixel, 
vorheriger Frame ist egal) erhöht sich das Rauschen (für die 
Huffmann-Tabelle) erstmal um sqrt(2). Hatte ich mal probiert und wieder 
sein lassen.

Stephan

von J. S. (engineer) Benutzerseite


Lesenswert?

Stephan H. schrieb:
> Und ich kann sagen, dass mit für den Menschen visuell niemals
> wahrnehmbaren Informationsverlusten die 10-Bit-Grenze kein Problem sein
> wird. Auch bei dem begrenzten Speicher.

Auf welche Ausgabe beziehst Du Dich dabei? Bei Monitoren sind ja bei 
Weitem keine 10 Bit zu transportieren.

von Stephan H. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Stephan H. schrieb:
>> Und ich kann sagen, dass mit für den Menschen visuell niemals
>> wahrnehmbaren Informationsverlusten die 10-Bit-Grenze kein Problem sein
>> wird. Auch bei dem begrenzten Speicher.
>
> Auf welche Ausgabe beziehst Du Dich dabei? Bei Monitoren sind ja bei
> Weitem keine 10 Bit zu transportieren.

Ich sag ja 10 Bit sind kein Problem.
Die gängigen 8 Bit sind aber (bei der üblichen sRGB-Kurve) manchmal 
schon kritisch. Langsame Farbübergänge im dunklen Bereich produzieren da 
ab und an sichtbares Banding. Hängt natürlich vom Monitor und den 
Einstellungen ab...

Evtl. will man ja auch mal die Helligkeit hochziehen oder die Tonwerte 
spreizen. Da sollten die Abstufungen in der Kodierung möglichst unter 
dem "netürlichen" Rauschen liegen. Hängt natürlich von dem unbekannten 
Anwendungsszenario ab.

Aber wir wissen ja noch nicht einmal ob es sich um Rohdaten/RGB handelt. 
Oder YUV mit reduzierter Abtastfrequenz für die Farben. Oder ein 
lineares Profil oder eines mit Gamma-Kurve.

In die 10 Bit bekommt man jedenfalls ein (lineares, nicht 
interpoliertes) Rohsignal bei den aktuell gängigen Sensoren rein ohne 
groß Daten zu verlieren. Messtechnische Auswertung ausgeschlossen, denn 
da können in hellen Bereichen - die den Großteil des Datenvolumens 
ausmachen - weit mehr Werte differenziert werden als das Auge schafft.

Ich glaub aber der TE hat aufgegeben.

Stephan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.