在Matlab中查找由轮廓线定义的2D区域

时间:2013-11-18 05:23:38

标签: matlab area contour kde

我在计算Matlab中的核密度估计(KDE)产生的2D轮廓区域时遇到了困难。我有三个变量:

X和Y = meshgrid,计算变量'density'(256x256) 密度=从KDE(256x256)计算的密度

我运行代码

  
    

轮廓(X,Y,密度,10)

  

这会生成附加的图。对于10个轮廓水平中的每一个,我想计算面积。我在其他一些平台上做过这样的事情,比如R,但我在Matlab中找出正确的方法/语法时遇到了麻烦。

  
    

C = contourc(密度)

  

我相信上面的行会存储轮廓的所有值,允许我计算区域,但我不完全理解这些值是如何存储的,也不是如何正确地得到它们。

任何帮助或建议将不胜感激!非常感谢你。

2 个答案:

答案 0 :(得分:2)

以下是我发布的关于usage of Matlab contour(...) function的类似问题。

主要思想是正确操作返回变量。在你的例子中

c = contour(X,Y,density,10)

变量c可以返回并用于对等值线的任何计算,包括面积。

答案 1 :(得分:2)

这个小脚本可以帮到你。它是contour的一般。可能也适用于contour3contourf,当然还需要进行调整。

[X,Y,Z] = peaks;   %example data
% specify certain levels
clevels = [1 2 3];
C = contour(X,Y,Z,clevels);
xdata = C(1,:);   %not really useful, in most cases delimters are not clear
ydata = C(2,:);   %therefore further steps to determine the actual curves:

%find curves
n(1) = 1;         %n: indices where the certain curves start
d(1) = ydata(1);  %d: distance to the next index
ii = 1;
while true

       n(ii+1) = n(ii)+d(ii)+1;    %calculate index of next startpoint

       if n(ii+1) > numel(xdata)   %breaking condition
           n(end) = [];            %delete breaking point
           break
       end

       d(ii+1) = ydata(n(ii+1));   %get next distance
       ii = ii+1; 
end

%which contourlevel to calculate?
value = 2;             %must be member of clevels
sel = find(ismember(xdata(n),value));
idx = n(sel);          %indices belonging to choice
L = ydata( n(sel) );   %length of curve array

% calculate area and plot all contours of the same level
for ii = 1:numel(idx)
    x{ii} = xdata(idx(ii)+1:idx(ii)+L(ii));
    y{ii} = ydata(idx(ii)+1:idx(ii)+L(ii));

    figure(ii)
    patch(x{ii},y{ii},'red');            %just for displaying purposes
    %partial areas of all contours of the same plot
    areas(ii) = polyarea(x{ii},y{ii});   

end

% calculate total area of all contours of same level
totalarea = sum(areas)

示例:峰值(通过Matlab)

级别value=2是绿色轮廓,第一个循环获取所有轮廓线,第二个循环计算所有绿色多边形的区域。最后总结一下。

enter image description here


如果你想获得所有级别的所有总区域,我宁愿写一些小函数,而不是使用另一个循环。您还可以考虑,仅绘制每个计算所需的级别。这样contourmatrix会更容易,您可以简化流程。如果您没有多个形状,我只需使用标量指定级别,并使用contour仅为此级别获取C,删除xdata的第一个值并{ {1}}并使用ydata

直接计算区域