## How to convert 2D image of circle shape to 2D straight line ?

Ole

### Ole (view profile)

さんによって質問されました 2016 年 8 月 14 日

### John BG (view profile)

さんによって コメントされました 2016 年 8 月 23 日
John BG

### John BG (view profile)

さんの 回答が採用されました
I have an image 2D that looks pretty much like donut how to convert it to straight lines ?
Basically I would like to sum over angle. And it is easier on rectangular grid. It is some conformal transformation ? To something that look like #### 0 件のコメント

サインイン to comment.

## 1 件の回答

### John BG (view profile)

2016 年 8 月 17 日
採用された回答

Ole
the following script answers your question, attached script and the image of your question with name used in the script.
Following, the script commented:
clc,cla;
format long;
[sz1 sz2 sz3]=size(A);
szx=sz2;szy=sz1;
A1=A(:,:,1);A2=A(:,:,2);A3=A(:,:,3); % working with binary maps or grey scale images this wouldn't be necessary
figure(1);imshow(A);
hold all;
Cx=floor(szx/2);Cy=floor(szy/2);
plot(Cx,Cy,'co'); % because observe image centre not centered
Rmin=80;Rmax=400; % radius search range for imfindcircles
[centers, radii]=imfindcircles(A,[Rmin Rmax],... % outer circle
'ObjectPolarity','dark','Sensitivity',0.9);
hold all; % inner circle
'ObjectPolarity','bright');
% L=floor(.5*(radii+radii2)); % this is NOT the length X that should have the resulting XY morphed graph
L=floor(2*pi*radii); % expected length of the morphed graph
cx=floor(.5*(centers(1)+centers2(1))); % coordinates of averaged circle centres
cy=floor(.5*(centers(2)+centers2(2)));
plot(cx,cy,'r*'); % check avg centre circle is not aligned to figure centre
plot([cx 1],[cy 1],'r-.'); Observe image centre and inner circle centre are not aligned.
IF you try to sweep with a for loop using angle the chances are that depending upon how big is the image there are going to be missing pixels, or if step too big (image too small) either way it may deform resulting figure.
I also tried sweep following outer rectangular perimeter, it was getting complicated.  I choose to sweep with an outer circle 5 pixels away from the outer circle.
t=[45:360/L:404+1-360/L]; % if step=1 then we only get 360 points but need an amount of L points
% if angle step 1/L over minute waiting for for loop to finish
R=radii+5;x=R*sind(t)+cx;y=R*cosd(t)+cy; % build outer perimeter
hL1=plot(x,y,'m'); % axis equal;grid on;
% hold all;
% plot(hL1.XData,hL1.YData,'ro'); x_ref=hL1.XData;y_ref=hL1.YData;
% Sx=zeros(ceil(R),1);Sy=zeros(ceil(R),1);
Sx={};Sy={};
for k=1:1:numel(hL1.XData)
Lx=floor(linspace(x_ref(k),cx,ceil(R)));
Ly=floor(linspace(y_ref(k),cy,ceil(R)));
% plot(Lx,Ly,'go'); % check
% plot([cx x(k)],[cy y(k)],'r');
% L1=unique([Lx;Ly]','rows');
Sx=[Sx Lx'];Sy=[Sy Ly'];
end
Now Sx and Sy contain the indices to be used to point at the values of the start image.
sx=cell2mat(Sx);sy=cell2mat(Sy);
[s1 s2]=size(sx);
Out of answering other similar questions, building Red Green Blue and then assembling them is the simplest and fastest way:
B1=uint8(zeros(s1,s2));
B2=uint8(zeros(s1,s2));
B3=uint8(zeros(s1,s2));
for n=1:1:s2
for k=1:1:s1
B1(k,n)=A1(sx(k,n),sy(k,n));
B2(k,n)=A2(sx(k,n),sy(k,n));
B3(k,n)=A3(sx(k,n),sy(k,n));
end
end
C=uint8(zeros(s1,s2,3));
C(:,:,1)=B1;
C(:,:,2)=B2;
C(:,:,3)=B3;
figure(2);imshow(C); Ole
if you find this answer useful would you please be so kind to mark my answer as Accepted Answer?
To any other reader, please if you find this answer of any help solving your question,
please click on the thumbs-up vote link,
John BG

Ole

2016 年 8 月 22 日
Thank you.
John BG

### John BG (view profile)

2016 年 8 月 23 日
thanks for accepting my answer.
Please feel free to
1. suggest any possible improvement