1

我有一个数组,其图像如下所示。数组中的值表示每个像素/网格处的粒子数。我想计算非零粒子沿非零粒子存在的外围/边界的分布(外围/边界是指离中心最远的点的分布)。作为输出,我想获得:

1)沿外围/边界的非零粒子数,以及

2)这些粒子所在的像素/网格数

有什么快速/有效的方法吗?

在此处输入图像描述

编辑 1:描述边界示例的快照 边界线跟踪非零粒子。 在此处输入图像描述

4

3 回答 3

2

从粒子计数矩阵开始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))

注意:此解决方案将确保边界线上的每个点都具有非零粒子计数

于 2013-11-07T05:03:53.923 回答
1

peri矩阵逻辑索引的外围M

peri = true(25);
peri(2:end-1, 2:end-1) = false;

n那么,外围的粒子数为n = M(peri)。(1) 沿边界的粒子总数为sum(n)。(2) 它们所在的像素数为sum(n > 0)

于 2013-11-07T00:19:11.707 回答
1

-我想出了这个算法来解决你的问题。

- 你想要什么的细节不是 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
于 2013-11-07T05:02:58.623 回答