当前位置: 首页 > article >正文

C#调用OpenCvSharp实现图像的膨胀和腐蚀

  图像膨胀和腐蚀操作属于图像处理中常用的形态学操作,其原理都是采用特定小矩形(核矩形),将其中心位置与图像中的每个像素对齐后,对重合位置的像素执行特定处理后,将处理结果保存到中心位置对应的像素处(详细的图形化原理展示见操作文献7-9),膨胀和腐蚀的区别在于,前者是取重合位置的像素集合中的最大值,而后者取最小值。
  腐蚀操作可以‌去除图片中的噪声和杂点、分割连通区域‌、减小目标物体的尺寸‌,而膨胀操作能填充图片中的小孔和断裂部分、放大特征、平滑边界,更详细的介绍可以查看参考文献或者百度相应内容。

  参考文献6中介绍了膨胀和腐蚀的C++代码实现方式,主要就是两层循环遍历图像的每个像素,再内嵌两层循环判断与核矩形的重叠位置,取其最大值或最小值作为当前像素点的值。参考文献示例中的核矩形用的3X3的矩形,中心点在矩形中心,实际opencv中支持不同只存的核矩形且能指定中心点。
  原本打算翻一下opencv源码中的膨胀和腐蚀源代码,不过就找到下图截图位置,函数嵌套使用太多了,不想往下找了。不过也能看得出来,膨胀和腐蚀本质上都是同一函数底层实现的。

在这里插入图片描述
  腐蚀和膨胀的OpenCvSharp函数声明如下所示,主要参数意义如下:
  1)src:源图像,可以输入Mat类型实例;
  2)dst:腐蚀或膨胀函数的处理结果,可以用Mat类型;
  3)element:核矩形,可以使用getStructuringElement函数创建,也可以使用Mat.Ones函数创建,可以是矩形,也可以是十字形、椭圆形等形状。如果该参数为空,则默认使用3X3的矩形;
  4)anchor :核矩形的中心位置,默认值为(-1, -1),也即矩形的中心;
  5)iterations:腐蚀或膨胀操作的执行次数,默认为1次。

public static void Erode(InputArray src, OutputArray dst, InputArray? element, Point? anchor = null, int iterations = 1, BorderTypes borderType = BorderTypes.Constant, Scalar? borderValue = null)
public static void Dilate(InputArray src, OutputArray dst, InputArray? element, Point? anchor = null, int iterations = 1, BorderTypes borderType = BorderTypes.Constant, Scalar? borderValue = null)

  腐蚀及膨胀的示例代码及运行效果如下所示:

int iterations= Convert.ToInt32(textBox1.Text);
using Mat imgSrc = Cv2.ImRead(lblMsg.Text);

using Mat kernalMat = Mat.Ones(Convert.ToInt32(textBox2.Text), Convert.ToInt32(textBox2.Text),MatType.CV_8UC1);
using Mat imgDest = new Mat(imgSrc.Size(), imgSrc.Type());
Cv2.Erode(imgSrc, imgDest, kernalMat, null, iterations);

Cv2.ImShow("腐蚀操作", imgDest);

在这里插入图片描述

int iterations= Convert.ToInt32(textBox1.Text);
using Mat imgSrc = Cv2.ImRead(lblMsg.Text);

using Mat kernalMat = Mat.Ones(Convert.ToInt32(textBox2.Text), Convert.ToInt32(textBox2.Text),MatType.CV_8UC1);
using Mat imgDest = new Mat(imgSrc.Size(), imgSrc.Type());
Cv2.Dilate(imgSrc, imgDest, kernalMat, null, iterations);

Cv2.ImShow("膨胀操作", imgDest);

在这里插入图片描述

参考文献:
[1]https://github.com/shimat/opencvsharp
[2]https://blog.csdn.net/weixin_45052363/article/details/132112794
[3]https://blog.csdn.net/m0_37605642/article/details/132352643
[4]https://opencv.org/
[5]https://github.com/opencv/opencv
[6]https://cloud.tencent.com/developer/article/1485860
[7]https://blog.csdn.net/cs1395293598/article/details/134716765
[8]https://zhuanlan.zhihu.com/p/613908156
[9]https://blog.csdn.net/weixin_46999174/article/details/140642492


http://www.kler.cn/a/501503.html

相关文章:

  • STM32 FreeRTOS的任务创建和删除
  • 《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)
  • 机器人碳钢去毛刺,用大扭去毛刺主轴可轻松去除
  • C#版 软件开发6大原则与23种设计模式
  • 【Ubuntu 24.04】虚拟机常见问题解决
  • 【UE5 C++课程系列笔记】29——在UE中使用第三方库的流程
  • JavaScript动态渲染页面爬取之Splash
  • web前端第五次作业---制作菜单
  • 基于 SSH 的任务调度系统
  • 高可用技术:构筑数字世界的稳固根基
  • 26_Redis RDB持久化
  • Excel如何制作轮班表
  • Centos9 + Docker 安装 MySQL8.4.0 + 定时备份数据库到本地
  • 代码的形状:重构的方向
  • Java中Map常用遍历方式以及性能对比
  • node.js中实现token的生成与验证
  • Qt6快速安装方法
  • 【深度学习基础】用深度学习做数据预测的大体流程
  • 【MySQL学习笔记】MySQL的索引
  • SQL美化器优化
  • 鸿蒙路由通信(路由跳转/参数传递)
  • 搭建prometheus+grafana监控系统抓取Linux主机系统资源数据
  • 《框架程序设计》复习题解析-2
  • docker 自建rustdesk服务器测试
  • 51单片机和STM32集成蓝牙模块实用指南
  • 多个表单使用相同的 ref 和 rules,表单验证规则不生效