声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5552|回复: 12

[图像处理] 如何在matlab中根据图形形状求出图形面积

[复制链接]
发表于 2011-3-31 09:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
附件中的图形中,我的想法是求出上面图形占总的矩形边框的面积比例求出来即可,但是怎么做还没思路,请高手们讨论。
未命名.bmp
回复
分享到:

使用道具 举报

发表于 2011-3-31 23:28 | 显示全部楼层
你可找到图形的数学描述。可以考虑用蒙特卡洛方法,基本思路是随机的在矩阵中选取随机数,看看有多少落在你的曲线包含的面积下,随着随机数的大量增加,曲线包含的面积和矩形面积比就等于随机数落在你曲线下的面积。你可以尝试一下

评分

1

查看全部评分

发表于 2011-4-1 00:59 | 显示全部楼层
回复 1 # 刘颖慧 的帖子

离散点? 或函数?
个人水平专业有限, 感觉说清楚些较好, 最好有代码!
发表于 2011-4-1 08:20 | 显示全部楼层

恩,我也学习了。
发表于 2011-4-1 09:10 | 显示全部楼层
可以利用matlab里面求图形面积的函数
  1. polyarea
复制代码
请仔细查看帮助文件,了解其用法,希望能够帮助到你

评分

1

查看全部评分

 楼主| 发表于 2011-4-1 09:11 | 显示全部楼层
回复 2 # 雨人 的帖子

现在用的是,把图形里面用填充,膨胀的方法,和外面的矩形分开
clc
clear
name=input('输入图片名');
AA=imread(name);
Wide=input('输入图片宽度');
Long=input('输入图片长度');
Wide1=input('输入所选原始图片纵坐标长度');
Long1=input('输入所选原始图片橫坐标长度');
%image(AA)
imshow(AA)
%info=imfinfo('1234.jpg')
for i=1:Wide
for j=1:Long
    if (AA(i,j,1)>80&AA(i,j,2)>100&AA(i,j,3)>80)%|(AA(i,j,1)==&AA(i,j,2)<150&AA(i,j,3)==0)
       BB(i,j,1)=0;
       BB(i,j,2)=0;
       BB(i,j,3)=0;
    else
       BB(i,j,1)=1;
       BB(i,j,2)=1;
       BB(i,j,3)=1;
    end
end
end
figure
image(BB)

Se=strel('line',7,7);
BB2=imdilate(BB,Se);
%figure
%image(BB2)
BB22=im2bw(BB2);
%figure
%image(BB22)
BB3=bwmorph(BB22,'thin');
%figure
%image(BB3,[0 0 0;1 1 1])
BB4=bwmorph(BB3,'bridge');
%BB4 = bwmorph(BB33,'shrink',Inf);
for i=1
    for j=1:Long
        BB4(i,j)=0;
    end
end
for i=Wide
    for j=1:Long
        BB4(i,j)=0;
    end
end
for i=1:Wide
    for j=1
        BB4(i,j)=0;
    end
end
for i=1:Wide
    for j=Long
        BB4(i,j)=0;
    end
end
BB40=bwmorph(BB4,'bridge');
%figure
%image(BB4)

%figure
%image(BB4)
BB5=bwmorph(BB40,'skel',Inf);
%figure
%image(BB5)
BB6=bwmorph(BB5,'spur',Inf);
%figure
%image(BB6)
BB7=bwfill(BB6,'hole');
figure
image(BB7)
BB8=double(BB7);
%area0=regionprops(BB8)
area1=bwarea(BB7);
area=area1/(Wide*Long)*Wide1*Long1%地面示功图面积
s= regionprops(BB8, 'centroid');%求示功图质心
centroids = cat(1, s.Centroid);%示功图质心坐标
X0=centroids(1)/Long*Long1%将质心横坐标换算到原始图坐标中,为质心到图左端距离
Y0=centroids(2)/Wide*Wide1%将质心纵坐标换算到原始图坐标中,为质心到图顶的距离
%imshow(BB8)
%       hold on
%       plot(centroids(:,1), centroids(:,2), 'b*')
%       hold off
%求功图七个不变矩
m=regionprops(BB8, 'area');
m00=m.Area;
m10=0;
m01=0;
for i=1:Wide %
    for j=1:Long
        if BB8(i,j)==1
        m10=m10+i;
        m01=m01+j;
        end
    end
end
x1=m10/m00;
y1=m01/m00;
u00=m00;
u11=0;
u12=0;
u21=0;
u20=0;
u02=0;
u30=0;
u03=0;
for i=1:Wide%
   for j=1:Long
       if BB8(i,j)==1
           u11=u11+(i-x1)*(j-y1);
           u12=u12+(i-x1)*(j-y1)^2;
           u21=u21+(i-x1)^2*(j-y1);
           u20=u20+(i-x1)^2;
           u02=u02+(j-y1)^2;
           u30=u30+(i-x1)^3;
           u03=u03+(j-y1)^3;
       end
   end
end
ata11=u11/(u00^((1+1)/2+1));
ata20=u20/(u00^((2+0)/2+1));
ata02=u02/(u00^((0+2)/2+1));
ata12=u12/(u00^((1+2)/2+1));
ata21=u21/(u00^((2+1)/2+1));
ata30=u30/(u00^((3+0)/2+1));
ata03=u03/(u00^((0+3)/2+1));
fai1=ata20+ata02
fai2=(ata20-ata02)^2+4*ata11^2
fai3=(ata30-ata12)^2+(3*ata21-ata03)^2
fai4=(ata30+ata12)^2+(ata21+ata03)^2
fai5=(ata30-ata12)*(ata30+ata12)*((ata30+ata12)^2-3*(ata21-ata03)^2)+(3*ata21-ata03)*...
(ata21+ata03)*(3*(ata30+ata12)^2-(ata21+ata03)^2)
fai6=(ata20-ata02)*((ata30+ata12)^2-(ata21+ata03)^2)+4*ata11*(ata30+ata12)*(ata21+ata03)
fai7=3*(ata12-ata03)*(ata30+ata12)*((ata30+ata12)^2-3*(ata21+ata03)^2)+(3*ata21-ata03)*...
(ata21+ata03)*(3*(ata30+ata12)^2-(ata21+ata03)^2)

total=[area X0 Y0 fai1 fai2 fai3 fai4 fai5 fai6 fai7]%将所求量总放到一个数组中以便集中存储调用

这个程序顺带计算了一下质心位置

顺带问一下大家,别的电脑运行没问题,昨天我运行也没问题,今天我的电脑总提示这样一个错误:
??? Undefined function or method 'checkinput' for input arguments of type 'cell'.

Error in ==> regionprops>ParseInputs at 839
        if ~isempty(stats(k).PixelIdxList)

Error in ==> regionprops at 109
%   nonsparse, and contain integers. L can have any numeric class and any
不知道为什么?
 楼主| 发表于 2011-4-1 09:13 | 显示全部楼层
回复 3 # ChaChing 的帖子

ChaChing您好,我把程序贴出来了,现在的问题是能用,但是不知道为什么提示我错误,别的电脑可以正常运行的,这个错误我分析不出来原因。

点评

别的电脑可以运行,那说明程序本身应该没有问题,是不是你workspace里面的变量或者当前目录的文件名与你的变量或者函数重名?  发表于 2011-4-1 09:23
发表于 2011-4-1 10:21 | 显示全部楼层
回复 6 # 刘颖慧 的帖子

你的程序是脚本程序,没有函数,错误提示为没有定义的函数‘checkinput’,你好好检查一下这个脚本文件的文件名字是什么,调用的时候是从命令窗口怎么调用的,如果还不行,就在程序里面加断点,单步调试。希望对你有帮助
 楼主| 发表于 2011-4-1 10:33 | 显示全部楼层
回复 8 # 雨人 的帖子

谢谢,我重新启动一下,错误就没有了,过几天重新再安装一遍matlab吧。
 楼主| 发表于 2011-4-1 10:34 | 显示全部楼层
回复 7 # 刘颖慧 的帖子

昨天出现这种重名错误,我改过了,今天来了又出现其他问题,不过我重新启动了一遍就好了,很无语。
发表于 2011-4-3 09:53 | 显示全部楼层
这个困哪吧,你要的什么面积
 楼主| 发表于 2011-4-3 10:58 | 显示全部楼层
回复 11 # zhengyangxue 的帖子

面积问题已经基本解决了,谢谢~
发表于 2012-9-13 21:56 | 显示全部楼层
回复 2 # 雨人 的帖子

没明白
能详细不
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-2 23:34 , Processed in 0.305203 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表