Ich habe eine Matrix, die aus positiven und negativen Werten besteht. Ich muss diese Dinge tun.schnellste Möglichkeit zur Berechnung der Nachbarschaft von Pixeln
Lassen Sie u(i,j)
die Pixel der Matrix u
bezeichnen.
- Berechnen Sie die Nulldurchgangspixel. Dies sind die Pixel im Raster, wenn
u(i-1,j)
undu(i+1,j)
entgegengesetzte Vorzeichen haben oderu(i,j-1)
undu(i,j+1)
entgegengesetzte Vorzeichen haben. - Dann muss ich das schmale Band um diese Nulldurchgangspixel berechnen. Die Breite des Schmalbands ist
(2r+1)X(2r+1)
für jedes Pixel. Ich nehmer=1
, also muss ich tatsächlich die 8 Nachbarschafts-Pixel von jedem Nulldurchgangspixel bekommen.
Ich habe dies in einem Programm getan. Bitte sehen Sie es unten.
%// calculate the zero crossing pixels
front = isfront(u);
%// calculate the narrow band of around the zero crossing pixels
band = isband(u,front,1);
Ich füge auch die isfront
und isband
Funktionen.
function front = isfront(phi)
%// grab the size of phi
[n, m] = size(phi);
%// create an boolean matrix whose value at each pixel is 0 or 1
%// depending on whether that pixel is a front point or not
front = zeros(size(phi));
%// A piecewise(Segmentation) linear approximation to the front is contructed by
%// checking each pixels neighbour. Do not check pixels on border.
for i = 2 : n - 1;
for j = 2 : m - 1;
if (phi(i-1,j)*phi(i+1,j)<0) || (phi(i,j-1)*phi(i,j+1)<0)
front(i,j) = 100;
else
front(i,j) = 0;
end
end
end
function band = isband(phi, front, width)
%// grab size of phi
[m, n] = size(phi);
%// width=r=1;
width = 1;
[x,y] = find(front==100);
%// create an boolean matrix whose value at each pixel is 0 or 1
%// depending on whether that pixel is a band point or not
band = zeros(m, n);
%// for each pixel in phi
for ii = 1:m
for jj = 1:n
for k = 1:size(x,1)
if (ii==x(k)) && (jj==y(k))
band(ii-1,jj-1) = 100; band(ii-1,jj) = 100; band(ii-1,jj+1) = 100;
band(ii ,jj-1) = 100; band(ii ,jj) = 100; band(ii,jj+1) = 100;
band(ii+1,jj-1) = 100; band(ii+1,jj) = 100; band(ii+1,jj+1) = 100;
end
end
end
end
Die Ausgänge werden im Folgenden :, sowie die Rechenzeit gegeben:
%// Computation time
%// for isfront function
Elapsed time is 0.003413 seconds.
%// for isband function
Elapsed time is 0.026188 seconds.
Wenn ich den Code ausführen ich die richtigen Antworten erhalten tun, aber die Berechnung für die Aufgaben ist zu viel nach meinem Geschmack. Gibt es einen besseren Weg, es zu tun? Vor allem die isband
Funktion? Wie kann ich meinen Code weiter optimieren?
Vielen Dank im Voraus.
Haben Sie morphologische Operationen betrachtet, sagen [ 'bwmorph'] (http://www.mathworks.com/help/images/ref/bwmorph.html)? –
Vorsicht: Zugriff auf die unteren rechten zwei benachbarten Pixel in Ihrem 'isband' ist falsch codiert; Sie haben wahrscheinlich kopiert und eingefügt und vergessen, die -1 in eine +1 und +0 zu korrigieren. –
@RodyOldenhuis danke für den Kommentar. Ja, ich habe es kopiert und eingefügt, also war es ein Fehler. Bearbeitete meine Frage, um es zu korrigieren. – roni