【问题标题】:Get the adjacent indexes from the linear indexing in matlab从matlab中的线性索引中获取相邻索引
【发布时间】:2018-05-24 09:48:47
【问题描述】:

给定矩阵的一组线性索引,我怎样才能从中只获取相邻的索引?相邻是指位于索引左侧、右侧、顶部、底部或对角线位置的索引。

例如,给定一个 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] 的线性索引(它对应于非零条目的索引),我怎样才能只选择具有至少一个邻居?在这种情况下,我的输入是

[1, 2, 4, 6, 11, 12, 14, 18, 19]

我希望输出是

[1, 2, 6, 11, 12, 14, 18, 19]

除了4之外,所有其他的在索引集中都有邻居。

【问题讨论】:

  • 听起来像是某种形式的邻接矩阵。有关提示,请参阅 this

标签: matlab matrix indexing


【解决方案1】:

您可以使用二维卷积计算每个条目的非零邻居的数量,并将其用作逻辑掩码:

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

【讨论】:

  • 你得到了我的 +1,因为这不需要工具箱。
【解决方案2】:

图像处理工具箱中的bwconncomp 函数返回二进制图像中的连通分量。由于您的矩阵是二进制图像,即包含零和一的二维矩阵,我们可以使用它。

调用函数

>> 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

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2011-10-22
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多