Создание ограничивающего прямоугольника вокруг фрагментированного силуэта в matlab
Здравствуйте, я работаю с matlab. Я пытаюсь создать ограничивающую рамку вокруг силуэта. Проблема здесь в том, что силуэт фрагментирован как показано здесь
Код, который я попробовал, -
BW=bwconncomp(image);
STATS = regionprops(BW, 'FilledArea','BoundingBox');
Это дает мне ограничивающую рамку вокруг части силуэта. Я не могу использовать dilate
, которая является предпочтительной морфологической операцией в этом случае, поскольку она соединяет силуэт с соседними фрагментами.
Заранее спасибо за помощь.
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 минимальный ограничивающий прямоугольник