从matlab中的线性索引中获取相邻索引

从matlab中的线性索引中获取相邻索引,matlab,matrix,indexing,Matlab,Matrix,Indexing,给定矩阵的一组线性索引,如何仅从中获取相邻索引?。我所说的相邻索引是指位于索引的左、右、上、下或对角位置的索引 例如,给定一个4*5矩阵 B = [1 0 0 0 0; 1 1 0 1 1; 0 0 1 0 1; 1 0 1 0 0;] B[1,2,4,6,11,12,14,18,19]的线性指数(它对应于非零entries的指数),我怎么能只选择至少有一个邻居的指数?在本例中,我的输入是 [1, 2, 4, 6, 11, 12, 14, 18, 19] 我希望

给定矩阵的一组线性索引,如何仅从中获取相邻索引?。我所说的相邻索引是指位于索引的左、右、上、下或对角位置的索引

例如,给定一个4*5矩阵

B = [1 0 0 0 0;
     1 1 0 1 1;
     0 0 1 0 1;
     1 0 1 0 0;]
B[1,2,4,6,11,12,14,18,19]的线性指数(它对应于非零entries的指数),我怎么能只选择至少有一个邻居的指数?在本例中,我的输入是

[1, 2, 4, 6, 11, 12, 14, 18, 19]
我希望输出是

[1, 2, 6, 11, 12, 14, 18, 19]
除了4之外,所有其他的索引集中都有邻居。

图像处理工具箱中的函数返回二进制图像中连接的组件。因为你的矩阵是一个二进制图像,也就是一个包含0和1的二维矩阵,我们可以使用它

调用函数

>> CC = bwconncomp(B);
返回一个结构,其中包含(除其他字段外)
PixelIdxList
,它是一个单元数组,其中每个元素都是对应于特定连接组件的像素索引数组。就您而言,这是:

>> CC.PixelIdxList

ans =

  1×2 cell array

    {8×1 double}    {[4]}
因此您有两个连接的组件:一个由8个像素组成,索引由
CC.PixelIdxList{1}
给出,另一个包含1个索引为
4
的像素

由于要删除所有没有邻居的像素,可以检查
CC.PixelIdxList
的所有元素的元素数,并仅使用一个元素删除所有元素:

>> numPixels = cellfun(@numel,CC.PixelIdxList);
>> toRemove = (numPixels == 1);
这为我们提供了一个数组
toRemove
,其中包含我们要保留的每个连接组件的
0
,以及我们要删除的每个连接组件的
1
。最后,您可以将要保留的所有连接组件连接到一个阵列中

>> allIdx = CC.PixelIdxList(~tooSmall);
>> allIdx = allIdx{:};
这给我们留下了想要的结果

>> allIdx

allIdx =

     1
     2
     6
    11
    12
    14
    18
    19

您可以使用2D卷积计算每个项的非零邻居数,并将其用作逻辑掩码:

result = find(B & conv2(B~=0, [1 1 1; 1 0 1; 1 1 1], 'same'));

听起来像是某种形式的邻接矩阵。请参阅以获取提示。您获得了我的+1,因为这不需要工具箱。