adjacentdircount

Below is a demonstration of the features of the adjacentdircount function

Contents

Syntax

[Lc]=adjacentdircount(L,n);

Description

The adjacentdircount function calculates the number of adjacent entries of an input logic array allong a specified direction.

Examples

clear; close all; clc;

Plot settings

fontSize=10;

Example: Using adjacentdircount to compute "connectivity"

The adjacentdircount function computes the number of adjacent elements in the input array that have the value 1. As such it computes a type of connectivity or "thickness" of structures in the logic arrays allong a certain dimension.

Lets consider the following array:

L=[0 1 1 0 0 1;...
   0 0 1 0 0 1;...
   1 0 0 1 1 1]; %A logic array or an array containing ones

Now view the output of the adjacentdircount function for n=1:

n=1; %Row direction (i.e. thickness orthogonal to rows)
[Lc]=adjacentdircount(L,n);
Lc
Lc =

     0     1     2     0     0     3
     0     0     2     0     0     3
     1     0     0     1     1     3

and similarly for for n=2:

n=2; %Column direction (i.e. thickness orthogonal to columns)
[Lc]=adjacentdircount(L,n);
Lc
Lc =

     0     2     2     0     0     1
     0     0     1     0     0     1
     1     0     0     3     3     3

Example: Use for 3D arrays

Create a 3D example array, here L is copied upside down into a second "slice" and again for the third slice.

L(:,:,2)=flipud(L);
L(:,:,3)=flipud(L(:,:,1));
n=3; %Slice direction (i.e. thickness orthogonal to slices)
[Lc]=adjacentdircount(L,n);
Lc
Lc(:,:,1) =

     0     1     1     0     0     3
     0     0     3     0     0     3
     1     0     0     1     1     3


Lc(:,:,2) =

     2     0     0     2     2     3
     0     0     3     0     0     3
     0     2     2     0     0     3


Lc(:,:,3) =

     2     0     0     2     2     3
     0     0     3     0     0     3
     0     2     2     0     0     3

Example: Studying object line feature thickness

% Simulating a striped image in 3D
np=45;
[X,Y,Z]=meshgrid(linspace(-5*pi,5*pi,np));
R=sqrt(X.^2+Y.^2+Z.^2); %Radii
M=sin(R);

First consider the mid-slice for 2D analysis

midInd=round(size(M,3)/2);
m=M(:,:,midInd);

Convert to a logic array for thickness analysis

L=m>0;

Now use adjacentdircount to compute "connectivity" allong first and second dimensions

[Lc1]=adjacentdircount(L,1); %1st dim
[Lc2]=adjacentdircount(L,2); %1st dim

Plotting the results

hf=cFigure;
hold on;
subplot(1,3,1);
imagesc(L);
colormap gjet; colorbar;
axis equal; axis tight;
set(gca,'FontSize',fontSize);

subplot(1,3,2);
imagesc(Lc1);
colormap gjet; colorbar;
axis equal; axis tight;
set(gca,'FontSize',fontSize);

subplot(1,3,3);
imagesc(Lc2);
colormap gjet; colorbar;
axis equal; axis tight;
set(gca,'FontSize',fontSize);

drawnow;

Now lets expand to 3D analysis

L=M>0;
[Lc1]=adjacentdircount(L,1); %1st dim
[Lc2]=adjacentdircount(L,2); %1st dim
[Lc3]=adjacentdircount(L,3); %1st dim

%Construct logic array setting voxels to display using |ind2patch| function
logicPatch=L; %Initialise as L
logicPatch(:,:,midInd:end)=0; %Crop off half to visualize interior

[F,V,C]=ind2patch(logicPatch,L,'vb');
[F1,V1,C1]=ind2patch(logicPatch,Lc1,'vb');
[F2,V2,C2]=ind2patch(logicPatch,Lc2,'vb');
[F3,V3,C3]=ind2patch(logicPatch,Lc3,'vb');

cFigure;
subplot(2,2,1);
xlabel('J');ylabel('I'); zlabel('K'); hold on;
patch('Faces',F,'Vertices',V,'FaceColor','flat','CData',C,'EdgeColor','k');
axis equal; view(3); axis tight; axis vis3d; grid off;
colormap gjet; colorbar;
set(gca,'FontSize',fontSize);

subplot(2,2,2);
xlabel('J');ylabel('I'); zlabel('K'); hold on;
patch('Faces',F1,'Vertices',V1,'FaceColor','flat','CData',C1,'EdgeColor','k');
axis equal; view(3); axis tight; axis vis3d; grid off;
colormap gjet; colorbar;
set(gca,'FontSize',fontSize);

subplot(2,2,3);
xlabel('J');ylabel('I'); zlabel('K'); hold on;
patch('Faces',F2,'Vertices',V2,'FaceColor','flat','CData',C2,'EdgeColor','k');
axis equal; view(3); axis tight; axis vis3d; grid off;
colormap gjet; colorbar;
set(gca,'FontSize',fontSize);

subplot(2,2,4);
xlabel('J');ylabel('I'); zlabel('K'); hold on;
patch('Faces',F3,'Vertices',V3,'FaceColor','flat','CData',C3,'EdgeColor','k');
axis equal; view(3); axis tight; axis vis3d; grid off;
colormap gjet; colorbar;
set(gca,'FontSize',fontSize);

drawnow;

GIBBON www.gibboncode.org

Kevin Mattheus Moerman, [email protected]

GIBBON footer text

License: https://github.com/gibbonCode/GIBBON/blob/master/LICENSE

GIBBON: The Geometry and Image-based Bioengineering add-On. A toolbox for image segmentation, image-based modeling, meshing, and finite element analysis.

Copyright (C) 2019 Kevin Mattheus Moerman

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.