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

"flexiblere" and Funtkion

 

Mauri84
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2011, 14:42     Titel: "flexiblere" and Funtkion
  Antworten mit Zitat      
Hallo Liebe Matlab Community!


Folgendes ist der Sachverhalt:

Ich habe zwei Matrizen vom Typ logical. Nun möchte ich eine 'und' Abfrage machen, für die folgendes gilt:

Sie gibt eine Matrix aus die an den entsprechenden Einträgen eine 1 hat wenn die beiden Matrixelemente der zu vergleichenden Matrizen ungleich Null sind oder wenn eines der angrenzenden Matrixelemente ungleich Null ist. Ich möchte also auch eine wahre Antwort haben, wenn eines der benachbarten Matrixelemente ungleich Null ist.

zb:
Code:


A=[ 0 0 0; 0 1 0; 0 0 0]
B=[ 0 0 0; 1 0 0; 0 0 0]
C=meineAndOperation(A,B)=[0 0 0; 1 1 0; 0 0 0]

 


Bei meinen Matrizen dreht es sich um edgemaps, die anhand des edge-operators erstellt wurden.

Nun wollte ich fragen, ob jemandem eine Operation bekannt ist, die dieses gewährleistet, am besten noch mit einem justierbaren Radius.

Desweiteren habe ich mir überlegt in einer der Matrizen im Umkreis um jede Eins zusätzliche Einsen zu erzeugen. Somit würde meine 'und' Abfrage ebenso mehr wahre Ergebnisse liefern. Auch hierzu habe ich aber die entsprechende Funktion noch nicht ausfindig gemacht.

Über eine Antwort würde ich mich sehr freuen!


Viele Grüße


Mauri
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: 31.08.2011, 15:34     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das nicht komplett missverstehe, gibt es dieses "und" schon - es heißt "oder" Wink

Code:

Jedenfalls gibt es in deinem Fall die gewünschte Antwort.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 31.08.2011, 15:35     Titel:
  Antworten mit Zitat      
Irgendwie verstehe ich deine Aussage bzgl.
Zitat:
...wenn eines der angrenzenden Matrixelemente ungleich Null ist
nicht.

In deinem einfachen Bsp wäre die Lösung durch ein Oder gegeben.

Edit: Harald war wie so oft schneller...
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 31.08.2011, 15:49     Titel:
  Antworten mit Zitat      
Es wurde einfach nur ein schlechtes Beispiel gebracht. Er meint schon eine UND-Verknüpfung, allerdings zählen auch die umliegenden Elemente zur Erfüllung der Bedingung mit.

... ich würde es mit einer einfachen Schleife lösen: Gehe alle Werte von A durch und schaue in der Nachbarschaft von B, ob mindestens ein Element == 1 ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mauri84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2011, 15:54     Titel:
  Antworten mit Zitat      
Servus,

ja, bei diesem sehr einfachen und blöderweise schlecht gewählten Beisiel wäre 'oder' eine Möglichkeit, aber 'oder' betrachtet keine Pixel-Umgebungen sondern vergleicht nur die beiden korrespondierenden Pixel. Sorry für das schlechte Beispiel Sad. Das kann ich aber bei meinem Problem leider nicht verwenden. Am besten gehe ich etwas ins Detail.

Ich habe zwei Bilder mit dem selben Motiv aber anderer Beleuchtung. Mein Ziel ist es nun die Edgemaps der beiden Input-Bilder miteinander abzugleichen, sodass ich nur Kanten habe, die von beiden Bildern bestätigt wurden.

Benutze ich nun die normale and(A,B) Funktion bekomme ich zu wenig Punkte. Deshalb möchte eine flexiblere 'and' Funktion, die mir auch Kanten bestätigt, wenn in der Umgebung des korrespondierenden Pixels eine Kante vorliegt.

Hier ein größeres Beispiel:
Code:

A=[1 0 0 0 0, 0 0 0 1 0, 0 0 0 0 0, 0 0 0 0 0]
B=[0 1 0 0 0, 0 0 0 0 1, 0 0 0 0 0, 0 0 0 1 1]
C=meineAndOperation=[1 1 0 0 0, 0 0 0 1 1, 0 0 0 0 0, 0 0 0 0 0]


 


Viele Grüße

Mauri
Private Nachricht senden Benutzer-Profile anzeigen
 
Mauri84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2011, 16:05     Titel:
  Antworten mit Zitat      
Vielen Dank eupho,


ich werde mich mal an der Schleife probieren. Habe das in Matlab noch nie gemacht und bin über links zu Tutorials sehr dankbar Smile.

Hatte nur gehofft, das es vielleicht in Matlab schon eine vordefinierte Funktion für so eine Problemstellung gibt und man sich somit die Schleife sparen kann.

Ich melde ich wenn ich eine Schleife habe und stelle sie dann hier zur Verfügung.

mauri
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: 31.08.2011, 16:13     Titel:
  Antworten mit Zitat      
Hallo,

langsam wirds klarer. Die , im neuen Beispiel sollen wohl ; sein?
Warum stehen am Ende keine Einsen?

Mein Eindruck ist, dass hier auch ein einfaches Filter nützlich sein kann, um dann & auf die neuen Matrizen anzuwenden.

Code:
Af = filter2([0 1 0; 1 1 1; 0 1 0], A, 'same')
Bf = filter2([0 1 0; 1 1 1; 0 1 0], B, 'same')
Af & Bf


Ggf. das Filter etwas anpassen. Daraus könntest du dann natürlich auch eine eigene Funktion erstellen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2011, 16:24     Titel:
  Antworten mit Zitat      
Viele Dank Harald.


Ja das hat mir ein besseres Bild geliefert! Leider beinhaltet dieses Bild noch sehr viel Geräusche, es wurden also viele Punkte als Kanten bestätigt, die keine Katen sind. Ich glaube auch, das ich durch das Filtern die beiden Inputbilder zu sehr verändere.

Ich denke um die Schleife komme ich zunächst nicht umhin.


Aber vielen Dank, damit sieht es schon viel viel besser aus.


Grüße

Mauri
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: 31.08.2011, 16:37     Titel:
  Antworten mit Zitat      
Hallo,

du machst damit das (oder etwas sehr ähnliches), wie du wolltest. Wenn du das also als Schleife programmierst, wird etwas ähnliches, wenn nicht das gleiche herauskommen.

Ein anderes Filter wird die Anzahl der (vermeintlichen) Kanten reduzieren:
Code:
Af = filter2([0 1 0; 0 1 1; 0 0 0], A, 'same')
Bf = filter2([0 1 0; 0 1 1; 0 0 0], B, 'same')
Af & Bf

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
aj.geissler
Forum-Guru

Forum-Guru



Beiträge: 251
Anmeldedatum: 26.11.07
Wohnort: Seeheim-Jugenheim
Version: ---
     Beitrag Verfasst am: 01.09.2011, 10:44     Titel:
  Antworten mit Zitat      
Hi,

die Aussage, wenn eine der Nachbarn ungleich Null ist, führt eigentlich direkt zu einer Dilatationsoperation. Matlab hat - soweit ich weiß - so etwas. Kann sein, daß diese Operation allerdings nur in eine Image Analysis Toolbox ist.

Wenn beide Matrizen einer Dilationsoperation unterzogen worden sind, kann man diese dan verodern.

In SciLab habe ich so eine Operation ebenfalls mal benötigt. Habe den SciLab-Quelltext unten aufgeführt.

Grüße
Andi

Code:

function Qdil=spdilb(Q,mask);
// SPDILB   Binary Dilation of matrices
//
//      QDIL=SPDILB(Q,MASK);
//
//      Q      : matrix (binary info)
//      MASK   : Dilation window
//      QDIL   : output matrix
//
//      calling:
//      1)   QDIL=SPDILB(Q)
//         A Mask MASK=ONES(3,3) is used
//      2)   QDIL=SPDILB(Q,MASK)

[%nargout,%nargin]=argn(0);

Qdil=[];
if %nargin==0
   error('No Input Arguments are given !');
   return;
end
if %nargin==1
   mask=ones(3,3);
end
   
[zm,sm]=size(mask);

if ((modulo(zm,2)==0)|(modulo(sm,2)==0)) then,
   [zmask,smask]=find(mask);
   zmask=zmask - ceil((zm+1)/2);      // relative Positionen bezüglich
   smask=smask - ceil((sm+1)/2);      // Maskenmitte
   NMASK=length(zmask);
else
   [zmask,smask]=find(mask);
   zmask=zmask - ceil(zm/2);      // relative Positionen bezüglich
   smask=smask - ceil(sm/2);      // Maskenmitte
   NMASK=length(zmask);
end

Qdil=bool2s(shiftmat(Q,smask(1),zmask(1)) | shiftmat(Q,smask(2),zmask(2)));
if NMASK>2
   for k=3:1:NMASK
      Qdil=bool2s(Qdil | shiftmat(Q,smask(k),zmask(k)));
   end
end
endfunction  

// ################################################################################

function xneu=shiftmat(x,dx,dy)
// SHIFTMAT
//      XNEU=SHIFTMAT(X,DX,DY)
//
//      Matrix shifting by DX columns to the right and
//      DY lines to the bottom.
//      Shift to the left / top by negative values
//      of DX and DY.

[zx,sx]=size(x);
                          // Verschiebung rechts/links
if dx>=0
   xneu=[zeros(zx,dx),x(:,1:sx-dx)];
else
   dx=-dx;
   xneu=[x(:,dx+1:sx),zeros(zx,dx)];
end
                          // Verschiebung nach unten/oben
if dy>=0
   xneu=[zeros(dy,sx);xneu(1:zx-dy,:)];
else
   dy=-dy;
   xneu=[xneu(dy+1:zx,:);zeros(dy,sx)];
end
endfunction
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Mauri84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 31.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2011, 11:32     Titel:
  Antworten mit Zitat      
hallo Liebe Leute!

Vielen Dank für eure Hilfen.


@Harald: Nachdem ich mir mal genauer angekuckt habe was der filter command macht, hast du natürlich recht. Damit habe ich gute Ergebnisse bekommen Smile. vielen Dank.

@Andy: Viele Dank für die Idee und den Code, hatte vorher noch nie mit Dilatation zu tun, bin grad dabei das auch mal auszuprobieren.

Viele Grüße


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