Нахождение области изображения - PullRequest
4 голосов
/ 30 января 2012

Я использовал алгоритм маркировки подключенных компонентов (bwconncomp) для маркировки различных частей двоичного изображения (MATLAB). Теперь мне нужно рассчитать площадь разных меток и убрать метки с меньшей площадью. Могу ли я использовать команду поиска области по умолчанию или есть какие-то конкретные команды для этого в Matlab ... Справка ..

Ответы [ 3 ]

9 голосов
/ 30 января 2012

Из документации :

CC = bwconncomp (BW) возвращает подключенные компоненты CC, найденные в BW.Двоичное изображение BW может иметь любое измерение.CC - это структура с четырьмя полями ...

Последнее поле в CC: PixelIdxList, а именно:

[a] ячейка размером 1 на NumObjectsмассив, где k-й элемент в массиве ячеек - это вектор, содержащий линейные индексы пикселей в k-м объекте.

Вы можете найти область каждой метки, посмотрев на длину соответствующей записив массиве ячеек.Примерно так:

areas_in_pixels = cellfun(@length, CC.PixelIdxList);

PixelIdxList - это массив ячеек, каждый элемент которого содержит линейные индексы пикселей, присутствующих в этом подключенном компоненте.Строка кода выше определяет длину каждой ячейки в массиве ячеек, то есть количество пикселей в каждом подключенном компоненте.

Я использовал cellfun, чтобы сделать код коротким и эффективным.Другой способ написания одной и той же вещи будет выглядеть примерно так:

areas_in_pixels = nan(1, length(CC.PixelIdxList);
for i = 1:length(CC.PixelIdxList)
  areas_in_pixels(i) = length(CC.PixelIdxList{i});
end 

Для каждого подключенного компонента вы можете найти размер этого компонента в пикселях, обратившись к элементу Area_in_pixels:

areas_in_pixels(34)   %# area of connected component number 34
4 голосов
/ 04 февраля 2012

Если вы не хотите писать много кода, как описано выше, просто используйте встроенные функции MATLAB для определения области. Пометьте свои компоненты, и из свойств компонента вы можете узнать площадь этого компонента. Предположим, что Bw является двоичным изображением:

[B,L] = bwboundaries(Bw,'noholes');
stats = regionprops(L,'Area','perimeter');

for k = 1:length(B) 
  area(k)=stats.Area;
end
2 голосов
/ 02 ноября 2012

Вы можете сделать это еще лучше, избегая цикла for следующим образом:

[B,L] = bwboundaries(Bw,'noholes');
stats = regionprops(L,'Area','perimeter');
area = [stats.Area];

Лучший, -Будет

...