Verfasst am: 31.08.2011, 14:42
Titel: "flexiblere" and Funtkion
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.
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.
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.
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 . 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.
ich werde mich mal an der Schleife probieren. Habe das in Matlab noch nie gemacht und bin über links zu Tutorials sehr dankbar .
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.
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.
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([010; 011; 000], A, 'same')
Bf = filter2([010; 011; 000], B, 'same')
Af & Bf
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.
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
@Harald: Nachdem ich mir mal genauer angekuckt habe was der filter command macht, hast du natürlich recht. Damit habe ich gute Ergebnisse bekommen . 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
Einstellungen und Berechtigungen
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
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.