WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Werte aus Kurve auslesen und in Formel berechnen

 

Nowak89
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2015, 09:24     Titel: Werte aus Kurve auslesen und in Formel berechnen
  Antworten mit Zitat      
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.

Wie sieht hier das Vorgehen aus?

Vielen Dank!
Grüße
Marc
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.10.2015, 13:25     Titel: Re: Werte aus Kurve auslesen und in Formel berechnen
  Antworten mit Zitat      
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?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2015, 08:10     Titel:
  Antworten mit Zitat      
Hallo,

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.

Nun möchte ich den Radius bestimmen
Code:
r=sqrt(i.^2+j.^2)
,
aus meiner interpolierten Kennlinie den Faktor auslesen und diesen auf mein Bild berechnen mit
Code:
ZielBild (i,j,:) = EingabeBild(i,j,:)*Faktor


Hoffe, jetzt ist es verständlicher.
Grüße
Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2015, 11:02     Titel:
  Antworten mit Zitat      
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....
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.10.2015, 10:26     Titel:
  Antworten mit Zitat      
Hallo Nowak89,

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?

Code:
siz = size(EingabeBild);
center = (siz(1:2) + 1) / 2;
x_vec = (1:siz(1)) - center(1);
y_vec = (1:siz(2)).' - center(2);
mask = sqrt(bsxfun(@plus, x_vec .^2, y_vec .^2));

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:
Code:
ZielBild = EingabeBild .* cat(3, factor, factor, factor);


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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2015, 11:24     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine Antwort.

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?

Ja, ist ok!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.10.2015, 13:28     Titel:
  Antworten mit Zitat      
Hallo Nowak89,

Code:
x=[1;2;3;4;5]
y=[1;4;9;16;25]

Genau das war notwendig. Um hier den Wert für x=2.5 zu bekommen und Du linear interpolieren möchtest (das hast Du noch nicht geklärt!):
Code:
yi = interp1(x, y, 2.5);

(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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2015, 14:40     Titel:
  Antworten mit Zitat      
Hallo,

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.

Code:
img=imread('image.jpg');
img=im2double(img);  
figure, imshow(img);    
[rows,columns,chan] = size(img);
[j,i] = meshgrid(1:columns, 1:rows);    

mx=columns/2;                          
my=rows/2;
Vx=[0
    0.2500 0.5000 0.7500 1.0000 1.2500 1.5000
    1.7500 2.0000 2.2500 2.5000 2.7500 3.0000];
Vy=[1.0000 0.9700 0.9200 0.8750 0.8300 0.7950
    0.7500 0.4950 0.6450 0.5900 0.5450 0.5000 0.455];

imgOut=zeros(rows, columns, chan);

for chan=1:3
for i=1:rows
    for j=1:columns
        x=(j-mx);                            
        y=(i-my);
        r=sqrt(x.^2+y.^2)*0.0055;
        factor = interp1(Vx, Vy,r,'linear', 'extrap');
       
       imgOut(i,j,chan) = img(i,j,chan)*factor;
    end
end

end

figure, imshow(trgImg);
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.10.2015, 15:32     Titel:
  Antworten mit Zitat      
Hallo Nowak89,

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:
Code:
img = imread('image.jpg');
img = im2double(img);  
[rows,columns,chan] = size(img);

mx=columns/2;                          
my=rows/2;
Vx=[0
    0.2500 0.5000 0.7500 1.0000 1.2500 1.5000
    1.7500 2.0000 2.2500 2.5000 2.7500 3.0000];
Vy=[1.0000 0.9700 0.9200 0.8750 0.8300 0.7950
    0.7500 0.4950 0.6450 0.5900 0.5450 0.5000 0.455];

x_vec = (1:siz(1)) - mx;
y_vec = (1:siz(2)).' - my;
mask = sqrt(bsxfun(@plus, x_vec .^2, y_vec .^2)) * 0.0055;
factor = interp1(Vx, Vy, mask, 'linear', 0.455);  % Extrapolation

imgOut = img .* cat(3, factor, factor, factor);

Ich kann es zur Zeit nicht testen. Vielleicht benötigt man ein reshape(factor, rows, solumns) .

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2015, 08:35     Titel:
  Antworten mit Zitat      
Hallo Jan,

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.

Error in Untitled (line 20)
imgOut = img .* cat(3, factor, factor, factor);


Ich bin mir nicht so ganz im Klaren, was es genau mit diesem Teil auf sich hat?!?!
Code:
x_vec = (1:siz(1)) - mx;
y_vec = (1:siz(2)).' - my;


Was ist der Vorteil der ersten gegenüber der zweiten Berechnungsvorschrift?
Code:
mask = sqrt(bsxfun(@plus, x_vec .^2, y_vec .^2)) * 0.0055;

        x=(j-mx);                            
        y=(i-my);
        r=sqrt(x.^2+y.^2)*0.0055;
 


Dankeschön!
Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.10.2015, 09:05     Titel:
  Antworten mit Zitat      
Hallo Nowak89,

Zitat:
es funktioniert leider nicht. Es wird ein Graubild ausgegeben (jedoch 3-Kanal) und es ist keine Abdunklung zum Rand hin zu erkennen.

Das ist sehr merkwürdig: Wenn der Code mit einem Fehler stoppt, wie kann dann ein Bild ausgegeben werden?

Zitat:
Bei deinem Code gibt es Dimensionsprobleme beim cat Befehl.
Zitat:
Error using .*
Array dimensions must match for binary array op.

Error in Untitled (line 20)
imgOut = img .* cat(3, factor, factor, factor);

Ich hatte ja geschrieben:
Zitat:
Vielleicht benötigt man ein reshape(factor, rows, solumns)

Hast Du das mal versucht?

Zitat:
Ich bin mir nicht so ganz im Klaren, was es genau mit diesem Teil auf sich hat?!?!
Code:
x_vec = (1:siz(1)) - mx;
y_vec = (1:siz(2)).' - my;
mask = sqrt(bsxfun(@plus, x_vec .^2, y_vec .^2)) * 0.0055;

Es wird das gleiche berechnet wie in Deiner Schleife, nur kompakter und effizienter: Vektorisiert. Im Allgemeinen ist das schneller.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nowak89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 25.09.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2015, 13:46     Titel:
  Antworten mit Zitat      
auch der reshape Befehl brachte keinen Erfolg.... Sad

Code:
clear all;
close all;
img = imread('image.jpg');
img = im2double(img);  
[rows,columns,chan] = size(img);

mx=columns/2;                          
my=rows/2;
Vx=[0;
    0.2500; 0.5000; 0.7500; 1.0000; 1.2500; 1.5000;
    1.7500; 2.0000; 2.2500; 2.5000; 2.7500; 3.0000];
Vy=[1.0000; 0.9700; 0.9200; 0.8750; 0.8300; 0.7950;
    0.7500; 0.4950; 0.6450; 0.5900; 0.5450; 0.5000; 0.455];

x_vec = (1:size(1)) - mx;
y_vec = (1:size(2)).' - my;
mask = sqrt(bsxfun(@plus, x_vec .^2, y_vec .^2)) * 0.0055;

factor = interp1(Vx, Vy, mask, 'linear', 0.455);  % Extrapolation
imgOut = reshape(factor, rows, columns);
imgOut = img .* cat(3, factor, factor, factor);

figure, imshow(imgOut);
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.11.2015, 14:49     Titel:
  Antworten mit Zitat      
Hallo Nowak89,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.