2014-09-13 12 views
7

का उपयोग करके एक छवि को स्थानांतरित करना मैं एक्स (-j * 2 * pi * x * F) द्वारा fft के गुणा का उपयोग करके एक छवि (2 डी मैट्रिक्स द्वारा प्रतिनिधित्व) को स्थानांतरित करना चाहता हूं, जहां एक्स विस्थापन है। मेरे पास है:मैटलैब - एफएफटी

input=peaks(200); 
H=fftshift(fft2(fftshift(input))); 
x=19; 
H=H*exp(-1i*x*2*pi*F); 
IF_image=fftshift(ifft2(fftshift(H))); 
imshow(IF_image) 

लेकिन मैं पहचान करने मुसीबतों/मेरी इनपुट के बाद से एच में एफ [F] का प्रतिनिधित्व करने आ रही है एक 2 आयामी सरणी है। मैं ये कैसे करूं? वांछित आउटपुट मेरी मूल छवि क्षैतिज धुरी (एक्स इकाइयों द्वारा) में उसी फ्रेम में स्थानांतरित हो जाएगी, इसलिए यह x + 1 से शुरू होगा। एक उदाहरण के रूप:

तो input=

1 2 3 4 5 
6 7 8 9 0 

और एक्स = 2, मैं चाहता हूँ:

4 5 1 2 3 
9 0 6 7 8 
+0

बस इतना कह रहा है, 'सर्किफ्ट' का उपयोग करना आसान नहीं है? – bla

+0

हां, यह है। लेकिन सिद्धांत रूप में, यह वर्णित विधि का उपयोग करके किया जा सकता है, जिसमें मुझे रूचि है। (: – Pythonice

+0

@ सेसिलियागुएरा - मैं 'सर्किफ्ट' से सहमत हूं, लेकिन मुझे लगता है कि आप इसे फूरियर ट्रांसफॉर्म के अनुवाद/शिफ्ट संपत्ति के प्रदर्शन के रूप में कर रहे हैं। किसी भी तरह से, मैंने एक उत्तर लिखा है। – rayryeng

उत्तर

11

आप/अनुवाद के लिए संपत्ति की पहचान -1 डी में बदलने वाले। 2 डी के लिए, यह थोड़ा अलग है लेकिन एक ही सिद्धांत पर आधारित है।

enter image description here

x0,y0 पारी लागू करना चाहते हैं होगा: 2 डी में अनुवाद को प्राप्त करने, इस अनुवाद/पाली संपत्ति है, जो के रूप में परिभाषित किया जाता है। इस प्रकार, x0 का सकारात्मक मूल्य आपके 2 डी सिग्नल को दाईं ओर स्थानांतरित करेगा, जबकि ऋणात्मक मान बाईं ओर स्थानांतरित होगा। इसी प्रकार, y0 का सकारात्मक मूल्य आपकी 2 डी छवि को नीचे की ओर ले जाएगा, जबकि ऋणात्मक मान ऊपर की ओर बढ़ जाएगा।

इसलिए, 2 डी में अपने फूरियर ट्रांसफॉर्म को देखते हुए, आपको एक्सपोनेंट को अतिरिक्त शब्द जोड़ना होगा। इसके अतिरिक्त, N द्वारा सामान्यीकृत या आपके 2 डी सिग्नल का आकार होना चाहिए। यह माना जा रहा है कि आपके 2 डी सिग्नल में पंक्तियों और स्तंभों की संख्या समान है। यदि यह मामला नहीं है, तो आपको u*x0 लेना होगा और आप स्तंभों की संख्या से विभाजित होंगे और v*y0 पंक्तियों की संख्या से विभाजित होंगे।
अब, आप अपने उपरोक्त कोड में F के बारे में उलझन में हैं क्योंकि आप सुनिश्चित नहीं हैं कि इसे 2 डी में कैसे परिभाषित किया जाए। आपको 2 डी ग्रिड में प्रत्येक बिंदु के लिए आवृत्ति मान परिभाषित करना होगा। आपके fftshift कॉल के कारण, हम -100 और 99 के बीच x और y मानों को परिभाषित करेंगे, क्योंकि आपका 2 डी सिग्नल 200 x 200 आकार का है और यह हमारे 2 डी सिग्नल को मध्य में केंद्रित करेगा। यह वास्तव में fftshift कर रहा है। इसी तरह, ifftshiftfftshift द्वारा किए गए केंद्र को पूर्ववत करता है। इन बिंदुओं को 2 डी में परिभाषित करने के लिए, मैं meshgrid का उपयोग करता हूं। एक बार जब आप इन बिंदुओं को परिभाषित कर लेंगे, तो आप (x,y) सह-समन्वय की प्रत्येक जोड़ी लेंगे, फिर उपरोक्त संपत्ति में दिखाई देने के साथ जटिल घातीय बनाएं।

इस प्रकार, इस कोड में आपके कोड को संशोधित करना होगा। ध्यान रखें कि मैंने आपके मूल कोड में अनावश्यक fftshift और ifftshift कॉल से छुटकारा पा लिया है। आप fft पर कॉल करेंगे, फिर स्पेक्ट्रम को केंद्र में fftshift करें। मैंने आपके वैरिएबल input को in में भी बदल दिया है, input MATLAB में एक फ़ंक्शन है, और हम अनजाने में फ़ंक्शन को चर के साथ छाया नहीं करना चाहते हैं।

मैंने x शिफ्ट को -35 में भी परिभाषित किया है, और y शिफ्ट -50 में स्थानांतरित किया गया है। इसका मतलब यह होगा कि परिणामी संकेत बाईं ओर 35 तक और 50 तक ऊपर जाएगा।

इसलिए

:

in=peaks(200); %// Define input signal 
H=fftshift(fft2(in)); %// Compute 2D Fourier Transform 
x0=-35; %// Define shifts 
y0=-50; 

%// Define shift in frequency domain 
[xF,yF] = meshgrid(-100:99,-100:99); 

%// Perform the shift 
H=H.*exp(-1i*2*pi.*(xF*x0+yF*y0)/200); 

%// Find the inverse Fourier Transform 
IF_image=ifft2(ifftshift(H)); 

%// Show the images 
figure; 
subplot(1,2,1); 
imshow(in); 
subplot(1,2,2); 
imshow(real(IF_image)); 

लें टिप्पणी है कि मैं असली परिणामी छवि के घटक का प्रदर्शन किया। यह इस तथ्य के कारण है कि एक बार जब आप व्यस्त फूरियर ट्रांसफॉर्म लेते हैं, तो कुछ संख्यात्मक अपर्याप्तता हो सकती है और सिग्नल का जटिल हिस्सा वास्तव में काफी छोटा होता है। सिग्नल के वास्तविक घटक का उपयोग करके हम इसे अनदेखा कर सकते हैं।

enter image description here

आप देख सकते हैं, छवि ठीक शिफ्ट किया था, के रूप में संपत्ति ऊपर देखा द्वारा सत्यापित:

इस छवि को मैं हो रही है। यदि आप अलग-अलग बदलावों को निर्दिष्ट करना चाहते हैं, तो आपको अपने स्वाद के अनुरूप x0 और y0 को बदलने की आवश्यकता है। आपके मामले में, आप y0 = 0 निर्दिष्ट करेंगे, तो x0 जो कुछ भी आप चाहते हैं वह क्षैतिज अनुवाद चाहते हैं।

+0

@ सैंडिनो - कर सकते हैं ' टी का मानना ​​है कि मैंने उस टाइपो को नहीं देखा। मैंने बहुत पहले इस प्रश्न का उत्तर दिया। सुधार के लिए धन्यवाद। – rayryeng