经典回复:
此方法是基于蒙特卡洛的撒粒子估计面积。
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)