2014-02-07 64 views
1

如Matlab中使用「regionprops」上的圖像處理流水線的一部分我生成結構:MATLAB從結構轉換成表和輸出中爲csv

vWFfeatures = 


1631x1 struct array with fields: 

Area 
Centroid 
MajorAxisLength 
MinorAxisLength 
Eccentricity 
EquivDiameter 

其中「質心」是含有一個矢量[X,Y ]例如[12.4,26.2]。我想將此結構轉換爲表格並保存爲CSV文件。例如,目標是將「質心」向量分成標爲Centroid_X和Centroid_Y的表中的兩列。我不知道如何實現這一點。

到目前爲止,我調查了使用'struct2table'函數。這將「質心」作爲一列輸出。此外,當我嘗試分配輸出到一個變量我得到一個錯誤:

table = struct2table(vWFfeatures) 
Error using struct2table 
Too many output arguments. 

我不明白這一點,任何幫助嗎?

+1

您是否嘗試過''AsArray',true'作爲'struct2table'的附加參數?你的結構看起來可能有不兼容的尺寸。 – scenia

+0

是的,我試過這個,沒有它不起作用。我認爲這個問題可能在struct2table版本中,因爲我運行的是Matlab R2013a這個函數不可用,所以我下載了它:http://www.mathworks.com/matlabcentral/fileexchange/36214-struct2table但是文檔不同於我正在閱讀。我仍然得到錯誤太多輸出參數 –

+1

是的,這是一個用戶提交,這不是後來的MATLAB版本中包含的原始'struct2table'。鏈接的版本不支持輸出參數,這意味着您不能將結果分配給變量。您必須找到與官方行爲相匹配的版本,或者重新編寫您下載的版本以包含此功能。 – scenia

回答

0

這是我如何解決它到底:提取的每個字段從數據結構,用於horzcat加入到一個新的數組,那麼定義報頭和用於csvwrite_with_headers,到輸出中爲CSV。

wpbFeatures = regionprops(vWFlabelled, 'Area','Centroid', 'MajorAxisLength', 'MinorAxisLength', 'Eccentricity', 'EquivDiameter'); 
wpbArea = vertcat(wpbFeatures.Area); 
wpbCentroid = vertcat(wpbFeatures.Centroid); 
wpbCentroidX = wpbCentroid(:,1); 
wpbCentroidY = wpbCentroid(:,2); 
wpbFeret = max(imFeretDiameter(vWFlabelled, linspace(0,180,201)), [], 2); 
wpbMajorAxisLength = vertcat(wpbFeatures.MajorAxisLength); 
wpbMinorAxisLength = vertcat(wpbFeatures.MinorAxisLength); 
wpbEccentricity = vertcat(wpbFeatures.Eccentricity); 
wpbEquivDiameter = vertcat(wpbFeatures.EquivDiameter); 
wpbFeatures = horzcat(wpbArea, wpbCentroidX, wpbCentroidY, wpbFeret, wpbMajorAxisLength, wpbMinorAxisLength, wpbEccentricity, wpbEquivDiameter); 
headers = {'Area','CentroidX','CentroidY', 'Feret', 'MajorAxisLength', 'MinorAxisLength', 'Eccentricity', 'EquivDiameter'}; 
csvwrite_with_headers(strcat(PlateName, '_ResultsFeatures.csv'),wpbFeatures,headers); 
1

由於原始struct2table不適用於您,您可能需要特別實施您試圖實現自己的行爲。
在這種情況下,這意味着提取要保存的值(拆分陣列,)然後保存數據:如果你想在你的CSV欄標題

data_Centroid = vertcat(vWFfeatures.Centroid); %// contains the centroid data 
Centroid_X = data_Centroid(:,1); %// The first column is X 
Centroid_Y = data_Centroid(:,2); %// the second column is Y 
csvwrite('centroid.csv',data_Centroid); %// writes values into csv 

,情況就變得複雜,因爲csvwrite方能處理數值數組:

celldata = num2cell(num2str(data_Centroid)); %// create cell array 
celldata(:,3) = celldata(:,4); %// copy col 4 (y data) into col 3 (spaces) 
for i=1:length(celldata) 
    celldata{i,2} = ','; %// col 2 has commas 
    celldata{i,4} = '\n'; %// col 4 has newlines 
end 
celldata = celldata'; %'// transpose to make the entries come columnwise 
strdata = ['Centroid_X,Centroid_Y\n',celldata{:}]; %// contains all as string 

fid = fopen('centroid.csv','w'); % writing the string into the csv 
fprintf(fid,strdata); 
fclose(fid);