PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Qt] catCompress - Komprimierungsalgos.



retak
22.01.2011, 12:05
Hai ho,
da ich mich gerade mit der Fouriertransformation beschäftige, möchte ich nunmal probieren Bilder damit zu komprimieren. Die Idee ist ganz einfach: die Bilddaten in den Frequenzraum umrechnen, und alle Frequenzen weglassen, deren Amplitute kleiner 30% der größten Amplitude ist.

Damit das auch nutzbar ist, eine kleine GUI in Qt.

Was ich gern heute noch hinbekommen würde.

- Qt Programm schreiben was alle gänigen Bildformate anzeigen kann (easy)
- Für größere Bilder sollten Scrollbalken erscheinen (hab ich noch nie hinbekommen)
- das Format catCompress genauer Beschreiben. Breite/Höhe Angaben etc. sollen nicht mit in die FT einbezogen werden. Das Format recht locker gestalten damit z.b. auch mal Audiodaten mit gespeichert werden
- nicht erklären wie ich auf den Namen catCompress komme ;)
- einen Regler mit dem man einstellen kann, wie stark die Frequenz sein muss, damit sie nicht ignoriert wird
- den Kram in eine Datei speichern
- und natürlich sollte das Programm das Zeug auch wieder laden können.
- eine kurze Info um wieviel die Datei kleiner wurde
- einen Fortschrittsbalken

Puh doch ganz schön viel. Na ich setz lieber 2 Tage für an.

Dinge die wahrscheinlich niemals implementiert werden:
- Eine Vorschauanzeige für das komprimierte Bild
- Die FT für alle Dateien ermöglichen. RAW rein, RAW raus sozusagen
- Audiodaten aber speziell behandeln, z.B. kann man hier auch hohe und schwache Frequenzen weg lassen
- andere Komprimierungsalgos ermöglichen. Ich hab da noch einen für Plaintext only der jeden Text um 12% verkleinert :)

Naja ganz schön viele Ideen. Ich mach erstmal das allernötigste um zu sehen um wieviel so ein Bild kleiner wird. Und ob man dann etwas noch erkennen kann.

Wem noch irgendwas lustiges einfällt, nur heraus damit. Sourcecode wirds auch geben, auch wenn ich noch nicht weiss wohin damit. Aber vllt. hat der ein oder andere ja Spass damit.

Gruss

echox
22.01.2011, 14:16
- Für größere Bilder sollten Scrollbalken erscheinen (hab ich noch nie hinbekommen)

QScrollArea ('http://doc.qt.nokia.com/4.5/qscrollarea.html')?

retak
22.01.2011, 14:31
Ja schon klar. Gibt ja auch ein Example. Nur irgendwie haut das bei mir nicht hin. Da muss es noch klack machen irgendwie. Benutzte Qt ja auch erst seit genau 1 Jahr.

echox
22.01.2011, 14:45
Na dann her mit Quellcode :-P
Sorry ich werd aus dem Posting nicht so ganz schlau, dachte du hast das mit Absicht entsprechend aufgefuehrt ;-)

retak
22.01.2011, 18:03
Komischerweise geh es jetzt. Habe wohl immer irgendwas mit den Layouts falsch gemacht. Das kann man auch alles in der GUI rumklicken. 0 Zeilen Quellcode für die Scrollbalken. Finde ich schön.

Es kann also Bilder laden und speichern. Jetzt bau ich mal den Fourierkram ein.

Peanut
22.01.2011, 20:25
Wir haben sowas mal in der Vorlesung ausprobiert. Das Beispiel mit der Fourier-Transformation finde ich grad nicht mehr, aber ein Bild zur Eigenwertzerlegung hab ich dir:
SVD.png (http://image.esheep.ch/images/svd.png)

Wir haben dabei jeweils eine Eigenwertzerlegung gemacht und anschliessend ausprobiert wieviele Eigenvektoren nötig sind, damit man das Bild noch erkennen kann. Bei jedem Bild ist die Grösse angegeben, welche benötigt wird um alles zu speichern. (Grösse="Anzahl Eigenwerte" + "Höhe des Bildes" * "Anzahl benutzter Eigenvektoren")
Allerdings haben wir das mit Matlab gemacht, das heisst die Algorithmen haben wir nicht selber implementiert. (Zitat vom Professor: "Implementiert NIEMALS diese Algorithmen selber, benutzt BLAS, LAPACK und die anderen Bibliotheken!")

Ich nahme an du hast bereits was passendes für FT oder FFT... Ich bin gespannt was da rauskommt :)

retak
23.01.2011, 01:48
Hm Eigenvektor klar. Jetzt in Verbindung mit der FT nicht. Das wird eng mit der Klausur. Aber interessant :)

Also FT allein ist total einfach. Zwei Schleifen und komplexe Multiplikation. FFT ist schon ein Happen komplizierter. Hier mal ein Beispiel.


int N;
double f[N];
complex<double> F[N];
for(int j = 0; j < N; j++)
{
for(int k = 0; k <= N-1; k++)
{
F[j] += f[k]*exp(complex<double>(0, 2*M_PI*(-k*j)/N));
}

F[j].operator /=(N);
}

Peanut
23.01.2011, 12:26
Ja wäre dann für die "anderen komprimierungsalgos" ;)

retak
23.01.2011, 17:37
Hmpf! Für ein kleines Bild, 50x50 Pixel rennt das Programm fast eine Minute. Das ist natürlich absolut unbrauchbar. Also ich bin echt überrascht, was ist denn da so kompliziert zu berechnen.
Klar, kann ja irgendeine fertige FFT nehmen, aber dann ist der Spass weg :/

Bin mal grad mit callgrind drüber. 39% der gesammt Zeit kostet cexp, also e-Funktion im komplexen und 24% _muldc3 das wird dann die komplexe Multiplikation sein.

Hmm naja gut. Ich legs erstmal bei Seite. Muss mal anderes lernen.