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安装(一)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子科大软件系统架构设计——设计模式

设计模式概述 设计模式的背景 设计面向对象软件比较困难&#xff0c;而设计可以复用的面向对象软件更加困难不是解决任何问题都需要从头做起&#xff0c;最好能复用以往的设计方案经验面向对象软件设计经验需要有一定的模式记录下来&#xff0c;以提供给其他设计者使用&#…

搭建Nginx文件下载站点

一、下载Nginx 首先&#xff0c;确保你的服务器上已经安装了Nginx&#xff0c;使用编译安装&#xff0c;下载最新版Nginx。 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar -xf nginx-1.25.3.tar.gz二、安装Fancyindex和Nginx-Fancyindex-Theme模块 # 下载Fancyin…

如何使用 YOLOv8 做对象检测

介绍 对象检测是一项计算机视觉任务&#xff0c;涉及识别和定位图像或视频中的对象。它是许多应用的重要组成部分&#xff0c;例如自动驾驶汽车、机器人和视频监控。 多年来&#xff0c;已经开发了许多方法和算法来查找图像中的对象及其位置。卷积神经网络对于此类任务有着非…

uni-app 工程目录结构介绍

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

[kubernetes]控制平面ETCD

什么是ETCD CoreOS基于Raft开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;etcd像是专门为集群环境的服务发现和注册而设计&#xff0c;它提供了数据TTL失效、数据改变监视、多值、目录监听、…

MyBatis:Generator

MyBatis Generator附批量操作分页查询存储过程 Generator 介绍网址&#xff1a;Introduction to MyBatis Generator Generator &#xff0c;一个用于 MyBatis 的代码生成工具&#xff0c;可以根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件&#xff0c;提高…

智能优化算法应用:基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.协作搜索算法4.实验参数设定5.算法结果6.…

自媒体实战篇:剪辑软件应用与实操

剪辑软件应用与实操 剪映基础界面认识 素材面板 导入本地素材,剪映自带素材库,音频,文本等素材合集面板播放预览 预览本地素材,,剪映自带素材库以及时间线面板中的素材的实时效果时间线面板 对素材进行基础的编辑操作,调整素材轨道等素材功能面板 可对素材或者文本等精细…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.…

VMvare虚拟机之文件夹共享防火墙设置

目录 一.jdk的配置&TomCat的配置 1.1 jdk配置 1.2 tomcat配置 二.文件夹共享功能 2.1 作用 2.2.高级共享和普通共享 三.防火墙设置 3.1 入站规则和出站规则 四.附图-思维导图 一.jdk的配置&TomCat的配置 建立一个共享文件夹&#xff0c;将jdk文件和tomcat文…

Java中的内部类、枚举

内部类、枚举 内部类成员内部类静态内部类局部内部类&#xff08;不重要&#xff09;匿名内部类&#xff08;重要&#xff09;什么是匿名内部类使用场景 枚举类什么是枚举类枚举类的特点枚举类提供的一些额外API拓展&#xff1a;抽象枚举使用枚举类实现单例设计模式 常见应用场…

thinkphp6.0的workerman在PHP8.0下报错

一、我先升级了thinkphp6.0到最新版本&#xff1a; composer update topthink/framework二、结果提示我composer版本过低&#xff0c;需要升级到2&#xff0c;于是我又升级了composer composer self-update 三、我又升级了workerman: composer require topthink/think-work…

Unity 获取当前日期的短时间和处于早中午晚哪个时间段

在我们手机中我们总会看到下图所示的时间&#xff0c;时间段当前时间&#xff0c;假如我们要实现这个效果应该怎么做呢。 首先是使用DateTime.Now获取当前时间&#xff1a; // 获取当前时间DateTime currentTime DateTime.Now; 其次由当前时间获取短时间&#xff0c;可以使用…

Intel FPGA 技术开放日

概要 时间&#xff1a;2023.11.14 全天 &#xff08; 9:00 - 16: 20&#xff09; 地点&#xff1a;北京望京. 凯悦酒店 主题内容&#xff1a;分享交流了Intel FPGA 产品技术优势和落地实践方案。 会议的议程 开场致词&#xff1a; FPGA业务&#xff0c;是几年前intel收购而…

虚拟机安装centos7系统步骤

1、下载系统镜像文件 下载地址&#xff1a;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso 2、鼠标右键点击虚拟机-->设置-->CD/DVDD-->使用ISO映像文件-->点击浏览&#xff0c;选择文件&#xff0c;而后保存设置 3、点…

如何使用Docker将.Net6项目部署到Linux服务器(二)

目录 二 安装Redis 2.1 基本安装 2.1.1 下载Redis 2.1.2 解压并安装Redis 2.1.3 编译Redis 2.1.3 配置config文件 2.1.4 配置redis服务 2.1.5 关闭redis服务 2.2 Docker安装 2.2.1 拉取镜像 2.2.2 查看镜像 2.2.2 创建挂载目录 2.2.3 创建配置文件 2.2.4 创建容器…

PortSwigger Access Control

lab1: Unprotected admin functionality 访问robots.txt 进了删除即可 lab2: Unprotected admin functionality with unpredictable URL 访问admin-d0qwj5 lab3: User role controlled by request parameter 发现Cookie中存在判断是否为admin lab4: User role can be modifie…

gitattributes配置文件的作用

0 Preface/Foreword 0.1 基本概念 Git版本管控工具功能强大&#xff0c;在使用过程中&#xff0c;在多人合作的项目开发过程中&#xff0c;经常会遇到提交代码时出现的warning提醒&#xff0c;尤其是换行符。 Linux/Unix/Mac OS操作系统的换行符使用LF符号&#xff08;\n&am…

逆向P1P2总结

字节八位 word 16位 deword 32 位 00 00 00 e8 是存储32位信息的起点 不是程序运行的起点 为什么电脑有32位与64位之分 寻址宽度 以字节为单位 0xfffffff 1 就是最大容量 转为十进制为 4294967296 / 1024 &#xff08;k&#xff09;/1024 &#xff08;kb&#xff09;/ 1…

web功能实例 - Canvas裁剪工具

嗯,手撸官方文档2天&#xff0c;发现没啥用&#xff0c;尤其是动画,那种计算出来的&#xff0c;根本想不到。因此学着学了抱着要做个东西的想法,去网上找相关案例,最终做出了这个裁剪工具。 PS :先说一下思路: 核心实现有3个canvas图层, 其中一个负责图片的预览。另外2个叠加到…