Blockproc
में 'TrimBorder' "gridding" MATLAB में एक छवि के लिए एक वास्तव में उपयोगी कार्य है। यह बहुत अच्छी तरह से प्रलेखित है, और यह tutorial page के साथ भी पूरा हो गया है। हालांकि, जब आप ब्लॉक के बीच कुछ प्रकार के ओवरलैप चाहते हैं, तो चीजें अधिक कठिन हो जाती हैं। Mathworks मंचों this one और this one सहित कुछ स्पष्टीकरण, है, और एक विवरण here (प्रश्न # 1) पर एक प्रयास है, लेकिन कोई नहीं वास्तव में कहीं भी बताता है कि क्यों कुछ झंडे अन्य लोगों के साथ सेट किया जा की जरूरत है। क्या कोई कृपया बता सकता है कि 'BorderSize'
पैरामीटर का उद्देश्य क्या है? ऐसा लगता है जब 'Trim Borders'
false
के लिए सेट है, 'BorderSize'
पैरामीटर वास्तव में क्या प्रलेखन कहते है कि (और आप उम्मीद थी क्या):'BorderSize' और MATLAB blockproc समारोह
'BorderSize': एक दो तत्व वेक्टर, [VH], यह निर्दिष्ट प्रत्येक ब्लॉक में जोड़ने के लिए सीमा पिक्सल की मात्रा। समारोह प्रत्येक ब्लॉक के ऊपर और नीचे वी पंक्तियों को जोड़ता है और प्रत्येक ब्लॉक के एच कॉलम बाएं और दाएं होते हैं। प्रत्येक परिणामस्वरूप ब्लॉक के आकार होगा: [एम + 2 * वी, N + 2 * एच]
डिफ़ॉल्ट रूप से, समारोह स्वचालित रूप से मज़ा का परिणाम से सीमा को हटा। अधिक जानकारी के लिए 'TrimBorder' पैरामीटर देखें। फ़ंक्शन पैड ब्लॉक के साथ छवि किनारों से परे सीमाओं के साथ ब्लॉक करता है।
लेकिन जब आप पढ़ 'TrimBorder'
विवरण, यह बहुत स्पष्ट नहीं करता है:
'TrimBorder': एक तार्किक अदिश। जब सत्य पर सेट किया जाता है, तो ब्लॉकप्रोक फ़ंक्शन उपयोगकर्ता फ़ंक्शन, मज़े के आउटपुट से सीमा पिक्सेल से बाहर निकलता है। फ़ंक्शन मज़े के आउटपुट के ऊपर और नीचे से V पंक्तियों को हटा देता है, और बाएं और दाएं किनारों से एच कॉलम हटा देता है। 'बॉर्डरसाइज' पैरामीटर वी और एच को परिभाषित करता है। डिफ़ॉल्ट सत्य है, जिसका अर्थ है कि ब्लॉकप्रोक फ़ंक्शन स्वचालित रूप से मज़ेदार आउटपुट से सीमाओं को हटा देता है।
मैं 'BorderSize'
(यानी टाइल्स ओवरलैप) क्यों शामिल करना चाहता हूं लेकिन आउटपुट पर इसे लागू नहीं करना चाहता हूं? क्या यह सिर्फ एक खराब समझाया गया ध्वज है: 'TrimBorder'
'BorderSize'
का उपयोग करने के लिए बंद होना चाहिए, या क्या मुझे कुछ बड़ा याद आ रहा है? मुझे लगता है कि मेरे भ्रम की बात यह है कि: मैं 'TrimBorder'
false
पर कब सेट करूंगा?
उदाहरण:
% Non-overlapping
A = ones(10);
B = blockproc(A, [2,2], @(x)sum(sum(x.data)));
% B =
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% GOOD Overlapping--one-pixel border
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1], 'TrimBorder', false);
% B =
% [ 9 12 12 12 9 ]
% [ 12 16 16 16 12 ]
% [ 12 16 16 16 12 ]
% [ 12 16 16 16 12 ]
% [ 9 12 12 12 9 ]
% BAD Overlapping--one-pixel border
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1]);
% B = []
यह एक बढ़िया जवाब है की नहीं एक करने के लिए पूरी छवि 10 की। सामान्य रूप से यदि आपके ब्लॉक फ़ंक्शन से आपका आउटपुट ब्लॉक इनपुट ब्लॉक पर एक ही आकार का होना चाहिए, तो आप शायद अपनी सीमाओं को ट्रिम करना चाहते हैं। यदि आपका ब्लॉक फ़ंक्शन मौलिक रूप से आने वाले डेटा को बदल रहा है (जैसा कि आपके मामले में, जहां आप पूरे ब्लॉक में ले रहे हैं और स्केलर मान लौट रहे हैं) तो आप संभवतः सीमाओं को ट्रिम नहीं करना चाहेंगे। कोई असली जादू नहीं हो रहा है। यदि ट्रिमबॉर्डर सत्य पर सेट किया गया है तो आपके ब्लॉक फ़ंक्शन आउटपुट लौटने के बाद इसे सीमा आकार से "छंटनी" की जाएगी। आपके मामले में आपका पूरा आउटपुट "छंटनी" दूर था। – brendan
यह एक बहुत ही विस्तृत उत्तर है, धन्यवाद! क्या आप मेरे "खराब" उदाहरण में व्यवहार की व्याख्या कर सकते हैं? एक खाली मैट्रिक्स आउटपुट में परिणामस्वरूप 'TrimBorder' क्यों छोड़ा? – marcman
क्षमा करें, मुझे यह संबोधित करना याद आया। इसके अनिवार्य रूप से @brendan ने ऊपर क्या कहा - TrimBorder = true आपके फ़ंक्शन के आउटपुट से सीमावर्ती ([1 1]) को 'निकालने' का प्रयास करेगा, जो पहले से ही एक स्केलर है, इसलिए वास्तविक आउटपुट [] है! –