我有一个数组,其图像如下所示。数组中的值表示每个像素/网格处的粒子数。我想计算非零粒子沿非零粒子存在的外围/边界的分布(外围/边界是指离中心最远的点的分布)。作为输出,我想获得:
1)沿外围/边界的非零粒子数,以及
2)这些粒子所在的像素/网格数
有什么快速/有效的方法吗?
编辑 1:描述边界示例的快照 边界线跟踪非零粒子。
从粒子计数矩阵开始M
,这将为您提供Mb
边界的掩码,因为它已由问题定义,
% define particle count matrix and find non-zero locations
M = randi(5,10,10)-1
[nr,nc] = size(M);
[pRows,pCols] = find(M);
% identify locations that compose the "boundary" line
boundCoords = [accumarray(pCols,pRows',[nc 1],@min)', ...
accumarray(pCols,pRows',[nc 1],@max)', ...
1:nr 1:nr; ...
1:nc 1:nc, ...
accumarray(pRows,pCols',[nr 1],@min)', ...
accumarray(pRows,pCols',[nr 1],@max)'];
boundCoords = unique(boundCoords','rows');
boundCoords(any(boundCoords==0,2),:)=[]; %' remove possible (unlikely) zeros
% create a mask representation of the boundary line
Mb = false(size(M));
Mb(sub2ind(size(Mb),boundCoords(:,1),boundCoords(:,2))) = true
这就是我理解你希望你的边界掩码看起来的样子。构成边界的像素数为
numBorderPix = sum(Mb(:))
这些边界点上的粒子数为
numBorderParticles = sum(M(Mb))
注意:此解决方案将确保边界线上的每个点都具有非零粒子计数。
peri
矩阵逻辑索引的外围M
是
peri = true(25);
peri(2:end-1, 2:end-1) = false;
n
那么,外围的粒子数为n = M(peri)
。(1) 沿边界的粒子总数为sum(n)
。(2) 它们所在的像素数为sum(n > 0)
。
-我想出了这个算法来解决你的问题。
- 你想要什么的细节不是 100% 清楚的,因此可能无法准确计算出你想要什么。
-解释在评论中
A=full(sprand(10,10,0.9));
crossKernel=[0 1 0; 1 1 1; 0 1 0]; %% neighbor kernel
isBorder = (conv2(ones(size(A)),crossKernel,'same')~=5); %% find pixels on border
isZeroOnBorder = isBorder & (A==0); %% find zeros on border
%%% the pixels on the new border are...
isNewBorder = (conv2(double(isZeroOnBorder),crossKernel,'same')... %% next to a zero on border
| isBorder )... %% or on the border of the matrix
& (~isZeroOnBorder); %% and are not zeros on border
newBorderLength=nnz(isNewBorder) %% counting and obtaining result