MATLAB Answers

## Counting the neighbors in matrix

Asked by Aravin

### Aravin (view profile)

on 7 Aug 2012
Accepted Answer by Matt Fig

### Matt Fig (view profile)

Hi everyone,

I have matrix R in which each element is integer of range [0 7]. I want to calculate the count of neighbor, let say for pixel value 0 how many times it has the neighbor 1, 2, ..., 7. every pixel has eight neighbors, for example

```[n1 n2 n3
n4 x  n5
n6 n7 n8]
```

where pixel x have eight neighbors. As a resultant I think we will have an other matrix of 8 x 8, or we can say 8 histograms as we have eight possible values in given matrix R.

I hope I have explained what I want :-(

Image Analyst

### Image Analyst (view profile)

on 12 Aug 2012

Granted, their graycomatrix is very confusing and has some weird defaults, and you have to do things to get it to do what you'd intuitively want it to do. For example, it only looks at pairings to the right of the pixel, not all around at all 8 neighbors (unless you pass in the correct "offset" parameter). Matt, try this code and see if you get the tables they show in their explanatory diagram:

```m = [1 1 5 6 8; 2 3 5 7 1; 4 5 7 1 2; 8 5 1 2 5]
glcm = graycomatrix(m, 'GrayLimits', [min(m(:)) max(m(:))])
```
Aravin

### Aravin (view profile)

on 13 Aug 2012

Hi Matt,

Here is the one line solution I did for my problem.

```final_H= graycomatrix(x, 'offset', [0 1; -1 1; -1 0; -1 -1; 0 -1; 1 -1;1 0;1 1],'NumLevels',15);
```

I will have 8 number of channels, which I have sum for final result.

Matt Fig

### Matt Fig (view profile)

on 13 Aug 2012

Thanks, IA. Indeed you are correct. The illustration I was looking at in the doc seemed to imply it was showing graycomatrix(I).

I see now the difference between what this function gives and what I (and others) showed below. If we have:

```x = randi([0 7],1000,1000);
```

Then to get the same result as:

```G = sum(graycomatrix(x,...
'graylimits',[0 7],...
'Offset',[0 1; 0 -1;-1 1; -1 0; -1 -1;1 -1;1 0;1 1]),3)
```

I would modify my code to:

```R = ones(3);
R(5) = 0;
```
```for ii = 7:-1:0
I = conv2(single(x==ii),R,'same');
```
```    for jj = 0:7
M(ii+1,jj+1) = sum(I(x(:)==jj));
end
end```

Thus M and G are equal. M took half the time to compute, but the code is definitely longer! Note that the calculation of M could perhaps be made more efficient by storing the x(:)==jj in a cell outside the loop.

Anyway, I'm glad Aravin got what was required.

## 4 Answers

### Matt Fig (view profile)

Answer by Matt Fig

### Matt Fig (view profile)

on 8 Aug 2012
Edited by Matt Fig

### Matt Fig (view profile)

on 8 Aug 2012
Accepted answer

If you don't have the image processing toolbox, or if you want your code to be useful to those who don't, this is just as fast. Note that the example only looks for the neighbors of the number 7. You can put this into a loop as needed. I assume your matrix is named x.

```H = single(x==7);
H = logical(conv2(H,ones(3),'same'))~=H;
H = x(H(:));
Y = unique(H);
H = histc(H,Y);
H = [Y H];
```

Aravin

on 11 Aug 2012

Thanks Matt...

### Sean de Wolski (view profile)

Answer by Sean de Wolski

### Sean de Wolski (view profile)

on 7 Aug 2012

I would take an image processing approach:

```x = zeros(5); %sample matrix
x(3:5,3:5) = [1 2 1;1 7 2;3 4 1];
x(5) = 7;
```
```BW = x==7; %We'll count neighbors of 7s
M  = xor(imdilate(BW,ones(3)),BW); %neighbors of 7s
uv = unique(x(M)); %unique neighbors
n = histc(x(M),uv); %count unique neighbors
[uv n] %display number of unique values to occurences
```

Matt Fig

on 8 Aug 2012

Nice!

Aravin

### Aravin (view profile)

on 11 Aug 2012

Thanks Sean... Really nice solution.

### Andrei Bobrov (view profile)

Answer by Andrei Bobrov

### Andrei Bobrov (view profile)

on 7 Aug 2012
Edited by Andrei Bobrov

### Andrei Bobrov (view profile)

on 8 Aug 2012
```A = randi([0 7],10);
```
```A1 = nan(size(A)+2);
A1(2:end-1,2:end-1) = A;
k = (0:7)';
n = numel(k);
out = zeros(n);
d = true(3);
d(5) = false;
for i1 = 1:n
[ii,jj] = find(A1 == k(i1));
p = zeros(n,1);
for i2 = 1:numel(ii)
q = A1(ii(i2) + (-1:1),jj(i2) + (-1:1));
p = p + histc(q(d&(~isnan(q))),k);
end
out(:,i1) = p;
end
```

variant based on the idea of ​​Sean and Matt:

```k = (0:7)';
out = zeros(numel(k));
for a = 1:numel(k)
out(:,a) = histc(x(bwdist(x == k(a),'chessboard') == 1),k);
end
```

Aravin

### Aravin (view profile)

on 11 Aug 2012

Thanks Andrei Bobrov :-)

Aravin

### Aravin (view profile)

on 11 Aug 2012

Indeed, this is the perfect solution to my problem. Matts and sean Solution doesn't include the count of searching key value. In their given examples, if we are seaching 7, then their solution doesn't count the 7 as neighbor, but your solution does.

Thanks Andrei.

Sean de Wolski

### Sean de Wolski (view profile)

on 13 Aug 2012

Our solutions could count the 7 as a nieghbor! Just remove the xor() from mine or the ~= from Matt's. We were intentionally not counting the 7, but if you want to count it it makes our solutions even simpler :)

### Teja Muppirala (view profile)

Answer by Teja Muppirala

### Teja Muppirala (view profile)

on 8 Aug 2012
```R = randi([0 7],100); % Input
```
```H = zeros(8); % The 8x8 Matrix
for k = 0:7
C = conv2(double(R == k),[1 1 1; 1 0 1; 1 1 1],'same');
H(:,k+1) = accumarray(1+R(C~=0),nonzeros(C),[8 1]);
end
```
```bar(H);
```

#### 0 Comments

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi test

### Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

New to MATLAB?