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

Problem mit logical indexing

 

madlab
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 86
Anmeldedatum: 15.05.12
Wohnort: Freiburg
Version: 7.11 (R2010b)
     Beitrag Verfasst am: 19.11.2012, 14:19     Titel: Problem mit logical indexing
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Frage zur logischen Indzierung von Matritzen. Ich möchte bei einem Bild "img" der Größe m,n nur jede zweite Zeile betrachten.
Um nur die ungeraden (odd) Zeilen zu betrachten, versuche ich die ungeraden Zeilen im Bild mittels logical Indexing mit "1" auszuwählen und die restlichen zeilen zu ignorieren:

Code:

imgLength = size(img,1);
imgWidth = size(img,2);
logicMask = logical(ones (imgLength, imgWidth));

oddImg = img(logicMask(1:2:end,1:end));
 


Das Ergbnis ist leider nicht das, was ich erwarte. Ich hätte gerne ein Ergebnis "oddImg" das die selbe größe (also m,n Pixel) wie das Originalbild hat, jedoch jede gerade Zeile auf 0 gesetzt ist (ergo nur die ungeraden Zeilen ihre ursprünglichen Werte beinhalten). Ich erhalte stattdessen aber einen vektror der die größe (m/2)*n , 1 hat.
Könnt ihr mir weiter helfen? Wie kann ich ein Ergbnis erzeugen, welches das Originalbild im Prinzip nur "überdeckt" aber die Größe des Bildes beibehält. Ist logical Indexing hier vllt des falsche Weg? Bitte um eure Hilfe Smile

Grüße,
Mad

*edit*

zur Erkäuterung: Im Prinzip möchte ich genau so etwas machen:
Code:
A = rand(5);
B =  A > 0.5;
A(B) = 0
 


Ergebnis:

A =

0 0 0 0.4387 0.4898
0 0.0318 0 0.3816 0.4456
0.3922 0.2769 0.3171 0 0
0 0.0462 0 0 0
0.1712 0.0971 0.0344 0.1869 0

Das Ergebnis A hat die selbe Größe wie A zu Beginn. Jedoch fällt mir für meinen Fall keine Passende Matrix B ein Oo

Zuletzt bearbeitet von madlab am 19.11.2012, 14:35, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2012, 14:33     Titel:
  Antworten mit Zitat      
Code:

oddImg = img;
oddImg(2:2:end,:)  = 0;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2012, 14:33     Titel:
  Antworten mit Zitat      
Code:
oddImg=img; %kopie erstellen
oddImg(2:2:end,:)=0; %jede 2. Zeile löschen
Private Nachricht senden Benutzer-Profile anzeigen
 
madlab
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 86
Anmeldedatum: 15.05.12
Wohnort: Freiburg
Version: 7.11 (R2010b)
     Beitrag Verfasst am: 19.11.2012, 14:45     Titel:
  Antworten mit Zitat      
hi ihr beiden,

vielen Danke Smile das ist gut für den Anfang. Ich werde sehen, wie ich das weiter ausbauen kann.
Meine Idee ist es später verschiedenste Möglichkeiten zu definieren, wie ich ein und das selbe Originalbild "img" unterschiedlich anspreche. Welche Methode würdet ihr mir vorschlagen wenn ich z.B. jede zweite Zeile des Bildes und jedes fünfte Pixel des Bildes kombinieren möchte? Gibt es da eine Möglichkeit diese beiden Zugriffe als "Masken" zu definieren und dann die Masken zu kombinieren? Es soll möglich sein die Masken auch einzln anzuwenden.

pseudo bsp: meinauswahlimg = img(oddZeile && step5Pixel) ;

Ich hoffe ihr versteht meine Frage, kann es momentan nicht besser erklären Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
madlab
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 86
Anmeldedatum: 15.05.12
Wohnort: Freiburg
Version: 7.11 (R2010b)
     Beitrag Verfasst am: 19.11.2012, 17:34     Titel:
  Antworten mit Zitat      
Hallo zusammen,

dank eurer Hilfe, bin ich mittlerweile etwas weiter. Ich scheitere aber immernoch, das Ausgabebild in die gewünschte Form zu bringen. Ich möchte mein Bild "img" mit einigen Masken bearbeiten. Als beispiel habe ich mal zwei Masken ausgewählt. Die evenMask, soll alle geraden Zeilen auswählen, die segMask soll die Pixel Spalten 1 bis 200 auswählen.

Code:

evenMask = logical(ones(size(img)));
evenMask(1:2:end,:) = 0;

segMask =logical(zeros(size(img)));
segMask(:,1:200) = 1;

maskedImg = img(segMask & evenMask);
 


Mein Ergebnis "maskedImg" kommt jetzt als eine Spalte zurück. Dies sind schon die Werte, die ich nacher benötige. Allerdings möchte ich eine m,n matrix in der selben größe wie "img" in der die ausgewählten Werte dann an ihrer ursprünglichen Position sind. Die durch die Masken verdeckten Werte sollen einfach null sein. Habt ihr einen Tip, wie ich das elegant realisieren kann?

Grüße,

mad
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: 19.11.2012, 18:30     Titel:
  Antworten mit Zitat      
Hallo madlab,
Code:
evenMask = true(size(img));  % Schneller als LOGICAL(ONES())
evenMask(1:2:end, :) = false;

segMask = false(size(img)));
segMask(:, 1:200) = true;

maskedImg = img;
maskedImg(not(segMask & evenMask)) = 0;

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 86
Anmeldedatum: 15.05.12
Wohnort: Freiburg
Version: 7.11 (R2010b)
     Beitrag Verfasst am: 20.11.2012, 10:44     Titel:
  Antworten mit Zitat      
Hallo Jan,

genau das wollte ich erreichen Smile vielen Dank auch für den Tip mit der Maskenerzeugung per "true".
Ich verstehe allerdings noch nicht wieso mein ursprünglicher Code nur eine einzelne Spalte erzeugt.
Code:
maskedImg = img(segMask & evenMask);
 


Verarbeitet Matlab das so, dass nur die Elemente welche beide Bedingungen erfüllen aus dem Orignal img herausgenommen werden? Ich finde das etwas Schade, da man die Positionsinformation mit meiner Lösung ja "wegwirft".
Bei deiner Variante ist wesentlich besser ersichtlich was passiert Smile

Grüße,

mad
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.11.2012, 11:02     Titel:
  Antworten mit Zitat      
Hallo madlab,

Beim Logical Indexing wird ein Vektor zurückgegeben, weil dies die einzige konsitstent Möglichkeit ist:
Code:
X = [1, 2; 3, 4];
Index = [true, true; false, true];
X(Index)

Nun enthielte die erste und zweite Zeile (oder spalte) unterschiedlich viele Elemente, was ja in einem Matrix nicht möglich ist. Also wird hier ein Vektor zurückgeliefert. Für:
Code:

ist das zwar nicht zwingend, aber die Dimensionierung der Ausgabe sollte nicht von den Werten des Eingabe abhängen.

Den Logical Index auf die Linke Seite zu ziehen hat den Vorteil, dass dies wie ein linearer Index behandelt wird, also wie "X(1:4)", wobei "X(4)" genau das gleiche bedeutet wie "X(2, 2)", aber es ist ein klein wenig schneller.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 86
Anmeldedatum: 15.05.12
Wohnort: Freiburg
Version: 7.11 (R2010b)
     Beitrag Verfasst am: 20.11.2012, 11:18     Titel:
  Antworten mit Zitat      
stimmt, das mit der konsitens klingt logisch.
eine kleine Frage offtopic:

Kann ich möglichst einfach matritzen "Blockweise" anlegen?
z.B. immer zeilenweise 3 werte true, drei werte false:

1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 ...
1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 ...
1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 ...
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .

meine idee wäre gewesen die Grundsturktur 1 1 1 0 0 0 einmal anzulegen und dann beliebig oft zu wiederholen. Ich habe allerdings keine Idee wie ich das schreiben muss, da mir nur die Schreibweise (a:b:c,d:e:f) geläufig ist und ich nicht weiß, wie ich damit eine Block-Form darstellen kann. Muss ich hierfür Schleifen nutzen oder hat matlab auch für solche Fälle eine Funtkion?
besser eigenes Thema hierfür erstellen?

Grüße,

Mad
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 11:28     Titel:
  Antworten mit Zitat      
Code:

repmat repliziert eine Matrix X oder Y mal in je Spalte oder Zeile
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.11.2012, 11:39     Titel:
  Antworten mit Zitat      
Hallo madlab,

Das bereits empfohlene REPMAT ist vermutlich optimal.

Eine andere Lösung:
Code:
x = zeros(6, 100)
x(:, rem(1:100, 6) < 3) = 1;

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 86
Anmeldedatum: 15.05.12
Wohnort: Freiburg
Version: 7.11 (R2010b)
     Beitrag Verfasst am: 20.11.2012, 12:23     Titel:
  Antworten mit Zitat      
Hallo ihr beiden,

danke für die Empfehlungen Smile
habe die Variante mit repmat ausprobiert und funktioniert.

Vielen Dank!
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.