Java-Code erklärung?

4 Antworten

Ich erkläre es mal für den eindimensionalen Fall:

Es sind n in einer Zeile angeordnete Werte gegeben:

[x₀,x₁, x₂, x₃, ..., x_(n-1)] 

Weichzeichnen bedeutet hier den Mittelwert der Nachbarn zu nehmen:

[0, (x₀ + x₂)/2, (x₁ + x₃)/2, ..., (x_(n-3) + x_(n-1))/2, 0]

Weil es für den ersten und letzten Wert keine Nachbarn gibt, wird bei den Schleifen im Progamm auch jeweils mit x,y = 1 begonnen und bereits bei _hoehe - 1, _breite - 1 ausgeschlossen aufgehört. Also die Werte an den Stellen 0 und n - 1 bleiben 0.

Weil man für die Berechnung von (x₁ + x₃)/2 für x₁ nicht das neue x₁' = (x₀ + x₂)/2, welches man gerade berechnet hat, sondern eben das alte verwenden will, wird das gesamte Bild kopiert, sodass für die Berechnung der neuen Werte die alten Werte zur Verfügung bleiben. Erst wenn die Berechnungen zu Ende sind, aktualisiert man die Variable von dem alten Bild.

In dem zweidimensionalen Fall wird der Mittelwert über die acht Nachbarpixel genommen.


Mathematik2000 
Fragesteller
 18.12.2022, 19:08

Warum 8?

0
Mathmaninoff, UserMod Light  18.12.2022, 19:15
@Mathematik2000

Das wurde in dem Programm eben so gemacht. Ich hätte den Durchschnitt über die acht Nachbarn und das Pixel selber genommen und nicht nur den Durchschnitt über die acht Nachbarn. Warum das so gewählt wurde ist mir auch nicht klar. Beim Weichzeichnen gibt es viele verschiedene Möglichkeiten gewichtete Durchschnitte zu bilden. Statt nur den direkten Nachbarn kann man die Pixel, die noch eins weiter weg sind, auch einbeziehen. Man kann auch die Werte, die näher dran, sind stärker gewichten, wie beim Gaußschen Weichzeichner.

In dem vorliegenden Code kommt der Summand _bilddaten[y][x] selber nicht vor und es wird durch 8 geteilt.

1
Mathematik2000 
Fragesteller
 20.12.2022, 10:21

Warum beendet mit 0? warum x2+x3 und nicht x1+x2?

[0, (x₀ + x₂)/2, (x₁ + x₃)/2, ..., (x_(n-3) + x_(n-1))/2, 0]

0
Mathmaninoff, UserMod Light  20.12.2022, 11:18
@Mathematik2000
warum x2+x3 und nicht x1+x2?

"x₂ + x₃" kommt weder in der Frage noch in meiner Antwort vor.

Warum beendet mit 0?

Ganz links würde (x_(-1) + x_1)/2 und ganz rechts (x_(n-2) + x_n)/2 stehen, aber x_(-1) und x_n sind außerhalb des Arrays. Darum fängt man nicht bei 0 an, sondern bei 1 und hört auch 1 vorher auf, damit der linke und rechte Nachbar auch noch im Array drinnen sind. Wenn man den ersten und letzten Eintrag überspringt, bleibt da die 0. Alternativ könnte man auch das neue Array auf jeder Seite um 1 verkleinern, sodass die Nullen wegfallen.

In deiner neueren Frage wurde das Problem gelöst, indem man überprüft, welche Nachbarn innerhalb des Arrays liegen und dementsprechend wird der Durchschnitt nur über diese gebildet.

0
Mathmaninoff, UserMod Light  20.12.2022, 11:46
@Mathematik2000

So wie ich bereits sagte, in dem Programm wird der Durchschnitt über die acht Nachbarn genommen. Warum das Pixel in der Mitte selber nicht dazu gezählt wird, ist mir auch nicht klar. Im eindimensionalen Fall hat man zwei Nachbarn.

So könnte man auch weichzeichnen: [x₀ + x₁, x₁ + x₂, ..., x_(n-2) - x_(n-1)] / 2
Dabei wird das Array um 1 kleiner. Der Programmierer hat aber eben nicht diese Möglichkeit gewählt. Die Wahl finde ich auch unlogisch.

0

Hallo Mathematik2000,

dieser Code enthält eine Methode mit dem Namen "weichzeichen".
Diese nimmt keine Argumente entgegen und gibt auch keinen Wert zurück, da der Rückgabetyp "void" ist.

Innerhalb der Methode werden zunächst zwei Variablen deklariert:
eine Ganzzahlvariable mit dem Namen "a" und ein zweidimensionales Array mit dem Namen "_kopie", das aus Kurzzeichenfolgen besteht.
Die Größe des Arrays "_kopie" wird anhand der Werte von "_hoehe" und "_breite" festgelegt.

Danach wird eine Schleife gestartet, die über alle y-Werte von 1 bis _hoehe-1 iteriert.
Innerhalb dieser Schleife wird eine weitere Schleife gestartet, die über alle x-Werte von 1 bis _breite-1 interiert.

Innerhalb der inneren Schleife wird der Wert von "a" berechnet, indem der Wert von "_bilddaten[y+1][x+1]" mit dem Wert von "_bilddaten[y-1][x-1]" usw. addiert wird und das Ergebnis durch 8 geteilt wird.
Der resultierende Wert von "a" wird dann in das Array "_kopie" an der Stelle [y][x] gespeichert.

Nachdem die innere Schleife beendet wurde, wird das Array "_bilddaten" mit dem Array "_kopie" überschrieben und die Methode "zeichneBild" aufgerufen.
Die Methode "weichzeichnen" wird anschließend beendet.

Grüße

Das sind 2 Schleifen über alle Bildpunkte, und darin wird für jeden Bildpunkt der Mittelwert aus den 8 benachbarten Punkten berechnet - und die Farbe des aktuellen Punktes dann auf diesen Wert gesetzt.


Mathematik2000 
Fragesteller
 18.12.2022, 19:04

warum int y=1 und nicht y=0? warum y < höhe-1? warum 8 benachbarten Punkte?

0

Das ist ein Bildfilter bzw Weichzeichner. Da gibt's extra Filterkerne für verschiedene möglich Effekte und der läuft dann über 2 D array bzw das bild und dann wird dieser Filter angewendet, auf die Bildpunkte. Das sind meistens 9 Elemente die so ein Filter hat.

Das sieht ungefähr so aus:

111

121

111

Nur als beispiel, der passt nicht zu deiner Aufgabe. Aber das ist quasi ein kleines array, was komplett über das Bild array drüber läuft und Änderungen vornimmt.


Mathematik2000 
Fragesteller
 18.12.2022, 19:05

Woher kommen diese Zahlen? was bedeutet einzelne Zahlen?

111

121

111

0