PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Farbwert-Interpolierung: Algorithmus gesucht


Metzler
2005-06-22, 18:10:50
Ahoi,

Folgende Fragestellung: Ich habe ein 2D Feld, auf dem ich beliebig 4 Punkte auswähle mit verschiedenen Farbwerten. Basierend auf diesen 4 Punkten will ich jetzt das ganze Feld füllen, ergo aus diesen 4 Farbwerten sämtliche anderen Farbwerte berechnen. Ich such jetzt einen geeigneten Algorithmus, ein Name würde schon helfen... Die Interpolation soll auf jeden Fall nicht linear sein.
Irgendwelche Tips?

Danke für Antworten

Metzler

aths
2005-06-22, 18:50:17
Wieso nicht linear?

Bei 4 Punkten würde ich bilinear interpolieren.

Metzler
2005-06-22, 19:16:34
Ich meinte pure Linearität, hab ich nicht genau genug gesagt. Hm, meinst du, bilineare Interpolation zum Glätten vorhandener Farbwerte herzunehmen? Ich bräuchte hauptsächlich was, um die restlichen, noch nicht vorhandenen Farbwerte zu erstellen. Ich hab mir zwar jetzt was auf dem Blatt überlegt, finde es aber doch etwas komplex...

micki
2005-06-22, 19:44:11
Ich meinte pure Linearität, hab ich nicht genau genug gesagt. Hm, meinst du, bilineare Interpolation zum Glätten vorhandener Farbwerte herzunehmen? Ich bräuchte hauptsächlich was, um die restlichen, noch nicht vorhandenen Farbwerte zu erstellen. Ich hab mir zwar jetzt was auf dem Blatt überlegt, finde es aber doch etwas komplex...
simples bilineares interpolieren ist was du suchst.

MFG
micki


ich hoffe das verlinken klappt,

http://www.forum-3dcenter.org/vbulletin/attachment.php?attachmentid=18792&stc=1

das linke wäre das resultat der interpolation.

Metzler
2005-06-22, 23:10:53
Hm, mir fehlt da die Vorstellung, wie ich bilineares Filtering auf mein Problem hin anwenden will. Nochmal konkret: Ich habe (als Beispiel) ein 100x100 Feld, in dem alle Punkte schwarz sind, außer 4 ausgesuchten Punkten. Meinetwegen [10,5],[60,25],[33,75] und [95,95]. Diese 4 Punkte haben Werte != 0. Und anhand dieser 4 Punkte will ich jetzt das ganze Feld mit Punkten füllen. Ich will da kein Bild resizen oder in einem Bild die Kanten weicher zeichnen. Ich habe ja auch keine Punkte direkt daneben, die sich zur Interpolation eignen würden, da diese 0 sind.

Danke für eine etwas konkretere Erklärung oder einen Link.

Coda
2005-06-22, 23:15:50
Auf gut deutsch: Du willst einen Farbverlauf zwischen diesen 4 Punkten?

Metzler
2005-06-22, 23:20:23
Ja, will ich, aber ich dachte, bilineares Filtering ist nur auf direkt nebeneinander liegende Punkte bezogen...
Egal, Danke schonmal, ich schaus mir morgen nochmal intensiver an...

aths
2005-06-23, 10:06:42
Hm, mir fehlt da die Vorstellung, wie ich bilineares Filtering auf mein Problem hin anwenden will. Nochmal konkret: Ich habe (als Beispiel) ein 100x100 Feld, in dem alle Punkte schwarz sind, außer 4 ausgesuchten Punkten. Meinetwegen [10,5],[60,25],[33,75] und [95,95]. Diese 4 Punkte haben Werte != 0. Und anhand dieser 4 Punkte will ich jetzt das ganze Feld mit Punkten füllen. Ich will da kein Bild resizen oder in einem Bild die Kanten weicher zeichnen. Ich habe ja auch keine Punkte direkt daneben, die sich zur Interpolation eignen würden, da diese 0 sind.

Danke für eine etwas konkretere Erklärung oder einen Link.Durchdenk dir das noch mal :) Fertige Lösungen anzuwenden bringt ja nur wenige neuen Erkenntnisse.

Sofern die vier Vektoren (Punkte) nicht sehr unglücklich angeordnet sind, kannst du daraus per bilinearer Filterung einen Farbverlauf erzeugen. Ggf. musst du allerdings Farbkanäle "clampen", also bei <0 und >1 abschneiden.

Du kannst das Problem zunächst als 1D-Problem betrachten, mit linearer Interpolation. Wenn dir die Herangehensweise dann klargeworden ist, erweitere das einfach um die Y-Achse auf ein 2D-Problem. Dazu musst du zusätzliche Stützwerte bei neuen Punkten berechnen. Die einzelnen RGB-Farbkanäle benötigst du auch in "HDR", also in einem Bereich <0 und >1. An besten du konvertierst die Byte-Werte von RGB in float, dann kannst du später noch einbauen, auch für sRGB korrekt zu rechnen. Am Ende schneidest du dann die Werte auf 0..1 ab, und konvertierst sie zurück ins Byte-Format.

ScottManDeath
2005-06-23, 13:05:19
Du könntest auch cheaten und mit OpenGL oder Direct3D ein Polygon zeichnen mit deinen Farben an den Eckpunkten und dann das Ergebnis zurücklesen. ;)

Da die GPU allerdings Dreiecke rendert, wirst Du wahrscheinlich die Diagonale des Rechtecks sehen, so wie in de Anhang von micki rechts oben. Das lässt sich auch umgehen durch entsprechendes Verwenden von Texturen und homogenen Texturkoordinaten. Dazu gabs von NVIDIA mal ein Whitepaper. Dann hast Du auch den Effekt von mickis Anhang ganz links =)

Xmas
2005-06-23, 17:54:45
Ahoi,

Folgende Fragestellung: Ich habe ein 2D Feld, auf dem ich beliebig 4 Punkte auswähle mit verschiedenen Farbwerten. Basierend auf diesen 4 Punkten will ich jetzt das ganze Feld füllen, ergo aus diesen 4 Farbwerten sämtliche anderen Farbwerte berechnen. Ich such jetzt einen geeigneten Algorithmus, ein Name würde schon helfen... Die Interpolation soll auf jeden Fall nicht linear sein.
Irgendwelche Tips?

Danke für Antworten

Metzler
Also prinzipiell kannst du dafür furchtbar viele Algorithmen verwenden, die Frage ist, wie das Ergebnis denn aussehen soll? Du hast ja ein Viereck vorgegeben. Ich nehme an, es sollen auch Farbwerte außerhalb dieses Vierecks erzeugt werden. Wäre es ein Dreieck, könntest du eine Ebene konstruieren die durch alle drei Punkte geht. Natürlich könntest du hier 4 Ebenen konstruieren und den Mittelwert verwenden.

Eine andere Möglichkeit wäre es, die vier Werte mit dem Inversen des Abstands zu den Punkten zu gewichten. Also wenn du die Punkte (Xi, Yi) mit Farbwert Ci vorgegeben hast, berechnest du den Abstand Di = sqrt((x - Xi)*(x - Xi) + (y - Yi)*(y - Yi)) vom aktuellen Punkt (x, y). Ist ein Di gleich 0, bekommt der Punkt gleich den Farbwert Ci. Sonst werden die Ci gewichtet mit dem Faktor Summe(1/D)/Di aufaddiert.

Metzler
2005-06-23, 22:41:46
Hi Xmas,

Erstmal Danke.
Frage zu deinem Algo: Soll man alle 1/Di aufsummieren oder was genau ist mit D gemeint?

Neomi
2005-06-23, 23:31:35
Frage zu deinem Algo: Soll man alle 1/Di aufsummieren oder was genau ist mit D gemeint?

D ist die Distanz zu einem Punkt, Di die Summe aller Gewichtungen. Sofern D1 bis D4 alle ungleich Null sind, gilt quasi das hier:

V = (V1/D1 + V2/D2 + V3/D3 + V4/D4) / (1/D1 + 1/D2 + 1/D3 + 1/D4)

Metzler
2005-06-23, 23:55:57
Ok, Danke, funktioniert sehr gut!

Xmas
2005-06-25, 01:27:27
V = (V1/D1 + V2/D2 + V3/D3 + V4/D4) / (1/D1 + 1/D2 + 1/D3 + 1/D4)
Sieht irgendwie eleganter aus als meine Beschreibung. ;)
Übrigens wirkt es IMO besser, wenn man statt der Distanzen die quadrierten Distanzen nimmt, also die Wurzel weglässt. Dann sind die Spitzen an den vorgegebenen Punkten nicht ganz so steil.

Metzler
2005-06-26, 00:35:36
Jup, sieht besser aus. Danke für den Tip :)