I have a matrix which consists of positive and negative values. I need to do these things.
Let u(i,j) denote the pixels of the matrix u.
- Calculate the zero crossing pixels. These are the pixels in the grid if
u(i-1,j)andu(i+1,j)are of opposite signs oru(i,j-1)andu(i,j+1)are of opposite signs. - Then I need to calculate the narrow band around these zero crossing pixels. The width of the narrow band is
(2r+1)X(2r+1)for each pixel. I am takingr=1so for it I have to actually get the 8 neighborhood pixels of each zero crossing pixels.
I have done this in a program. Please see it below.
%// calculate the zero crossing pixels
front = isfront(u);
%// calculate the narrow band of around the zero crossing pixels
band = isband(u,front,1);
I am also attaching the isfront and isband functions.
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
The outputs are given below:, as well as the computation time:

%// Computation time
%// for isfront function
Elapsed time is 0.003413 seconds.
%// for isband function
Elapsed time is 0.026188 seconds.
When I run the code I do get the correct answers but the computation for the tasks is too much to my liking. Is there a better way to do it ? Especially the isband function? How can I optimize my code further ?
Thanks in advance.
As suggested by EitanT, there is at least
bwmorphthat already does what you want.If you do no have access to the image processing toolbox, or just insist on doing it yourself:
You can replace the triple-loop in
isfrontwith the vectorizedAnd you can replace
isbandby this single loop:Alternatively, as suggested by Milan, you can apply the image dilation through convolution:
which should be even faster.
And you can of course have some other minor optimizations (
isbanddoesn't requirephias an argument, you can passfrontas a logical array so thatfindis faster, etc.).