matlab अपने केंद्र तत्व के आसपास संख्याओं के 1D सदिश को घूर्णन करके 2 डी छवि कैसे बनाऊं?



image-processing rotation (1)

मेरे पास 1D वेक्टर हैं जो एक सर्कुलर सममित ऑब्जेक्ट के केंद्र कट का प्रतिनिधित्व करते हैं। सदिश ही अपने केंद्र तत्व के सममित है। मैं MATLAB में अपने ऑब्जेक्ट तत्व के आसपास 1 डी सदिश को घूर्णन करके मूल वस्तु की एक 2 डी छवि बनाना चाहता हूं।

मैंने निम्न कोड (संख्याओं के एक डमी मूल सदिश के साथ) की कोशिश की, लेकिन मैं उत्पन्न 2 डी छवि से प्राप्त केंद्र को मूल 1 डी वेक्टर से मेल नहीं खाता, जैसा कि आप कोड चलाते हैं, यह देखा जा सकता है मैं किसी भी मदद की सराहना करता हूँ !!!

close all; clc    

my1D_vector=[ zeros(1,20) ones(1,15) zeros(1,20)]; % original vector

len=length(my1D_vector);    
img=zeros(len, len);
thetaVec=0:0.1:179.9; % angles through which to rotate the original vector  
numRotations=length(thetaVec);

% the coordinates of the original vector and the generated 2D image:
x=(1:len)-(floor(len/2)+1);  
y=x;

[X,Y]=meshgrid(x,y);

for ind_rotations=1:numRotations
    theta=pi/180*thetaVec(ind_rotations);
    t_theta=X.*cos(theta)+Y.*sin(theta);        
    cutContrib=interp1(x , my1D_vector , t_theta(:),'linear');
    img=img+reshape(cutContrib,len,len);
end
img=img/numRotations;

figure('name','original vector');plot(x,my1D_vector,'b.-')
figure('name','generated 2D image');  imagesc(x,y,img); colormap(gray) ; 

figure('name','comparison between the original vector and a center cut from the generated 2D image');
plot(x,my1D_vector,'b.-')
hold on
plot(x,img(find(x==0),:),'m.-')
legend('original 1D vector','a center cut from the generated 2D image')


मैंने आपके कोड का पालन नहीं किया लेकिन इसके बारे में कैसे:

V = [ zeros(1,20) ones(1,15) zeros(1,20)]; % Any symmetrical vector
n = floor(numel(V)/2); 

r = [n:-1:0, 1:n]; % A vector of distance (measured in pixels) from the center of vector V to each element of V

% Now find the distance of each element of a square 2D matrix from it's centre. @(x,y)(sqrt(x.^2+y.^2)) is just the Euclidean distance function. 
ri = bsxfun(@(x,y)(sqrt(x.^2+y.^2)),r,r');

% Now use those distance matrices to interpole V
img = interp1(r(1:n+1),V(1:n+1),ri);

% The corners will contain NaN because they are further than any point we had data for so we get rid of the NaNs
img(isnan(img)) = 0; % or instead of zero, whatever you want your background colour to be

इसलिए कोण पर अंतःप्रेरित करने के बजाय, मैं त्रिज्या पर एक दूसरे के बीच में घुसना करता हूं। तो r , 1 डी में V के प्रत्येक तत्व के केंद्र से दूरी के एक वेक्टर को दर्शाता है ri फिर 2 डी में केंद्र से दूरी का प्रतिनिधित्व करता है और ये हम उन मूल्यों को जोड़ते हैं जो हम करना चाहते हैं। मैं तब केवल r और V आधे का उपयोग करता हूं क्योंकि वे सममित हैं।

आप बाद में 0 सभी NaN एस सेट कर सकते हैं क्योंकि आप कोनों को घुसना नहीं कर सकते क्योंकि उनका त्रिज्या V में आपके दूर के बिंदु के त्रिज्या से बड़ा है।

मैं अपना प्लॉटिंग कोड इस्तेमाल कर रहा हूं

तथा

नीले और मैजेन्टा वक्र बिल्कुल ओवरलैप होते हैं

व्याख्या

कल्पना कीजिए कि आपका सदिश, V , केवल एक 1 बाय 5 वेक्टर था। तब यह आरेख दिखाता है कि r और ri क्या होगा:

मैंने इसे चित्र पर चिह्नित नहीं किया लेकिन r' बीच का स्तंभ होगा अब हमारे पास से कोड है

ri = bsxfun(@(x,y)(sqrt(x.^2+y.^2)),r,r');

और चित्र के अनुसार r = [2,1,0,1,2] अब प्रत्येक पिक्सेल के लिए हमारे पास केंद्र से यूक्लिडियन दूरी है इसलिए पिक्सेल (1,1) sqrt(r(1).^2+r(1).^2) जो कि sqrt(2.^2+2.^2) जो कि आरेख में दिखाए गए अनुसार sqrt(8) है।

इसके अलावा आप देखेंगे कि मैंने कोने के पिक्सल को "ग्रेड" किया है इन पिक्सल हमारे डेटा के किसी भी बिंदु से केंद्र से आगे हैं क्योंकि हमारे डेटा की अधिकतम त्रिज्या (केंद्र से दूरी) 2 लेकिन sqrt(8) > sqrt(5) > 2 ताकि आप उस डेटा को दोहराए नहीं जा सकें, आप उनके लिए मूल्य प्राप्त करने के लिए एक्सट्रपलेशन करना होगा। interp1 1 इन बिंदुओं के लिए interp1 देता है।

प्रक्षेप क्यों काम करता है? पिक्सेल के केंद्र के संदर्भ में प्रत्येक पिक्सेल की स्थिति के बारे में सोचें अब इस आरेख में, लाल चक्र होता है जब आप बाहरी तत्वों (यानी r==2 ) को घुमाएंगे और हरे रंग के तत्व 1 को घूमते हुए (यानी r==1 )। आप देखेंगे कि पिक्सेल जो sqrt(2) (नीला तीर) की दूरी को प्राप्त करता है, इन दो त्रि-त्रि-त्रि-त्रि-त्रि-क्षुद्रों के बीच होता है जब हम उन्हें घुमाने और इसलिए हमें उन दो पिक्सेल के बीच उस दूरी को दोहराया जाना है।