数学建模社区-数学中国

标题: 【经典回复】 求不规则图形面积 [打印本页]

作者: 数学中国YY主管    时间: 2016-3-1 15:28
标题: 【经典回复】 求不规则图形面积
我想求这个不规则图形的面积,请问各位大神应该怎么求啊?最好能详细点,刚刚接触matlab不是很会,谢谢!

QQ图片20160301152715.png


经典回复:
此方法是基于蒙特卡洛的撒粒子估计面积。
a=imread('C:\Users\Administrator\Desktop\as.jpg');
b=rgb2gray(a);
figure(1);
imshow(b)
b=double(b);
% 得到原图的宽高
[m,n]=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,'*');
% 得到不规则图形边界点的个数及坐标
[Yuan_x,Yuan_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行不规则图形为白点的坐标
        [Dian_x,Dian_y]=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)

结果图片
QQ图片20160301152837.jpg




作者: 远行的小船儿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);
  [Dian_x,Dian_y]=find(b(ii,==255);
有点小问题
需要修改一下,如下
imshow(b);
cc=find(b(ii==255));
  [Dian_x,Dian_y]=find(b(ii==255));





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5