OpenCvSharp函数:Dilate膨胀、GetStructuringElement获取形态操作的结构元素、Erode腐蚀
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腐蚀相关推荐
- JS获取并操作iframe中元素的方法
document.getElementById('iframe的ID').contentWindow.document.getElementById('元素的ID') 注意要加上contentWind ...
- matlab 膨胀 结构元,图像形态学膨胀 结构元素
宽度W,高度H 的图像,做膨胀操作,如果膨胀的结构元素structure element,大小为kw,kh,那么就需要做W*H*kw*kh次运算,运算量比较大. 根据图像形态学的理论,膨胀满足结合律, ...
- OpenCV中膨胀和腐蚀结构元素的创建
CreateStructuringElementEx:IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anch ...
- 数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)
文章目录 一.实验目的 二.实验仪器 三.实验原理 1. 结构元素: 2. 腐蚀运算: 3. 膨胀运算: 4. 开运算: 5. 闭运算: 四.实验内容: 1. 形态学图像处理用于图像边界提取 2.数学 ...
- 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作
图像形态学中两种最基本的操作就是对图形的腐蚀和膨胀,可以说,形态学中的中高级操作都是建立在这两种操作之上.通过这两种基本的运算可以去除图像中的噪声,分割出独立的区域或者将两个区域连接在一起. 关于图像 ...
- OPenCV膨胀函数dilate()的使用
OPenCV版本:4.4 IDE:VS2017 功能描述 简述:使用一个指定的核元素去膨胀一个图像,图像膨胀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所 ...
- OpenCV每日函数 图像过滤模块 (5) dilate膨胀函数
一.概述 通过使用特定的结构元素来扩大图像.该函数使用指定的结构元素扩展源图像,该结构元素确定取最大值的像素邻域的形状: 膨胀可以应用数次(迭代). 在多通道图像的情况下,每个通道都是独立处理的. 膨 ...
- python opencv 膨胀_OpenCV-Python:形态学操作
importcv2importnumpy as np img= cv2.imread('j.bmp', 0) kernel= np.ones((5, 5), np.uint8) erosion= cv ...
- OpenCV morphologyEx、erode、dilate、getStructuringElement (形态学算子)
::返回OpenCV算子速查表 OpenCV getStructuringElement 1. 函数 1.1 getStructuringElement 1.2 morphologyEx 1.3 er ...
最新文章
- 大一计算机课程ppt作业,大学生计算机基础作业PPT.ppt
- win7定时关机命令_电脑两个小技巧:新手设置电脑定时关机 VS 定时开机的方法详解!...
- SAP Spartacus ProductConnector和ProductService实现
- java日志之slf4j与logback简单使用
- u-boot启动参数命令格式
- python图形界面库哪个好_8个必备的Python GUI库
- 程序员的自我修养——读《软技能-代码之外的生存指南》笔记
- 机票预定系统类图_出行干货|在法国,廉价机票攻略
- 「AI原生」时代来临?百度智能云提出AI-Native,发布新一代云基础架构「太行」
- javaweb实训第四天下午——员工管理系统-JSPServletJDBC综合练习-CRUD
- 最短寻道时间优先算法c语言程序,操作系统先来先服务、最短寻道时间优先(SSTf)、扫描算法(SCAN)、循环扫描算法(CSCAN)的c++实现.doc...
- 毛发及眼球的渲染技术
- HDU 3639 Hawk-and-Chicken
- 波浪谱 matlab画,matlab窄带随机过程
- 微签电子印章自动生成上线
- R 两组样本t检验 wilcoxon检验、卡方、fisher精确检验
- Python程序写诗【训练1分钟】古诗生成
- 这个能力很重要,但大多数人没有
- 作为元宇宙里的潮人,怎能不穿上时髦的数字服装呢?
- 使用CARLA模拟器实现DQN自动驾驶(三)导航系统