数学中国YY主管 发表于 2016-3-1 15:28

【经典回复】 求不规则图形面积


我想求这个不规则图形的面积,请问各位大神应该怎么求啊?最好能详细点,刚刚接触matlab不是很会,谢谢!



经典回复:
此方法是基于蒙特卡洛的撒粒子估计面积。
a=imread('C:\Users\Administrator\Desktop\as.jpg');
b=rgb2gray(a);
figure(1);
imshow(b)
b=double(b);
% 得到原图的宽高
=size(b);
% 二值化
for i=1:m
    for j=1:n
        if b(i,j)>0
            b(i,j)=255;
        end
    end
end
% 初始化撒点个数
num_Dian=10000;
P=rand(num_Dian,2);
x=m*P(:,1);
x= floor(x);
y=n*P(:,2);
y= floor(y);
% 会出撒的点
hold on
plot(x,y,'*');
% 得到不规则图形边界点的个数及坐标
=find(b==255);    % 得到坐标
num_of_YuanBianShang_Dian=length(Yuan_x);  % 得到个数
% 初始化圈内撒的点的个数
count_Dian_In_YuanNei=0;
for ii=1:m
    % 从第一行开始遍历,每当碰到第一个不规则图形的边界时候
    % 得到该图形在这一行的两个端点,通过判断两端点内撒的点
    % 的个数来统计所有在图形内的点的个数
    cc=find(b(ii,:)==255);
    if cc
        % 找到第ii行不规则图形为白点的坐标
        =find(b(ii,:)==255);
        % 找到第ii行不规则图形两个端点内撒的点的位置
        location_x=find(x==ii);
        if ~isempty(location_x)
            num_location_x=size(location_x);
            for kk=1:num_location_x
                if y(location_x(kk))<=max(Dian_y)&&y(location_x(kk))>=min(Dian_y)
                    % 统计第ii行不规则图形两个端点内撒的点的个数
                    count_Dian_In_YuanNei=count_Dian_In_YuanNei+1;
                end
            end
        end
    end
end
% 不规则图形的面积为:
S=m*n*(count_Dian_In_YuanNei/num_Dian)

结果图片




远行的小船儿666 发表于 2016-3-12 21:59

可以的,值得学习一下

远行的小船儿666 发表于 2016-3-12 22:00

谢谢楼主分享

远行的小船儿666 发表于 2016-3-13 12:59

imshow(b)
cc=find(b(ii,==255);
  =find(b(ii,==255);
有点小问题
需要修改一下,如下
imshow(b);
cc=find(b(ii==255));
  =find(b(ii==255));
页: [1]
查看完整版本: 【经典回复】 求不规则图形面积