image - इन छवियों को एक साथ कैसे रखा जाए?



matlab image-processing (1)

मेरे 200 अंक हैं। प्रत्येक समय बिंदु के लिए, एक छवि है, जिसका आकार 40*40 double , इस समय बिंदु से मेल खाती है। उदाहरण के लिए, image 1 time point 1 मेल खाती है; image k time point k ( k = 1,2,...,200 ) से मेल खाती है।

समय बिंदु T = 1:200 , चित्र के रूप में नाम के साथ Image_T , इस प्रकार Image_1 , Image_2 आदि।

मैं इन सभी 200 छवियों को एक साथ रखना चाहता हूं। अंतिम आकार 40*40*200 डबल है। अंतिम छवि fMRI छवि ( fmri_szX = 40 , fmri_szY = 40 और fmri_szT = 200 ) fmri_szT = 200 । कैसे प्राप्त करें? धन्यवाद!


गतिशील चर

ध्यान दें कि जब तक यह संभव है , यह खराब प्रोग्रामिंग माना जाता है (उदाहरण के लिए here देखें, या लोरेन और यहां तक ​​कि उनके documentation में मैथवर्क्स आपको यह नहीं करने के लिए कहते हैं)। डायनामिक वैरिएबल नामों से बचते हुए, अपनी छवियों को सीधे 3 डी सरणी या सेल संरचना में लोड करना बेहतर होगा। मैंने इसे पूर्णता के लिए पोस्ट किया है; यदि आपको कभी इस समाधान का उपयोग करना पड़ता है, तो आपको तुरंत (सेल) सरणी में बदलना चाहिए।

लिंक्ड लेखों का यह eval कि क्यों eval इतना बुरा विचार है, यह है कि MATLAB अब भविष्यवाणी नहीं कर सकता है कि ऑपरेशन का परिणाम क्या होगा। उदाहरण के लिए A=3*(2:4) MATLAB द्वारा एक दोहरे-सरणी के आउटपुट के लिए पहचाना जाता है। यदि आप सामान eval , तो MATLAB अब ऐसा नहीं कर सकता। MATLAB एक व्याख्या की गई भाषा है, अर्थात कोड की प्रत्येक पंक्ति को पहले पूरे कोड को संकलित किए बिना फिर से पढ़ा जाता है। इसका मतलब यह है कि हर बार MATLAB का सामना करना पड़ता है, इसे रोकना पड़ता है, अभिव्यक्ति का मूल्यांकन करना होता है, फिर आउटपुट की जाँच करना, उस स्टोर करना और जारी रखना। MATLAB (JIT / MAGMA आदि) द्वारा नियोजित अधिकांश गति-इंजन बयानों के परिणाम की भविष्यवाणी किए बिना काम नहीं कर सकते हैं, और इसलिए eval मूल्यांकन के दौरान बंद हो जाएंगे, जिससे आपका कोड बहुत धीमा हो जाएगा।

इसके अलावा eval के उपयोग का एक सुरक्षा पहलू है। निम्नलिखित को धयान मे रखते हुए:

var1=1;
var2=2;
var3=3;
varnames={'var1','var2; disp(''GOTCHA''); %', 'var3'};

accumvar=[];
for k=1:numel(varnames)
   vname=varnames{k};
   disp(['Reading from variable named ' vname]); eval(['accumvar(end+1)=' vname ';']);
end

अब accumvar में वांछित चर नाम होंगे। लेकिन यदि आप accumvar को आउटपुट के रूप में सेट नहीं करते हैं, तो आप एक accumvar उपयोग नहीं कर सकते हैं, लेकिन उदाहरण के लिए eval('rm -rf ~/*') जो आपके पूरे डिस्क को बिना बताए भी स्वरूपित कर देगा।

पाश दृष्टिकोण

for ii = 200:-1:1
    str = sprintf('Image_%d',ii);
    A(:,:,ii) = eval(str);
end

यह आपका मैट्रिक्स बनाता है। ध्यान दें कि मैं लूप को पीछे की तरफ चलाने देता हूं, ताकि A को इसके सबसे बड़े आकार में इनिशियलाइज़ कर सके।

अर्ध-सदिश दृष्टिकोण

str=strsplit(sprintf('image_%d ',1:200),' '); % Create all your names
str(end)=[]; % Delete the last entry (empty)
%Problem: eval cannot handle cells, loop anyway:
for ii = 200:-1:1
    A(:,:,ii)=eval(str{ii});
end

eval सरणियों का समर्थन नहीं करता है, इसलिए आप सीधे सेलार्रे को अंदर प्लग नहीं कर सकते।

डायनामिक फ़ाइल नाम

ऊपर के समान शीर्षक होने के बावजूद, इसका अर्थ है कि आपकी फ़ाइल नाम संरचित है, इसलिए फ़ाइल ब्राउज़र में है, और MATLAB नहीं है। मैं यहां .jpg फाइलें ग्रहण कर रहा हूं, लेकिन आप हर समर्थित छवि एक्सटेंशन जोड़ सकते हैं। इसके अलावा, सभी छवियों को एक फ़ोल्डर में रखना सुनिश्चित करें और उस एक्सटेंशन के साथ कोई अतिरिक्त चित्र नहीं है, या आपको केवल वांछित छवियों को शामिल करने के लिए dir() कॉल को संशोधित करना होगा।

filenames = dir('*.jpg');
for ii = length(filenames):-1:1
    A(:,:,:,ii) = imread(filenames{ii});
end

छवियाँ आमतौर पर m*n*3 फ़ाइलों के रूप में पढ़ी जाती हैं, जहाँ m*n पिक्सेल में आपकी छवि का आकार है और 3 इस तथ्य से उपजी हैं कि वे imread द्वारा आरजीबी के रूप में imread । इसलिए A अब एक 4 डी मैट्रिक्स है, जिसे m*n*3*T रूप में संरचित किया गया है, जहां अंतिम सूचकांक छवि के समय से मेल खाता है, और पहले तीन आरजीबी प्रारूप में आपकी छवि हैं।

चूंकि आप निर्दिष्ट नहीं करते हैं कि आप अपने 40*40 डबल कैसे प्राप्त करते हैं, इसलिए मैंने 4D मैट्रिक्स छोड़ दिया है। क्या आप उन्हें पढ़ सकते हैं और फिर RGB की uint16 व्याख्या का उपयोग करने के लिए स्विच कर सकते हैं, जो कि एक एकल संख्या है, जिसके परिणामस्वरूप m*n*1*T चर होगा, जिसे आप A = squeeze(A(:,:,1,:)); कहकर A = squeeze(A(:,:,1,:)); 3D चर में घटा सकते हैं A = squeeze(A(:,:,1,:));





matlab-guide