Функция 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