(M2C系列)C语言二值图的形态学腐蚀膨胀及开闭运算

  • 一、结构元
  • 二、腐蚀
  • 三、膨胀
  • 四、开闭运算
  • 五、其他

by HPC_ZY


由于剧情,需要纯C(不用三方库)实现图像算法。但作为一名MATLAB老用户,刚学会了内存分配,顾开始实现图像算法,在此总结。
今后会持续更新MATLAB函数的C实现,欢迎交流,共同学习。

.
注:本文不讲原理,假设已经理解形态学原理,或通过以下文章学习
https://blog.csdn.net/weixin_42462804/article/details/84039380
.


一、结构元

  1. 类型定义
typedef struct
{int* x;  // 值为1的元素行坐标int* y;  // 值为1的元素列坐标int len;  // 值为1的元素数量
}StrElem;
  1. 自定义结构元

如上图结构元,参数分别为

StrElem se1,se2, se3;
se1.x = {0, 0, 1};
se1.y = {0, 1, 0};
se1.len =3;se2.x = {-1, 0, 0, 0, 1};
se2.y = {0, -1, 0, 1, 0};
se2.len = 5;se3.x = {0, 1, 2};
se3.y = {0, 0, 0};
se3.len = 3;
  1. 标准结构元
    这里只写两种,‘square’,‘diamond’
StrElem strel(int r, int type)
{StrElem se;switch(type){case 1: // diamondse.len = (r*2 + 1)*(r*2 + 1);se.x = (int*)malloc(se.len*sizeof(int));se.y = (int*)malloc(se.len*sizeof(int));int idx = 0;for (int i = -r; i <= r; i++){for (int j = -r; j <= r; j++){if (abs(i) + abs(j) <= r){se.x[idx] = i;se.y[idx] = j;idx++;}}}break;case 2: // squarese.len = 2*r*(r + 1) + 1;se.x = (int*)malloc(se.len*sizeof(int));se.y = (int*)malloc(se.len*sizeof(int));int idx = 0;for (int i = -r; i <= r; i++){for (int j = -r; j <= r; j++){se.x[idx] = i;se.y[idx] = j;idx++;}}break;}return se;
}

调用方式与结果

StrElem se1 = strel(2, 1);
StrElem se2 = strel(3, 2);


二、腐蚀

腐蚀相对简单,因为不用考虑图像边缘的问题

// 输出:图像  输入:原始图像,行,列,结构元半径,结构元类型
double** imerode2(double** in, int Rows, int Cols, int r, int type){// 初始化double** out = NULL;out = (double**)malloc(Rows * sizeof(double *));for (int i = 0; i < Rows; i++)out[i] = (double*)malloc(Cols * sizeof(double));for (int i = 0; i < Rows; i++)for (int j = 0; j < Cols; j++)out[i][j] = 0;// 腐蚀StrElem se;se = strel(r, type);for (int i = r; i < Rows-r; i++){    for (int j = r; j < Cols-r; j++){for (int k = 0; k < se.len; k++){if (in[i + se.x[k]][j + se.y[k]] < 1)goto p; // 判断是否整个结构元在目标内}out[i][j] = 1;p:;}}return out;
}

调用方式与结果

double** im1 = imerode2(im, 512, 512, 10, 1);


三、膨胀

膨胀的时候,目标可能会超出原图边界,所以要扩充原图

double** imdilate2(double** in, int Rows, int Cols, int r, int type){// 扩展图初始化double** tmpin = NULL, **tmpout = NULL;int tmpR = Rows + 2*r, tmpC = Cols + 2*r;tmpin = (double**)malloc(tmpR * sizeof(double *));tmpout = (double**)malloc(tmpR * sizeof(double *));for (int i = 0; i < tmpR; i++){tmpin [i] = (double*)malloc(tmpC * sizeof(double));tmpout [i] = (double*)malloc(tmpC * sizeof(double));}for (int i = 0; i < tmpR; i++)for (int j = 0; j < tmpC ; j++){tmpin [i][j] = 0;tmpout [i][j] = 0;}for (int i = 0; i < Rows; i++)for (int j = 0; j < Cols; j++)tmpin [i+r][j+r] = in[i][j];// 输出初始化double** out = NULL;out = (double**)malloc(Rows * sizeof(double *));for (int i = 0; i < Rows; i++)out[i] = (double*)malloc(Cols * sizeof(double));for (int i = 0; i < Rows; i++)for (int j = 0; j < Cols; j++)out[i][j] = 0;// 膨胀StrElem se;se = strel(r, type);for (int i = r; i < tmpR- r; i++)for (int j = r; j < tmpC - r; j++)if (tmpin[i][j]>0)for (int k = 0; k < se.len; k++)tmpout[i + se.x[k]][j + se.y[k]] = 1;// 截取赋值(保持与原图同尺寸)for (int i = 0; i < Rows; i++)for (int j = 0; j < Cols; j++)out[i][j] = tmpout [i+r][j+r];// free(别忘了释放)for (int i = 0; i < tmpR; i++){free(tmpin[i]);free(tmpout[i]);}free(tmpin);free(tmpout);return out;
}

调用方式与结果

double** im2 = imdilate2(im, 512, 512, 10, 1);


四、开闭运算

由于:
开运算 = 腐蚀+膨胀
闭运算 = 膨胀+腐蚀
这里就不列出代码了,大家可组合上述代码完成imopen2(),imclose2()。

调用方式与结果

// im是double**
double** im3 = imopen2(im, 512, 512, 10, 1);
double** im4 = imclose2(im, 512, 512, 10, 1);

五、其他

  1. 上述函数名结尾都有“2”,因为我们是对二维图像进行处理。对应的还有三维形态学操作,如 imopen3()。
  2. 后续可能更新灰度形态学或三维形态学
  3. 对应MATLAB代码
se = strel('diamond', 10);
im1 = imerode(im,se);
im2 = imdilate(im,se);
im3 = imopen(im,se);
im4 = imclose(im,se);

C语言二值图的腐蚀膨胀及开闭运算相关推荐

  1. Open_CV形态学运算专题 (腐蚀膨胀、开闭运算、梯度运算、顶帽运算黑帽运算 )【Python-Open_CV系列(十)】

      Open_CV形态学运算专题 之 腐蚀&膨胀.开&闭运算.梯度运算.顶帽运算黑帽运算               [Python-Open_CV系列(十)]   文章目录 1. 腐 ...

  2. 开运算和闭运算_OpenCV计算机视觉学习(5)——形态学处理(腐蚀膨胀,开闭运算,礼帽黑帽,边缘检测)...

    Fly-AI竞赛服务平台 flyai.com 在开始学习之前推荐大家可以多在FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站 ...

  3. FPGA实现图像二值形态学滤波——腐蚀膨胀

    一.二值图像 二值图像(Binary Image)是指图像上的每一个像素只有两种可能的取值或灰度等级状态.简言之,在图像中灰度等级只有两种0或255(黑或白). 二.形态学 形态学,即数学形态学(Ma ...

  4. 8、灰度图的腐蚀、膨胀、开闭运算、顶帽底帽

    1. 灰度图的腐蚀 用结构元素的中心点,从左到右从上到下,依次扫描灰度图的像素点,图片上该像素点的值取为结构元素所覆盖区域中像素点的 最小值,扫描一遍后会得到一张新图,就是原图的腐蚀图. 用该结构元素 ...

  5. opencv 腐蚀 matlab,Opencv3编程入门笔记(4)腐蚀、膨胀、开闭运算、漫水填充、金字塔、阈值化、霍夫变换...

    19      腐蚀erode.膨胀dilate 腐蚀和膨胀是针对图像中的白色部分(高亮部分)而言的,不是黑色的.除了输入输出图像外,还需传入模板算子element,opencv中有三种可以选择:矩形 ...

  6. [图像形态学操作]——腐蚀和膨胀、开闭运算、黑帽礼帽

    形态学转换是基于图像形状的一些简单操作,它通常在二进制图像上执行.腐蚀和膨胀是两个基本的形态学运算符.然后它的变体形式如:开运算.闭运算.礼帽黑帽等. 一.连通性 在图像学当中,图像的最小单位是像素, ...

  7. python+OpenCv笔记(七):图像的形态学操作(腐蚀与膨胀、开闭运算、礼帽与黑帽)

    一.腐蚀与膨胀 腐蚀就是原图中高亮的部分被蚕食,效果图拥有比原图更小的高亮区域. 腐蚀的作用是:消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点. 膨胀就是使原图中高亮的部分扩张,效果图拥有比 ...

  8. 腐蚀,膨胀,开闭运算 处理图片中的噪声点

    通过形态学过滤图片中的噪声点 以小代价,在目标检测的基础上引入了语义分割的分支,让机器人在检测脏东西的同时,区别出可行驶区域,因此有必要对粗的语义分割结果进行处理,这里使用了图形形态学中的腐蚀,膨胀, ...

  9. python 简单图像处理(13) 二值图腐蚀和膨胀,开运算、闭运算

    原文:http://www.cnblogs.com/xianglan/archive/2010/12/29/1921211.html python 简单图像处理(13) 二值图腐蚀和膨胀,开运算.闭运 ...

最新文章

  1. 乘风破浪的Seq2Seq模型:在事件抽取上的应用
  2. 为什么要使用路由重分发?
  3. Silverlight 2 学习笔记之事件的重复绑定问题
  4. 高级ZK:异步UI更新和后台处理–第1部分
  5. 万字长文精华之数据中台构建五步法
  6. Ajax返回值问题思考
  7. 2017.7.28 愤怒的小鸟 思考记录
  8. onenote使用python开发_如何充分利用 OneNote,发挥它的全部价值和潜力?
  9. 物联网安全 - 对称加密算法
  10. c#访问其他服务器的共享文件夹,C#实现访问网络共享文件夹
  11. elasticsearch中forcemerge清除文件占用的磁盘空间
  12. 用python计算圆周率
  13. mui html5 vue,VUE中使用MUI方法
  14. 【知识兔】Excel教程:批量合并相同内容单元格神技
  15. 同事常说的堡垒机是什么?
  16. ASCII码对照表:
  17. ajax传递数组到后台时为空,ajax传递数组,后台接收为null解决方法
  18. 微信小程序实现新闻轮播、禁止手动竖向滑动
  19. 程序猿之歌 PHP,程序猿之歌
  20. 安卓全机型免Root卸载系统预装软件的方法

热门文章

  1. 品质标签分几种颜色_常见标签种类
  2. Ubuntu16.04更新时出现“有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是 因为系统无法达到您要求的状态造成的。”
  3. 泡妞神器Python!教你用它时刻关注女友心情变化!
  4. 山东理工大学计算机学院答辩,计算机学院毕业设计规范与流程-山东理工大学-计算机科学与技术学院.doc...
  5. Facebook的公共主页怎么发帖看起来更专业
  6. Vitepress(一):基础教程
  7. 汇编语言学习和常见错误(个人总结)
  8. U盘系统盘恢复成普通U盘
  9. 自定义Repository的实现方法
  10. 清理C盘垃圾,设置默认安装到其他盘