Ширина и высота вращающегося объекта в форме многоугольника - Matlab - PullRequest
2 голосов
/ 16 апреля 2020

На основании этого вопроса Я пытаюсь вычислить ширину и высоту объекта. Я сделал это, преобразовав исследуемый объект в многоугольник и повернул его. Как я могу извлечь ширину и высоту повернутого объекта многоугольника? Есть ли способ сделать это с помощью regionprop и будет ли он более эффективным?

Код:

clc;
clear;
close all;

Image = rgb2gray(imread('pillsetc.png'));
BW = imbinarize(Image);
BW = imfill(BW,'holes');
BW = bwareaopen(BW, 100);
[B,L] = bwboundaries(BW,'noholes');

imshow(Image);
hold on;

k=3;
stat = regionprops(BW,'Centroid','Orientation','MajorAxisLength');
b = B{k};
yBoundary = b(:,2);
xBoundary = b(:,1);
centroidObject = stat(k).Centroid;
xCentre = centroidObject(:,2);
yCentre = centroidObject(:,1);
plot(yCentre, xCentre, 'r*')

orientationDegree =  stat(k).Orientation
hlen = stat(k).MajorAxisLength/2;
cosOrient = cosd(stat(k).Orientation);
sinOrient = sind(stat(k).Orientation);
xcoords = xCentre + hlen * [cosOrient -cosOrient];
ycoords = yCentre + hlen * [-sinOrient sinOrient];

plot(yBoundary, xBoundary, 'r', 'linewidth', 3);
pgon = polyshape(yBoundary, xBoundary);  
polyRot = rotate(pgon,(90+orientationDegree),centroidObject);  
plot(polyRot);  

[xlim,ylim] = boundingbox(polyRot);
Height = xlim(2) - xlim(1); 
Width = ylim(2) - ylim(1);

1 Ответ

1 голос
/ 17 апреля 2020

Я бы использовал угол, возвращенный вычислением минимального диаметра Ферета, чтобы вращать многоугольник. Обычно при этом повороте поле представляет собой поле с минимальной площадью (исключения кажутся очень редкими). Функция «Ориентация» рассчитывается на основе эллипса наилучшего соответствия и не обязательно приведет к появлению небольшого прямоугольника.

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

нет никаких дополнительных затрат. Это код, который выполняет то, что я описываю:

Image = rgb2gray(imread('pillsetc.png'));
BW = imbinarize(Image);
BW = imfill(BW,'holes');
BW = bwareaopen(BW, 100);

stat = regionprops(BW,'ConvexHull','MinFeretProperties');

% Compute Feret diameter perpendicular to the minimum diameter
for ii=1:numel(stat)
    phi = stat(ii).MinFeretAngle; % in degrees
    p = stat(ii).ConvexHull * [cosd(phi),-sind(phi); sind(phi),cosd(phi)];
    minRect = max(p) - min(p); % this is the size (width and height) of the minimal bounding box
    stat(ii).MinPerpFeretDiameter = minRect(2); % add height to the measurement structure
end

Обратите внимание, что первое значение minRect в приведенном выше коде является шириной объекта и эквивалентно stat(ii).MinFeretDiameter. Два значения не идентичны, потому что они вычисляются по-разному, но они довольно близки. Второе значение minRect, которое сохраняется как «MinPerpFeretDiameter», является высотой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...