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

70 ビュー (過去 30 日間)
Ole 2016 年 8 月 14 日
コメント済み: John BG 2016 年 8 月 23 日
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.

### 採用された回答

John BG 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
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
John BG

#### 2 件のコメント

Ole 2016 年 8 月 22 日
Thank you.
John BG 2016 年 8 月 23 日
1. suggest any possible improvement