Verwirrspiel Intervallmapping
Verfasst: 06.08.2018, 19:32
Intervallmapping ist ja eigentlich einfach. Will man (p0, p1)->(q0, q1) abbilden, geht das mittels: q = (p-p0)/(p1-p0) * (q1-q0) + q0. (Im ersten Schritt wird die Zahl auf den Bereich 0..1 normiert und dann auf den neuen Bereich abgebildet). Diese Abbildung erfüllt alle Erwartungen, Endpunkte werden auf Endpunkte abgebildet, ein Wert der im ersten Intervall genau in der Mitte liegt, lieg nach Abbildung auch im zweiten Intervall genau in der Mitte und so weiter.
Sagen wir, ich möchte jetzt ein Bild der Größe 128^2 auf 256^2 skalieren. Intuitiv würde man sagen, dass im Ursprungsbild die Pixel eine Distanz von genau einem Pixel haben (trivial), und im zweiten Bild jeder ursrüngliche Pixel irgendwie auf 2 Pixel erweitert werden muss, sprich der Abstand ist jetzt 2. Jetzt kann man sich überlegen, wie man die Pixel nummerieren möchte. (0..127)->(0..255) oder (1..128)->(1..256). Zur Veranschaulichung sagen wir jetzt aber, wir wollen die Größe von 4 auf 8 skalieren. Wir bekommen nach obiger Formel:
[0..3]->[0..7]: [0, 1, 2, 3]->[0, 2.33, 4.67, 7]
[1..4]->[1..8]: [1, 2, 3, 4]->[1, 3.33, 5.67, 8]
Autsch, das ist hässlicher als erwartet. Das neue Intervall ist doppelt so groß wie das alte, im alten war der Abstand der Zahlen genau 1, aber im neuen ist der Abstand der Zahlen alles andere als genau 2. Man würde vielleicht erwarten, wenn das Intervall verdoppelt wird, muss man einfach nur alle Zahlen mit 2 multiplizieren. Man möchte also:
[1..4]->[1..8]: [1, 2, 3, 4]->[2, 4, 6, 8]
Wie kommt man auf dieses 'schöne' Ergebnis? Indem man die Intervallgrenzen auf (0..4)->(0..8) setzt und insgesamt 5 Zahlen im Intervall hat:
[0..4]->[0..8]: [0 1 2 3 4]->[0 2 4 6 8]
Hat man trotzdem nur 4 Werte, kann man von den 5 Zahlen entweder die erste oder die letzte weglassen und kommt damit auf (0..3) oder (1..4).
Es scheint, wir haben eine Lösung gefunden und alles sieht schön aus. Aber leider haben wir ein neues Problem. Nehmen wir mal das Beispiel Farbkodierung. Wir haben eine 8bit Zahl zwischen 0 und 255 (die Farben zwischen schwarz und weiß darstellt) und wollen diese auf das Intervall 0..1 mappen. Gemäß der obigen Definition müsste unser Intervall aber von 0 bis 256 gehen, demnach dürfte der Wert 255 nicht auf 1 gemappt werden, sondern vielmehr auf ~0.996. Wir können also auf einmal gar kein weißes Weiß mehr darstellen, das passt einfach nicht in unsere 8bit Zahl.
Es erscheint, dass es keine wirkliche Lösung gibt. Im Grunde genommen gab es auch niemals ein wirkliches Problem, es ist alles eine Frage, wie man Intervalle definiert und was Grenzen bedeuten sollen. Aber ich überlege gerade, was eine schöne Lösung ist, eine die im Alltag Spaß macht. Was sind eure Gedanken dazu?
Sagen wir, ich möchte jetzt ein Bild der Größe 128^2 auf 256^2 skalieren. Intuitiv würde man sagen, dass im Ursprungsbild die Pixel eine Distanz von genau einem Pixel haben (trivial), und im zweiten Bild jeder ursrüngliche Pixel irgendwie auf 2 Pixel erweitert werden muss, sprich der Abstand ist jetzt 2. Jetzt kann man sich überlegen, wie man die Pixel nummerieren möchte. (0..127)->(0..255) oder (1..128)->(1..256). Zur Veranschaulichung sagen wir jetzt aber, wir wollen die Größe von 4 auf 8 skalieren. Wir bekommen nach obiger Formel:
[0..3]->[0..7]: [0, 1, 2, 3]->[0, 2.33, 4.67, 7]
[1..4]->[1..8]: [1, 2, 3, 4]->[1, 3.33, 5.67, 8]
Autsch, das ist hässlicher als erwartet. Das neue Intervall ist doppelt so groß wie das alte, im alten war der Abstand der Zahlen genau 1, aber im neuen ist der Abstand der Zahlen alles andere als genau 2. Man würde vielleicht erwarten, wenn das Intervall verdoppelt wird, muss man einfach nur alle Zahlen mit 2 multiplizieren. Man möchte also:
[1..4]->[1..8]: [1, 2, 3, 4]->[2, 4, 6, 8]
Wie kommt man auf dieses 'schöne' Ergebnis? Indem man die Intervallgrenzen auf (0..4)->(0..8) setzt und insgesamt 5 Zahlen im Intervall hat:
[0..4]->[0..8]: [0 1 2 3 4]->[0 2 4 6 8]
Hat man trotzdem nur 4 Werte, kann man von den 5 Zahlen entweder die erste oder die letzte weglassen und kommt damit auf (0..3) oder (1..4).
Es scheint, wir haben eine Lösung gefunden und alles sieht schön aus. Aber leider haben wir ein neues Problem. Nehmen wir mal das Beispiel Farbkodierung. Wir haben eine 8bit Zahl zwischen 0 und 255 (die Farben zwischen schwarz und weiß darstellt) und wollen diese auf das Intervall 0..1 mappen. Gemäß der obigen Definition müsste unser Intervall aber von 0 bis 256 gehen, demnach dürfte der Wert 255 nicht auf 1 gemappt werden, sondern vielmehr auf ~0.996. Wir können also auf einmal gar kein weißes Weiß mehr darstellen, das passt einfach nicht in unsere 8bit Zahl.
Es erscheint, dass es keine wirkliche Lösung gibt. Im Grunde genommen gab es auch niemals ein wirkliches Problem, es ist alles eine Frage, wie man Intervalle definiert und was Grenzen bedeuten sollen. Aber ich überlege gerade, was eine schöne Lösung ist, eine die im Alltag Spaß macht. Was sind eure Gedanken dazu?