2009-02-22 10 views
12

मैं MATLAB में एक छवि को पढ़ना चाहता हूं, उस पर एक आयत खींचें, और फिर छवि को सहेजें।मैं MATLAB में एक परिवर्तित छवि को कैसे सहेज सकता हूं?

इसके अलावा, मैं सिर्फ MATLAB सीख रहा हूं - कृपया नम्र रहें। ऐसा लगता है कि यह आसान होना चाहिए, लेकिन मुझे ऐसा नहीं लगता है।

im = imread('image.tif'); 
imshow(im); 
rectangle('Position', [100, 100, 10, 10]); 
imwrite(im, 'image2.tif'); 

हालांकि मैं छवि पर आयत देख सकते हैं, सहेजी गई छवि आयत प्रदर्शित नहीं करता है। मैं छवि को कैसे सहेज सकता हूं और आयताकार दिखा सकता हूं?

एफडब्ल्यूआईडब्ल्यू, मैंने पहले ही saveas() की कोशिश की है, लेकिन यह मुझे एक बड़ी छवि देता है। क्या saveas() का उपयोग करने का कोई तरीका है और सहेजी गई छवि को सही आकार बनाएं?

+0

अंतिम भाग के लिए, यह संभवतः संबंधित है: http://stackoverflow.com/questions/3600945/printing-a-matlab-plot-in-exact-dimensions-on-paper – Amro

उत्तर

10

वास्तव में इस समस्या के बारे में a bug at The MathWorks site है। बहुत बुरा वे वास्तविक जवाब का जादू नहीं करते हैं (जैसे, आईएमएचओ, आपके मॉनिटर को शासक पकड़ना वास्तविक समाधान नहीं है)।

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

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

उपयोग उपरोक्त कोड, tweak -r पैरामीटर जब तक यह ठीक है, और देखा लग रहा है!

+0

यह एक अच्छा समाधान की तरह लगता है; सिर्फ 2 छोटे मुद्दे। सबसे पहले, -r पैरामीटर के लिए सेटिंग्स का एक गुच्छा कोशिश करने के लिए थोड़ा परेशान है। दूसरा, मुझे लगता है कि आउटपुट छवि में अक्ष के चारों ओर दिखाई देने वाली सीमा शामिल होगी, जो कुछ मामलों में अवांछनीय है। – gnovice

+1

मैंने 'सीमा' पैरामीटर के साथ imshow() फ़ंक्शन को 'तंग' के रूप में अपडेट किया है, इसलिए छवि के चारों ओर भूरे रंग की सीमा दिखाई नहीं दे रही है। – jacobko

3

यदि आप आईएम को सहेजना चाहते हैं, तो आपको पहले इसके मूल्य को संशोधित करना होगा। मैं आयत समारोह, से परिचित नहीं हूँ, लेकिन आप निम्नलिखित (जानवर बल) कर सकते हैं:

im = imread('image.tif'); 
im(100:110,100)=0; 
im(100:110,110)=0; 
im(100,100:110)=0; 
im(110,100:110)=0; 
imshow(im); 
imwrite(im, 'image2.tif'); 

ध्यान दें, कोड ऊपर ग्रे पैमाने छवि के लिए है, अगर आपकी छवि एक आरजीबी छवि है, तो आप करेंगे निम्नलिखित कार्य करने होंगे:

im(100:110,100,:)=0; 
.... 
18

कारण आयत सहेजी गई छवि में दिखाई नहीं देता है, क्योंकि आप चर im, जो छवि डेटा संग्रहीत करता है को संशोधित नहीं कर रहे हैं। आयताकार प्लॉट छवि पर प्रदर्शित एक साजिश वस्तु है। आपको छवि डेटा को स्वयं संशोधित करना होगा।

आमतौर पर, MATLAB में पढ़ने वाली छवियों को एन-बाय-एम-बाय-3 मैट्रिक्स (यानी प्रत्येक पिक्सेल के लिए आरजीबी (लाल-हरे-नीले) मानों के साथ एन-बाय-एम पिक्सेल छवि के रूप में लोड किया जाता है)। आमतौर पर, छवि डेटा एक uint8 डेटा प्रकार है, इसलिए आरजीबी मूल्यों 255 से 0 से लेकर आप किसी दिए गए पिक्सेल के लिए आरजीबी मान बदलने के लिए, आप क्या करेंगे निम्नलिखित चाहता था, तो:

im = imread('test.jpg'); % Load a jpeg image 
im(1,1,1) = 255; % Change the red value for the first pixel 
im(1,1,2) = 0; % Change the green value for the first pixel 
im(1,1,3) = 0; % Change the blue value for the first pixel 
imwrite(im,'new.jpeg'); % Save modified image 

वहाँ अलग हैं एक समय में एक से अधिक पिक्सल को संशोधित करने के तरीके (यानी एक आयताकार क्षेत्र), जिसके लिए आपको multidimensional arrays में अनुक्रमणित करने की आवश्यकता होगी। MATLAB (i.e. truecolor बनाम indexed बनाम) में विभिन्न प्रकार की छवियों को कैसे पढ़ा जाता है, इस बारे में अधिक जानकारी के लिए, मैं imread के लिए प्रलेखन की जांच करूंगा।

2

आप चित्र विंडो से संशोधित छवि को पकड़ने के लिए getframe का उपयोग करने में सक्षम हो सकते हैं। मुझे लगता है कि आप क्रमशः छवि और उसके रंगरूप के रूप में getframeimwrite द्वारा लौटाई गई संरचना के सीडीटा और कोलोमाप फ़ील्ड को पास कर सकते हैं।

+0

getframe एक अच्छा और त्वरित समाधान है । हालांकि, मुझे लगता है कि एक चेतावनी है। यह छवि के आयामों के आयाम आंकड़े आकार पर निर्भर करेगा। यदि आपने एक छोटी सी विंडो (1024-बाय -600 कहें) में एक बड़ी छवि (700-बाय -600 कहें) में प्लॉट किया है, तो आप अपनी छवि पर कुछ रिज़ॉल्यूशन खो देंगे। – gnovice

7

jacobko उत्तर के बाद।आंकड़े स्थापना paperposition और paperunits गुण और अक्ष इकाइयों और स्थिति गुण आमतौर पर संकल्प tweak के बिना मुझे वांछित परिणाम देता है। तो,

>> im = imread('image.tif'); 
>> f = figure, imshow(im); 
>> r=rectangle('Position',[100, 100,10,10]); 
>> set(r,'edgecolor','b') % change the color of the rectangle to blue 
>> set(f,'units','centimeters','position',[1 1 2.5 2.5]) % set the screen size and position 
>> set(f,'paperunits','centimeters','paperposition',[1 1 2.5 2.5]) % set size and position for printing 
>> set(gca,'units','normalized','position',[0 0 1 1]) % make sure axis fills entire figure 
>> print(f, '-r80','-dtiff','image2.tif') 

उत्पादन छवि, image2.tif, अब 2.5 सेमी द्वारा 80dpi की एक resoultion पर धुरी के चारों ओर सीमा के बिना 2.5 सेमी की जाएगी।

+0

+1: मैं कहूंगा कि यह दिए गए लोगों का सबसे अच्छा "आंकड़ा स्तर" उत्तर है। – gnovice

1
close all; clear; clc; 

r = 240 ; c = 320; 

fig = figure('Visible', 'off'); 
imshow(zeros(r,c)); 
hold on; 
plot([c-fix(c/2),c-fix(c/2)],[r-fix(r/2),r-fix(r/2)],'r*', 'MarkerSize', 10); 

% Sets position and size of figure on the screen 
set(fig, 'Units', 'pixels', 'position', [100 100 c r]); 

% Sets axes to fill the figure space 
set(gca, 'Units', 'pixels', 'position', [0 0 c+1 r+1 ]); 

% Sets print properties; Looks like 1 pixel = (3/4)th of a point 
set(fig, 'paperunits', 'points', 'papersize', [fix((c-1)*(3/4))+1 fix((r-1)*(3/4))+1]); 
set(fig, 'paperunits', 'normalized', 'paperposition', [0 0 1 1]); 

print(fig, sprintf('-r%d', ceil(72*(4/3))), '-dpng', 'image.png'); 


im = imread('image.png'); 
figure; imshow(im); 
12
शीर्ष में सवाल का

, वहाँ matlab द्वारा प्रदान की काफी एक सरल उपाय है:

% you so far 

im = imread('image.tif'); 
imshow(im); 
rectangle('Position', [100, 100, 10, 10]); 

% now you use "getframe" and "frame2im" 

f = getframe(gca); 
im = frame2im(f); 

imwrite(im,'image2.tif'); 

कि मेरे लिए महान काम किया जब मैं भी एक छवि पर एक आयत आकर्षित किया और यह बचाने की कोशिश की । आप इसके साथ काम पर रखना चाहते हैं, तो बस

imread('image2.tif'); 

+1

जीसीए फ्रेम को सहेजने से यह चाल चलती है लेकिन छवि को मूल संकल्प में सहेज नहीं पाएगी। – Luqman

+0

आउटपुट छवि का आकार इनपुट छवि आकार जैसा ही है, इसलिए यह मूल छवि के संकल्प को संरक्षित करने के लिए प्रतीत होता है। यह मेरे लिए समाधान था। बहुत धन्यवाद! –

2
[f,p] = uigetfile('*.*'); 
I = imread([p,f]); 
imwrite(I,'img12.tif');% 

किसी भी नाम हम छवि को बचाने के लिए दे सकते हैं जोड़ सकते हैं और इसके साथ काम पर रखने

सादर :), लौरा

स्वचालित रूप से यह आपके फ़ोल्डर में सहेजा जाएगा और आप किसी भी छवि को ब्राउज़ कर सकते हैं।

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

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