C#自学37一 OpenCvSharp之Canny算法边缘检测

博客介绍了Canny算法的步骤,包括高斯模糊、灰度转化、计算梯度、非最大信号抑制和高低阈值输出二值图像。还阐述了找到梯度强度和方向,将梯度方向分为四个区域,并说明了根据梯度变化趋势方向在垂直方向找相邻像素与中间值比较的方法。

一、Canny算法步骤:
1.高斯模糊 — GaussianBlur
2.灰度转化 —CvtColor
3.计算梯度 — Sobel / Scharr
4.非最大信号抑制:边缘信号很强,但只能有一个信号(边缘只能是一条线,而不能是一个有宽度的面),对其他的非边缘信号进行压制(在梯度方向上,如果不是最大信号就剔除)。
5.高低阈值输出二值图像。

找到梯度强度和方向:
在这里插入图片描述
θ:在 0 ~ 180 之间,表示梯度方向 ,值表现了梯度在那个方向的变化率最大。
在这里插入图片描述
45 ,90 ,135 对应区域

1.黄色区域其值范围: 0 ~ 22.5 与 157.5 ~ 180
2.绿色区域取值范围:22.5 ~ 67.5
3.蓝色区域取值范围:67.5 ~ 112.5
4.棕色区域取值范围:112.5 ~ 157.5
有梯度得到变化趋势方向,在与变化趋势垂直的方向寻找相邻的左右两个像素,与中间值作比较。


private void button1_Click(object sender, EventArgs e)
        {
            Canny(@"C:\Users\shang\Desktop\OPENCVsharp\图像\ImageTest2\010161.jpg");
        }
 #region Canny算子 边缘提取
        static Mat src = new Mat();
        static Mat dst = new Mat();
        static Mat gray = new Mat();
        static Mat output = new Mat();
        static int minVal = 50;
        static int maxVal = 255;
        const string outputName = "Canny Result";
        private static void Canny(string path)
        {
            src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth);

            dst = new Mat(src.Size(), src.Type());

            new Window("SRC", WindowMode.AutoSize, src);

            src.CopyTo(dst);


            Cv2.CvtColor(dst, gray, ColorConversionCodes.RGB2GRAY); //转为灰度图(必须转)
            new Window(outputName, WindowMode.AutoSize);
            Cv2.Blur(gray, gray, new Size(3, 3), new Point(-1, -1), BorderTypes.Default);//模糊处理(降低噪点)

            CvTrackbarCallback2 CannyDome = new CvTrackbarCallback2(CallBarck_CannyDome);
            CvTrackbar cvt = new CvTrackbar("Bar :", outputName, minVal, maxVal, CallBarck_CannyDome, src);
            //Cv2.Canny(gray, dst, 100, 255, 3,true);

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




        /// <summary>
        /// 委托函数
        /// </summary>
        /// <param name="pos">变化的量</param>
        /// <param name="userdata">传入的数据对象</param>
        private static void CallBarck_CannyDome(int pos, object userdata)
        {
            Mat m = (Mat)userdata;
            Cv2.Canny(m, output, pos, pos * 2, 3, true);
            dst = new Mat(src.Size(), src.Type());

            /*
             * 拷贝数据
             * 参数  Mat m  :拷贝到
             *      Mat mask : 要拷贝的对象 (mask 的像素是非0的才拷贝,是0不拷贝) 
             *       
             *       
             */
            src.CopyTo(dst, output); //拷贝:

            Cv2.ImShow(outputName, dst);
        }
        #endregion
        

在这里插入图片描述
在这里插入图片描述

、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进步说明Csharp和OpenCV的结合使用,首先个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进步贴近生产实际、内涵丰富,对算法也进行了进步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进步提升实现“基于图像处理”的解决方案能力。  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值