做毕业设计需要用到这个,所以自己写了个函数。函数作用是求两张轮廓线图片不一致地方所围成区域的周长和面积。后面还要优化,先把大致结构贴在这里:

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封闭区域围成的面积相关推荐

  1. 已知抛物线与直线相交两点和抛物线顶点,求抛物线和直线所围成的面积?

    已知抛物线与直线相交两点和抛物线顶点,求抛物线和直线所围成的面积? 顶点:p1(-b/2a),((4ac-b^2)/2a): 抛物线方程:y=ax^2+bx+c; 直线方程:y=k*x+b; 已知:p ...

  2. MATLAB计算黎曼积分曲线围成的面积

    MATLAB计算黎曼积分曲线围成的面积 假设一个曲线方程f(x)= x.^3-x.^2-2*x. f(x)与笛卡尔坐标x坐标轴有交点,如图: 计算该曲线与x(1<= x <=2)围成的面积 ...

  3. 求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) ...

  4. 两条曲线所围成的面积_三个视频搞定:求曲边梯形面积的思想、微积分基本定理及其几何意义、微积分理论的可视化解读、...

    ● 本文适合高二下学期.高三一轮复习的同学阅读.先看视频再看文字,看视频时注意利用暂停,想清楚每一步变形的依据. 01 曲边梯形的面积.微积分基本定理的内容 视频讲解 1.曲边梯形的概念及面积求法 ( ...

  5. 两条曲线所围成的面积_求余弦函数y=cosax在一个周期内与x轴围成的面积

    本文介绍求余弦函数y=cosax在一个周期内与x轴围成的面积. 通过学习微积分,利用定积分的知识可以求出规则曲线,例如余弦函数y=cosax与x轴围成的面积,由于余弦函数为周期函数,通过求一个周期内函 ...

  6. matlab p图,【MATLAB】P图神器,初露锋芒:第一周作业(剧透)

    做完第一周Matlab作业,深感MatLab之强大.(都第几周了,才做第一周作业...) 不在上图像处理这门课的同学,也可以试试在Matlab敲这些代码哦~ 用Matlab P图可有意思呢~ Writ ...

  7. 两条曲线所围成的面积_人教版数学六年级上册 5.3:圆的面积(一) 微课视频|知识点|课件解析|同步练习...

    [教学微课堂] [知识点] 一.圆的认识 1.日常生活中的圆 2.画图.感知圆的基本特征 (1)实物画图 (2)系绳画图 3.对比,感知圆的特征:我们以前学过的长方形.正方形.平行四边形.梯形.三角形 ...

  8. matlab 能谱图,基于Matlab平台上γ能谱光滑处理

    核 动 力 工 程 Nuclear Power Engineering 第 28 卷 第 3 期 2 0 0 7 年6 月 Vol. 28. No.3 Jun. 2 0 0 7 文章编号:0258-0 ...

  9. matlab 泡泡图,使用matlab绘制2维、3维气泡图

    在学习模糊c均值聚类时,突然想到能否将每个样本对所属簇的奴属度(C)用气泡图的形式表示出来,这样就可以在一张图上同时获得分类与奴属度(C)两类信息.在matlab中没有绘制气泡图的专用函数,不过可以通 ...

最新文章

  1. php学习day9---数据库的基本知识
  2. 监控录像帮忙找回医院被偷的女婴
  3. [HDCTF2019]MFC
  4. java护照号码校验_SpringBoot如何优雅的校验参数
  5. 很认真地聊一下 “选择比努力更重要”
  6. JavaScript中的基本表单验证
  7. stm32f7网口_STM32F7串口通信问题
  8. keras的训练引擎:train_array.py和train_generator.py
  9. Luogu P2068 统计和
  10. 计算机视觉 图像合成_合成数据如何促进计算机视觉
  11. c语言定义数组变量初始化为0,C语言数组初始化
  12. ps html css 工具,PS常用九大抠图工具
  13. 计算机天空之城音乐谱,天谕手游天空之城乐谱代码是什么
  14. sqlserver 错误大全
  15. 树莓派做旁路网关 及 无法上网解决
  16. 黑客长期摇号不中黑掉北京小客车摇号网
  17. 弗兰克赫兹实验计算机仿真实验报告,大学物理实验教学大纲
  18. 全网最全AD16——PCB布线
  19. centOS7.9安装MySQL教程
  20. 双人零和博弈(two player zero-sum game)的性质

热门文章

  1. 总结计算机中十进制数二进制数,计算机中十进制转换为二进制的新方法
  2. shell中encoding=utf-8_如何在Linux中将文件编码转换为UTF-8
  3. 面向对象的三个基本要素,五个基本原则
  4. 室内聚会趣味游戏大全
  5. SpringBoot 整合 Dozer 映射框架
  6. 眼动数据分析基础知识了解(人眼工作机制)
  7. FabricV2.2测试网络搭建以及开发环境部署
  8. 【电脑讲解】amd主板pbo是什么?微星技嘉主板如何设置pbo?
  9. 理化生实验操作考试系统(理化生实验考评教室)
  10. PDF怎么编辑,如何去除PDF水印