Emgu CV4图像处理之膨胀和腐蚀、梯度计算、开闭运算14(C#)

本文测试环境:

win10  64位

vistual studio 2019  

Emgu CV 4.6.0

环境配置准备:

1 新增控制台项目,.net framework为4.7.2

2  把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下

3  项目选择x64

4 添加项目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll  

具体配置参考:

Emgu CV4图像处理之环境搭建1(C#)_zxy2847225301的博客-CSDN博客

形态学图像处理包括:

 

原理参考文章,写得还不错:

OpenCV 图像处理之膨胀与腐蚀 - 知乎

1  膨胀:

这里我们指定范围为3*3的矩阵,kernel(卷积核核)指定为全为1的3*3的矩阵,卷积计算后,该像素点的值等于以该像素点为中心的3*3范围内的最大值。由于我们是二值图像,所以只要包含周围白的部分,就变为白的。

如:

 图中的128=Max(128,0,0,0,126,24,0,0,0)

膨胀后的效果图(相当加粗了,领域扩张了):

Emgu CV的函数原型如下:

src:原图

dst:输出图

element:操作的卷积核,可以通过 CvInvoke.GetStructuringElement获取到

iterations:膨胀的次数

borderType:边界模式,一般为默认Emgu.CV.CvEnum.BorderType.Default

borderValue:边界值,一般为默认值new MCvScalar()

代码如下:

srcPic.png原图如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("srcPic.png");
            ImgDilate(srcPic);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }



        /// <summary>
        /// 图像膨胀
        /// </summary>
        /// <param name="srcPic"></param>
        private static void ImgDilate(Image<Bgr, Byte> srcPic)
        {
            //原图进行转换为灰度图
            CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
            Mat dstPic = new Mat();
            Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));

            CvInvoke.Dilate(srcPic, dstPic, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());

            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);
            CvInvoke.WaitKey(0);
        }


    }
}

 运行结果如下:

2  腐蚀 

腐蚀操作和膨胀操作相反,也就是将毛刺消除,判断方法为:在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。由于我们是二值图像,也就是取0(黑色)。

 总结: 只要原图片3 * 3范围内有黑的,该像素点就是黑的。

腐蚀后的效果图(相当瘦身了,领域被蚕食了):

Emgu CV的函数原型如下:

src:原图

dst:输出图

element:操作的卷积核,可以通过 CvInvoke.GetStructuringElement获取到

iterations:膨胀的次数

borderType:边界模式,一般为默认Emgu.CV.CvEnum.BorderType.Default

borderValue:边界值,一般为默认值new MCvScalar()

代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("srcPic.png");
            ImgErode(srcPic);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }



        /// <summary>
        /// 图像腐蚀
        /// </summary>
        /// <param name="srcPic"></param>
        private static void ImgErode(Image<Bgr, Byte> srcPic)
        {
            //原图进行转换为灰度图
            CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
            Mat dstPic = new Mat();
            Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3,3), new Point(-1, -1));

            CvInvoke.Erode(srcPic, dstPic, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default,new MCvScalar());

            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);
            CvInvoke.WaitKey(0);
        }

       



    }
}

运行结果:

3   形态学函数Morphology

函数原型:

src:原图

dst:输出图

operation:形态学的运算类型,如下图:

kernel:操作的卷积核,可以通过 CvInvoke.GetStructuringElement获取到

anchor:一般为new Point(-1, -1)

iterations:膨胀的次数

borderType:边界模式,一般为默认Emgu.CV.CvEnum.BorderType.Default

borderValue:边界值,一般为默认值new MCvScalar()

3.1  开运算

先腐蚀后膨胀

实现的效果是毛刺信息在腐蚀的时候就已经消除了,膨胀也不会膨胀出多余信息

 

参考代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("srcPic.png");
            ImgOpenOperation(srcPic);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }



        

        /// <summary>
        /// 开运算
        /// </summary>
        /// <param name="srcPic"></param>
        private static void ImgOpenOperation(Image<Bgr, Byte> srcPic)
        {
            //原图进行转换为灰度图
            CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
            Mat dstPic = new Mat();
            Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));

            CvInvoke.MorphologyEx(srcPic, dstPic,Emgu.CV.CvEnum.MorphOp.Open,element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());

            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);
            CvInvoke.WaitKey(0);
        }

       


    }
}

运行结果如下:

3.2 闭运算

先膨胀后腐蚀

原图中内部的黑点被消除了

 

参考代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("srcPic.png");
            ImgCloseOperation(srcPic); //闭运算
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }



       
        /// <summary>
        /// 闭运算
        /// </summary>
        /// <param name="srcPic"></param>
        private static void ImgCloseOperation(Image<Bgr, Byte> srcPic)
        {
            //原图进行转换为灰度图
            CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
            Mat dstPic = new Mat();
            Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));

            CvInvoke.MorphologyEx(srcPic, dstPic, Emgu.CV.CvEnum.MorphOp.Close, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());

            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);
            CvInvoke.WaitKey(0);
        }

       



    }
}

运行结果如下:

3.3 梯度运算

梯度计算主要显示的是边缘信息。计算的方法:

膨胀的图像 - 腐蚀的图像

我们明显的看出,用大一圈的图像减去小一圈的图像正好就是边缘的信息。

参考代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {

            Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("srcPic.png");
            ImgGradient(srcPic);
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }



      
        /// <summary>
        /// 梯度运算(取边缘信息)
        /// </summary>
        /// <param name="srcPic"></param>
        private static void ImgGradient(Image<Bgr, Byte> srcPic)
        {
            //原图进行转换为灰度图
            CvInvoke.CvtColor(srcPic, srcPic, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
            Mat dstPic = new Mat();
            Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));

            CvInvoke.MorphologyEx(srcPic, dstPic, Emgu.CV.CvEnum.MorphOp.Gradient, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());

            CvInvoke.Imshow("srcPic", srcPic);
            CvInvoke.Imshow("dstPic", dstPic);
            CvInvoke.WaitKey(0);
        }




    }
}

运行结果:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxy2847225301

测试使用

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值