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;
}
posted @ 2024-07-10 17:19  ꧁执笔小白꧂  阅读(83)  评论(0编辑  收藏  举报