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

Matrizen Berechnungen - ich finde den fehler nicht

 

wolfomat
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2011, 16:42     Titel: Matrizen Berechnungen - ich finde den fehler nicht
  Antworten mit Zitat      
zum problem:

Zitat:

??? Error using ==> mtimes
MTIMES is not fully supported for integer classes. At least one
input must be scalar.

Error in ==> A7 at 23
I1neu(M, N, z) = ( I1(M, N, z) - gmini1 ) * ( ( wmax -
wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;


hab auch schon gesucht und gegoogelt, aber nix dazu gefunden, bzw. ich verstehe die erläuterungen nicht.

Hier ist der Code:

Code:

function A7(gamma, histoprozent)

I1 = imread('unterbel.jpg');
I2 = imread('herbst.jpg');
I3 = imread('multivolume.png');

%I1 -> gamma korrektur
%I2 -> histostretch
%I3 -> histo linearisierung

wmin = 0;
wmax = 255;
gmini1 = min(min(I1));
gmaxi1 = min(min(I2));

[M N z] = size(I1);

I1neu = zeros(M, N, z);

for k=1:z
    for i=1:M
        for j=1:N
            I1neu(M, N, z) = ( I1(M, N, z) - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;
        end
    end
end



imshow(I1neu);

end
 


wichtig: ich will das mal so probieren, ich weiß es gibt dank der imagetoolbox genug funktionen die sicher das machen was ich da oben versuche, aber ich will das ganze schon verstehen.

Wenn ich das ganze in die Matlab Kommandozeile eingebe und berechnen lasse (mit einem einzelnen wert und die daten (wmax,wmin, gmin,gmax) selbst eingetragen) dann berechnet der auch neue werte.
was mach ich falsch? Sad[/code]
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.06.2011, 18:13     Titel:
  Antworten mit Zitat      
Hallo,

die Fehlermeldung deutet das ja schon an: mtimes (*) ist für Integerarrays nur eingeschränkt unterstützt. Es bleibt also nichts anderes, als das Bild in einen anderen Datentyp, z.B. Single oder Double, umzuwandeln.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2011, 18:52     Titel:
  Antworten mit Zitat      
egal ob single oder double, der fehler bleibt.....?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.06.2011, 19:23     Titel:
  Antworten mit Zitat      
Hallo,

derselbe Fehler? Kann ich mir nicht vorstellen.
Nur sicherheitshalber: hast du gespeichert?

Davon abgesehen bietet sich der Code doch wunderbar an, um zu vektorisieren und die for-Schleifen wegzulassen.
Code:
I1neu = (I1 - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2011, 20:40     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,
Nur sicherheitshalber: hast du gespeichert?


yapp, das mach ich immer schon automatisch Wink

Harald hat Folgendes geschrieben:
Hallo,
Davon abgesehen bietet sich der Code doch wunderbar an, um zu vektorisieren und die for-Schleifen wegzulassen.
Code:
I1neu = (I1 - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;

Grüße,
Harald


das habe ich auch probiert, und folgender fehler wird geworfen:
Code:

??? Error using ==> minus
Class of operand is not supported.

Error in ==> A7 at 29
I1neu = (I1 - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) +
wmin;
 


:-/ komm mir bisschen doof vor, zumal ich das schonmal so ähnlich gemach habe....
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.06.2011, 21:25     Titel:
  Antworten mit Zitat      
Hallo,

wenn alle beteiligten Variablen (Operanden) in Double umgewandelt sind, kann es zu dieser Fehlermeldung an sich nicht kommen.
Bitte im Zweifelsfall nochmal das ganze momentane Skript posten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2011, 22:44     Titel:
  Antworten mit Zitat      
hi,

also es läuft noch nicht :/
egal ob ich nun die schleife oder vektoriell berechne, ich bekomme immer fehlermeldungen >.>

die "neuste":
Zitat:

??? Array dimensions must match for binary array op.

Error in ==> A7 at 39
I1neu = (I1 - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) +
wmin;


hier das script:
Code:

I1 = imread('unterbel.jpg');
%I2 = imread('herbst.jpg');
%I3 = imread('multivolume.png');

%I1 -> gamma korrektur
%I2 -> histostretch
%I3 -> histo linearisierung

wmin = 0;
wmax = 255;
gmini1 = min(min(I1));
gmaxi1 = min(min(I2));

[M N z] = size(I1);

I1neu = zeros(M, N, z);

I1 = double(I1);
I1neu = double(I1neu);
wmin = double(wmin);
wmax = double(wmax);
gmini1 = double(gmini1);
gmaxi1 = double(gmaxi1);

%M = double(M);
%N = double(N);
%z = double(z);

%for k=1:z
%    for i=1:M
%        for j=1:N
%            I1neu(M, N, z) = ( I1(M, N, z) - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;
%        end
%    end
%end

I1neu = (I1 - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;
imshow(I1neu);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.06.2011, 09:09     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist, dass gmaxi1 und gmini1 keine Skalare, sondern 1x1x3-Variablen sind (schau mal in den Workspace). Ich vermute, du willst
Code:
gmini1 = min(I1(:));
gmaxi1 = min(I2(:));


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 15:19     Titel:
  Antworten mit Zitat      
super danke, läuft Smile

auf den workspace schauen, das hab ich noch ned wirklich gemacht, also ich kam noch ned auf die idee....
vorallemdingen das min(min()) und max(max()) wurde uns so im studium erläutert..... oh man Very Happy

danke für deine hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.06.2011, 15:41     Titel:
  Antworten mit Zitat      
Hallo,

vielleicht die Erklärung:
min nimmt das Minimum entlang einer Dimension (Default: Spalten).
Bei einer 2D-Matrix kannst du dann nochmal min nehmen, und bekommst dann das Minimum über alle Elemente.
Code:

Bei einer 3D-Matrix müsstest du noch einmal das Minimum nehmen, was dann ein bisschen abartig wirkt.
Code:


Eleganter ist dann doch, die Elemente der Matrix in einem Vektor anzuordnen - so wie von mir eben vorgeschlagen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 16:19     Titel:
  Antworten mit Zitat      
der code läuft, aber er macht ned das was er soll. das bild wird schwarz oder weiß, aber irgendwie ned der gewünschte effekt. ich hasse das....
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.06.2011, 17:07     Titel:
  Antworten mit Zitat      
Hallo,

bist du sicher, dass diese Zeile stimmt:
Code:
gmaxi1 = min(min(I2));

Warum nennst du es gmaxi1, wenn es ein Minimum von Bild 2 ist?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 17:45     Titel:
  Antworten mit Zitat      
Code:

gmaxi1 = min(min(I2));
 


stimmt, sollte max(max(I1)); heißen...
aber da liegt nicht das problem.. .mhmmm

der geht auch gar ned in die for schleife rein, das verstehe ich nicht... :-/


dann habe ich die for schleifen mal etwas "gefixt":
Code:

for k=1:1:z
    for i=1:1:M
        for j=1:1:N
            I1neu(M, N, z) = ( I1(M, N, z) - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;
        end
    end
end


auch das brachte nix Sad in einer anderen matlab file loopt der auch nicht durch. ..... mhmm
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.06.2011, 17:57     Titel:
  Antworten mit Zitat      
Hallo,

warum nimmst du überhaupt eine Schleife statt des vektorisierten Codes?
Und was bedeutet: "er geht nicht in die Schleife rein"? Der Code wird an sich, wie sich mit dem Debugger auch nachvollziehen lässt, zeilenweise durchgeführt.
Bitte also um genauere Erläuterung.

Ansonsten wäre auch eine genauere Erklärung, was der Code machen soll hilfreich - und dass du das Bild, um das es geht anhängst, oder es anhand eines Demobildes (z.B. b747.jpg) nachvollziehbar machst.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 05.06.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 18:21     Titel:
  Antworten mit Zitat      
bild: ist einfach unterbelichtet -> ist beliebig.

Zitat:
"er geht nicht in die Schleife rein"?


er durchläuft die schleife, aber berechnet nix.
lag an der falschen indizierung.
statt M, N und z als Indizes, nimmt man die laufvariablen k,i und j. was auch sinn macht *d'oh*

Code:


for k=1:1:z
    for i=1:1:M
        for j=1:1:N
            I1neu(i, j, k) = ( I1(i, j, k) - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;
        end
    end
end
 


hat den selben effekt wie:
Code:

I1neu = (I1 - gmini1 ) * ( ( wmax - wmin ) / ( gmaxi1 - gmini1 ) ) + wmin;
 


wollte halt nur des lerneffektes wegen die for schleife benutzen Smile

dann I1neu/255 teilen -> dann ist das bild heller Smile
(egal ob schleife oder vektoriell, das ergebnis ist immer das gleiche, aber die schleife ist halt sehr lahm!!!! (wie gesagt -> lerneffekt))
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.