OpenCvSharp 学习笔记10 --图像的膨胀与腐蚀

一:形态学操作(morphology operators)- 膨胀与腐蚀

  • 图像形态学操作 – 基于形状的一系列图像处理操作的集合,主要是基于集合理论基础上的形态学数学
  • 形态学基本的四个操作 : 腐蚀,膨胀,开,闭
  • 膨胀和腐蚀是图像处理中最常用的形态学操作手段

膨胀原理:
跟卷积操作相似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心点为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中结构体B可以是任意形状。

腐蚀原理:
腐蚀与膨胀的操作的过程一样,不同的是以最小值替换锚点重叠下的像素值。

公式:
膨胀
o u t p u t ( x , y ) = max ⁡ ( x 1 , y 1 ) : e l e m e n t ( x 1 , y 1 ) 不 等 于 0 s r c ( x + x 1 , y + y 1 ) output(x,y)= \max_{(x1,y1):element(x1,y1){不等于0}} src(x+x1,y+y1) output(x,y)=(x1,y1):element(x1,y1)0maxsrc(x+x1,y+y1)

腐蚀

o u t p u t ( x , y ) = min ⁡ ( x 1 , y 1 ) : e l e m e n t ( x 1 , y 1 ) 不 等 于 0 s r c ( x + x 1 , y + y 1 ) output(x,y)= \min_{(x1,y1):element(x1,y1){不等于0}} src(x+x1,y+y1) output(x,y)=(x1,y1):element(x1,y1)0minsrc(x+x1,y+y1)

二:API介绍

Cv2.GetStructuringElement(): 获取结构元素

参数描述
MorphShapes shape结果元素的形状,枚举类型
Size ksize结构元素的大小
Point anchor结构元素的锚点(中心点)

Cv2.Dilate(): 膨胀,通过使用特定的结构元素来扩展图像。

参数描述
InputArray src源图像
OutputArray dst输出图像
InputArray element结构元素,一定要是奇数
Point? anchor = null锚点位置,默认是null
int iterations = 1应用膨胀的次数。[默认情况下这是1]
borderType = BorderTypes.Constant图像边缘处理方法。[默认情况下这是BorderType.Constant]
Scalar? borderValue = null在边界为常数的情况下的边界值。默认值具有特殊意义。[默认情况下这是cvcp . morphologydefaultbordervalue ()]

Cv2.Erode(): 腐蚀,通过使用特定的结构元素来侵蚀图像。

参数描述
InputArray src源图像
OutputArray dst输出图像
InputArray element结构元素 ,一定要是奇数
Point? anchor = null锚点位置,默认是null
int iterations = 1应用侵蚀的次数。[默认情况下这是1]
borderType = BorderTypes.Constant图像边缘处理方法。[默认情况下这是BorderType.Constant]
Scalar? borderValue = null在边界为常数的情况下的边界值。默认值具有特殊意义。[默认情况下这是cvcp . morphologydefaultbordervalue ()]

三:代码:

 static void Main(string[] args)
        {
            string imagePath1 = @"C:\Users\whx\Desktop\opcvImage\ss.jpg";
            ExpansionAndCorrosion(imagePath1);
        }
 #region 图像膨胀与腐蚀
        static int elementSize = 0;//初始化
        static int maxSize = 21; //滑动效果最大值
        static Mat src;
        /// <summary>
        /// 图像膨胀与腐蚀
        /// </summary>
        private static void ExpansionAndCorrosion(string path)
        {
            using (src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
            using (Mat dst = new Mat(src.Size(), src.Type()))
            {

                //CvTrackbarCallback2 :窗口动态调整
                CvTrackbarCallback2 cvCallback = new CvTrackbarCallback2(CallBackDome);
                Cv2.ImShow("SRC", src);
                src.CopyTo(dst);
                Cv2.ImShow("DST", dst);

                CvTrackbar cvt = new CvTrackbar("Bar :", "DST", elementSize, maxSize, cvCallback, dst);


                Cv2.WaitKey();
            }

        }

        private static void CallBackDome(int size, object userdate)
        {

            //不用using 释放掉就不能处理了
            Mat s1 = (Mat)userdate;

            size = size * 2 + 1; //要为奇数
            Mat se = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(size, size), new Point(-1, -1));

            //膨胀
            Cv2.Dilate(src, s1, se, new Point(-1, -1), 1);

            //腐蚀
            //Cv2.Erode(src, s1, se, new Point(-1, -1), 1);

            //Cv2.ImShow("DST", s1);
            new Window("DST",WindowMode.Normal ,s1);
        }

        #endregion

效果

图为系数为1时,膨胀效果
在这里插入图片描述
把系数跳到3时,膨胀效果进一步加深。
在这里插入图片描述

下面看腐蚀效果,把膨胀代码注释掉。

 private static void CallBackDome(int size, object userdate)
        {

            //不用using 释放掉就不能处理了
            Mat s1 = (Mat)userdate;

            size = size * 2 + 1; //要为奇数
            Mat se = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(size, size), new Point(-1, -1));

            //膨胀
            //Cv2.Dilate(src, s1, se, new Point(-1, -1), 1);

            //腐蚀
            Cv2.Erode(src, s1, se, new Point(-1, -1), 1);

            //Cv2.ImShow("DST", s1);
            new Window("DST",WindowMode.Normal ,s1);
        }

图为系数为2时,腐蚀效果
在这里插入图片描述
把系数调到4时,腐蚀效果进一步加深。
在这里插入图片描述
腐蚀就是变大,加粗,膨胀是变小,变细???

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值