Counting the neighbors in matrix
    3 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
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 :-(
9 comentarios
  Matt Fig
      
      
 el 13 de Ag. de 2012
				
      Editada: Matt Fig
      
      
 el 13 de Ag. de 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.
Respuesta aceptada
  Matt Fig
      
      
 el 8 de Ag. de 2012
        
      Editada: Matt Fig
      
      
 el 8 de Ag. de 2012
  
      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];
Más respuestas (3)
  Sean de Wolski
      
      
 el 7 de Ag. de 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
2 comentarios
  Andrei Bobrov
      
      
 el 7 de Ag. de 2012
        
      Editada: Andrei Bobrov
      
      
 el 8 de Ag. de 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
3 comentarios
  Sean de Wolski
      
      
 el 13 de Ag. de 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
    
 el 8 de Ag. de 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 comentarios
Ver también
Categorías
				Más información sobre Data Distribution Plots en Help Center y File Exchange.
			
	Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!





