2009-06-08 8 views
41

यह प्रश्न शुरू होता है जहां this question समाप्त होता है। MATLAB में एक शक्तिशाली और लचीला छवि प्रदर्शन प्रणाली है जो आपको जटिल छवियों को प्रदर्शित करने के लिए imshow और plot कमांड का उपयोग करने देती है और फिर परिणाम को सहेजती है। उदाहरण के लिए:MATLAB में, मैं छवि को कैसे प्लॉट कर सकता हूं और इसे प्रदर्शित किए बिना परिणाम कैसे सहेज सकता हूं?

im = imread('image.tif'); 
f = figure, imshow(im, 'Border', 'tight'); 
rectangle('Position', [100, 100, 10, 10]); 
print(f, '-r80', '-dtiff', 'image2.tif'); 

यह बहुत अच्छा काम करता है।

समस्या यह है कि यदि आप बहुत सारी छवि प्रसंस्करण कर रहे हैं, तो यह आपके द्वारा बनाई गई प्रत्येक छवि को दिखाने के लिए वास्तविक ड्रैग होना शुरू होता है - आप ज्यादातर उन्हें केवल सहेजना चाहते हैं। मुझे पता है कि मैं सीधे एक छवि को लिखना शुरू कर सकता हूं और फिर परिणाम को सहेज सकता हूं। लेकिन साजिश/आयताकार/इम्शो का उपयोग करना इतना आसान है, इसलिए मुझे आशा है कि एक ऐसा आदेश है जो मुझे साजिश, इशशो आदि कहने दे, परिणाम प्रदर्शित न करे और फिर जो प्रदर्शित किया गया हो उसे बचाएं। किसी को इसके लिए कोई त्वरित समाधान पता है?

वैकल्पिक रूप से, एक बिटमैप काम कर सकते हैं पर एक पट्टी डाल करने के लिए एक त्वरित तरीका है ...

उत्तर

41

जब आप आंकड़ा बनाने आप बंद को दृश्यमान गुण सेट।

f = figure('visible','off') 

कौन सा आपके मामले में

im = imread('image.tif'); 
f = figure('visible','off'), imshow(im, 'Border', 'tight'); 
rectangle('Position', [100, 100, 10, 10]); 
print(f, '-r80', '-dtiff', 'image2.tif'); 

होगा और अगर आप इसे फिर से देखना चाहते आप

set(f,'visible','on') 
4

मैं Bessi के समाधान यहाँ एक सा पर विस्तार कर रहा हूँ कर सकते हैं। मुझे पता चला है कि यह जानना बहुत उपयोगी है कि छवि को पूरी आकृति कैसे लेनी है और आउटपुट छवि आकार को कसकर नियंत्रित करने में सक्षम होना है।

% prevent the figure window from appearing at all 
f = figure('visible','off'); 
% alternative way of hiding an existing figure 
set(f, 'visible','off'); % can use the GCF function instead 

% If you start getting odd error messages or blank images, 
% add in a DRAWNOW call. Sometimes it helps fix rendering 
% bugs, especially in long-running scripts on Linux. 
%drawnow; 

% optional: have the axes take up the whole figure 
subplot('position', [0 0 1 1]); 

% show the image and rectangle 
im = imread('peppers.png'); 
imshow(im, 'border','tight'); 
rectangle('Position', [100, 100, 10, 10]); 

% Save the image, controlling exactly the output 
% image size (in this case, making it equal to 
% the input's). 
[H,W,D] = size(im); 
dpi = 100; 
set(f, 'paperposition', [0 0 W/dpi H/dpi]); 
set(f, 'papersize', [W/dpi H/dpi]); 
print(f, sprintf('-r%d',dpi), '-dtiff', 'image2.tif'); 

आप एक मैट्रिक्स के लिए आंकड़ा प्रस्तुत करना चाहते हैं, तो टाइप करें "मदद @ avifile/addframe", तो subfunction "getFrameForFigure" कहा जाता है निकालें। यह एक गणित-आपूर्ति कार्य है जो आंकड़ों से डेटा निकालने के कुछ (वर्तमान में) अनियंत्रित तरीकों का उपयोग करता है।

4

यहाँ एक पूरी तरह से अलग जवाब है:

आप एक छवि बाहर फ़ाइल चाहते हैं, यही कारण है कि सिर्फ छवि के बजाय पूरे आंकड़ा नहीं बचा?

im = magic(10) 
imwrite(im/max(im(:)),'magic.jpg') 

तब साबित करें कि यह काम करता है।

imshow('magic.jpg') 

यह विभिन्न आउटपुट प्रारूपों के लिए अनुक्रमित और आरजीबी के लिए भी किया जा सकता है।

20

आपके प्रश्न का सरल उत्तर Bessi और Mr Fooz द्वारा दिया गया है: आकृति के लिए 'बंद' सेटिंग सेट करें। हालांकि यह बहुत IMSHOW और PRINT तरह आदेशों का उपयोग करने आंकड़े जेनरेट करना आसान है, मैं संक्षेप में प्रस्तुत करेंगे क्यों मुझे लगता है कि यह जरूरी सबसे अच्छा विकल्प नहीं है:

  • श्री Fooz के जवाब के रूप में रेखांकित हैं, वहाँ कई अन्य कारकों है कि आते हैं छवियों के रूप में आंकड़ों को बचाने की कोशिश करते समय खेलते हैं। आपको प्राप्त होने वाले आउटपुट का प्रकार कई आकृति और अक्ष सेटिंग्स पर निर्भर होने जा रहा है, इस प्रकार संभावना है कि आपको वह आउटपुट नहीं मिलेगा जो आपको चाहिए।यह विशेष रूप से समस्याग्रस्त हो सकता है यदि आपके आंकड़े अदृश्य होने के लिए सेट हैं, क्योंकि आपको कुछ विसंगति दिखाई नहीं देगी जो आकृति या अक्ष के लिए डिफ़ॉल्ट सेटिंग में बदलाव के कारण हो सकती है। संक्षेप में, आपका आउटपुट कई सेटिंग्स के प्रति अत्यधिक संवेदनशील हो जाता है, जिसे आपको अपने आउटपुट को नियंत्रित करने के लिए अपने कोड में जोड़ना होगा, क्योंकि श्री फूज़ का उदाहरण दिखाता है।

  • भले ही आप आंकड़े नहीं देख रहे हैं, फिर भी आप संभवतया आवश्यकतानुसार MATLAB को अधिक काम कर रहे हैं। ग्राफिक्स ऑब्जेक्ट्स अभी भी बनाए गए हैं, भले ही उन्हें प्रस्तुत नहीं किया गया हो। यदि गति चिंता का विषय है, तो आंकड़ों से छवियां उत्पन्न करना आदर्श समाधान की तरह प्रतीत नहीं होता है।

मेरे सुझाव वास्तव में छवि डेटा सीधे संशोधित करने और IMWRITE का उपयोग कर इसे बचाने के लिए है। यह IMSHOW और अन्य प्लॉटिंग समाधानों का उपयोग करने जितना आसान नहीं हो सकता है, लेकिन मुझे लगता है कि यह अधिक कुशल है और अधिक मजबूत और लगातार परिणाम देता है जो विभिन्न साजिश सेटिंग्स के प्रति संवेदनशील नहीं हैं। उदाहरण आप दे के लिए, मेरा मानना ​​है कि एक काले रंग की आयत बनाने के लिए वैकल्पिक कोड कुछ इस तरह दिखेगा:

im = imread('image.tif'); 
[r,c,d] = size(im); 
x0 = 100; 
y0 = 100; 
w = 10; 
h = 10; 
x = [x0:x0+w x0*ones(1,h+1) x0:x0+w (x0+w)*ones(1,h+1)]; 
y = [y0*ones(1,w+1) y0:y0+h (y0+h)*ones(1,w+1) y0:y0+h]; 
index = sub2ind([r c],y,x); 
im(index) = 0; 
im(index+r*c) = 0; 
im(index+2*r*c) = 0; 
imwrite(im,'image2.tif'); 
0

आप सभी आंकड़े को निष्क्रिय करने के -noFigureWindows इस्तेमाल कर सकते हैं।