сегментация объектов с помощью bwlabel - PullRequest
0 голосов
/ 21 января 2020

У меня есть двоичное изображение, и мне интересно выполнять сегментацию только по символам, которые появляются в горизонтальной центральной линии, потому что применение bwlabel ко всему изображению возвращает мне 80 объектов, но Меня интересует только символы, пиксели которых появляются в центральной линии.

если я применю bwlabel к центральной строке подзаголовка, я получу 9 объектов, из них мне нужно отбросить первый символ слева от оставшиеся 9-1, я должен выбрать N (например, N = 6) те, которые имеют наибольшую площадь (сортировка и выбор).

Я сделал что-то вроде:

% Ib1 = binaryImage;

off = height / 2;
Ib2 = Ib1 (off-2: off + 2, :);
[Ietiq, NumObj] = bwlabel (Ib2);

stats = regionprops (Ietiq, 'Area', 'Centroid');
areas_matlab = cat (1, stats.Area);
centroid_matlab = cat (1, stats.Centroid);
areas_matlab = sort (areas_matlab, 'descend');

I не знаю, как выбрать только самые большие N объектов и сегментировать эти объекты, обнаруженные горизонтальной центральной линией (только часть пикселей, составляющих символ) на исходном изображении Ib1.

благодаря те, кто сможет мне помочь

1 Ответ

1 голос
/ 23 января 2020

Функция Matlab 'sort' имеет второй аргумент, который предоставляет массив индексов элементов, описывающих расположение отсортированных элементов. Вы можете нарезать его на N, чтобы получить нужные N крупнейших подключенных компонентов из regionprops.

оно должно выглядеть следующим образом:

[areas_matlab, ii] = sort (areas_matlab, 'descend')
N=6;
max_n_stats=stats(ii(1:N));

РЕДАКТИРОВАТЬ: Для визуализации результат - добавьте функцию PixelIdxList к вызову функции regionprops и нарисуйте выбранные символы:

Ib22 = zeros(size(Ib2));
for ii=1:N
    Ib22(max_n_stats(ii).PixelIdxList) = ii;
end

Ib11 = zeros(size(Ib1));
Ib11(off-2: off + 2) = Ib22;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...