Вписать круг объекта повернутых результатов - Matlab - PullRequest
1 голос
/ 14 апреля 2020

Я изменил код на основе показанного в https://www.mathworks.com/matlabcentral/answers/377838-please-how-can-i-find-the-center-and-the-radius-of-the-inscribed-circle-of-a-set-of-points, чтобы найти круг для надписи, но я не понимаю, почему изображение поворачивается. Почему и как я могу это решить?

Код:

url='https://i.pcmag.com/imagery/reviews/00uaCVfzQ4Gsuhmh85WvT3x-4.fit_scale.size_1028x578.v_1569481686.jpg';

Image = rgb2gray(imread(url));   
Image = imcomplement(Image);
fontSize = 10; 
% determine contours
BW = imbinarize(Image);
BW = imfill(BW,'holes');
[B,L] = bwboundaries(BW,'noholes');
k = 1;
b = B{k};
y  = b(:,2);
x  = b(:,1);

 subplot(2, 2, 1);
plot(x, y, 'b.-', 'MarkerSize', 3);
grid on;
title('Original Points', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
% Make data into a 1000x1000 image.
xMin = min(x)
xMax = max(x)
yMin = min(y)
yMax = max(y)
scalingFactor = 1000 / min([xMax-xMin, yMax-yMin])
x2 = (x - xMin) * scalingFactor + 1;
y2 = (y - yMin) * scalingFactor + 1;
mask = poly2mask(x2, y2, ceil(max(y2)), ceil(max(x2)));
% Display the image.
p2 = subplot(2, 2, 2);
imshow(mask);
axis(p2, 'on', 'xy');
title('Mask Image', 'FontSize', fontSize);
% Compute the Euclidean Distance Transform
edtImage = bwdist(~mask);
% Display the image.
p3 = subplot(2, 2, 3);
imshow(edtImage, []);
axis(p3, 'on', 'xy');
% Find the max
radius = max(edtImage(:))
% Find the center
[yCenter, xCenter] = find(edtImage == radius)
% Display circles over edt image.
viscircles(p3, [xCenter, yCenter], radius,'Color','g');
% Display polygon over image also.
hold on;
plot(x2, y2, 'r.-', 'MarkerSize', 3, 'LineWidth', 2);
title('Euclidean Distance Transform with Circle on it', 'FontSize', fontSize);
% Display the plot again.
subplot(2, 2, 4);
plot(x, y, 'b.-', 'MarkerSize', 3);
grid on;
% Show the circle on it.
hold on;
% Scale and shift the center back to the original coordinates.
xCenter = (xCenter - 1)/ scalingFactor + xMin
yCenter = (yCenter - 1)/ scalingFactor + yMin
radius = radius / scalingFactor
rectangle('Position',[xCenter-radius, yCenter-radius, 2*radius, 2*radius],'Curvature',[1,1]);
title('Original Points with Inscribed Circle', 'FontSize', fontSize);

Исходное изображение: enter image description here

Выходное изображение enter image description here

1 Ответ

0 голосов
/ 14 апреля 2020

[B,L] = bwboundaries(BW,...) возвращает B значения строки и столбца ( документация ). То есть первый столбец B{k} равен y, второй - x.

После изменения этого бита кода следующим образом:

y = b(:,1);
x = b(:,2);

вы заметите что изображение перевернуто! Это связано с тем, что в изображении ось Y увеличивается вниз (y - номер строки в матрице), тогда как на графике ось Y увеличивается (математическая система координат).

Оси, где вы используете imshow, автоматически устанавливая правильную систему координат, но затем вы делаете axis(p3, 'on', 'xy');, переворачивая его снова вверх дном. Вместо этого используйте

axis(p1, 'on', 'image');

на осях, где вы не используете imshow (т.е. верхний левый и нижний правый).

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