Подогнать внутренний круг объекта - Matlab - PullRequest
1 голос
/ 09 апреля 2020

I sh, чтобы поместиться во внутренний круг объекта контура, как я могу это сделать? в показанном примере я попытался вычислить r, разделив MajorAxisLength, но он не работает.

Код:

clc;
clear;
RGB = imread('pillsetc.png');
I = rgb2gray(RGB);
bw = imbinarize(I);
imshow(bw)
bw = bwareaopen(bw,30);
bw = imfill(bw,'holes');
imshow(bw)
[B,L] = bwboundaries(bw,'noholes');
stats = regionprops(L,'Centroid','MajorAxisLength');
hold on   
k=3;  
boundary = B{k};
r = stats(k).MajorAxisLength/2;
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2),'+');
theta = linspace(0,2*pi);
x = r*cos(theta) + centroid(1);;
y = r*sin(theta) + centroid(2);;
plot(x,y)
axis equal

enter image description here

enter image description here

1 Ответ

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

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

Мои выводы следующие:

цель Рассчитать радиус вписанного круга в прямоугольник необходимо для оценки длины короткого края.

Если мы предположим, что эллипс c, прилегающий к прямоугольнику, дает примерно ту же площадь, что и прямоугольник, а отношение короткого / длинного края такое же, как у крысы по малой / большой оси ios, то мы можем получить следующее уравнение:

x=short edge of the rectangle;
y=long edge of the rectangle;
b=minor axis of the fitted ellipse;
a=major axis of the fitted ellipse;

, тогда мы получим

x/y=b/a
x*y=a*b*pi

, из которого мы можем решить, что значение x равно sqrt(pi)*b. Это делает радиус вписанного круга sqrt(pi)/2*b.

, изменяя ваши две строки кода ниже

stats = regionprops(L,'Centroid','MinorAxisLength');
...
r = stats(k).MinorAxisLength*(sqrt(pi)/4);
...

Я смог получить что-то довольно близкое к вписанному кругу. Попробуйте.

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