我试图像下图一样计算散乱方块的面积总面积。
我知道有一个功能可以通过制作一个全面的凸面来估计面积大小,但我不确定我是否可以使用一些类似的方法来解决这个问题。
有没有人有个好主意?
编辑[2016年1月1日]: 我试过的代码是这样的。它可以工作,但每次必须保存并加载.png图像。我想询问是否可以在没有保存图像的情况下计算尺寸。
clear
b=zeros(127,2); %matrix
for i=1:127
rnd=randn(1,2);
b(i,:)=30.*rnd;
end
BW=scatter(b(:,1),b(:,2),15,[],'r','s','filled');
view(2) %view from Z+
axis off
saveas(gcf,'scatter.png')
close all
BWbase = imread('scatter.png'); %import
BW = im2bw(BWbase,0.5); %convert to binary data
imshow(BW);
bwarea(BW)
答案 0 :(得分:0)
如果您知道正确的功能,则无需保存并加载图像。您的代码有一些我修复过的问题,我将在此解释:
1-您不需要用零初始化b
,然后使用随机值的for循环填充它。相反,你可以在一行代码中完成所有这些:
b = 30 * randn(127,2);
2-然后使用scatter
绘制点数。我已删除[]
来修复命令。
BW = scatter(b(:,1),b(:,2),15,'r','s','filled');
请注意,这不是图像,而是需要转换为图像的图形。您正在寻找的功能是getframe
。此功能记录图形中的帧。您可以通过向其提供当前数字gcf
来调用它。
F = getframe(gcf);
4-现在您的框架存储在F
中,但它还不是图像。要将其转换为图片,您需要使用frame2im
函数。
[X, Map] = frame2im(F);
5-然后,就像你自己一样,将图像转换为二进制并计算面积:
BW2 = im2bw(X,0.5);
bwarea(BW2)
整个代码可以在这里看到:
b = 30 * randn(127,2);
BW = scatter(b(:,1),b(:,2),15,'r','s','filled');
axis off
F = getframe(gcf);
[X, Map] = frame2im(F);
BW2 = im2bw(X,0.5);
imshow(BW2);
bwarea(BW2)