自学内容网 自学内容网

Opencv边缘检测(四)

sobel边缘检测

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _05_sobel边缘检测
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Mat gard_x= new Mat();
            Mat abs_gard_x = new Mat();


            Mat gard_y = new Mat();
            Mat abs_gard_y = new Mat();

            Mat dst = new Mat();


            Mat src= Cv2.ImRead(@"F:\AI视觉23班\06_OpenCV\images\airline-stewardess-bikini.jpg");

            Cv2.ImShow("原图", src);
            //参数1:输入图像
            //参数2:输出图像
            //参数3:输出的图像的类型
            //参数4,参数5: 1,0 表示求dx=1 dy=0的方向的一阶导数

            //求 x方向的梯度
            Cv2.Sobel(src, gard_x,MatType.CV_16S,1,0);

            //用于对图片进行高亮处理
            Cv2.ConvertScaleAbs(gard_x, abs_gard_x);
            Cv2.ImShow("x方向", abs_gard_x);
          

            //求 y方向的梯度

            Cv2.Sobel(src, gard_y, MatType.CV_16S,0,1);
            Cv2.ConvertScaleAbs(gard_y, abs_gard_y);
            Cv2.ImShow("y方向", abs_gard_y);
       



            //合并
            //整体方向的梯度
            Cv2.AddWeighted(abs_gard_x, 0.5, abs_gard_y, 0.5,0,dst);
            Cv2.ImShow("合并", dst);

            Cv2.WaitKey(0);

        }
    }
}

canny边缘检测

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _06_canny边缘检测
{
    internal class Program
    {
        static void Main(string[] args)
        {
          Mat scrImage1=  Cv2.ImRead(@"F:\AI视觉23班\06_OpenCV\images\orange.jpg");
            //复制
            Mat scrImage2=scrImage1.Clone();


            Cv2.ImShow("原图",scrImage1);

            //创建一个和scrImage1同样大小同样类型的矩阵
         Mat dstImage=   new Mat(scrImage1.Cols, scrImage1.Rows, scrImage1.Type());
            Mat grayImage= new Mat();
            //将原图转换成灰度图
            Cv2.CvtColor(scrImage2, grayImage,ColorConversionCodes.BGR2GRAY);


            Mat edge =new Mat();
            Cv2.Blur(grayImage, edge,new Size() { Width = 3, Height=3});

            //参数1:输入图像,必须是灰度图
            //参数2:输出边缘图像
            //参数3和参数4:阈值  这两个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割,即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
            Cv2.Canny(edge, edge,3,9);


            scrImage2.CopyTo(dstImage, edge);


            Cv2.ImShow("边缘",dstImage);
            Cv2.WaitKey(0);


        }
    }
}

Scharr滤波器

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _07_Scharr滤波器
{
    internal class Program
    {
        static void Main(string[] args)
        {

            Mat gard_x = new Mat();
            Mat abs_gard_x = new Mat();
            Mat gard_y = new Mat();
            Mat abs_gard_y = new Mat();
            Mat dst = new Mat();



            Mat src = Cv2.ImRead(@"F:\AI视觉23班\06_OpenCV\images\airline-stewardess-bikini.jpg");

            Cv2.ImShow("原图", src);
            //参数1:输入图像
            //参数2:输出图像
            //参数3:输出的图像的类型
            //参数4,参数5: 1,0 表示求dx=1 dy=0的方向的一阶导数

            //求 x方向的梯度
            Cv2.Scharr(src, gard_x, MatType.CV_16S, 1, 0);

            //用于对图片进行高亮处理
            Cv2.ConvertScaleAbs(gard_x, abs_gard_x);
            Cv2.ImShow("x方向", abs_gard_x);


            //求 y方向的梯度

            Cv2.Scharr(src, gard_y, MatType.CV_16S, 0, 1);
            Cv2.ConvertScaleAbs(gard_y, abs_gard_y);
            Cv2.ImShow("y方向", abs_gard_y);


            //合并
            //整体方向的梯度
            Cv2.AddWeighted(abs_gard_x, 0.5, abs_gard_y, 0.5, 0, dst);
            Cv2.ImShow("合并", dst);

            Cv2.WaitKey(0);


        }
    }
}

原文地址:https://blog.csdn.net/weixin_45788237/article/details/142365794

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!