direkt zum Inhalt | Websitenavigationsübersicht | Sprachwechsel

Prof. Dr.-Ing. habil. Hansjörg Mixdorff
Beuth-Hochschule für Technik Berlin
(University of Applied Sciences)
FB Informatik und Medien
Multimediatechnik (Audio/Video) / Technische Sprachverarbeitung
Email: mixdorff@bht-berlin.de

Tagesdatum

Diese Seite steht in folgenden Sprachen zur Verfügung:

  • Deutsch 

Sie befinden sich: Home » Medientechnologien » Übung-2

Inhalt dieser Seite:

Multimediatechnik Medientechnologien Übung-2

Wählen Sie eine weitere Seite:

Bild-Grundlagen: Abtastung, Aliasing, Quantisierung

Einführung:

Zur Verdeutlichung der Vorgänge bei der digitalen Bildverarbeitung werden wir verschiedene Manipulationen auf dem digitalisierten Bild (in Form von unkomprimierten Bitmap-(BMP)-Dateien) selbst programmieren. Dazu werden die Java-Methoden read_bmp aus der Klasse BmpReader und write_bmp aus der Klasse BmpWriter zum Ein-und Auslesen von BMP-Dateien zur Verfügung gestellt. Diese werden aus der main-Methode der Klasse bmp_io aufgerufen. Bmp_io, bzw. main wird daher entsprechend um einen Programmblock erweitert werden, der die genannten Manipulationen realisiert.

Bilder können z.B. mit eigenen Handys oder Kameras aufgenommen werden. Zur Darstellung und Editierung kann man z.B. einfach Paint benutzen.

Die Klasse bmp_io in der vorliegenden Form liest lediglich eine BMP-Datei ein und speichert sie gegebenenfalls unter einem anderen Namen wieder ab. Wir werden die IDE Eclipse nutzen, um bmp_io zu erweitern und das Programm auch stets innerhalb der IDE ausführen. Das heißt, wir legen bmp_io in Eclipse als Java Project an und kompilieren und führen es aus darin aus. Unter "Run configurations" lassen sich die Übergabeparameter, d.h., Ein- aus Ausgabedateinamen festlegen:

Arguments:

  • input.bmp (BMP-Datei 'input.bmp' wird eingelesen und Header-Daten werden angezeigt)
  • input.bmp output.bmp (BMP-Datei 'input.bmp' wird eingelesen und in die Datei 'output.bmp' kopiert)

nach oben ] [ Website-Navigation ]

1. Aufgabe

Erzeuge zwei Bilder im Format 16x9 mit deiner Kamera oder deinem Handy (960x540 Pixel, 24Bit), davon eines mit eher flächigen Inhalten (Gang/Decke/Wand/Schrank) und eines mit feineren Strukturen (Natur) und achte auf gute Belichtung. Typischerweise werden diese Bilder im komprimierten JPG-Format abgespeichert sein. Damit wir sie für unsere Experimente benutzen können, müssen sie zunächst z.B. in Paint in Bitmaps konvertiert werden. Es kann auch sein, dass die Kamera ein anderes Format und eine andere Pixelzahl hat, so dass man die Dimensionen noch verändern muss. Speichere deine Bilder aus Paint also im BMP-Format mit 24Bit ab.

Benenne die Dateien "Flaechen_NameArbeitsgruppe.bmp" und Details_NameArbeitsgruppe.bmp". Schick mir die beiden BMP-Dateien unter Nennung deiner Arbeitsgruppe per Mail. In den folgenden Übungen wirst du diese Dateien oft als Ursprungsbilder verwenden. Sollten sie verloren gehen, kannst du sie notfalls wieder von mir erhalten. Darauf werde ich dir zwei BMP-Dateien mit Testbildern zusenden, die du bei den folgenden Aufgabenpunkten benötigst, gratingHXX.bmp und gratingVXX.bmp.

Nun lies die Bilder mit bmp_io ein und erkläre die Angaben im Header, die auf der Konsole ausgegeben werden! Wie erklärt sich die Dateigröße für die beiden Dateien?

nach oben ] [ Website-Navigation ]

2. Aufgabe - Aliasing

2.1 Modifiziere bmp_io dahingehend, dass die RGB Werte der einzelnen Pixel in der BMP-Datei in eine (lesbare) ASCII-Datei geschrieben werden. Es reichen dabei jeweils eine Zeile und eine Spalte! Lies die von mir geschickten Testdateien ein und schätze aus den resultierenden Zahlenfolgen die Periodendauer in Pixeln in horizontaler und vertikaler Richtung. (Jeweils eine Periode horizontal und eine vertikal für das Übungsprotokoll abspeichern).

nach oben ] [ Website-Navigation ]

2.2 Auch bei der Bildabtastung muss das sogenannte Abtasttheorem eingehalten werden. Wie lautet es und wie läßt sich der Grenzfall, für den es gerade noch gilt, illustrieren (Zeichnung !)?

2.3 Erzeuge aus deinen eigenen Farbbildern Graustufen-Bilder. Dazu muss der Helligkeitswert Y aus den RGB-Werten errechnet werden (wie und woher kommt die Formel?). Mit diesem Y-Wert wird dann die R, G und B-Information überschrieben. Speichere die Graustufenbilder ab.

2.4 Erkläre, wie bei Bild- und Videoaufnahmen Aliasing entstehen kann. Ähnlich wie bei der 1. Übung am Audiosignal wollen wir auf das Bild ein Down-Sampling anwenden und sehen, wann dabei Aliasing auftritt. Beim Audiosignal haben wir jedes zweite Sample verworfen und damit die Abtastfrequenz halbiert. Beim Bild verringern wir die räumliche Auflösung, indem wir die Zahl der Bildzeilen bzw. Bildspalten verringern. Dabei wollen wir das Bild allerdings nicht verkleinern - was normalerweise die Folge wäre - sondern einfach die ungeradzahligen Spalten durch den Inhalt der geradzahligen Spalten ersetzen, d.h. Spalte 1 wird durch Spalte 0 ersetzt, Spalte 3 durch Spalte 2 etc. und analog für die Zeilen. Wenn das Ursprungsbild nun sehr feine Strukturen aufweist, wie in machen Testdateien, können Aliasing-Verzerrungen sichtbar werden. Achte darauf, dass stets Rot, Grün und Blau getrennt manipuliert werden müssen.

2.5 Modifiziere bmp_io dahingehend, dass zunächst in jeder Zeile des eingelesenen Bilds jedes ungeradzahlige Pixel durch das davor liegende geradzahlige Pixel ersetzt wird (horizontales Down-Sampling). Diese Veränderung hat natürlich nur bei einem der beiden Testbilder Sinn (warum?). Speichere das resultierende Bild ab. Da sich die Bildgröße bei dieser Operation nicht ändert, muss der Bild-Header auch nicht verändert werden. Falls du im Ergebnis keine Veränderung sehen kannst, ersetze mehr Spalten, also Spalte 1 und 2 durch Spalte 0, dann Spalte 1, 2 und 3 durch Spalte 0 usw. Wende diese Manipulation auf die Testbilder an, bis du eine Veränderung in Form eines Moiré-Musters siehst. Notiere, bei welcher Verringerung du die Veränderungen beobachtest und beschreibe die Veränderungen! Erkläre das Ergebnis an Hand der von dir bestimmten Periodendauer in Pixeln.

Nun wende die Zeilenverringerung vertikal an, d.h. ersetze die Pixel jeder ungeradzahligen Zeile durch die der Zeile davor (vertikales Down-Sampling). Auch hier hat die Manipulation nur bei einer der Testdateien Sinn!

Abschließend wendest du noch das horizontale Downsampling auf deine eigenen Bilder an, bis du eine sichtbare Verschlechterung beobachtest. Notiere auch hier, wann dies bei deinen beiden Bildern der Fall ist.

nach oben ] [ Website-Navigation ]

3. Aufgabe - Bitreduzierung

3.1 Wir wollen nun bmp_io so modifizieren, dass wir die Bitzahl reduzieren können. Dazu können wir z.B. alle RGB-Werte durch eine Potenz von 2 teilen (Integer-Division ohne Rest). Damit das resultierende Bild nicht dunkler wird als das Original, kompensieren wir die Operation durch Multiplikation mit derselben Zweierpotenz. Zu beachten: Der Datentyp hat nach wie vor eine Bittiefe von 24Bit (8bit pro Farbe!)

(Denselben Effekt erreicht man auch durch einfaches logisches 'Verunden' mit einem entsprechenden HEX-Wert, indem man mit dem LSB beginnend Bits 'ausblendet'.)

nach oben ] [ Website-Navigation ]

3.2 Mit dem entstandenen Programm verändern wir die in Aufgabe 1 erzeugten BMP-Dateien. Ab welcher Bitzahl tritt beim Detail-Bild und beim Flächen-Bild eine sichtbare Verschlechterung der Qualität ein? Wie kann man diese Verschlechterung am besten beschreiben? (Alle Ergebnisbilder ins Übungsprotokoll)

3.3 Modifiziere dein Programm noch einmal so, dass auch das Differenzbild zwischen Original und bitreduziertem Bild, das heißt das Fehlerbild ausgegeben, werden kann. Beachte dabei, dass bei der Differenzbildung negative und positive Werte auftreten können. Diese müssen wieder in den Wertebereich 0...255 transformiert werden, d.h. auf den Mittelwert 127 gebracht werden (wie?). Dabei musst du auch bedenken, dass z.B. bei 1 Bit Reduzierung der Fehler nur 0, 1 oder -1 wäre. Dieser Wertebereich wäre viel zu klein, als dass man ihn in der 8bit-Grafik noch sehen könnte. Daher muss der Fehler durch Multiplikation mit einer 2er Potenz verstärkt werden. In anderen Worten: Hat man vorher durch 2^n geteilt, sollte man das Differenzsignal vor dem Abspeichern mit 2^(8-n-1) multiplizieren. So ist sichergestellt, dass der Verstärkungsfaktor mit der Anzahl der gelöschten Bits kleiner wird (Bilder all dieser Fälle ins Übungsprotokoll)

nach oben ] [ Website-Navigation ]

Seite drucken

Informationen zu dieser Seite:

Letzte Änderung: 25-Juli-2006
URL dieser Seite: http://public.beuth-hochschule.de/~mixdorff/mmt1/uebung1.html

Erstellt von: © (2006) created by πhomas Ulrich | www.jedermensch.de

Erstellt mit: Valid XHTML 1.0! Valid CSS! Erstellt mit CSS!

•Seitenende•