C#+OpenCV基础(十二)_图片形态学计算
1、膨胀
/// <summary>
/// 膨胀
/// </summary>
/// <param name="mat">图片</param>
/// <param name="element">用于膨胀的结构内核;如果element=new Mat(),则使用3x3矩形结构化元素</param>
/// <param name="anchor">锚在元素中的位置。默认值(-1,-1)表示锚点位于元素中心</param>
/// <param name="iterations">应用膨胀的次数。[默认情况下为1]</param>
/// <param name="borderType">边缘像素的外推类型</param>
/// <param name="borderValue">在边缘为常量的情况下的边缘值</param>
/// <returns></returns>
public static Mat Dilate(Mat mat, InputArray? element, Point? anchor = null, int iterations = 1,
BorderTypes borderType = BorderTypes.Constant, Scalar? borderValue = null)
{
Mat dstMet = new Mat();
// var element = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(1, 1));
// 膨胀Cv2.Dilate
Cv2.Dilate(mat, dstMet, element, anchor, iterations, borderType, borderValue);
return dstMet;
}
2、腐蚀
/// <summary>
/// 腐蚀
/// </summary>
/// <param name="mat">图片</param>
/// <param name="element">用于侵蚀的结构内核;如果element=new Mat(),则使用3x3矩形结构化元素</param>
/// <param name="anchor">锚在元素中的位置。默认值(-1,-1)表示锚点位于元素中心</param>
/// <param name="iterations">应用侵蚀的次数。[默认情况下为1]</param>
/// <param name="borderType">边缘像素的外推类型</param>
/// <param name="borderValue">在边缘为常量的情况下的边缘值</param>
/// <returns></returns>
public static Mat Erode(Mat mat, InputArray? element, Point? anchor = null, int iterations = 1,
BorderTypes borderType = BorderTypes.Constant, Scalar? borderValue = null)
{
Mat dstMet = new Mat();
// var element = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(1, 1));
// 腐蚀Cv2.Erode
Cv2.Erode(mat, dstMet, element, anchor, iterations, borderType, borderValue);
return dstMet;
}
3、形态学运算
- 开运算:先腐蚀后膨胀,可清除小白点;图片会非常模糊;
- 闭运算:先膨胀后腐蚀,可清除小黑点;图片会非常模糊;
- 形态学梯度:膨胀图与腐蚀图之差,用于提取物体边缘;
- 顶帽:原图 减 开运算,用于分离比临近点亮一些的斑块,进行背景提取;
- 黑帽:闭运算 减 原图,用于分离比临近点暗一些的斑块;
- 击中与击不中:用击中结构去腐蚀原始图像得到击中集合,用击不中结构去腐蚀原始图像的补集得到击不中集合,取两者的交集(与运算)作为结果集;可用于寻找模版图片在原图片中的位置;
/// <summary>
/// 形态学运算
/// 开运算:先腐蚀后膨胀,可清除小白点;图片会非常模糊;
/// 闭运算:先膨胀后腐蚀,可清除小黑点;图片会非常模糊;
/// 形态学梯度:膨胀图与腐蚀图之差,用于提取物体边缘;
/// 顶帽:原图 减 开运算,用于分离比临近点亮一些的斑块,进行背景提取;
/// 黑帽:闭运算 减 原图,用于分离比临近点暗一些的斑块;
/// 击中与击不中:用击中结构去腐蚀原始图像得到击中集合,用击不中结构去腐蚀原始图像的补集得到击不中集合,取两者的交集(与运算)作为结果集;可用于寻找模版图片在原图片中的位置;
/// </summary>
/// <param name="mat">图片</param>
/// <param name="op">形态学运算的类型;腐蚀,膨胀,开运算,闭运算,形态学梯度,顶帽,黑帽,击中与击不中</param>
/// <param name="element">用于侵蚀的结构内核;如果element=new Mat(),则使用3x3矩形结构化元素</param>
/// <param name="anchor">锚在元素中的位置。默认值(-1,-1)表示锚点位于元素中心</param>
/// <param name="iterations">应用侵蚀和膨胀的次数[默认为1]</param>
/// <param name="borderType">边缘像素的外推类型</param>
/// <param name="borderValue">在边缘为常量的情况下的边缘值</param>
/// <returns></returns>
public static Mat MorphologyEx(Mat mat, MorphTypes op, InputArray? element,
Point? anchor = null, int iterations = 1, BorderTypes borderType = BorderTypes.Constant, Scalar? borderValue = null)
{
Mat dstMet = new Mat();
//var op = MorphTypes.Gradient;
//var element = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(6, 6));
// 进行形态学运算
Cv2.MorphologyEx(mat, dstMet, op, element, anchor, iterations, borderType, borderValue);
return dstMet;
}
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/18294611