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

Schleife summiert falsch auf

 

donni24
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.17
Wohnort: München
Version: ---
     Beitrag Verfasst am: 21.06.2017, 21:44     Titel: Schleife summiert falsch auf
  Antworten mit Zitat      
Hallo liebe Forengemeinde,

ich habe folgendes Problem:
Ich bearbeite eine große Menge Bilder nach mit Matlab.
Und zwar habe ich rgb-Bilder, von deren Intensität aus ich die Dichte berechnen wollte und über alle Bilder die mittlere Dichte.
Die Zuweisung der Dichte ist mittels einer einfachen linearen Funktion y=mx+t erfolgt.
Um die mittlere Dichte nun zu berechnen, wollte ich nun jedes Bild umrechnen und aufaddieren und zum Schluss durch die Gesamtzahl der Bilder teilen.

Noch eine kleine Voranmerkung: Aufgrund der Menge der Bilder, ist mein Arbeitsspeicher immer vollgelaufen, deswegen habe ich das gesamte Video zerstückelt.

Meine Schleife sah nun so aus:
Code:

Dichte_mittel = zeros (800);
for i=1:1:1000
Img{i}=im2double(imread('reihe.tif',i));
Dichte{i}=Img{i}.*m+t;
Dichte_mittel = Dichte_mittel+Dichte{i};
clear Dichte{i},Img{i};
end
Dichte_m = Dichte_mittel/1000;
save('d1.mat','Dichte_m');
Dichte_mittel = zeros(800);
 

usw dieselben Schleifen mit den weiteren 1000ern.

Wenn ich mir jetzt später mal so eine mittlere Dichte anschauen möchte, deren Mittelwerte zwischen 30 und 100 liegen können, erhalte ich plötzlich ein Bild mit Werten zwischen 279 und 280. Also deutlich höher als eigentlich möglich.
Ich habe mein m und t schon mehrfach überprüft, die sind korrekt. Außerdem können die Intensitäten von der Aufnahme her nicht größer als 256 sein, also kann es an unbekannten Höchstwerten ebenfalls nicht liegen.
Jetzt meine Vermutungen:
Ich überfülle irgendwie die Zählvariable Dichte_mittel oder beim Variablenrecyclen von Dichte_mittel läuft irgendwas schief, wenn ich die einfach nur mit 0 überschreibe.
Wisst ihr, woran das liegt?
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 22.06.2017, 07:14     Titel:
  Antworten mit Zitat      
Ist ohne die Daten aufwändig / schwierig zu debuggen. Ein Beispiel "reihe.tif" und m und t hilft der Community.

Generell nach die Frage nach der Definition von "Dichte" und "mittleren Dichte" in der Bildverarbeitung. Ich konnte da nichts finden auf die Schnelle. Ich dachte mir, dass das bestimmt schon im FileExchange vorliegt, aber man braucht den Fachbegriff ja auf Englisch.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
donni24
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.17
Wohnort: München
Version: ---
     Beitrag Verfasst am: 22.06.2017, 13:13     Titel:
  Antworten mit Zitat      
Eine Beispieltif wäre leider zu groß für den Upload (1-2gb groß jeweils).

Aber ich habe mal eine zufällige Datei hergenommen, laut imhist sind die rgb Werte zwischen 102 und 178. Daraufhin habe ich 10000 zufällige Matrizen erzeugt mit dem Wertebereich zwischen 102 und 178, diese als tif gespeichert und mit denselben m und t gerechnet aus der Zufallsdatei.
m ist hier 2.1212
und t = -272.7273
Damit, manuell gerechnet, ist der kleinstmögliche Wert bei -56 und der größte bei 104.

Dennoch erhalte ich nach dem Durchlaufen der Schleife wieder Werte zwischen -271.3 und -271.8 (auffällig, wie nahe diese Werte dem t sind oder?)

Das mit der Dichte habe ich evntl falsch ausgedrückt. Ich möchte letztlich nur meine Werte im tif umrechnen auf einen Wertebereich, den ich benötige.
Könnte das Problem auch daran liegen, dass negative Werte aufsummiert werden, obwohl es sich um ein Bild handelt?

Edit: Ich habe auch noch andere Messreihen angeschaut, wo kein negativer Wert erzeugt wird. Die Ergebnisse sind aber immer direkt um den Wert meines ts herum habe ich jetzt gemerkt.
Private Nachricht senden Benutzer-Profile anzeigen
 
donni24
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.17
Wohnort: München
Version: ---
     Beitrag Verfasst am: 22.06.2017, 13:34     Titel:
  Antworten mit Zitat      
Ich habs glaube ich:

Im2double setzt die uint(Cool Werte auf Werte zwischen 0 und 1. Ich füge also einfach ganz stumpf noch die Zeile:
Dichte{i}=256*Dichte{i}; ein, dann kommen plötzlich passende Werte raus.

Code:
Dichte_mittel = zeros (800);
for i=1:1:1000
Img{i}=im2double(imread('reihe.tif',i));
Dichte{i}=256*Dichte{i};
Dichte{i}=Img{i}.*m+t;
Dichte_mittel = Dichte_mittel+Dichte{i};
clear Dichte{i},Img{i};
end
Dichte_m = Dichte_mittel/1000;
save('d1.mat','Dichte_m');
Dichte_mittel = zeros(800);


Jetzt bleibt aber dennoch ein kleines Problem: Manchmal habe ich einzelne Pixel, die einen Ausreißerwert haben. Die wollte ich recht stumpf ohne extra Schleife (Rechenzeit) rausfiltern:

Code:
ii=Img{i}<102;
Img{i,ii}=102;
ii=Img{i}>178;
Img{i,ii}=178;


Da meckert er aber rum:
Expected one output from a curly brace or dot indexing expression, but there were 147456 results.
Gäbe es da eine Lösung ohne Schleife?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.06.2017, 14:53     Titel:
  Antworten mit Zitat      
Hallo,

das dürfte gehen:
Code:
ii=Img{i}<102;
Img{i}(ii)=102;
ii=Img{i}>178;
Img{i}(ii)=178;


Die Frage ist, warum du überhaupt indizierst, wenn du ohnehin nach jeder Iteration die Variablen entfernst.

Code:
Dichte_mittel = zeros (800);
for i=1:1:1000
Img=im2double(imread('reihe.tif',i));

% vermutlich hier rein?
ii=Img<102;
Img(ii)=102;
ii=Img>178;
Img(ii)=178

Dichte=256*Dichte;
Dichte=Img.*m+t;
Dichte_mittel = Dichte_mittel+Dichte;
%clear Dichte{i},Img{i};
end
Dichte_m = Dichte_mittel/1000;
save('d1.mat','Dichte_m');


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
donni24
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 21.06.17
Wohnort: München
Version: ---
     Beitrag Verfasst am: 22.06.2017, 15:11     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hilfe!
Den clear Befehl habe ich wieder herausgenommen, das war nur ein Experiment den mangelnden Speicher zu kompensieren (geht trotzdem nicht, aufgrund der Fragmentierung, andere Geschichte), tatsächlich brauche ich die Variablen an anderer Stelle wieder, deswegen habe ich sie indiziert.
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 - 2024 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.