【发布时间】:2016-04-05 19:46:07
【问题描述】:
我使用 imagesc 创建一个绘图。 X/Y 轴分别为经度和纬度。 Z 值是下图所示图像的图像强度。我想做的是计算显示的每个多边形的面积。任何人都可以推荐一种简单的(或任何)方法来实现这一点吗?
编辑
忘记添加图片了。
【问题讨论】:
-
多边形外的
Z值是否是某个唯一值,比如0?或者可以应用阈值吗?
我使用 imagesc 创建一个绘图。 X/Y 轴分别为经度和纬度。 Z 值是下图所示图像的图像强度。我想做的是计算显示的每个多边形的面积。任何人都可以推荐一种简单的(或任何)方法来实现这一点吗?
编辑
忘记添加图片了。
【问题讨论】:
Z 值是否是某个唯一值,比如0?或者可以应用阈值吗?
下面是一个玩具示例。它取决于Z 值在对象内部与外部不同(这里:不是0)的假设。同样在这里,我假设在第 4 列有一个直线分隔线,但相同的原则(应用掩码)可以应用于其他边界。这也假设这些值沿 x 和 y 轴等距,但问题并未相反。如果不是这种情况,则需要使用bsxfun 进行更多工作。
A = [0 2 0 0 0 2 0
3 5 3 0 1 4 0
1 4 0 0 3 2 3
2 3 0 0 0 4 2
0 2 6 0 1 6 1
0 3 0 0 2 3 0
0 0 0 0 0 0 0];
area_per_pix = 0.5; % or whatever
% plot it
cm = parula(10);
cm(1, :) = [1 1 1];
figure(1);
clf
imagesc(A);
colormap(cm);
% divider
dv_idx = 4;
left_object = A(:, 1:(dv_idx-1));
left_mask = left_object > 0; % threshold object
num_pix_left = sum(left_mask(:));
% right object, different method
right_mask = repmat((1:size(A, 2)) > dv_idx, size(A, 1), 1);
right_mask = (A > 0) & right_mask;
num_pix_right = sum(right_mask(:));
fprintf('The left object is %.2f units large, the right one %.2f units.\n', ...
num_pix_left * area_per_pix, num_pix_right * area_per_pix);
【讨论】:
area_per_pix 是沿 x 轴的两个数据点之间的距离乘以沿 y 轴的距离。我只是选择了一个任意值。如果不是所有数据点都具有相同的区域,它会变得更加复杂。 div_idx 再次被选中以匹配我的玩具数据。这是分隔两个形状的列。你必须从你的数据中得到它。如果您的数据不能沿一列分离,那么还有其他方法可以定义掩码。
A 的相关部分(这很容易,因为我们将所有内容都提取到某一列),然后是阈值。这可能等同于应用于右侧(使用(div_idx+1):end 作为索引)。在第二种方法中,我们将其与掩码相结合(这是一种更通用的方法,因为掩码可以是任意的)
A 大小相同的矩阵,并将其与掩码逐元素相乘,然后求和:例如,apix = bsxfun(@times, (1:size(A,1))' * .5, 1:size(A, 2)); weighted=right_mask.*apix; sum(weighted(:)); 这里apix 包含每个坐标对处的区域。
这可能会有所帮助:http://se.mathworks.com/matlabcentral/answers/35501-surface-area-from-a-z-matrix 他没用过imagesc,但也是类似的问题。
【讨论】: