Получить смежные индексы из линейного индексирования в Matlab - PullRequest
0 голосов
/ 24 мая 2018

Учитывая набор линейных индексов матрицы, как я могу получить из нее только смежные индексы?Под соседним я понимал индексы, которые находятся слева, справа, сверху, снизу или по диагонали позиции индекса.

Например, для матрицы 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, все остальные имеют соседей в наборе индексов.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы можете использовать 2D-свертку для вычисления количества ненулевых соседей каждой записи и использовать это в качестве логической маски:

result = find(B & conv2(B~=0, [1 1 1; 1 0 1; 1 1 1], 'same'));
0 голосов
/ 24 мая 2018

Функция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...