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



matlab image-processing (1)

गतिशील चर

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

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

एवल सरणियों का समर्थन नहीं करता है, इसलिए आप सीधे सेलएरे str को प्लग नहीं कर सकते हैं। cellfun जैसी cellfun भी 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 इस तथ्य से उत्पन्न होता है कि उन्हें आरजीबी के रूप में पढ़ा जाता है। इसलिए A अब एक 4 डी मैट्रिक्स है, m*n*3*T रूप में संरचित, जहां अंतिम सूचकांक छवि के समय से मेल खाती है, और पहले तीन आरजीबी स्वरूप में आपकी छवि हैं।

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

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

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

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