image MatLab-FFT का उपयोग कर एक छवि स्थानांतरण



image-processing ifft (1)

मैं अपने fft द्वारा एक्सपी (-ज * 2 * pi * x * F) के गुणन का उपयोग करते हुए एक छवि (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)

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

यदि input=

1 2 3 4 5
6 7 8 9 0

और एक्स = 2, मुझे चाहिए:

4 5 1 2 3
9 0 6 7 8

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

x0,y0 वह बदलाव होगा जिसे आप शुरू करना चाहते हैं जैसे, 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 क्या कर रहा है इसी तरह, ifftshift fftshift द्वारा किया गया ifftshift पूर्ववत करता है इन बिंदुओं को 2 डी में परिभाषित करने के लिए, मैं meshgrid उपयोग करता meshgrid । एक बार जब आप इन बिंदुओं को परिभाषित करते हैं, तो आप प्रत्येक जोड़ी (x,y) समन्वयित कर लेते हैं, तो आप जटिल संपत्तियां बनाते हैं, जैसा कि आप उपरोक्त संपत्ति में देखते हैं।

जैसे, आपके कोड को इस फैशन में संशोधित करना होगा। ध्यान रखें कि मुझे अपने मूल कोड में बेमानी fftshift और ifftshift कॉल से छुटकारा मिल गया है। आप fftshift को कॉल करेंगे, फिर स्पेक्ट्रम केंद्र के लिए 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));

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

यह मैं प्राप्त छवि है:

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





ifft