Plot polygons as image to process

조회 수: 11 (최근 30일)
Nhat Nguyen
Nhat Nguyen 2023년 2월 23일
댓글: Image Analyst 2025년 2월 19일
Hi guys,
I have data of a curve which I want plot it as an image. And later use function regionprops to get its orientation and centroid.
Is there any way I can do that, or directly get the orientation of the curve data.
The image is the polygon plot of the curve, while the data has not duplicate point, the function return:
"Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or
unexpected results. Input data has been modified to create a well-defined polyshape."
And delete half of my data to draw that image, any suggestion I could do to prevent that?
Thanks!

채택된 답변

Simon Chan
Simon Chan 2023년 2월 23일
You may use function centroid to determine the centroid of a polyshape.
When you convert the polyshape into an image, the result of the centroid would be different due to the resolution of a pixel on an image.
Consider the following example with a very simple polyshape:
pgon = polyshape([20 20 17 15],[7 3 2 9]);
[x,y] = centroid(pgon)
x = 17.7984
y = 5.4419
Now, convert it to an image:
A = zeros(25,25);
for k = 1:length(pgon.Vertices)
A(pgon.Vertices(k,2),pgon.Vertices(k,1))=1;
end
J = bwconvhull(A);
regionprops(J,'Centroid','Orientation')
ans = struct with fields:
Centroid: [17.6875 5.5000] Orientation: 63.9994
If you want to increase the resolution, for example, 100 times. This would give you a closer value.
MagFactor = 100;
A = zeros(25*MagFactor,25*MagFactor);
for k = 1:length(pgon.Vertices)
A(pgon.Vertices(k,2)*MagFactor,pgon.Vertices(k,1)*MagFactor)=1;
end
J = bwconvhull(A);
stat = regionprops(J,'Centroid','Orientation')
stat = struct with fields:
Centroid: [1.7798e+03 544.2466] Orientation: 65.4331
cent = stat.Centroid/MagFactor
cent = 1×2
17.7977 5.4425
figure
ax1 = subplot(1,2,1);
plot(pgon);
axis(ax1,'image');
ax1.XLim = [1 25];
ax1.YLim = [1 25];
ax2 = subplot(1,2,2);
imshow(J);
ax2.YDir='normal';
  댓글 수: 4
Eric
Eric 2025년 2월 19일
insertShape seems to be the standard Matlab solution...
Image Analyst
Image Analyst 2025년 2월 19일
@Eric, insertShape burns a shape into an image array. It requires the Computer Vision Toolbox.
poly2mask creates a binary image and requires the Image Processing Toolbox. It does not burn pixels/shapes into another image though you could use the binary image to burn it into a gray scale or RGB image.
Functions fill and patch work on plots (not images, though you can put hold on and use them over images, in which case they'd be in the overlay, not burned into the image itself). They are included in standard, base MATLAB.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Image Analyst
Image Analyst 2023년 2월 23일
If you have the x and y of the outline, you can use poly2mask to turn it into an image and then use regionprops to get its orientation and centroid.
mask = poly2mask(x, y, rows, columns);
props = regionprops(mask, 'Orientation', 'Centroid');

카테고리

Help CenterFile Exchange에서 Elementary Polygons에 대해 자세히 알아보기

제품


릴리스

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by