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

embedded/2025/1/14 1:18:48/

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

相关文章

机器学习赋能的智能光子学器件系统研究与应用

在人工智能与光子学设计融合的背景下,科研的边界持续扩展,创新成果不断涌现。从理论模型的整合到光学现象的复杂模拟,从数据驱动的探索到光场的智能分析,机器学习正以前所未有的动力推动光子学领域的革新。据调查,目前…

PHP Filesystem:深入解析与实战应用

PHP Filesystem:深入解析与实战应用 引言 PHP作为一种流行的服务器端编程语言,提供了强大的文件系统操作功能。本文将深入探讨PHP的Filesystem函数,这些函数允许开发者访问和操作服务器上的文件系统。无论是进行基本的文件操作,还是实现复杂的文件管理系统,PHP的Filesys…

Golang笔记——切片与数组

本文详细介绍Golang的切片与数组,包括他们的联系,区别,底层实现和使用注意事项等。 文章目录 数组与切片的异同相同之处区别 切片(Slice)源码解析Go 源码中 len() 和 cap() 定义长度与容量示例 append() 函数Go 切片扩…

STM32 物联网智能家居 (一) 方案设计STM32+ESP8266+TCP/UDP/MQTT

STM32 物联网智能家居 (一) 方案设计STM32ESP8266TCP/UDP/MQTT 下面我们要开展物联网智能家居的博客专栏,该专栏我们会将STM32各种外设模块I2c、Usart、Wifi、ESP8266、分层编程思想以及调试的方法融入到整个专栏中,让你从一个单片机小白,进…

Kotlin | Android Provider 的实现案例

目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase,在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗? 内部存储: 当使用 Room 创建数据库(如 DemoDatabase),数据库文件通常…

VSCode 更好用的设置

配置 {"terminal.integrated.fontSize": 15,"security.workspace.trust.untrustedFiles": "open","editor.minimap.enabled": false,"workbench.colorTheme": "Visual Studio 2017 Light - C","gnuGlobal.c…

vue3 +ts 学习记录

1 父子传参 父传子 父组件 <TestFuzichuancan :title"title"/> const title 父组件标题子组件 import { defineProps } from vue; interface Props {title?: string,arr: number[]; } const props withDefaults(defineProps<Props>(), {title: 默认…

OpenCV相机标定与3D重建(53)解决 Perspective-3-Point (P3P) 问题函数solveP3P()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据 3 个 3D-2D 点对应关系找到物体的姿态。 cv::solveP3P 是 OpenCV 中的一个函数&#xff0c;用于解决 Perspective-3-Point (P3P) 问题。该问…