Bildbearbeitung mit Eclipse in Java... hilfe!

Benutzer101250  (30)

Sorgt für Gesprächsstoff
Hi Leute,
Ich hoff jetzt mal, ich hab das richitge Forum getroffen :zwinker:

Also, mein Problem ist folgendes:
Ich will/muss ein "Bildbearbeitungsprogramm" schreiben, das unter anderem ein Bild halbiert (d.h. 0.5*Länge und 0.5*Breite). Danach soll ein zweites Programm die Bildqualität erhöhen, indem Pixel aus dem Original aufs neue Bild übernommen werden.

Jetzt habe ich aber keine Ahnung, wie ich das anstellen soll... :schuettel:




Was ich bisher habe ist folgender Code (um das Bild auf 1/2 seiner Originalgrösse zu bringen):
package bildbearbeitung;

import mediacomputation.Picture;
import mediacomputation.PictureExplorer;

public class BildBearbeitungsProgramm {

public static void main(String args[]) {
// hier können Sie kommagetrennt die Namen der
// Bilder angeben, die bearbeitet werden sollen
//
// die Bilder müssen alle im gleichen Ordner
// wie goldengate.jpg liegen
final String[] bildDateiNamen = { "felix2007.jpg" };

// hier können Sie kommagetrennt angeben,
// welche Bildbearbeitungs-Klassen auf die Bilder
// losgelassen werden sollen
final BildBearbeitungInterface[] bildBearbeiter = { new BildHalbieren() };

// den Rest des Programms unverändert lassen :smile:
for (int i = 0; i < bildDateiNamen.length; i++) {
Picture bild = new Picture(bildDateiNamen);
PictureExplorer bildExplorer = new PictureExplorer(bild);
bildExplorer.setTitle(bildDateiNamen);
}

for (int i = 0; i < bildDateiNamen.length; i++) {
for (int j = 0; j < bildBearbeiter.length; j++) {
Picture bild = new Picture(bildDateiNamen);
PictureExplorer bildExplorer = new PictureExplorer(
bildBearbeiter[j].bearbeite(bild));
bildExplorer.setTitle(bildDateiNamen + ": "
+ bildBearbeiter[j].getClass().getName());
}
}
}

}
 

Benutzer85905 

Meistens hier zu finden
Ich habe den Eindruck, dass euch eine Menge Code bereits vorgegeben wurde? Kannst du das mal meinetwegen grün markieren, das erspart uns, dass wir den Code deiner Lehrer/ Professoren/... verschlimmbessern :zwinker:

Und gibt es zu dem Paket mediacomputation eine API, also eine Dokumentation der Schnittstellen?

Was ist dein konkretes Problem? Funktioniert der Code oben nicht? Was gibt der Compiler dann aus?
Oder ist dein Problem, die zweite Aufgabe zu erledigen?
 
D

Benutzer

Gast
Ich "verstehe" den Code auch nicht. Da fehlt doch etwas....["new BildHalbieren()"]
Wenn in Eclipse, dann sollten Euch doch die dazugehörigen APIs zur VErfügung gestellt werden - die dann "nur" von deinem Programm verarbeitet werden......Das Rad muss ja nicht neu erfunden werden....

Na ja, egal - Was verstehst du unter der Aufgabe die "Bildqualität zu erhöhen"?
(indem Pixel aus dem Original aufs neue Bild übernommen werden) ?

In welches neue Bild? Das verkleinerte Bild? Die Farbqualität erhöhen - das Bild komprimieren?
Weniger "Treppcheneffekt"? ......

Ähm... ja.....:zwinker:
 

Benutzer101250  (30)

Sorgt für Gesprächsstoff
@ MariaB85: Jup, vieles war vorgegeben. Der Code hier funktioniert aber und tut genau das, was er soll --> ein neues Bild mit je 1/2 Länge und Breite ausgeben. Nur an der zweiten Aufgabe scheitere ich gnadenlos..

@ all: Was genau ich unter "Bildqualität erhöhen" verstehe, weiss ich eben selbst nicht so genau :S

Der originale Wortlaut der Aufgabe lautet: "2. Finden Sie ein Verfahren, das mehrere Pixel des Originalbildes verwendet, um so die Bildqualität zu steigern. Am besten, Sie experimentieren dazu mit verschiedenen Formeln für die Berechnung der Farben der neuen Pixel."

---------- Beitrag hinzugefügt um 21:41 -----------

Uuh.. ich glaub, ich hab den falschen Code kopiert! Sorry Leute xD
Hier der "echte" Code:


package bildbearbeitung;

import mediacomputation.Picture;
import mediacomputation.Pixel;

public class BildHalbieren implements BildBearbeitungInterface {

@Override
public Picture bearbeite(Picture originalBild) {
int breite = originalBild.getWidth();
int hoehe = originalBild.getHeight();

Picture neuesBild = new Picture(breite, hoehe);

for (int y = 0; y < hoehe; y++) {
for (int x = 0; x < breite; x++) {
Pixel originalPixel = originalBild.getPixel(x, y);
Pixel neuerPixel = neuesBild.getPixel(x / 2, y / 2);
kopiereFarben(originalPixel, neuerPixel);
}
}
return neuesBild;
}

void kopiereFarben(Pixel originalPixel, Pixel neuerPixel) {
neuerPixel.setRed(originalPixel.getRed());
neuerPixel.setGreen(originalPixel.getGreen());
neuerPixel.setBlue(originalPixel.getBlue());
}

}
 

Benutzer85905 

Meistens hier zu finden
Ohne die API wird es trotzdem sehr schwer, dir zu helfen. Denn wir können ja nicht raten, welche Funktionen mediacomputation bereit stellt.

Außerdem wäre interessant, welches Wissen denn von dir erwartet wird: Was studierst (?) du, in welcher Veranstaltung wurde dir diese Aufgabe gestellt usw.?

Es dürfte einige Verfahren geben, um Kanten zu schärfen, Verwacklungen zu beseitigen usw.
Aber wenn du nichts in dieser Hinsicht jemals gehört hast, ist es unwahrscheinlich, dass so etwas von dir erwartet wird.
 

Benutzer101250  (30)

Sorgt für Gesprächsstoff
Hehe, ich studiere noch gar nicht :zwinker: Bin gerade im letzten Jahr vor dem Abi (im Mai ist es soweit...) und habe als ergänzungsfach Informatik gewählt --> Habe jetzt seit August inf gehabt.

Leider bringe ich kaum Vorwissen mit, und habe daher auch kA was das mit mediacomputation auf sich hat.. Was wir bisher gemacht haben sind Basics mit JavaKara und dann Kara programmieren von Eclipse aus. Also stehen wir noch sehr am Anfang :zwinker:

--> Vorausgesetzt wird nicht viel, erwartet wird eigentlich auch nicht viel aber iwie klappts trotzdem nicht^^
Danke trozudem schon mal
 

Benutzer18029 

Verbringt hier viel Zeit
Äh, der Code ist doch ne totale Blackbox, wo ist da der Sinn dabei? Was will man euch damit beibringen? Programmieren wohl kaum, das lernt man so bestimmt nicht, egal in welcher Sprache. :ratlos:
 

Benutzer81281 

Verbringt hier viel Zeit
Off-Topic:
Äh, der Code ist doch ne totale Blackbox, wo ist da der Sinn dabei? Was will man euch damit beibringen? Programmieren wohl kaum, das lernt man so bestimmt nicht, egal in welcher Sprache. :ratlos:

auf der Schule ist der Info-Unterricht aber so :grin:
ich habe auf diese Art und Weise meine gesamte Oberstufe in Informatik verbracht. Die Größte Herausforderung war, so zu tun, etwas sinnvolles zu machen bzw. den Lehrer in pseudo-wissenschaftliche Gespräche zu verwickeln um von der eigenen Faulheit, sich mit dem Problem tiefgehend zu befassen, abzulenken.

Gelernt haben wir trotzdem viele theoretische Grundlagen - nur Programmieren nicht :grin:

Aber jetzt an der Uni geht es schon wesentlich professioneller zu :smile:



@nordwind

ich würde dir gerne helfen, aber dazu müsste ich wissen, wie genau die Klassen "Picture" und "Pixel" aussehen.

Generell könnte ich mir es so vorstellen:
Bei der Halbierung (also viertelung der Fläche) wird momentan ja nur jedes vierte Pixel des Originalbildes in das neue Bild kopiert. Das hat zur Folge, dass ein großteil des Originals völlig ignoriert wird. Nehmen wir an, du hast ein Bild mit 75% schwarzen Pixeln und 25% weißen.
Dann wendest du die Verkleinerung an, und im schlimmsten Fall ist das neue Bild nun komplett weiß.

Also denke ich, dass man von vier Pixeln den Durschnittsfarbwert errechnen müsste, und diesen dann in das neue Pixel kopiert.


Zumindest kannst du deinen Lehrer jetzt in eine Diskussion verwickeln :zwinker:

lg
 

Benutzer101250  (30)

Sorgt für Gesprächsstoff
@ BeyondTheShore: Hey danke, auf die Idee mit dem Durchschnittswert bin ich gar nicht gekommen :grin: :grin: :grin:
Und ja, wirklich was "programmieren" können wir absolut nicht - wie auch, nach knapp 6 Monaten Unterricht mit je 4 Wochenstunden? Einige Basics verstehen wir glücklicherweise, auch wenn das nicht viel hilft xD
 

Benutzer18029 

Verbringt hier viel Zeit
Off-Topic:


auf der Schule ist der Info-Unterricht aber so :grin:
ich habe auf diese Art und Weise meine gesamte Oberstufe in Informatik verbracht. Die Größte Herausforderung war, so zu tun, etwas sinnvolles zu machen bzw. den Lehrer in pseudo-wissenschaftliche Gespräche zu verwickeln um von der eigenen Faulheit, sich mit dem Problem tiefgehend zu befassen, abzulenken.

Gelernt haben wir trotzdem viele theoretische Grundlagen - nur Programmieren nicht :grin:
Off-Topic:

Also bei uns wars nicht so, aber wir haben auch noch Turbo Pascal gelernt und nicht gleich Java. :grin: Da lernt man aber auch wenigstens anständig was.


Und ja, wirklich was "programmieren" können wir absolut nicht - wie auch, nach knapp 6 Monaten Unterricht mit je 4 Wochenstunden?
Wie bitte, nach 6 Monaten mit 4 Wochenstunden solltet ihr-sinnvollen Unterricht vorausgesetzt-eigentlich schon durchaus ein solides Grundverständnis haben und einfache Dinge programmieren können. :eek: Zumindest so grundlegende Sachen wie Variablentypen, Schleifen, bedingte Anweisungen, Umgang mit Dateien, Zeiger (sofern die in Java benutzt werden, aber ich meine das ist ja sehr ähnlich wie C, oder?) etc. könnt ihr doch wohl?! :ratlos: Sonst ist der Unterricht wirklich sinnlos...
 

Benutzer85905 

Meistens hier zu finden
Wie bitte, nach 6 Monaten mit 4 Wochenstunden solltet ihr-sinnvollen Unterricht vorausgesetzt-eigentlich schon durchaus ein solides Grundverständnis haben und einfache Dinge programmieren können. :eek: Zumindest so grundlegende Sachen wie Variablentypen, Schleifen, bedingte Anweisungen, Umgang mit Dateien, Zeiger (sofern die in Java benutzt werden, aber ich meine das ist ja sehr ähnlich wie C, oder?) etc. könnt ihr doch wohl?! :ratlos: Sonst ist der Unterricht wirklich sinnlos...

Wenn der Lehrer aber in dieser Zeit auch das Thema Vererbung erklären will (siehe "@override"), dann kann er die grundlegenden Sachen eigentlich nicht gut genug erklärt haben. Denn dann müsste er wirklich durch den Stoff gerast sein und ich nehme an, dass es sich hier nur um einen Grundkurs Informatik handelt, in dem er nicht erwarten darf, dass die Schüler eigentlich schon alles können.

Lass dir von deinem Lehrer die API geben und eine Erklärung, wie du bei der zweiten Aufgabe die Qualität steigern sollst. Ansonsten hast du bei dieser Aufgabe keine Chance :schuettel:
 

Benutzer98295 

Meistens hier zu finden
Zumindest so grundlegende Sachen wie Variablentypen, Schleifen, bedingte Anweisungen, Umgang mit Dateien, Zeiger (sofern die in Java benutzt werden, aber ich meine das ist ja sehr ähnlich wie C, oder?) etc. könnt ihr doch wohl?! :ratlos:

Off-Topic:
Syntax und Semantik ist ähnlich der von C, aber das Paradigma ist ein völlig anderes. Durch die JVM-Strukur und tendenziell fehleranfällige Zeiger wird in Java vollständig darauf verzichtet - Java hat den Anspruch, ohne Kenntnis der darunter liegenden Maschine einfach zu funktioniern.


Die zweite Aufgabe ist in meinen Augen Schwachsinn.
So wie ich das verstehe, soll die Bildqualität durch Zusammenrechnen von Bildpixel passieren. Das ist ein Teil der JPEG-Kompression. Nicht umsonst sind in der Kommission ein Haufen Experten...
Und Formeln? Was soll der Käse? Diskrete Kosinus-Fouriertransformation?

Um Bilder sinnvoll zu bearbeiten, gibts von Sun/Oracle eine eigene Library dazu die, image.codec.jpeg-lib. Sinnvoller als so eine undokumentierte selber gestrickte metacomputation-lib.
 

Benutzer89563 

Meistens hier zu finden
Ach Leute, was regt ihr euch nur alle (künstlich) so auf?

Im zweiten Code-beispiel ist doch bereits alles drin, was man für die Aufgabe braucht, weitere Infos über die API sind nicht notwendig, sofern es keine Schwierigkeiten gibt.

Ich verstehe z.B. auch nicht den letzten Beitrag hier. In erster Instanz bestehen Bilder aus einzelnen Pixeln. Der angegebene Code nimmt nur jedes zweite Pixel jeder Zeile und Spalte, um ein neues Bild mit der halben Größe in jeder Richtung aufzubauen. Dabei kommt es wie gesagt zu Problemen, wenn das Bild z.B. Muster aus senkrechten/ waagerechten Linien mit ner breite von 1Pixel enthält, die verschwinden ggf. völlig.
Wie ebenfalls bereits gesagt, kann man sowas wie den Mittelwert von einer Zelle von 2x2 Pixeln berechnen, und diesen dem einen neuen Pixel im neuen Bild zuweisen. Hierbei kommt es zu dem Problem, daß die Farbkomponenten meist nur mit 8Bit ausgegeben werden, wenn man hier vier Werte addiert, kommt es schnell zu nem Überlauf, sodaß man hier zunächst noch in mindestens 16 Bit umwandeln muß.

Das hat rein gar nix mit JPEG zu tun.



Weiterhin würde ich mich mal nicht aufregen, daß man doch besser die Bibliothek XY von Firma Z nehmen soll.
Wozu soll ich denn dann Mathe lernen, wenn mein Taschenrechner von Casio das doch bereits alles kann?

Ich hab hier ein gutes C++ Buch. Als Beispiele für Klassen werden irgendwelche Konstrukte der Warenverwaltung einer Firma verwendet. Wozu? Man kann ja gleich SAP nehmen.


Wer programmieren lernt, tut dies am besten an kleinen Beispielaufgaben, und wenn diese auch noch einen echten Output liefern wie in dem Fall diese Bilder, und wenn man dann noch die Möglichkeit hat, selber noch etwas daran zu tunen, dann gibt das ein schönes Erfolgserlebnis.
Die Bildschirmausgabe "Herr Maier verdient 2000€" von so ner Personalverwaltungsklasse, die man geschrieben hat, kann man sich da eher sonst wo hin stecken.


Daß das Bild hier Pixel für Pixel verarbeitet wird, nimmt dieser Bilderklasse den Schrecken, man sieht, daß da keine Magie hintersteckt, außerdem geht es ja auch darum, anschließend diese Sache mit dem Verbessern zu implementieren. Klar, vielleicht gibts ne Library, die das von sich aus kann, aber daran lernt man nix, z.B. die Sache mit den 8 Bit.

Also: Es geht hier sowohl um den generellen Lerneffekt beim Programmieren (möglichst viel selber schreiben), sowie um die eigene Implementierung einer Funktion, die große Bibliotheken sicher schon drin haben.


Ich persönlich finde die Idee, ein Bild mal Pixel für Pixel selbst zu bearbeiten, sehr schön, weil am Ende auch was dabei raus kommt.
Und: Wer sich immer nur auf irgendwelche großen Libs verläßt, steht evtl mal ziemlich dumm da, wenn keine Lib die gewünschte Funktionalität hat.

Ich hatte mal das problem, daß ich ein Bild hatte, von dem ich zeilenweise wissen mußte, wieviele cyanfarbene Pixel darin hintereinander ab der 25. Pixelspalte vorkamen. Dabei durften die Pixelreihen zum Teil von einzelnen schwarzen Pixeln unterbrochen sein.
Die hier vorgestellte Library reicht völlig, um diese Aufgabe zu lösen.
 

Benutzer40590  (42)

Sehr bekannt hier
Der originale Wortlaut der Aufgabe lautet: "2. Finden Sie ein Verfahren, das mehrere Pixel des Originalbildes verwendet, um so die Bildqualität zu steigern. Am besten, Sie experimentieren dazu mit verschiedenen Formeln für die Berechnung der Farben der neuen Pixel."

Es geht ja hier gar nicht darum, eine supertoll funktionierende Bildbearbeitung zu schrieben, sonder darum das man sich Gedanken macht wo denn das Problem liegt (das steht ja schon fast in der Aufgabe drin) und wie man es umgehen/verbessern könnte (selbst da steht der Hinweis schon in der Aufgabe "formeln zur Farbberechnung - sie hat sie einfach kopiert), bzw um das Verständniss was man da überhaupt macht.
Die Implementierung an sich ist doch bei der Aufgabe eher die Nebensache. Das es da 1a Bibliotheken gibt, spielt doch für die Aufgabe gar keine Rolle.

In Mathematik beweist man auch Dinge die ganz logisch sind oder berechnet Kreise auf vollkommen bekloppten Weg nur um irgendwelche Grundprinzipien zu verdeutlichen. In Deutsch schreibt man die drölfmillionste Interpretation usw ...

Ich wette der nächste Schritt wird eine EInführung in die üblichen Interpolations Algorithmen ... UND die einfachere Möglichkeit soetwas einzubauen :zwinker:
 

Benutzer18029 

Verbringt hier viel Zeit
Off-Topic:
Ach Leute, was regt ihr euch nur alle (künstlich) so auf?
Ich reg mich ja gar nicht auf, und schon gar nicht künstlich. Ich finde es einfach nur unsinnig den Schülern so Programmierung beibringen zu wollen und bin echt froh, dass es bei uns nicht so ablief. Da haben wir ordentlich "von der Pike auf" Programmierung in Pascal gelernt und es blieb auch genug Zeit neben reinen Programmieraufgaben ein wenig "richtige" Informatik zu machen, z.B. Sortieralgorithmen (Bubblesort, Quicksort etc.) und Datenstrukturen (Stacks, Bäume etc.). Und das war auch nur ein Grundkurs mit sogar nur drei (und nicht wie hier offenbar vier) Stunden pro Woche. Kann aber auch am Lehrer gelegen haben, vielleicht war der einfach gut... In der 13.Klasse bekamen wir nen anderen Lehrer und sollten Delphi lernen, was wohl gerade neu in den Lehrplan reingeschrieben wurde. Mit der Konsequenz dass der Lehrer da selbst keine Ahnung von hatte und uns irgendwelche Internet-Tutorien ausgedruckt hat, mit denen wir selbst rumprobieren sollten. Das war mir dann eindeutig zu blöd und hab das Fach innerhalb der ersten zwei Wochen abgewählt.

Wer programmieren lernt, tut dies am besten an kleinen Beispielaufgaben
Bei denen er den Code aber auch vollständig verstehen sollte. :zwinker: Klar kann man dann nicht gleich "realistische" Sachen programmieren, aber das ist auch nicht der Sinn von Informatikunterricht an der Schule.
 

Benutzer89563 

Meistens hier zu finden
Hallo Dirac!

Zugegeben, der erste Beitrag in diesem Thema ist tatsächlich Müll, aber der zweite ist doch sonnenklar.
Daß der Unterricht hier anscheinend nicht so optimal ist, ist sicher ein Punkt. Ich hatte nie info, da ich, als wir es in der 9. wählen konnten, bereits Minesweeper selbst programmiert hatte.

Ich weiß nicht, ob es generell daran liegt, daß hier anscheinend niemand richtig alle Beiträge liest, sondern jeder einfach nur seinen Senf zum ersten Beitrag gibt. Da wird noch ewig rumgenölt, daß man besser die große XY-lib nimmt, dabei steht doch im zweiten Beitrag des TS ganz klar drin, was nun Sache ist.

Apropos, da du ja ein Kollege bist: Ich hatte mal ein Computerspiel namens Blackbox oder ähnlich, bei dem man ein 8x8 großes, verdecktes Spielfeld hatte. Man konnte zwei Kugeln beliebig waagerecht oder senkrecht in die Felder schießen, und konnte aus Austrittsposition und Laufzeit ermitteln, wo in der Blackbox z.B. Spiegel zum Umlenken oder Reflektieren positioniert waren.
Heutzutage hab ich was anderes zum Spielen, bei dem man etwas rein steckt, und sich dann wundern darf, was raus kommt. Nennt sich ROOT. Spielst du es auch?
 

Benutzer54399 

Planet-Liebe Berühmtheit
Da es jetzt eh ein wenig allgemeiner wird...

Ich finde die Idee ziemlich gut, dass man zur Bildverbesserung eine Standard-Bibliothek nimmt. Zumindest als eine Möglichkeit um die Bildqualität zu verbessern. Viel Ergebnis mit wenig Aufwand, da würde sich in der Berufswelt jeder Chef darüber freuen.
Natürlich ist damit die Aufgabe nicht 100% erfüllt (ich denke die Lösung mit dem "Durchschnittspixel" trifft es da ganz gut), aber es zeigt doch zumindest, dass sich der Schüler mit dem Thema beschäftigt und auch einen Schritt weiter denkt.

Was die Geschwindigkeit des Lehrers angeht: Da muss man schon schauen, dass das nur ein Informatikkurs auf einem Gymnasium ist. Dass da überhaupt Programmieren ein Thema ist finde ich schon gut. In meiner letzten Programmierklasse konnten einige nach 2,5 Jahre noch keine Schleife schreiben, ohne vorher nachlesen zu müssen... und das war eine Klasse voller Fachinformatiker. :zwinker:

Während meines (kurzen) Studiums haben wir ähnliche Dinge durchgenommen, wie sie Dirac erwähnt (Strukturen, Sortieralgos, etc.). Es ist sicherlich nicht schlecht solche Dinge zu kennen, finde sie für einen Programmierkurs aber unnötig.
 

Benutzer18029 

Verbringt hier viel Zeit
Was die Geschwindigkeit des Lehrers angeht: Da muss man schon schauen, dass das nur ein Informatikkurs auf einem Gymnasium ist. Dass da überhaupt Programmieren ein Thema ist finde ich schon gut. In meiner letzten Programmierklasse konnten einige nach 2,5 Jahre noch keine Schleife schreiben, ohne vorher nachlesen zu müssen... und das war eine Klasse voller Fachinformatiker. :zwinker:
Das soll ja wohl ein Witz sein. :eek:

Es ist sicherlich nicht schlecht solche Dinge zu kennen, finde sie für einen Programmierkurs aber unnötig.
Informatik ist aber nicht nur Programmieren. Wenn man das Schulfach schon "Informatik" nennt und nicht "Computerkurs" oder so dann gehören solche Themen eben dazu. :zwinker:

@solitarius: Nee, kenne ich nicht. Und was die "Kollegen" angeht: Also ich bin kein Informatiker, falls du das meinst. :zwinker:
 

Benutzer101250  (30)

Sorgt für Gesprächsstoff
Also, heuteist der Abgabetermin für das Programm. Ich hab im unterricht noch nen Freund gefragt, der das Problem lösen konnte und er hat mir gezeigt, wo der Fehler lag :zwinker:

Danke trotzdem allen :smile:
 
Oben
Heartbeat
Neue Beiträge
Anmelden
Registrieren