Как получить прямоугольное изображение из regionprops (Image, 'BoundingBox') в Matlab?

У меня есть некоторые частицы, которые я идентифицировал на большом изображении, и мне нужно разобрать на более мелкие изображения для каждой частицы. Я использовал функцию BoundingBox для regionprops, но пока не добился успеха. Как теперь создать прямоугольный фрагмент изображения с помощью BoundingBox? Я могу использовать BoundingBox, чтобы нарисовать прямоугольник на исходном изображении, но параметры, возвращаемые BoundingBox, не имеют размера в пикселях (x, y, ширина, высота), (x1, y1, x2, y2) и т. Д., Что я ожидает возврата ограничивающей рамки. Я написал несколько примеров кода с использованием coin.png, чтобы их было легче понять. Можете ли вы помочь мне с этим? Спасибо!

figure(1);
I = imread('coins.png');
bw = im2bw(I, graythresh(I));
bw2 = imfill(bw,'holes');
imshow(bw2);


figure(2);
L = bwlabel(bw2);
imshow(label2rgb(L, @jet, [.7 .7 .7]))

figure(3);
imshow(I);
s = regionprops(L, 'BoundingBox');
rectangle('Position', s(1).BoundingBox);

person user391339    schedule 29.10.2011    source источник


Ответы (2)


Параметры, возвращаемые regionprops, являются [y,x,width,height] в координатах matrix (см. Также " неожиданный Matlab ".

Таким образом, чтобы извлечь прямоугольник, вы пишете:

subImage = I(round(s(1).BoundingBox(2):s(1).BoundingBox(2)+s(1).BoundingBox(4)),...
       round(s(1).BoundingBox(1):s(1).BoundingBox(1)+s(1).BoundingBox(3)));
person Jonas    schedule 29.10.2011
comment
Ага, и вы можете перебрать s.NumObjects, итератор заменяет 1 Джонаса. - person reve_etrange; 30.10.2011

Согласно документации REGIONPROPS:

BoundingBox равно [ul_corner width], где:

  • ul_corner: имеет форму [x y z ...] и указывает верхний левый угол ограничивающей рамки.

  • ширина: имеет форму [x_width y_width ...] и определяет ширину ограничивающей рамки по каждому измерению.

Теперь вы можете использовать функции IMCROP как imcrop(I, rect), где:

rect - это четырехэлементный вектор положения [xmin ymin width height], который определяет размер и положение прямоугольника обрезки.

Таким образом:

s = regionprops(L, 'BoundingBox');

subImage = imcrop(I, s(1).BoundingBox);
imshow(subImage)
person Amro    schedule 30.10.2011
comment
Я не знал об этом использовании imcrop, его гораздо удобнее читать, чем напрямую индексировать изображение. FWIW, документы говорят, что imcrop округляется так же, как Джонас в своем ответе. - person reve_etrange; 30.10.2011
comment
@reve_etrange: важно понимать различные методы определения местоположения изображения: mathworks.com/help/toolbox/images/brcu_al-1.html - person Amro; 30.10.2011
comment
Ссылка выше изменилась на: mathworks.com/help/images/image- координаты-системы.html. Также Image Processing Toolbox представила новые классы пространственной привязки: imref2d и imref3d - person Amro; 21.01.2014