2015-03-22 14 views
5

मैं 2 डी फ़ंक्शन का आई-वें व्युत्पन्न प्राप्त करने के लिए एफएफटी गुणों का उपयोग करने की कोशिश कर रहा हूं - विशेष रूप से 2 डी गाऊशियन फ़ंक्शन। मैं MATLAB में यह संख्यात्मक रूप से भी करना चाहूंगा।एफएफटी गुणों का उपयोग करके 2 डी फ़ंक्शन का व्युत्पन्न ढूंढना

दरअसल, मेरे पास जो कुछ भी कर रहा है उसका कोई संकेत नहीं है, लेकिन मैंने इंटरनेट पर बहुत कुछ पढ़ा है और MATLAB मदद की सभी चीजें हैं, और कुछ भी मेरी मदद नहीं करता है, इसलिए मैं पूछने जा रहा हूं यहाँ।

h = fspecial('gaussian', size(imr), 10); 
imshow(h, []); 
G = fft2(h); 

यह 512 x 512 imr के आकार, या मैं जानता हूँ कि मैं उलटा करते हैं और कुछ गुणा करने के लिए है गाऊसी के 0 व्युत्पन्न है, लेकिन:

यहाँ मैं अब तक राशि है मुझे नहीं पता कि क्या।

क्या कोई मुझे एफएफटी गुणों का उपयोग करके 2 डी गाऊशियन फ़ंक्शन के i-th व्युत्पन्न प्राप्त करने के बारे में एक सुराग दे सकता है?

अग्रिम धन्यवाद

उत्तर

15

अस्वीकरण - 16 सितंबर संपादित करें 2015

इस पोस्ट में काफी आवृत्ति डोमेन व्युत्पन्न आपरेशन की मेरी समझ में एक छोटे से अभी तक मौलिक दोष की वजह से बदल गया है। पिछले पुनरावृत्ति के बाद से इस पोस्ट में से बहुत कुछ बदल गया है।

मैं डीबग करने में मदद के लिए Luis Mendo धन्यवाद देना चाहता हूं कि यह पोस्ट के मूल संस्करण में प्रस्तुत किए गए किसी अन्य छवि के लिए क्यों काम नहीं कर रहा था।


जब अलग-अलग डेटा की बात आती है, तो व्युत्पन्न जैसी कोई चीज़ नहीं होती है। व्युत्पन्न एक विश्लेषणात्मक उपकरण है जो केवल निरंतर समय में मौजूद है। अलग-अलग समय में, हम केवल अंतर का उपयोग करके अनुमान लगा सकते हैं। इस प्रकार, मैं यह मानने जा रहा हूं कि आप व्युत्पन्न के बजाय अंतर संचालन का मतलब है। व्युत्पन्न के लिए सबसे आम अनुमानों में से एक आगे अंतर अंतरण का उपयोग करना है।

y[n] = x[n+1] - x[n], for n = 1, 2, ..., M-1 

M अपने असतत अनुक्रम में नमूनों की कुल संख्या है: वस्तुतः, एक -1 डी असतत अनुक्रम x[n] के लिए, उत्पादन अनुक्रम y[n] जहां आगे अंतर आपरेशन लागू किया जाता है के रूप में परिभाषित किया गया है। स्वाभाविक रूप से, आगे के अंतर संचालन की प्रकृति के कारण एक कम मूल्य होगा।

आवृत्ति डोमेन में एक ही चीज़ को पूरा करने के लिए, आपको असतत फूरियर ट्रांसफॉर्म के गुणों से shift theorem का उपयोग करना होगा।

यहाँ, i जटिल संख्या का प्रतिनिधित्व करता है, या वर्गमूल: वस्तुतः, संकेत x[n], जो X(k) है की DFTed संस्करण दिया, निम्नलिखित संपत्ति समय-डोमेन और एक साथ आवृत्ति-डोमेन से संबंधित है -1, और k आवृत्ति डोमेन में कोणीय आवृत्ति है। F^{-1}उलटा सिग्नल X(k) का फूरियर ट्रांसफॉर्म, जो डोमेन सिग्नल x[n] का फूरियर ट्रांसफॉर्म है। M सिग्नल की लंबाई x[n] और m भी उस शिफ्ट की मात्रा है जिसे आप सिग्नल ले जाना चाहते हैं।इसलिए, यह कह रहा है कि यदि आप m पदों से स्थानांतरित करके एक शिफ्ट ऑपरेशन की गणना करना चाहते हैं, तो आपको केवल फूरियर ट्रांसफॉर्म लेने की आवश्यकता है, तत्व-दर-तत्व प्रत्येक घटक को exp(-i*2*pi*m*k/M) से गुणा करें जहां k फूरियर में एक बिंदु का सूचकांक है इस मध्यवर्ती परिणाम के विपरीत फोरियर ट्रांसफॉर्म को बदलें और ले जाएं।

विशेष ध्यान दें कि फूरियर ट्रांसफॉर्म का अंतिम तत्व अर्थहीन है, क्योंकि अंतर ऑपरेशन के परिणामस्वरूप एक संकेत होता है जिसमें एक कम तत्व होता है और इसलिए इस परिणाम से अंतिम तत्व को हटाना महत्वपूर्ण है।

ऊपर वर्णित है, व्युत्पन्न हम फूरियर y[n] या Y(k) के रूपांतरण को खोजने की जरूरत के लिए सन्निकटन की गणना करने के लिए, और साथ

इसलिए की तरह की जा सकती है:

लें ध्यान दें कि बदलाव है -1 जैसे x[n+1] = x[n-(-1)]। इसलिए, आप फूरियर ट्रांसफॉर्म की गणना करेंगे, प्रत्येक संबंधित मान को exp(i*2*pi*k/M) - 1 से गुणा करें और उलटा लें।

यह 2 डी में जाने के लिए बहुत अधिक खिंचाव नहीं है। यहां मैं मानता हूं कि हम दोनों दिशाओं में अंतर संचालन कर रहे हैं - क्षैतिज और लंबवत। याद रखें, हमारे पास दो चर हैं जो क्षैतिज और ऊर्ध्वाधर स्थानिक निर्देशांक का प्रतिनिधित्व करते हैं। हम समय डोमेन की बजाय स्थानिक डोमेन भी कॉल करेंगे, क्योंकि चर 2 डी स्पेस में हमारी स्थिति के अनुसार हैं। इसके बाद के संस्करण तैयार करने के साथ जा रहे हैं, 2 डी में जा रहा बहुत बस है:

यहाँ, u और v 2 डी असतत अंतर आपरेशन y[u,v] के स्थानिक निर्देशांक प्रतिनिधित्व करते हैं। U और V 2 डी फ्रीक्वेंसी घटक हैं, और M और N 2 डी सिग्नल के कॉलम और पंक्तियों की संख्या हैं। विशेष देखभाल करें कि आप वास्तव में क्षैतिज अंतर संचालन कर रहे हैं जिसके बाद लंबवत अंतर संचालन होता है। विशेष रूप से, आप स्वतंत्र रूप से प्रत्येक पंक्ति के लिए एक क्षैतिज अंतर संचालन करेंगे, इसके बाद प्रत्येक कॉलम के लिए एक लंबवत अंतर संचालन होगा। वास्तव में, आदेश कोई फर्क नहीं पड़ता। आप जो भी ऑर्डर चुनते हैं, उसके बाद आप एक दूसरे के साथ कर सकते हैं। ध्यान रखना महत्वपूर्ण है कि सिग्नल का 2 डी फूरियर ट्रांसफॉर्म वही रहता है और आप कुछ जटिल स्थिरांक से प्रत्येक मान को गुणा कर रहे हैं। हालांकि, आपको यह सुनिश्चित करने की ज़रूरत है कि आप परिणाम की आखिरी पंक्ति और अंतिम कॉलम हटा दें क्योंकि प्रत्येक ऑपरेशन के परिणामस्वरूप सिग्नल होता है जो कि प्रत्येक पंक्ति की मूल लंबाई से एक बिंदु कम होता है और अंतर कॉलम अवलोकन के कारण प्रत्येक कॉलम ।

मान लें कि आपके पास पहले से ही फ़ंक्शन का एफएफटी है, आपको बस प्रत्येक 2 डी स्थानिक समन्वय लेना होगा और (exp(i*2*pi*U/M) - 1)*(exp(i*2*pi*V/N) - 1) से गुणा करना होगा। (U,V) पर संग्रहीत एफएफटी के प्रत्येक 2 डी घटक के लिए, हम इन आवृत्ति निर्देशांक का उपयोग करते हैं और उन दो चीजों के उत्पाद द्वारा उस स्थान को गुणा करते हैं। इसके बाद, आप व्यस्त एफएफटी ले लेंगे और हम इसकी तुलना वास्तविक स्थानिक-डोमेन व्युत्पन्न के साथ करेंगे। हमें देखना चाहिए कि वे वही हैं।

ध्यान दें कि जब आप 2 डी एफएफटी करते हैं, तो आवृत्तियों सामान्यीकृत जैसे कि वे दोनों आयामों में [-1,1] के बीच फैले हुए हैं। दोनों डोमेन में व्युत्पन्न संचालन की समानता दिखाते समय हमें इसे ध्यान में रखना होगा।साथ ही, चीजों को और अधिक सरल बनाने के लिए, यदि आप शिफ्ट आवृत्ति घटकों को बदलते हैं तो वे समझदार भी होंगे ताकि वे छवि के केंद्र में दिखाई दें। 2 डी एफएफटी करते समय, घटकों को इस तरह रखा जाता है कि डीसी घटक, या मूल छवि के ऊपरी-बाएं कोने में स्थित है। आइए सभी को fftshift के उपयोग से केंद्र में स्थानांतरित करें।

अब, चलिए कुछ छोटे से शुरू करते हैं। इस प्रक्रिया के लिए, हम मानते हैं कि प्रत्येक आयाम का आकार fftshift के माध्यम से आवृत्तियों के स्थानांतरण को आसान और स्पष्ट होने के लिए अजीब है। आइए मान लें कि हमारे पास 101 x 101 Gaussian फ़िल्टर था, जिसमें 10 का मानक विचलन था, और हम इसका एफएफटी लेते हैं, फिर fftshift। तो:

h = fspecial('gaussian', [101 101], 10); 
hf = fftshift(fft2(h)); 

अगर हम व्युत्पन्न खोजना चाहते हैं, हम आवृत्ति अंक कि आवृत्ति डोमेन छवि का आकार अवधि, 0 मूल है, जो अब केंद्र है के रूप में के साथ शुरू की एक ग्रिड परिभाषित करते हैं। हम meshgrid के माध्यम से ऐसा कर सकते हैं, और इसलिए:

[U,V] = meshgrid(-50:50, -50:50); 

सामान्य तौर पर, इस क्षैतिज और ऊर्ध्वाधर निर्देशांक क्षैतिज के लिए [-floor(cols/2),floor(cols/2)] और ऊर्ध्वाधर के लिए [-floor(rows/2),floor(rows/2)] तक फैली है। ध्यान दें कि उपर्युक्त ग्रिड में छवि के समान आयाम हैं, लेकिन केंद्र (0,0) पर है, और हम दोनों आयामों में -50 से 50 तक फैले हुए हैं।

अब, दोनों दिशाओं में आवृत्ति डोमेन में अंतर संचालन करें। के दोनों दिशाओं में दोनोंx और y, इसलिए पहले व्युत्पन्न के लिए ऐसा करते हैं:

hf2 = (exp(1i*2*pi*U/101) - 1).*(exp(1i*2*pi*V/101) - 1).*hf; 

लें ध्यान दें कि हम पड़ा तथ्य के कारण 101 से विभाजित करके सामान्य आवृत्तियों कि की आवृत्तियों एफएफटी सामान्यीकृत हैं। 101 x 101 छवि के आकार के कारण है। अगर हम इसे समय डोमेन में वापस चाहते हैं, तो बस व्यस्त एफएफटी लें। हालांकि, हमें पूर्ववत की आवश्यकता है जो हमने विपरीत एफएफटी लेने से पहले ifftshift के साथ किया था। हम संख्यात्मक त्रुटियों के कारण किसी भी अवशिष्ट जटिल मूल्यवान घटकों को खत्म करने के लिए real का भी उपयोग करते हैं। आप देखेंगे कि आउटपुट जटिल मूल्यवान है, लेकिन काल्पनिक घटक परिमाण में इतने छोटे हैं कि हम उन्हें अवहेलना कर सकते हैं। जैसे:

out_freq = real(ifft2(ifftshift(hf2))); 

भी पिछले पंक्ति और स्तंभ को हटाने के लिए याद रखें:

out_freq = out_freq(1:end-1,1:end-1); 

आप फिल्टर h के समय-डोमेन अंतर आपरेशन के साथ इस उत्पादन की तुलना करना चाहते हैं, तो हम ऐसा कर सकते हैं पंक्तियों पर diff का उपयोग करके, फिर इस परिणाम का उपयोग करके, हम कॉलम पर जाते हैं। इस प्रकार:

out_spatial = diff(diff(h, 1, 1), 1, 2); 

दूसरा पैरामीटर बताता है कि अंतर ऑपरेशन किस क्रम में है। यह पहला क्रम अंतर है, इसलिए दोनों क्षैतिज और ऊर्ध्वाधर अंतर संचालन 1 पर सेट किए गए हैं। तीसरा पैरामीटर आपको बताता है कि आप किस आयाम पर भिन्नता कर रहे हैं। हम इसे पहले कॉलम पर कर रहे हैं, फिर पंक्तियों पर मध्यवर्ती परिणाम लागू कर रहे हैं।हम तो दिखा सकते हैं कि वे दोनों क्या की तरह लग रहे:

figure; 
subplot(1,2,1); 
imshow(out_spatial, []); 
title('Derivative from spatial domain'); 
subplot(1,2,2); 
imshow(out_freq, []); 
title('Derivative from frequency domain'); 

और हम पाते हैं:

enter image description here

कूल! यह गॉसियन के व्युत्पन्न के बारे में मुझे जो कुछ पता है उससे सहमत है।

बोनस

एक बोनस का एक छोटा सा रूप में, मैं कॉर्नेल विश्वविद्यालय से कुछ महान स्लाइड की ओर आकर्षित करना चाहते हैं: http://www.cs.cornell.edu/courses/cs6670/2011sp/lectures/lec02_filter.pdf

विशेष रूप से, इस गाऊसी की तरह यदि आप के लिए गए थे लग रहा है क्या है 3 डी, जहां हम दोनों क्षैतिज और ऊर्ध्वाधर निर्देशांक होने में इसे देख, और Z मूल्य 3 डी में गाऊसी की ऊंचाई है:

enter image description here

तो, यह wha है टी होता है अगर हम स्वतंत्र रूप से दोनों दिशाओं के व्युत्पन्न लेते हैं। शीर्ष क्या स्थानिक होने वाली गतिविधि दिखाती, और नीचे क्या होता है अगर हम एक विहंगम दृश्य पर सीधे ऊपर इस पर एक दृष्टि डाली आपको दिखाता है:

enter image description here

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

+2

धन्यवाद बहुत आदमी। आपने मेरा दिन बचाया महान स्पष्टीकरण, सभी काम और सभी विनम्र। मैं तुम्हारी एक बियर या भोजन या जो भी आप चाहते हैं !! – Keydash

+1

@Keydash - कृपया मेरा उत्तर स्वीकार करने पर विचार करें :) – rayryeng

+1

@rayryeng अगली बार [छोटे जवाब] (http://stackoverflow.com/a/28411646/1714410) आज़माएं यदि आप समुदाय पहचान की तलाश में हैं;) एक उत्कृष्ट उत्तर, बीटीडब्ल्यू । – Shai

संबंधित मुद्दे