Создание ограничивающего прямоугольника вокруг фрагментированного силуэта в matlab


Здравствуйте, я работаю с matlab. Я пытаюсь создать ограничивающую рамку вокруг силуэта. Проблема здесь в том, что силуэт фрагментирован как показано здесь

Введите описание изображения здесь

Код, который я попробовал, -

BW=bwconncomp(image);
STATS = regionprops(BW, 'FilledArea','BoundingBox');
Это дает мне ограничивающую рамку вокруг части силуэта. Я не могу использовать dilate, которая является предпочтительной морфологической операцией в этом случае, поскольку она соединяет силуэт с соседними фрагментами.

Заранее спасибо за помощь.

2 2

2 ответа:

Здесь есть что-то, чтобы заставить вас идти с изображением, которое вы разместили. Я использовал линейный структурирующий элемент с углом, чтобы расширить изображение и усилить сигнал от маленьких белых кусочков слева от силуэта. Затем с помощью regionprops его легче идентифицировать объекты по отдельности и выбрать объект с наибольшей площадью (то есть силуэт), вычисленный с помощью свойства FilledArea, и сообщить обратно ограничивающую рамку на исходном изображении. Может быть, это и не идеально, но это только начало, и, похоже, так оно и есть. дают довольно приличный результат.

Вот код:

clear
clc
close all

BW = im2bw(imread('Silhouette.png'));
BW = imclearborder(BW);

%// Dilate with a line structuring element oriented at about 60 degrees to
%// amplify the elements at an angle that you don't want.
se = strel('line',5,60);        
dilateddBW = imdilate(BW,se);

figure;
imshow(dilateddBW)

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

Введите описание изображения здесь

Вызов regionprops и отображение вывода:

%// Get the region properties and select that with the largest area.
S = regionprops(dilateddBW,'BoundingBox','FilledArea','PixelIdxList');

boundingboxes = cat(1, S.BoundingBox);
FilledAreas = cat(1,S.FilledArea);

[~,MaxAreaIndex] = max(FilledAreas);

%// Get linear indices of the corresponding silhouette to display along
%// with its bounding box.
MaxIndices = S(MaxAreaIndex).PixelIdxList;

%// Create empty image to put the silhouette + box
NewIm = false(size(dilateddBW));

NewIm(MaxIndices) = 1;

figure;

imshow(BW)
rectangle('Position',boundingboxes(MaxAreaIndex,:),'EdgeColor','r')

Вывод:

Введите описание изображения здесь

Надеюсь, что это как-то поможет!

Поскольку у вас есть массив векторов, содержащий Индис пикселей(bwconncomp () возвращает структуру, у которой есть член с именем PixelIdxList), вы можете создать прямоугольник, найдя пиксели с min x, min y, max x, max y.

Вот хороший пример: 2D минимальный ограничивающий прямоугольник