Do not plot the shape in the middle and polar transformation
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
Alex Perrakis
il 18 Nov 2021
Commentato: Alex Perrakis
il 18 Nov 2021
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/805224/image.jpeg)
Hello Guys, i have the above seen plot and i would like not to plot the shape seen within the circle and the do a polar tranformation. So that that circle appears to be a line.
6 Commenti
Risposta accettata
Adam Danz
il 18 Nov 2021
Modificato: Adam Danz
il 18 Nov 2021
This demo uses a cleaned up version of your code and then does the following,
- Computes center of noisy circle
- Shifts noisy circle to (0,0)
- Converts shifted image to polar coordinates
- finds the spike in rho values (radii) based on thresholding
- Removes the spike.
If you want a smooth circle, you could fit the final (x,y) values to a cirlce (see example) or just use the median rho values in polar coordinates.
% Your code cleaned up
pic01=imread("1.png");
pic050=im2gray( imread("50.png") );
newpicture=imsubtract(pic01,pic050);
%imshow(newpicture)
% level = graythresh(newpicture);
level = 0.1405;
newbinpic = imbinarize(newpicture,level);
%imshowpair(newpicture,newbinpic,'montage')
newbinpic2=bwpropfilt(newbinpic,'perimeter',1);
% imshowpair(newbinpic2,newpicture,'montage');
boundaries = bwboundaries(newbinpic2,'noholes');
% Plot raw (x,y) values
x = boundaries{1}(:,2);
y = boundaries{1}(:,1);
figure()
subplot(2,2,1)
plot(x,y, 'r-')
title('raw values')
axis equal tight
hold on
% Assuming (x,y) is a noisy circle, find center
cnt = [min(x)+range(x)/2, min(y)+range(y)/2];
xline(cnt(1))
yline(cnt(2))
% Shift to (0,0) and compute polar coordinates
[theta, rho] = cart2pol(x-cnt(1), y-cnt(2));
% Plot in polar coord
subplot(2,2,2)
polarplot(theta, rho)
title('Polar coord.')
% Define a reasonable threshold to isolate the spike in RHO values
% 90% of the median looks OK
subplot(2,2,3)
plot(rho)
threshold = median(rho)*.9;
yline(threshold, '-k', 'Threshold')
ylabel('rho'); xlabel('index')
title('rho values')
% Find start and end of peak
peakIdx = find(rho < threshold);
peakIdx(2:end-1) = [];
xline(peakIdx(1)) % plot start of peak
xline(peakIdx(2)) % plot end of peak
% Remove the peak
theta(peakIdx(1):peakIdx(2)) = []; % you can do the same with x
rho(peakIdx(1):peakIdx(2)) = []; % you can do the same with y
% Plot the circle without the interior object
subplot(2,2,4)
polarplot(theta,rho)
title('Inner removed')
4 Commenti
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Weather and Atmospheric Science in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!