2016-01-12 4 views
5

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 = [] 

उत्तर

5

मुझे एक 'BorderSize' (अर्थात ओवरलैप टाइल्स) शामिल करना चाहते हैं, लेकिन उत्पादन करने के लिए इसे लागू नहीं?

सभी वर्कफ़्लो जहां एक छवि में आकार MXN का प्रत्येक ब्लॉक पर एक समारोह fun लागू करना चाहते हैं पर विचार करें, लेकिन परिणाम के लिए मान्य होने के लिए आप वास्तव में MXN ब्लॉक के चारों ओर सीमा पिक्सल की जरूरत है। (फ़िल्टरिंग, मॉर्फोलॉजी, कोई भी फ़ंक्शन जहां एकल आउटपुट पिक्सेल मान आसपास के एमएक्सएन पर निर्भर करता है)। यानी आपको एक एमएक्सएन आउटपुट ब्लॉक की गणना करने के लिए इनपुट की ब्लॉक (एम + एम, एन + एन) की आवश्यकता है।

सरल (उर्फ madeup) उदाहरण:

h = fspecial('gaussian', 3); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h)); 
imshowpair(im, B1,'montage'); 

enter image description here

सूचना ग्रिड लाइन? इस विशेष मामले में, आप पूरी छवि पर इम्फिल्टर को कॉल करेंगे।लेकिन ब्लॉकप्रोक आपको उन छवियों के साथ काम करने देता है जो आपकी भौतिक स्मृति से बड़ी हैं। तो इस चर्चा के लिए, कल्पना करें कि मैं एक विशाल टिफ फ़ाइल है।

इस वर्कफ़्लो के लिए

- अगर आप सिर्फ इस्तेमाल किया BorderSize 20x20 ब्लॉक प्रत्येक लगभग 3 पिक्सल बॉर्डर शामिल करना औरकिया उत्पादन सीमा ट्रिम नहीं:

h = fspecial('gaussian'); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', false); 
imshowpair(im, B1,'montage'); 

enter image description here

तो - आप वास्तव में सीमा को ट्रिम करने की आवश्यकता है (डिफ़ॉल्ट)

h = fspecial('gaussian'); 
im = imread('peppers.png'); 
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', true); 
imshowpair(im, B1,'montage'); 

enter image description here

नोट - मैंने उदाहरण के रूप में IMFILTER का उपयोग किया। छोटी छवियों के लिए, कोई सीधे IMFITLER का उपयोग करेगा। केवल बड़ी छवियों के लिए, कोई भी BLOCPROC में IMFITLER का उपयोग करने पर विचार करेगा।

+0

यह एक बढ़िया जवाब है की नहीं एक करने के लिए पूरी छवि 10 की। सामान्य रूप से यदि आपके ब्लॉक फ़ंक्शन से आपका आउटपुट ब्लॉक इनपुट ब्लॉक पर एक ही आकार का होना चाहिए, तो आप शायद अपनी सीमाओं को ट्रिम करना चाहते हैं। यदि आपका ब्लॉक फ़ंक्शन मौलिक रूप से आने वाले डेटा को बदल रहा है (जैसा कि आपके मामले में, जहां आप पूरे ब्लॉक में ले रहे हैं और स्केलर मान लौट रहे हैं) तो आप संभवतः सीमाओं को ट्रिम नहीं करना चाहेंगे। कोई असली जादू नहीं हो रहा है। यदि ट्रिमबॉर्डर सत्य पर सेट किया गया है तो आपके ब्लॉक फ़ंक्शन आउटपुट लौटने के बाद इसे सीमा आकार से "छंटनी" की जाएगी। आपके मामले में आपका पूरा आउटपुट "छंटनी" दूर था। – brendan

+0

यह एक बहुत ही विस्तृत उत्तर है, धन्यवाद! क्या आप मेरे "खराब" उदाहरण में व्यवहार की व्याख्या कर सकते हैं? एक खाली मैट्रिक्स आउटपुट में परिणामस्वरूप 'TrimBorder' क्यों छोड़ा? – marcman

+0

क्षमा करें, मुझे यह संबोधित करना याद आया। इसके अनिवार्य रूप से @brendan ने ऊपर क्या कहा - TrimBorder = true आपके फ़ंक्शन के आउटपुट से सीमावर्ती ([1 1]) को 'निकालने' का प्रयास करेगा, जो पहले से ही एक स्केलर है, इसलिए वास्तविक आउटपुट [] है! –

0

बस मामले में आप एक अतिव्यापी ब्लॉक हो रही है और है- बचाने के लिए देख रहे हैं

function cropSaveBlock(bs,ii) 
    subBlockRegion =(bs.data(:,:)); 
    fileName = [strrep(num2str(bs.location,ii),' ','_') '.jpg']; 
    imwrite(subBlockRegion, fileName); 
    end 
    a = imread('cameraman.tif'); 

ii = [1-जो कुछ यू चाहते हैं फ़ाइल नाम]% [01:20] यदि आपकी छवि 20 परिणामस्वरूप ब्लॉक हैं

aa=blockproc(a, [257 257], @(bs)cropSaveBlock(bs,ii),'BorderSize', [10 10 ]) 

% इधर, bordersize, एक्स है y 10, ब्लॉक