Dilate膨胀

函数说明:用特定的结构元素膨胀图像。膨胀可以看成是最大值滤波,即用最大值替换中心像素点。该函数就地模式,可以指定迭代次数,多通道图像的话,每个通道分开处理。

用3x3矩形结构元素膨胀

//函数原型
void Dilate(InputArray src,OutputArray dst,InputArray? element,Point? anchor = null,int iterations = 1,BorderTypes borderType = BorderTypes.Constant,Scalar? borderValue = null)

参数

说明

InputArray src

输入图像,通道数可以任意,类型必须为CV_8U,CV_16U, CV_16S, CV_32F或CV_64F。

OutputArray dst

输出图像,与输入图像有相同的大小、类型和通道数。(支持就地模式)

InputArray? element

用于膨胀的结构元素。为null或空Mat时,默认使用3x3矩形结构元素。可通过GetStructuringElement函数生成。

Point? anchor = null

锚点,结构元素的锚点。默认为(-1,-1),表示结构元素的中心点

int iterations = 1

膨胀的次数

BorderTypes borderType = BorderTypes.Constant

边界填充方式。不支持Wrap方式

Scalar? borderValue = null

当边界填充方式为Constant时的填充值,默认是Scalar.All(double.MaxValue)

GetStructuringElement获取形态操作的结构元素

函数说明:返回一个指定大小、形状的结构元素,用于膨胀、腐蚀或其它形态操作。

//函数原型1
Mat GetStructuringElement(MorphShapes shape,Size ksize)//函数原型2
Mat GetStructuringElement(MorphShapes shape, Size ksize, Point anchor)

参数

说明

MorphShapes shape

形态形状:Rect矩形、Cross十字、Ellipse椭圆

Size ksize

元素大小

Point anchor

元素内的锚定位置。默认值(-1,-1)表示锚点位于中心。注意,只有十字形元素的形状取决于锚点位置。在其他情况下,锚只是调节形态学操作的结果被转移了多少。

返回值Mat

结构元素矩阵

Erode腐蚀

函数说明:用特定的结构元素腐蚀图像。腐蚀可以看成是最小值滤波,即用最小值替换中心像素点。

该函数就地模式,可以指定迭代次数,多通道图像的话,每个通道分开处理。

用3x3矩形结构元素腐蚀

//函数原型
void Erode(InputArray src,OutputArray dst,InputArray? element,Point? anchor = null,int iterations = 1,BorderTypes borderType = BorderTypes.Constant,Scalar? borderValue = null)

参数

说明

InputArray src

输入图像,通道数可以任意,类型必须为CV_8U,CV_16U, CV_16S, CV_32F或CV_64F。

OutputArray dst

输出图像,与输入图像有相同的大小、类型和通道数。

(支持就地模式)

InputArray? element

用于腐蚀的结构元素。为null或空Mat时,默认使用3x3矩形结构元素。可通过GetStructuringElement函数生成。

Point? anchor = null

锚点,结构元素的锚点。

默认为(-1,-1),表示结构元素的中心点

int iterations = 1

腐蚀次数

BorderTypes borderType = BorderTypes.Constant

边界填充方式。

不支持Wrap方式

Scalar? borderValue = null

当边界填充方式为Constant时的填充值,默认是Scalar.All(double.MaxValue)

图像示例

原图

膨胀与腐蚀

定位下划线位置

源码示例

public void Run() {TestDilateAndErode();MorphologyDemo();LocateGapFilling();
}/// <summary>
/// 定位下划线
/// </summary>
/// <exception cref="Exception"></exception>
private void LocateGapFilling() {using (var src = Cv2.ImRead(ImagePath.GapFilling, ImreadModes.Grayscale)) {if (src.Empty()) throw new Exception($"图像打开有误:{ImagePath.GapFilling}");Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.BinaryInv);Cv2.ImShow("GapFilling", src);using var dst = new Mat();var element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(15, 1));//可消除部分垂直线Cv2.Erode(src, dst, element);ShowMat("Location", element, dst);Cv2.WaitKey();Cv2.DestroyAllWindows();}
}/// <summary>
/// 膨胀、腐蚀
/// </summary>
/// <exception cref="Exception"></exception>
private void MorphologyDemo() {using (var src = Cv2.ImRead(ImagePath.Morphology, ImreadModes.Grayscale)) {if (src.Empty()) throw new Exception($"图像打开有误:{ImagePath.Morphology}");Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Otsu | ThresholdTypes.Binary);Cv2.ImShow("gray", src);using var dst = new Mat();var element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(15, 15));//膨胀Cv2.Dilate(src, dst, element);ShowMat("Dilate Rect", element, dst);//腐蚀Cv2.Erode(src, dst, element);ShowMat("Erode Rect", element, dst);Cv2.WaitKey();Cv2.DestroyAllWindows();}
}private void ShowMat(string winNameFix, Mat element, Mat dst) {Cv2.ImShow($"{winNameFix},{element.Size()}", dst);
}/// <summary>
/// 演示Dilate与Erode,细看其中的不同。
/// 注意:一幅图像膨胀后再腐蚀的图像,不一定与原图一样。
/// </summary>
private void TestDilateAndErode() {using (var mat = new Mat(11, 15, MatType.CV_8UC1, new byte[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0})) {Helper.Dump(mat);var element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3));//膨胀Cv2.Dilate(mat, mat, null, iterations: 2);Console.WriteLine("Dilate X 2");Dump(mat);using var dst = new Mat();//加上空白边缘Cv2.CopyMakeBorder(mat, dst, 1, 1, 1, 1, BorderTypes.Constant, new Scalar(0, 0, 0));Cv2.Erode(mat, mat, null);Console.WriteLine("The first time of Erode");Dump(mat);Cv2.Erode(mat, mat, null);//可连接腐蚀多次//Cv2.Erode(mat,mat,null,iterations: 2);Console.WriteLine("The second time of Erode");Dump(mat);//加了空白边缘的图像Console.WriteLine("dst");Dump(dst);//对比前面的腐蚀结果//腐蚀Cv2.Erode(dst, dst, null);Console.WriteLine("ErodeX1");Dump(dst);Cv2.Erode(dst, dst, null);Console.WriteLine("ErodeX2");Dump(dst);}
}#region Dump
/// <summary>
/// 控制台显示矩阵
/// </summary>
/// <param name="mat">待显示的矩阵</param>
/// <param name="dumpChannel">要显示通道</param>
public static void Dump(Mat mat, FormatType formatType = FormatType.Default) {Dump(mat, new OpenCvSharp.Range(0, mat.Channels() - 1), formatType);
}
/// <summary>
/// 控制台显示矩阵
/// </summary>
/// <param name="mat">等显示的矩阵</param>
/// <param name="channelRange">要显示的通道范围</param>
public static void Dump(Mat mat, OpenCvSharp.Range channelRange, FormatType formatType = FormatType.Default) {var nChannels = mat.Channels();if (nChannels == 1) {Console.WriteLine(mat.Dump(formatType));return;}var splits = mat.Split();for (int c = channelRange.Start; c <= channelRange.End; c++) {if (c < nChannels) {Console.WriteLine(splits[c].Dump(formatType));}else {Console.WriteLine($"通道值{c}必须小于{nChannels}");}}
}
#endregion

OpenCvSharp函数示例(目录)

参考

https://docs.opencv.org/

https://edu.csdn.net/learn/38286/608282

OpenCvSharp函数:Dilate膨胀、GetStructuringElement获取形态操作的结构元素、Erode腐蚀相关推荐

  1. JS获取并操作iframe中元素的方法

    document.getElementById('iframe的ID').contentWindow.document.getElementById('元素的ID') 注意要加上contentWind ...

  2. matlab 膨胀 结构元,图像形态学膨胀 结构元素

    宽度W,高度H 的图像,做膨胀操作,如果膨胀的结构元素structure element,大小为kw,kh,那么就需要做W*H*kw*kh次运算,运算量比较大. 根据图像形态学的理论,膨胀满足结合律, ...

  3. OpenCV中膨胀和腐蚀结构元素的创建

    CreateStructuringElementEx:IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anch ...

  4. 数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)

    文章目录 一.实验目的 二.实验仪器 三.实验原理 1. 结构元素: 2. 腐蚀运算: 3. 膨胀运算: 4. 开运算: 5. 闭运算: 四.实验内容: 1. 形态学图像处理用于图像边界提取 2.数学 ...

  5. 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作

    图像形态学中两种最基本的操作就是对图形的腐蚀和膨胀,可以说,形态学中的中高级操作都是建立在这两种操作之上.通过这两种基本的运算可以去除图像中的噪声,分割出独立的区域或者将两个区域连接在一起. 关于图像 ...

  6. OPenCV膨胀函数dilate()的使用

    OPenCV版本:4.4 IDE:VS2017 功能描述 简述:使用一个指定的核元素去膨胀一个图像,图像膨胀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所 ...

  7. OpenCV每日函数 图像过滤模块 (5) dilate膨胀函数

    一.概述 通过使用特定的结构元素来扩大图像.该函数使用指定的结构元素扩展源图像,该结构元素确定取最大值的像素邻域的形状: 膨胀可以应用数次(迭代). 在多通道图像的情况下,每个通道都是独立处理的. 膨 ...

  8. python opencv 膨胀_OpenCV-Python:形态学操作

    importcv2importnumpy as np img= cv2.imread('j.bmp', 0) kernel= np.ones((5, 5), np.uint8) erosion= cv ...

  9. OpenCV morphologyEx、erode、dilate、getStructuringElement (形态学算子)

    ::返回OpenCV算子速查表 OpenCV getStructuringElement 1. 函数 1.1 getStructuringElement 1.2 morphologyEx 1.3 er ...

最新文章

  1. 大一计算机课程ppt作业,大学生计算机基础作业PPT.ppt
  2. win7定时关机命令_电脑两个小技巧:新手设置电脑定时关机 VS 定时开机的方法详解!...
  3. SAP Spartacus ProductConnector和ProductService实现
  4. java日志之slf4j与logback简单使用
  5. u-boot启动参数命令格式
  6. python图形界面库哪个好_8个必备的Python GUI库
  7. 程序员的自我修养——读《软技能-代码之外的生存指南》笔记
  8. 机票预定系统类图_出行干货|在法国,廉价机票攻略
  9. 「AI原生」时代来临?百度智能云提出AI-Native,发布新一代云基础架构「太行」
  10. javaweb实训第四天下午——员工管理系统-JSPServletJDBC综合练习-CRUD
  11. 最短寻道时间优先算法c语言程序,操作系统先来先服务、最短寻道时间优先(SSTf)、扫描算法(SCAN)、循环扫描算法(CSCAN)的c++实现.doc...
  12. 毛发及眼球的渲染技术
  13. HDU 3639 Hawk-and-Chicken
  14. 波浪谱 matlab画,matlab窄带随机过程
  15. 微签电子印章自动生成上线
  16. R 两组样本t检验 wilcoxon检验、卡方、fisher精确检验
  17. Python程序写诗【训练1分钟】古诗生成
  18. 这个能力很重要,但大多数人没有
  19. 作为元宇宙里的潮人,怎能不穿上时髦的数字服装呢?
  20. 使用CARLA模拟器实现DQN自动驾驶(三)导航系统

热门文章

  1. 账户注销及用户信息删除的合规实务问答
  2. python连接阿里云数据库_记一次python备份阿里云RDS数据库
  3. 西瓜视频运营策略分析:借助平台优势实现内容升级
  4. 新手学习嵌入式开发要学什么
  5. Win10下用Anaconda安装TensorFlow
  6. tinymce粘贴word图片问题解决
  7. FreeXGIS系列产品介绍
  8. 微信小程序| Ngork内网传统+后台API通信例子
  9. JVM架构、JVM垃圾回收机制、垃圾回收算法、垃圾回收器、JMM(内存模型)
  10. Dapr+Net6 服务调用09:集群指标收集-普罗米修斯