2009-10-28 12 views
12

मैं एक 256x256 छवि है और मैं इसे 128x128 प्रत्येक के 4 ब्लॉक में विभाजित और ए 4 को ए 1 के रूप में उन्हें पता करने के लिए चाहते हैं। अब मैं उन्हें अलग से फोन करना चाहता हूं और उन पर कुछ संचालन करना चाहता हूं। मुझे पता है कि यह blkproc फ़ंक्शन का उपयोग करके किया जा सकता है - लेकिन वास्तव में कैसे?MATLAB में किसी छवि को ब्लॉक में कैसे विभाजित करें?

मैं blkproc इस तरह फोन है?

B=blkproc(I,[4 4],?) 

मैं "?" के स्थान पर क्या रखूं, और मैं बनाए गए 4 ब्लॉक को कैसे संबोधित कर सकता हूं?

उत्तर

11

blockproc के बाद से (और पदावनत blkproc) Image Processing Toolbox में दोनों कार्य हैं, मैंने सोचा कि मैं एक बुनियादी MATLAB समाधान है कि कोई अतिरिक्त toolboxes की आवश्यकता है ...

जोड़ना होगा यदि आप एक विभाजित करने के लिए चाहते हैं मैट्रिक्स submatrices में, एक ही रास्ता मैट्रिक्स को तोड़ने के लिए और एक सेल सरणी के एक सेल में प्रत्येक submatrix स्टोर करने के लिए mat2cell उपयोग करने के लिए है। आपके मामले के लिए, वाक्य रचना इस प्रकार दिखाई देगा:

C = mat2cell(I, [128 128], [128 128]); 

C अब प्रत्येक कोशिका I की एक 128-दर-128 submatrix भंडारण के साथ एक 2-दर-2 सेल सरणी है। आप प्रत्येक कोशिका पर कार्रवाई चाहते हैं, आप तो समारोह cellfun इस्तेमाल कर सकते हैं। उदाहरण के लिए, यदि आप प्रत्येक submatrix में मूल्यों का मतलब ले जाना चाहते थे, आप क्या करेंगे निम्नलिखित:

meanValues = cellfun(@(x) mean(x(:)), C); 

पहला तर्क एक anonymous function जो पहले एक स्तंभ वेक्टर और उसके बाद में प्रत्येक submatrix को नया स्वरूप दे करने के लिए एक function handle है मतलब लेता है। आउटपुट प्रत्येक सबमिट्रिक्स के लिए औसत मानों का 2-बाय-2 मैट्रिक्स है।समारोह आप cellfun के पास विभिन्न आकार या प्रत्येक कक्ष के लिए प्रकार के आउटपुट बनाता है, तो cellfun उन्हें श्रृंखलाबद्ध एक समस्या है जाएगा और एक त्रुटि फेंक देगा: आप करने के लिए अपने कॉल के अंत करने के लिए ..., 'UniformOutput', false); जोड़ देते हैं तो

??? Error using ==> cellfun 
Non-scalar in Uniform output, at index 1, output 1. 
Set 'UniformOutput' to false. 

cellfun, फिर उपर्युक्त मामले में आउटपुट 2-बाय-2 सेल सरणी होगा जिसमें प्रत्येक सबमिट्रिक्स पर ऑपरेशन करने के परिणाम शामिल होंगे।

3

तो myImage अपने 256x256 छवि है, यह

image_top_left = myImage(1:128,1:128); 
image_top_right = myImage(1:128,129:256); 
image_bottom_left = myImage(129:256,1:128); 
image_bottom_right = myImage(129:256,129:256); 

नहीं हो सकता है?

6

blockprocblkproc के लिए नया नाम (जिसका बहिष्कार किया जाता है) है। इसका उपयोग किसी छवि में प्रत्येक ब्लॉक में फ़ंक्शन लागू करने के लिए किया जा सकता है। उदाहरण के लिए, यदि आप एक मैट्रिक्स 8x8 ब्लॉक में मैं विभाजित करके प्रत्येक ब्लॉक के मतलब की गणना करना चाहता था, तो आप इस करना होगा:

B=blockproc(I, [8 8], @(x) mean(x.data(:))); 

बी तो ब्लॉक के माध्यम से युक्त एक मैट्रिक्स है।

दो बातें यहां गौर करने योग्य

  • विनिर्देशक [8 8] ब्लॉक के आकार, नहीं ब्लॉक के संख्या निर्दिष्ट करता है।

  • आपको blockproc पर भेजे गए फ़ंक्शन के बाहर स्वयं ब्लॉक तक पहुंच नहीं है। एक वास्तविक कार्यक्रम में, तो आप शायद एक पाश का उपयोग कर इस करना चाहिए

    A1=I(1:128, 1:128); 
    A2=I(129:256, 1:128); 
    A3=I(1:128, 129:256); 
    A4=I(129:256, 129:256); 
    
    बेशक

    ,: आप ब्लॉक खुद को जरूरत है, आप के रूप में एड्रियन सुझाव क्या करना है।

+2

यदि आप अभी भी BLKPROC फ़ंक्शन के साथ छवि प्रसंस्करण टूलबॉक्स का पुराना संस्करण उपयोग कर रहे हैं, तो उपरोक्त उदाहरण का वाक्यविन्यास बदल जाएगा: 'B = blkproc (I, [8 8], @ (x) माध्य (एक्स (:))); ' – gnovice

1

यह आपके लिए बेहतर है कि आप अपने कार्यक्रम को 256 * 256 के लिए न केवल छवियों के सभी आकारों के लिए काम करें।

[row, col]=size(your_image); mr = round(row/2); % median of rows mc = round(col/2); % median of columns % Now divide your image and call each of them separately and do what ever you want top_left = your_image(1:mr , 1:mc); top_right = your_image(1:mr , (mc+1):col); bot_left = your_image((mr+1):row , 1:mc); bot_right = your_image((mr+1):row , (mc+1):col); % final stage is to combining these parts again to return to its original shape Back_to_original = [top_left,top_right ; bot_left,bot_right];

% आशा है कि यह आप के लिए उपयोगी होगा।

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