calculating angle between line of best fit and x axis
24 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
C.G.
am 7 Okt. 2021
Kommentiert: Star Strider
am 7 Okt. 2021
I have a set of coordinate points from a picture. I have used polyfit to find the line of best fit of these, but I want to find the angle between the line of best fit and the x axis, so the angle the pile of grains is sitting at. Can somebody tell me how I can do this?
%find the circles and get the coordinates
I = imread('testpic1.png');
imshow(I)
[X,Y]=meshgrid(1:size(I));
Rmin = 10;
Rmax = 20;
[cd, rd] = imfindcircles(I,[Rmin Rmax], 'ObjectPolarity', 'dark', 'Sensitivity', 0.94, 'Method','TwoStage');
viscircles(cd, rd, 'Color', 'b');
subplot(1,3,1)
imshow(I)
hold on
scatter(cd(:,1), cd(:,2),'r*')
cd = cd(cd(:,2) <315, :)
subplot(1,3,2)
imshow(I)
hold on
scatter(cd(:,1), cd(:,2),'r*')
%plot line of best fit
p = polyfit(cd(:,1),cd(:,2),1);
Bfit = polyval(p,cd(:,1));
subplot(1,3,3)
imshow(I)
hold on
scatter(cd(:,1),cd(:,2))
hold on
plot(cd(:,1),Bfit,'-r')
0 Kommentare
Akzeptierte Antwort
Star Strider
am 7 Okt. 2021
The slope is simply the tangent, so —
slope_angle = atand(p(1)) % Slope Angle (°)
Here, that comes out to be about 14.6°. The slope appears negative in the image plot because of the axes orientation being different in the images. Plotting it with both axes in their normal orientation (added at the end) shows it to be positive.
%find the circles and get the coordinates
I = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/760726/testpic1.png');
imshow(I)
[X,Y]=meshgrid(1:size(I));
Rmin = 10;
Rmax = 20;
[cd, rd] = imfindcircles(I,[Rmin Rmax], 'ObjectPolarity', 'dark', 'Sensitivity', 0.94, 'Method','TwoStage');
viscircles(cd, rd, 'Color', 'b');
subplot(1,3,1)
imshow(I)
hold on
scatter(cd(:,1), cd(:,2),'r*')
cd = cd(cd(:,2) <315, :)
subplot(1,3,2)
imshow(I)
hold on
scatter(cd(:,1), cd(:,2),'r*')
%plot line of best fit
p = polyfit(cd(:,1),cd(:,2),1)
Bfit = polyval(p,cd(:,1));
subplot(1,3,3)
imshow(I)
hold on
scatter(cd(:,1),cd(:,2))
hold on
plot(cd(:,1),Bfit,'-r')
slope_angle = atand(p(1)) % Slope Angle (°)
figure
plot(cd(:,1),cd(:,2),'.')
hold on
plot(cd(:,1),Bfit,'-r')
hold off
axis('equal')
title(sprintf('Slope = %.1f°',slope_angle))
.
2 Kommentare
Weitere Antworten (1)
Alan Stevens
am 7 Okt. 2021
Bearbeitet: Alan Stevens
am 7 Okt. 2021
Take the arctangent of the gradient of the straight line.
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!