Verfasst am: 20.10.2015, 09:24
Titel: Werte aus Kurve auslesen und in Formel berechnen
Hallo,
ich habe folgendes vor. Ich habe ein Bild und möchte die Helligkeit abhängig vom Radius zum Mittelpunkt verändern. Dabei habe ich eine Kurve von Punkten, abhängig vom Radius. Ich möchte nun für jeden Pixelwert (abhängig zum Mittelpunkt des Bildes) auf die Kurve zugreifen, den Wert auslesen und mit dem Pixelwert verrechnen.
Beispiel: Pixel mit dem Radius 3.5 zum Mittelpunkt, meine Kurve liefert mir die Werte von r(3)=0.9 und r(4)=0.8. Es soll demnach Interpoliert werden, sodass der wert r(3.5)=0.85 ermittelt wird. diesen Wert will ich dann mit dem Pixelwert multiplizieren.
Verfasst am: 20.10.2015, 13:25
Titel: Re: Werte aus Kurve auslesen und in Formel berechnen
Hallo Nowak89,
Ich verstehe die Frage noch nicht ganz.
Was sind die Inputs, die Du zur Verfügung hast?
"Ich habe ein Bild" sagt mir noch nicht viel. Was genau beduetet "Helligkeit"? Ist es ein Array im HSV-Format?
Zitat:
Beispiel: Pixel mit dem Radius 3.5 zum Mittelpunkt, meine Kurve liefert mir die Werte von r(3)=0.9 und r(4)=0.8. Es soll demnach Interpoliert werden, sodass der wert r(3.5)=0.85 ermittelt wird. diesen Wert will ich dann mit dem Pixelwert multiplizieren.
Was ist "der Pixelwert"? Hast Du die Interpolation schon hinbekommen? Wenn nicht, was hast Du probiert?
entschuldige bitte, ich glaube ich habe es etwas verwirrend geschrieben. Es soll eine Art Randlichtabfall entstehen.
Ich habe ein RGB Bild, das ich als Matrix einlese. Zusätzlich habe ich eine Kurve, die mir den Helligkeitsabfall abhängig vom Radius gibt (z.B. linearer Abfall von der Bildmitte nach außen, wobei die Bildmitte gleich bleibt (Intensität I=1 =>100%) und zum Rand hin immer dunkler wird (I=0.7 => 70%, das Bild hier also 30% dunkler ist als vorher).
Da meine Helligkeitsabfall-Kennlinie nur 10 Stützstellen hat, muss ich diese interpolieren, dass ich auf jeden beliebigen Wert zugreifen kann.
Kann mir niemand helfen?
Ich denke, dass es irgendwie möglich ist, nur habe ich noch keinen Ansatz gefunden, einen zuvor berechneten Wert in einer Matrix zu interpolieren und diesen weiter zu verwenden....
In welcher Form hast Du "die Kurve" gegeben? Du wirst irgendwelche Y-Werte haben, aber gehen die X-Werte in Pixeln oder von 0 bis 1, oder wie? Möchtest Du die 10 Punkte linear interpolieren, oder kubisch oder wie sonst? Wenn Du diese Details angibst, ist es leichter konkreten Code zu posten, der ohne eventuell falsche und verwirrende Annahmen auskommt.
Was soll geschehen, wenn das Eingabe-Bild eine gerade Anzahl von Pixeln in X- oder Y-Richtung aufweist? Wenn die Helligkeit dann von Zentrum her abnimmt, hast Du eventuell nirgendwo volle 100.0%, sondern in den mittleren 4 Pixeln einen Tick weniger. Ist das okay?
Nun enthält "mask" für jedes Pixel den Radius als Wert.
Jenachdem, wie die "Kurve" nun vorgegeben ist, kann man nun einfach
interp1
anwenden, um für jeden Radius-Wert den entsprechenden Helligkeitswert zu erhalten, und zwar als 2D Matrix "factor". Dann:
Der Code für die eigentliche Interpolation benötigt wohl auch nur 1 bis 3 Zeilen, aber das lässt sich genauer sagen, wenn Du die Details nochmal präzise postest.
Vielleicht einmal unabhängig von meinem Vorhaben. Das Problem liegt in der Interpolation und den Zugriff auf den jeweiligen Wert.
Ich habe die Werte der Funktionskurve als Vektoren gegeben (Bsp: x=[1;2;3;4;5], y=[1;4;9;16;25]).
Nun rechne ich meinen Radius aus und erhalte z.B. x=2,5. Wenn ich dann linear interpoliere müsste ich den Wert y=6,5 bekommen. Anschließend möchte ich mit y=6,5 weiterrechnen.
Ein weiteres Problem ist, dass ich auch Werte außerhalb dieses Bereichs benötige, z.B. x=-1 oder x=6, was man durch Extrapolation lösen könnte?!?!
Zitat:
In welcher Form hast Du "die Kurve" gegeben? Du wirst irgendwelche Y-Werte haben, aber gehen die X-Werte in Pixeln oder von 0 bis 1, oder wie?
Die x-Werte stellen den Radius dar. Abhängig von ihm sollen der y-Werte bestimmt werden.
Zitat:
Was soll geschehen, wenn das Eingabe-Bild eine gerade Anzahl von Pixeln in X- oder Y-Richtung aufweist? Wenn die Helligkeit dann von Zentrum her abnimmt, hast Du eventuell nirgendwo volle 100.0%, sondern in den mittleren 4 Pixeln einen Tick weniger. Ist das okay?
(Das ist eigentlich in der Dokumentation gut erklärt.)
Sind diese gezeigten Werte nun echte Werte, oder ist das nur ein fingiertes Beispiel?
Zitat:
Die x-Werte stellen den Radius dar.
Sie gehen also von einschließlich 0 bis zur maximal möglichen Anzahl von Pixeln oder ist das sklaiert auf 0.0 bis 1.0?
Du brauchst nun auch Extrapolation - aber wie soll extrapoliert werden? Soll der Wert des nächstgelegenen Punktes verwendet werden, oder möchtest Du ein Polynom durch die Punkte legen, dass sich dann nach außen erweitern lässt? Letzteres wäre von typischen Überschwingern betroffen, würde sich also schnell sehr hoch aufschaukeln.
Bitte kläre also noch die Details:
* Welche Methode möchtest Du zur Interpolation anwenden?
* Welche Methode brauchst Du für die Extrapolation?
* Wie sehen die realen Daten aus, die die Kurve definieren. Wenn die Kurve tatsächlich nur von x=1 bis 5 geht, gibt das nur einen winzigen Klecks in der Bild-Mitte.
Lasse Dich nicht verunsichern von meinen Nachfragen: Es ist ein typischer Effekt, dass einem noch nicht alle Details klar sind, wenn man etwas fragt. Das liegt in der Natur der Dinge und es ist kein Grund sich zu entschuldigen! Das hier ist ja ein Forum, um Matlab-Probleme zu klären. Und dazu gehört es heraus zu finden, was eigentlich das Problem ist.
das sind nicht die echten Werte. Die echten Werte sind X=[0 ...2.5], y=[1 ...0.5]. D.h. in der Bildmitte kaum bis gar keine Wertänderung (y=1), zum Rand hin ca 50% Helligkeitsabfall (y=0.5). X ist in mm, d.h. ich muss mit meiner Pixelgröße den Radius in mm umrechnen (r=r*0.0055).
Zitat:
Sie gehen also von einschließlich 0 bis zur maximal möglichen Anzahl von Pixeln oder ist das sklaiert auf 0.0 bis 1.0?
Skaliert, da ich das Bild von uin8 in double umwandle.
Zitat:
Du brauchst nun auch Extrapolation - aber wie soll extrapoliert werden? Soll der Wert des nächstgelegenen Punktes verwendet werden, oder möchtest Du ein Polynom durch die Punkte legen, dass sich dann nach außen erweitern lässt? Letzteres wäre von typischen Überschwingern betroffen, würde sich also schnell sehr hoch aufschaukeln.
Für die Extrapolation soll der Wert der am nächsten liegt, verwendet werden.
Interpolation: linear
Fehlen noch weitere Angaben?
Vielen Dank schon mal für die Unterstützung!
Gruß
Marc
Edit: Hier mal mein Code, vielleicht ist es so geschickter.
So weit ich sehe, läuft der Code, oder?
Wenn der letzte bekannte Punlt bei der Interpolation verwendet werden soll, wäre "0.455" besser als "extrap" als Argument für
interp1
.
Der
meshgrid
Befehl ist überflüssig.
Mein Code-Vorschlag macht das gleiche, nur ohne Schleifen:
es funktioniert leider nicht. Es wird ein Graubild ausgegeben (jedoch 3-Kanal) und es ist keine Abdunklung zum Rand hin zu erkennen.
Bei deinem Code gibt es Dimensionsprobleme beim cat Befehl.
Zitat:
Error using .*
Array dimensions must match for binary array op.
Wenn Du eine Fehlermeldung bekommst, poste sie im Forum.
Es ist leichter Fehler zu verbessern, als zu erraten, welche Fehler auftreten.
Den Code einfach bei mir laufen zu lassen, ist auch nicht unbedingt hilfreich, denn ich kann nicht erraten, ob Dein "image.jpg" z.B. ein Graustufen-Bild ist (also 2D) oder ein RGB-Bild (3D).
Es geht ja nur um eine einzelne Multiplikation. Vielleicht bekommst Du dies auch selbst heraus.
Gruß, Jan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.