Blatt05 Median Cut Algorithmus Verständnis

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Blatt05 Median Cut Algorithmus Verständnis
Ich habe eine Frage bezüglich der Vorgehensweise im Algorithmus bei der Matrix

Man hat die Matrix(Array)
155,21,105 55,122,228 26,237,155
173,166,73 87,46,129 106,69,192
nach funktionen und meinem Verständniss ist der Index hier 1 also Green und die Werte dazu sind min:21 max 237
daher ergeben sich für mich die Punkte 0,0 und 0,2 jetzt unterteile ich den Bereich in Ber1: 0,0 und Ber2: 0,1 bis 0,2
(und führe weiter rekursiv aus(aber hier für mich nicht mehr wichtig, da die Bereiche ja nur noch kleiner werden))
Der Test sagt aber dass mit der Zelle bei 1,2 etwas gemacht werden muss, daher wo ist mein Denkfehler bzw. was verstehe ich falsch.
Was mich sehr verwirrt ist, dass die Zelle 0,0 und die Zelle 1,2 gleich werden

Laut test wird das nämlich zu:

130,45,178 40,180,190 40,180,190
173,166,73 87,46,129 130,45,178

ich verstehe also nicht wie man den Bereich 0,0 und 1,2 bekommt


Meine Funktion bringt im Moment nämlich folgendes Ergebnis:
Der Aufruf median_cut
(array([[[155, 21, 163],
[ 53, 122, 224],
[ 26, 237, 155]],

   [[173, 166,  73],
    [ 87,  46, 129],
    [106,  69, 192]]]),
  1. liefert das Ergebnis
    array([[[155, 21, 163],
    [ 40, 180, 190],
    [ 40, 180, 190]],

    [[173, 166, 73],
    [ 96, 58, 160],
    [ 96, 58, 160]]], dtype=uint8), richtig wäre aber
    array([[[130, 45, 178],
    [ 40, 180, 190],
    [ 40, 180, 190]],

    [[173, 166, 73],
    [ 87, 46, 129],
    [130, 45, 178]]]).


dem output nach sieht es aus als hättest du dasselbe problem wie jemand in meiner rechnerübung gestern.
verwendest du in deiner [m]recursive_median_cut(…)[/m] zufällig [m]round(…)[/m]? wenn ja, dann rundest du bei zahlen gegenfalls auf. in der aufgabe steht jedoch, dass du abrunden sollst.


Also nach meinem Verständnis runde ich ab. Ich benutze kein Round sondern:
int((length/2)+x1)
wobei length die länge des entsprechenden Bereichs ist und x0 der start wert
So komme ich für den Bereich 0,1 auf 0 da 1/2=0,5 und da int einfach beim , abschneidet =>0 und darauf hin wird mit +0 nichts hinzugefügt => median ist 0 und meine 2 neuen bereiche sind 0,0 und 0,1
und falls ich 0,2 bis 0,4 hätte wäre es 2/2=1 und dann 2+1=3, was nach meinem wissen genau das Ergebnis sein sollte

Edit:
Ich verstehe bei diesem Testfall nicht wie man die Zellen 0,0 und 2,1 zusammen in einem Bereich bekommt? Diese Logik erschließt sich mir noch nicht, wie ich die obere linke Ecke und die untere Rechte Ecke zusammen in einen Bereich kriege, wenn ich immer in der Mitte teile.


ich verstehe deine formulierung nicht. ich hoffe ich kann dir mit rechenschritten auf die sprünge helfen. die fett formatierten stellen sind die begründung wie man auf die zellen 0,0 und 2,1 kommen sollte.

wir starten mit diesen pixels:

[(155,  21, 163, 0, 0), 
 ( 53, 122, 224, 1, 0),
 ( 26, 237, 155, 2, 0),
 (173, 166,  73, 0, 1),
 ( 87,  46, 129, 1, 1),
 (106,  69, 192, 2, 1)]

(tupel-belegung wie auf dem aufgaben-blatt [m](R, G, B, X, Y)[/m] )

1. recursive_median_cut(mit N=2):
…teilen anhand der längsten kante:

linke seite:  [(155,  21, 163, 0, 0), ( 87,  46, 129, 1, 1), (106,  69, 192, 2, 1)]
rechte seite: [( 53, 122, 224, 1, 0), (173, 166,  73, 0, 1), ( 26, 237, 155, 2, 0)]

2a. recursive_median_cut(mit N=1):
…linke seite: wir teilen anhand der längsten kante*):

linke seite links:  [(87, 46, 129, 1, 1)]

(87, 46, 129, 1, 1) bleibt dir erhalten bei color_average()

linke seite rechts: [(155, 21, 163, 0, 0), (106, 69, 192, 2, 1)]

color_average(): (155 + 106) / 2 = 130.5, (21 + 69) / 2 = 45, (163 + 192) /2 = 177.5

und der vollständigkeitshalber…
2b. recursive_median_cut(mit N=1):
…rechte seite: wir teilen anhand der längsten kante:

rechte seite links:  [(173, 166, 73, 0, 1)]
rechte seite rechts: [(26, 237, 155, 2, 0), (53, 122, 224, 1, 0)]

*: je nachdem ob man die bounding box nur für die split-RGB-kante oder für alle RGB-kanten neu berechnet: 1 bzw 0

also letztendlich bleibt pixel [m](87, 46, 129, 1, 1)[/m] so wie er ist, weil er in einer ein-elementigen liste verbleibt und somit der color_average() innerhalb dieser pixels-liste sein eigener farbwert verbleibt. andererseits hast du für zelle 2,1 die beiden pixel [m](155, 21, 163, 0, 0)[/m] und [m](106, 69, 192, 2, 1)[/m], mit denen sich dir die entsprechende color_average() werte ergeben.

1 „Gefällt mir“

Danke ich habe meinen Fehler gefunden, Ich habe die Aufgabenstellung falsch/missverstanden und habe die Tupel nicht sortiert, sondern einfach innerhalb der Matrix geteilt.