c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)

2023-12-26 13:45

本文主要是介绍c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在C#中使用OpenCV进行图像处理时,可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。

  1. 斑点检测
  2. 边缘检测
  3. 轮廓检测

一、斑点检测(Blob)

斑点检测是指在图像中找到明亮或暗的小区域(通常表示为斑点),并标记它们的位置。可以使用OpenCV中的函数SimpleBlobDetector来实现斑点检测。该函数将图像转换为二进制图像,然后找到所有的轮廓,通过设置阈值来确定斑点的亮度范围。

SimpleBlobDetector.Params

//函数原型
public Params()
{Data = new WParams{thresholdStep = 10f,minThreshold = 50f,maxThreshold = 220f,minRepeatability = 2u,minDistBetweenBlobs = 10f,filterByColor = 1,blobColor = 0,filterByArea = 1,minArea = 25f,maxArea = 5000f,filterByCircularity = 0,minCircularity = 0.8f,maxCircularity = float.MaxValue,filterByInertia = 1,minInertiaRatio = 0.1f,maxInertiaRatio = float.MaxValue,filterByConvexity = 1,minConvexity = 0.95f,maxConvexity = float.MaxValue};
}

SimpleBlobDetector是OpenCV中用于检测二值图像中的斑点的类,以下是它的参数说明:

1. thresholdStep:二值化阈值步长,用于在二值化过程中逐步增加或减小阈值,默认为10。

2. minThreshold:最小的二值化阈值,默认为50。

3. maxThreshold:最大的二值化阈值,默认为220。

4. minRepeatability:最小的斑点重复次数,默认为2,表示只有当一个斑点至少在两个不同位置被检测到时才会被认为是有效的。

5. blobColor:斑点的亮度值,取值为0或255,默认为0,表示只检测黑色斑点。

6. filterByArea:是否根据斑点的面积进行过滤,默认为true,表示进行过滤。

7. minArea:最小的斑点面积,默认为25,表示只检测面积大于25的斑点。

8. maxArea:最大的斑点面积,默认为5000,表示只检测面积小于5000的斑点。

9. filterByCircularity:是否根据斑点的圆形度进行过滤,默认为false,表示不进行过滤。

10. minCircularity:最小的斑点圆形度,默认为0.8,表示只检测圆形度大于0.8的斑点。

11. maxCircularity:最大的斑点圆形度,默认为1,表示只检测圆形度小于1的斑点。

12. filterByInertia:是否根据斑点的惯性比进行过滤,默认为true,表示进行过滤。

13. minInertiaRatio:最小的斑点惯性比,默认为0.1,表示只检测惯性比大于0.1的斑点。

14. maxInertiaRatio:最大的斑点惯性比,默认为1,表示只检测惯性比小于1的斑点。

15. filterByConvexity:是否根据斑点的凸度进行过滤,默认为true,表示进行过滤。

16. minConvexity:最小的斑点凸度,默认为0.95,表示只检测凸度大于0.95的斑点。

17. maxConvexity:最大的斑点凸度,默认为1,表示只检测凸度小于1的斑点。

这些参数可以根据具体应用场景进行调整,以得到符合要求的斑点检测结果。

所使用图例

// 读取原始图像
Mat image = new Mat("1.jpg", ImreadModes.Color);// 创建SimpleBlobDetector参数
SimpleBlobDetector.Params parameters = new SimpleBlobDetector.Params();// 设置参数
parameters.FilterByArea = true;
parameters.MinArea = 100;
parameters.MaxArea = 10000;// 创建SimpleBlobDetector
SimpleBlobDetector detector = SimpleBlobDetector.Create(parameters);// 检测斑点
KeyPoint[] keypoints = detector.Detect(image);// 在图像上绘制斑点
Mat result = new Mat();
Cv2.DrawKeypoints(image, keypoints, result, Scalar.All(-1), DrawMatchesFlags.Default);// 显示结果
Cv2.ImShow("Result", result);
Cv2.WaitKey(0);

 

二、边缘检测

边缘检测是一种图像处理技术,可以找到图像中的边缘或边界。penCV 中提供的两种重要边缘检测算法:Sobel边缘检测和 canny边缘检测。

1、cv2.Sobel()

//函数原型
public static void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize = 3, double scale = 1,double delta = 0, BorderType borderType = BorderType.Default
)

参数说明:

  1. src:输入图像。
  2. dst:输出图像,是一个与输入图像相同大小和类型的图像。
  3. ddepth:输出图像的深度,通常使用-1表示与输入图像相同深度。
  4. dx:表示在水平方向上进行边缘检测的阶数。
  5. dy:表示在垂直方向上进行边缘检测的阶数。
  6. ksize:表示卷积核的大小,默认为3。
  7. scale:可选参数,用于缩放结果,默认为1。
  8. delta:可选参数,用于调整结果的偏移,默认为0。
  9. borderType:可选参数,用于指定边界的处理方式,默认为BorderType.Default。

 使用cv2.Sobel函数可以进行边缘检测,通过调整dx和dy的值可以获得不同方向的边缘信息。输出图像的像素值表示了对应位置的边缘强度。

cv2.Sobel函数进行边缘检测的示例

using OpenCvSharp;Mat srcImage = new Mat("input.jpg", ImreadModes.Color);
Mat grayImage = new Mat();
Cv2.CvtColor(srcImage, grayImage, ColorConversionCodes.BGR2GRAY);Mat edges = new Mat();
Cv2.Sobel(grayImage, edges, MatType.CV_8U, 1, 0, 3);Cv2.ImShow("Edges", edges);
Cv2.WaitKey(0);

这个示例将输入图像转换为灰度图像,并使用Sobel算子在水平方向上进行边缘检测,然后显示结果图像。

总之,cv2.Sobel函数是OpenCVSharp库中的一个函数,用于在图像上应用Sobel算子进行边缘检测。通过调整参数可以获得不同方向的边缘信息。

2、cv2.Canny()

public static void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)

参数说明:

  • image:要进行边缘检测的输入图像。
  • edges:输出的边缘图像。
  • threshold1:第一个阈值,用于边缘链接。
  • threshold2:第二个阈值,用于边缘链接。
  • apertureSize:Sobel算子的孔径大小,默认为3。
  • L2gradient:一个布尔值,指定求梯度大小的方法,默认为false。

Canny边缘检测算法的原理是:首先对图像进行高斯滤波,然后通过Sobel算子计算图像的梯度,再通过非极大值抑制来提取局部最大值作为边缘点,最后通过双阈值检测来连接边缘点。

cv2.Canny函数的示例代码:

using OpenCvSharp;class Program
{static void Main(string[] args){// 读取图像Mat image = Cv2.ImRead("image.jpg", ImreadModes.Color);// 将图像转换为灰度图像Mat grayImage = new Mat();Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY);// 使用Canny边缘检测算法检测边缘Mat edges = new Mat();Cv2.Canny(grayImage, edges, 100, 200);// 显示原始图像和边缘图像Cv2.ImShow("Original Image", image);Cv2.ImShow("Edges", edges);Cv2.WaitKey(0);// 释放内存Cv2.DestroyAllWindows();image.Dispose();grayImage.Dispose();edges.Dispose();}
}

这个示例代码从文件中读取图像,然后将其转换为灰度图像。然后,它使用Canny边缘检测算法检测图像中的边缘,并将结果显示出来。最后,释放内存并关闭窗口。

注意:在运行此代码之前,确保已在项目中添加对OpenCVSharp库的引用,并将图像文件与示例代码放在同一目录下,并将图像文件名替换为实际的图像文件名

三、 轮廓检测

轮廓检测是一种从图像中提取物体形状的技术。OpenCV中的cvFindContours函数可以实现轮廓检测。该函数将图像转换为二进制图像,然后找到所有的轮廓。

轮廓检测步骤

  1. Cv2.CvtColor彩色图像转换为灰度图像
  2. cv2.threshold函数用于将图像进行二值化处理
  3. Cv2.FindContours在图像中查找轮廓
  4. Cv2.DrawContours在图像上绘制轮廓

示例代码

 // 读取图像Mat image = Cv2.ImRead("1.png", ImreadModes.Color);// 将图像转换为灰度图像Mat grayImage = new Mat();Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY); // 进行BGR2GRAY转换Mat ThresholdImage = new Mat();Cv2.Threshold(grayImage, ThresholdImage, 150, 255, ThresholdTypes.Binary); // 对图像进行二值化处理Cv2.ImShow("ThresholdImage", ThresholdImage);Cv2.WaitKey(0);OpenCvSharp.Point[][] contours;HierarchyIndex[] hierarchy;Cv2.FindContours(ThresholdImage, out contours, out hierarchy, RetrievalModes.List, ContourApproximationModes.ApproxSimple);Scalar color = new Scalar(0, 255, 0); // 轮廓颜色为绿色int thickness = 2; // 轮廓线粗细为2for (int i = 0; i < contours.Length; i++){Cv2.DrawContours(ThresholdImage, contours, i, color, thickness); // 绘制轮廓}Cv2.ImShow("Contours", ThresholdImage); // 显示图像Cv2.WaitKey(0);

c# OpenCV文章目录

c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)

c# OpenCV 基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)
c# OpenCV 图像裁剪、调整大小、旋转、透视(三)

c#OpenCV 读取、显示和写入图像(二)

c# OpenCV安装(一)

这篇关于c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/539639

相关文章

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C# 预处理指令(# 指令)的具体使用

《C#预处理指令(#指令)的具体使用》本文主要介绍了C#预处理指令(#指令)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1、预处理指令的本质2、条件编译指令2.1 #define 和 #undef2.2 #if, #el

C#实现将Excel工作表拆分为多个窗格

《C#实现将Excel工作表拆分为多个窗格》在日常工作中,我们经常需要处理包含大量数据的Excel文件,本文将深入探讨如何在C#中利用强大的Spire.XLSfor.NET自动化实现Excel工作表的... 目录为什么需要拆分 Excel 窗格借助 Spire.XLS for .NET 实现冻结窗格(Fro