OpenCvSharp 学习笔记11 --图像的膨胀与腐蚀:形态学操作

形态学操作包括:

  1. 开操作 – Open
  2. 闭操作 – Close
  3. 形态学梯度 – Morphological Gradient
  4. 顶帽 – Top hat
  5. 黑帽 – Black hat

API

CV2.MorphologyEx()

参数描述
InputArray src源图像
OutputArray dst输出图像
MorphTypes op形态操作类型
InputArray element结构数组
Point? anchor = null锚点(中心点)
int iterations = 1应用腐蚀和膨胀的次数。[默认情况下这是1]
BorderTypes borderType = BorderTypes.Constant边缘处理方法
Scalar? borderValue = null在边界为常数的情况下的边界值。默认值具有特殊意义。[默认情况下这是cvcp . morphologydefaultbordervalue ()]
原理:

开操作:open: 先腐蚀后膨胀,可以去掉小的对象。
d s t = o p e n ( s r c , e l e m e n t ) = d i l a t e ( e r o d e ( s r c , e l e m e n t ) ) dst=open(src,element)=dilate(erode(src,element)) dst=open(src,element)=dilate(erode(src,element))
代码:

/// <summary>
        /// 形态学开操作:先腐蚀后膨胀(可以去掉图像中小的对象)
        /// </summary>
        private static void MorphologyOpen(string path)
        {
            using (Mat src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
            using (Mat dst = new Mat())
            {

                //:定义结构元素
                InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 5), new Point(-1, -1));
                //开操作,也可省落变量前缀名
                Cv2.MorphologyEx(src: src, dst: dst, op: MorphTypes.Open, element: kernel, anchor: new Point(-1, -1));

                using (new Window("SRC", WindowMode.Normal, src))
                using (new Window("DST", WindowMode.Normal, dst))
                {
                    Cv2.WaitKey(0);
                }
            }
        }

在这里插入图片描述
图像中的小白点大部分都去掉了,调整结构体元素可以全部去掉。

闭操作 :close:先膨胀后腐蚀,可以填充图像的噪点。
d s t = c o l s e ( s r c , e l e m e n t ) = e r o d e ( d i l a t e ( s r c , e l e m e n t ) ) dst=colse(src,element)=erode(dilate(src,element)) dst=colse(src,element)=erode(dilate(src,element))
代码:

/// <summary>
        /// 形态学闭操作 :先膨胀后腐蚀(可以填充图像小的‘洞’,纯色如果包含小的污渍可以去掉污渍)
        /// </summary>
        private static void MorphologyClose(string path)
        {
            using (Mat src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
            using (Mat dst = new Mat())
            {

                //:定义结构元素
                InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5,5), new Point(-1, -1));
                //闭操作,也可省落变量前缀名
                Cv2.MorphologyEx(src: src, dst: dst, op: MorphTypes.Close, element: kernel, anchor: new Point(-1, -1));

                using (new Window("SRC", WindowMode.Normal, src))
                using (new Window("DST", WindowMode.Normal, dst))
                {
                    Cv2.WaitKey(0);
                }
            }
        }

在这里插入图片描述
小黑点没了!
形态学梯度:Morphological Gradient : 膨胀减去腐蚀,又称基本梯度(还包括:内部梯度,方向梯度)
d s t = M o r p h g r a d ( s r c , e l e m e n t ) = d i l a t e ( s e c , e l e m e n t ) − e r o d e ( s r c , e l e m e n t ) dst=Morph_{grad}(src,element)=dilate(sec,element)-erode(src,element) dst=Morphgrad(src,element)=dilate(sec,element)erode(src,element)
代码:

/// <summary>
        /// 形态学梯度- Morphological Gradient
        /// 1;膨胀减去腐蚀
        /// 2;又称为基本梯度(其它还包括-内部梯度、方向梯度)
        /// </summary>
        private static void MorphologyGradient(string path)
        {
            using (Mat src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
            using (Mat dst = new Mat())
            {

                //:定义结构元素
                InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(15, 15), new Point(-1, -1));
                //形态学梯度操作,也可省落变量前缀名
                Cv2.MorphologyEx(src: src, dst: dst, op: MorphTypes.Gradient, element: kernel, anchor: new Point(-1, -1));

                using (new Window("SRC", WindowMode.Normal, src))
                using (new Window("DST", WindowMode.Normal, dst))
                {
                    Cv2.WaitKey(0);
                }
            }
        }

在这里插入图片描述
**顶帽 top hat:**是原图像与开操作之间的差值操作。
代码:

 /// <summary>
        /// 形态学顶帽:是原图像与开操作之间的差值图像
        /// </summary>
        private static void MorphologyTopHAT(string path)
        {
            using (Mat src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
            using (Mat dst = new Mat())
            {

                //:定义结构元素
                InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(25, 25), new Point(-1, -1));
                //顶帽操作,也可省落变量前缀名
                Cv2.MorphologyEx(src: src, dst: dst, op: MorphTypes.TopHat, element: kernel, anchor: new Point(-1, -1));

                using (new Window("SRC", WindowMode.Normal, src))
                using (new Window("DST", WindowMode.Normal, dst))
                {
                    Cv2.WaitKey(0);
                }
            }
        }

在这里插入图片描述
**黑帽:black hat:**闭操作图像与原图像的差值图像
代码:

/// <summary>
        /// 形态学黑帽:闭操作图像与源图像的差值图像
        /// </summary>
        private static void MorphologyBlackHAT(string path)
        {
            using (Mat src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
            using (Mat dst = new Mat())
            {

                //:定义结构元素
                InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(15, 15), new Point(-1, -1));
                //顶帽操作,也可省落变量前缀名
                Cv2.MorphologyEx(src: src, dst: dst, op: MorphTypes.BlackHat, element: kernel, anchor: new Point(-1, -1));

                using (new Window("SRC", WindowMode.Normal, src))
                using (new Window("DST", WindowMode.Normal, dst))
                {
                    Cv2.WaitKey(0);
                }
            }
        } 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值