matlab封闭图面积,matlab求0-1封闭区域围成的面积
做毕业设计需要用到这个,所以自己写了个函数。函数作用是求两张轮廓线图片不一致地方所围成区域的周长和面积。后面还要优化,先把大致结构贴在这里:
function area_peri(a,b)%输入为两张轮廓图像
n = 481;m = 321;%n,m分别为图像的高和宽
pic1 = imread(a);
pic2 = imread(b);
pic1 = logical(pic1);
pic2 = logical(pic2);
pic = bitxor(pic1,pic2);%将两幅图像进行异或运算,求出边界
perimeter = bwarea(pic);%边界的像素点个数即周长
for i = 1:n,%遍历整个图像区域,求出边界围成面积的像素总个数即面积
flag = 0;
for j = 1:m,
if flag == 0
if pic(i,j) == 1
flag = 1;
end
else
if pic(i,j) == 1
flag = 0;
else
pic(i,j) = 1;
end
end
end
end
area = bwarea(pic);
fprintf('area = %f\nperimeter = %f\n',area,perimeter);
imshow(pic);
end
此函数的问题:对轮廓精确的要求较高(每一行必须修改偶数个像素,且边界必须是奇数;即奇数+奇数=偶数)
上述函数显然适用范围太过狭隘,轮廓不可能总会“碰巧”符合上述条件。实际上,搜索的思路也是自然而然的:即在封闭区域内选择一个种子点,然后在此点开始深搜(广搜),统计搜索到的像素数。按照此思路,我先在matlab上写了一个,但是发现matlab递归的效率太低了(它默认的递归次数是500次,而且所用时间也非常长)。所以还是记录下C代码:
#include
#include
#define N 488
int im[N][N],n=321,m=481,flag[N][N];//flag为边界的索引
int ori[8][2] = {{-1,0},{0,1},{1,0},{0,-1},{-1,1},{1,1},{1,-1},{-1,-1}};
int check(int x,int y){
//测试边界点是否在图像范围内
if(x<0||y<0||x==n||y==m)
return 0;
return 1;
}
void plant(int x,int y,int top){
//填充边界,不同的封闭区域边界设置为不同的值
int i;
for(i = 0;i<8;i++){
int xx = x+ori[i][0];
int yy = y+ori[i][1];
if(check(xx,yy) && im[xx][yy] == 1 && !flag[xx][yy]){
flag[xx][yy] = top;
plant(xx,yy,top);
}
}
}
void dfs(int x,int y){
//深搜求封闭区域面积;搜到的部分填充为1
int i;
for(i = 0;i<4;i++){
int xx = x+ori[i][0];
int yy = y+ori[i][1];
if(check(xx,yy) && im[xx][yy] == 0){
im[xx][yy] = 1;
dfs(xx,yy);
}
}
}
int isroot(int x,int y){
//判断当前像素能否当作种子像素;判断标准,距此点四周最近的坐标点都是同一块区域的边界。
int i,temp;
for(i = x;i>=0;i--)
if(flag[i][y]){
temp = flag[i][y];
break;
}
if(i == -1)
return 0;
for(i = x;i
if(flag[i][y]){
if(flag[i][y] != temp)
return 0;
break;
}
if(i==n)
return 0;
for(i = y;i>=0;i--)
if(flag[x][i]){
if(flag[x][i] != temp)
return 0;
break;
}
if(i==-1)
return 0;
for(i = y;i
if(flag[x][i]){
if(flag[x][i]!= temp)
return 0;
return 1;
}
if(i==m)
return 0;
return 1;
}
int main(){
int i,j,perimeter=0,area = 0;
int top = 1;
freopen("a.txt","r",stdin);
memset(flag,0,sizeof(flag));
for(i = 0;i
for(j = 0;j
scanf("%d",&im[i][j]);
perimeter += im[i][j];
}
for(i = 0;i
for(j = 0;j
if(!flag[i][j] && im[i][j] == 1){
flag[i][j] = top;
plant(i,j,top);
top++;
}
for(i = 1;i
for(j = 1;j
if(im[i][j]==0&&isroot(i,j)){
//printf("this root is %d %d\n",i,j);
im[i][j] = 1;
dfs(i,j);
}
}
}
for(i = 0;i
for(j = 0;j
if(im[i][j] == 1)
area++;
printf("Perimeter is %d\n",perimeter);
printf("Area is %d\n",area);
return 0;
}
matlab封闭图面积,matlab求0-1封闭区域围成的面积相关推荐
- 已知抛物线与直线相交两点和抛物线顶点,求抛物线和直线所围成的面积?
已知抛物线与直线相交两点和抛物线顶点,求抛物线和直线所围成的面积? 顶点:p1(-b/2a),((4ac-b^2)/2a): 抛物线方程:y=ax^2+bx+c; 直线方程:y=k*x+b; 已知:p ...
- MATLAB计算黎曼积分曲线围成的面积
MATLAB计算黎曼积分曲线围成的面积 假设一个曲线方程f(x)= x.^3-x.^2-2*x. f(x)与笛卡尔坐标x坐标轴有交点,如图: 计算该曲线与x(1<= x <=2)围成的面积 ...
- 求y=sin(x)从0到2*pi,与x轴围成的面积
求y=sin(x)从0到2*pi,与x轴围成的面积 #列表推导式area = [abs(math.sin(i*width))*width for i in range(n)] #由积分算出sin(x) ...
- 两条曲线所围成的面积_三个视频搞定:求曲边梯形面积的思想、微积分基本定理及其几何意义、微积分理论的可视化解读、...
● 本文适合高二下学期.高三一轮复习的同学阅读.先看视频再看文字,看视频时注意利用暂停,想清楚每一步变形的依据. 01 曲边梯形的面积.微积分基本定理的内容 视频讲解 1.曲边梯形的概念及面积求法 ( ...
- 两条曲线所围成的面积_求余弦函数y=cosax在一个周期内与x轴围成的面积
本文介绍求余弦函数y=cosax在一个周期内与x轴围成的面积. 通过学习微积分,利用定积分的知识可以求出规则曲线,例如余弦函数y=cosax与x轴围成的面积,由于余弦函数为周期函数,通过求一个周期内函 ...
- matlab p图,【MATLAB】P图神器,初露锋芒:第一周作业(剧透)
做完第一周Matlab作业,深感MatLab之强大.(都第几周了,才做第一周作业...) 不在上图像处理这门课的同学,也可以试试在Matlab敲这些代码哦~ 用Matlab P图可有意思呢~ Writ ...
- 两条曲线所围成的面积_人教版数学六年级上册 5.3:圆的面积(一) 微课视频|知识点|课件解析|同步练习...
[教学微课堂] [知识点] 一.圆的认识 1.日常生活中的圆 2.画图.感知圆的基本特征 (1)实物画图 (2)系绳画图 3.对比,感知圆的特征:我们以前学过的长方形.正方形.平行四边形.梯形.三角形 ...
- matlab 能谱图,基于Matlab平台上γ能谱光滑处理
核 动 力 工 程 Nuclear Power Engineering 第 28 卷 第 3 期 2 0 0 7 年6 月 Vol. 28. No.3 Jun. 2 0 0 7 文章编号:0258-0 ...
- matlab 泡泡图,使用matlab绘制2维、3维气泡图
在学习模糊c均值聚类时,突然想到能否将每个样本对所属簇的奴属度(C)用气泡图的形式表示出来,这样就可以在一张图上同时获得分类与奴属度(C)两类信息.在matlab中没有绘制气泡图的专用函数,不过可以通 ...
最新文章
- php学习day9---数据库的基本知识
- 监控录像帮忙找回医院被偷的女婴
- [HDCTF2019]MFC
- java护照号码校验_SpringBoot如何优雅的校验参数
- 很认真地聊一下 “选择比努力更重要”
- JavaScript中的基本表单验证
- stm32f7网口_STM32F7串口通信问题
- keras的训练引擎:train_array.py和train_generator.py
- Luogu P2068 统计和
- 计算机视觉 图像合成_合成数据如何促进计算机视觉
- c语言定义数组变量初始化为0,C语言数组初始化
- ps html css 工具,PS常用九大抠图工具
- 计算机天空之城音乐谱,天谕手游天空之城乐谱代码是什么
- sqlserver 错误大全
- 树莓派做旁路网关 及 无法上网解决
- 黑客长期摇号不中黑掉北京小客车摇号网
- 弗兰克赫兹实验计算机仿真实验报告,大学物理实验教学大纲
- 全网最全AD16——PCB布线
- centOS7.9安装MySQL教程
- 双人零和博弈(two player zero-sum game)的性质