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

server/2025/1/15 9:27:45/

  图像膨胀腐蚀操作属于图像处理中常用的形态学操作,其原理都是采用特定小矩形(核矩形),将其中心位置与图像中的每个像素对齐后,对重合位置的像素执行特定处理后,将处理结果保存到中心位置对应的像素处(详细的图形化原理展示见操作文献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.ppmy.cn/server/158123.html

相关文章

STM32 拓展 RTC案例1:使用闹钟唤醒待机模式 (HAL库)

需求描述 执行完毕正常代码之后,让MCU进入待机模式,设置闹钟,自动让MCU从待机模式中被唤醒。可以用led点亮熄灭显示是否唤醒。 应用场景:比如设计一个野外温度自动采集的设备,规定每小时采集一次温度,就可…

Windows 安装 Docker 和 Docker Compose

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

【ANGULAR网站开发】初始环境搭建(SpringBoot)

1. 初始化SpringBoot 1.1 创建SpringBoot项目 清理spring-boot-starter-test,有需要的可以留着 1.2 application.properties 将application.properties改为yaml,个人习惯问题,顺便设置端口8888,和前端设置的一样 server:por…

【2025 Rust学习 --- 12 实用工具特型02】

实用特型2 as引用特型Deref与DerefMut Deref 和 DerefMut,它们允许自定义类型的实例能够像引用一样被解引用(dereferenced),从而实现智能指针或其他类似的行为。这两个 trait 提供了对内部数据的访问,但有着不同的权…

【PyQt】pyqt单选框

[toc]pyqt单选框 pyqt单选框 问题 单选框的设置:放在主窗口下只能选择一个 男女和喜欢与否不能同时选择 方法1:box group 放入一个box group, 方法2:GroupBox 设置groupbox 方法2:layout 设置布局

Web前端界面开发

前沿:介绍自适应和响应式布局 自适应布局:-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果,随着我们的屏幕大小而发生适配的效果(类似等比例) 如:rem适配 和 vw/vh适配 …

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等) 如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)模型地址模型下载模型部署指定显卡运行app.py 运行环境requirements 调用接口代码调用 结语 如何…

SpringBoot监听器的使用方法

监听器(Listener)就是监听对象的创建、销毁等状态的变化以及定义一些事件发生后接下来要进行的动作。主要监听的三个域对象为:ServletRequest域、HttpSession域 和ServletContext域。本文通过几个简单的例子介绍一下监听器的用法。 监听 Ser…