c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)-程序员宅基地

技术标签: 计算机视觉  人工智能  opencv  c#opencv  

在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; // 轮廓线粗细为2

 for (int i = 0; i < contours.Length; i++)
 {
     Cv2.DrawContours(ThresholdImage, contours, i, color, thickness); // 绘制轮廓
 }

 Cv2.ImShow("Contours", ThresholdImage); // 显示图像
 Cv2.WaitKey(0);

  c# OpenCV相关文章目录

 c# OpenCvSharp安装(一)
c# OpenCvSharp读取、显示和写入图像(二)
c# OpenCvSharp图像裁剪、调整大小、旋转、透视(三)
c# OpenCvSharp基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)
c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)
c# OpenCvSharp 轮廓绘制六步骤你学会了吗(六)
c# OpenCvSharp 目标检测五个步骤(又学会了)(七)
c# OpenCvSharp透视矫正六步实现透视矫正(八
c# OpenCvSharp Cv2.Threshold()和Cv2.AdaptiveThreshold参数说明
c# OpenCvSharp透视矫正参数调整器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hb_ljj/article/details/135095713

智能推荐

uni-app技术分享| uni-app转小程序_实时音视频_uni小程序视频倍速播放-程序员宅基地

文章浏览阅读3.1k次。uniapp转小程序_实时音视频微信小程序 实现实时音视频与 uniapp 转码成微信小程序 实现实时音视频两者是一样的,区别仅仅是一个是原生小程序一个是 uniapp 转码成小程序本文使用uniapp转码成小程序实现音视频通话前提确保微信开发平台 =》开发 =》开发管理 =》接口设置 的 实时播放音视频流与实时录制音视频流开启[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvSzutl4-1649304145472)(./3.jpg)]线上版本配置 an_uni小程序视频倍速播放

微信小程序电子签名及图片生成_电子签名小程序-程序员宅基地

文章浏览阅读8.5k次,点赞17次,收藏129次。实现在小程序内安全有效的电子签名,实名认证,图片传输。_电子签名小程序

Logback日志框架使用_logback依赖-程序员宅基地

文章浏览阅读5.6k次,点赞4次,收藏37次。Logback是在log4j的基础上重新开发的一套日志框架,是完全实现SLF4J接口API(也叫日志门面)。Logback 的架构非常通用,可以应用于不同的环境。目前logback分为三个模块,logback-core,logback-classic和logback-access。logback-core模块为其他两个模块奠定了基础。logback-classic模块原生实现了SLF4JAPI,因此您可以轻松地在logback和其他日志记录框架(例如 log4j1.x或java.util.log...._logback依赖

Red Hat 6.5 虚拟机——离线Python环境配置_redhat6.5 安装python-程序员宅基地

文章浏览阅读330次。第一章 在win 10 上 安装 Red Hat 6.5 虚拟机——测试环境配置第二章 Python环境安装第三章 tiff文件操作第四章 numpy库操作矩阵第五章 图像拼接_redhat6.5 安装python

C语言字符串_c 字符-程序员宅基地

文章浏览阅读2.7k次。文章目录字符串:1、c语言中表示一个字符串:字符串的输入和输入:如何用scanf输入带空格的字符串?2、char型指针和char型数组的区别3、字符串长度获取strlen4、字符串拷贝strcpy5、字符串拼接strcat注意:要求前面字符串申请的地址空间足够长,必须容纳两个字符串,否则会越界6、字符串的比较strcmp字符串比较是要区分大小写strncmp比较的是前n个字符相不相同,而不是第n个字符相不相同7、strstr判断字符串时候有某个字符串8、strtok 分割字符串 同sscanf9、strch_c 字符

随便推点

Flutter学习笔记&学习资料推荐_pan.flutter实战第二版-程序员宅基地

文章浏览阅读3.2k次,点赞10次,收藏39次。对Flutter的学习已经有一段时间了,这里做一下总结记录吧,可能主要是学习资料的总结,还有一些杂七杂八的学习笔记。 Flutter 初体验 先说说对Flutter的感受吧,总的来说上手还是比较容易的,因为他的思想理念跟React十分相似,都是通过状态管理控制UI界面的更新,甚至连setState的方法名都是一样的,如果你是学习过类似React的框架的话,将很容易理解,基本可以直接开撸。但是它有好的地方,也有不好的地方。 好的地方:一个是它的reload热加载到手机,这样写代码调试的时候不用每次运行._pan.flutter实战第二版

安卓开发学习——第四天_安卓开发学习csdn-程序员宅基地

文章浏览阅读864次。3. 常用的UI布局1). LinearLayout: 线性布局 用来控制其子View以水平或垂直方式展开显示 2). RelativeLayout: 相对布局 用来控制其子View以相对定位的方式进行布局显示 3). FrameLayout: 帧布局 每一个子View都代表一个画面, 后面出现的会覆盖前面的画面 通过子View的androi_安卓开发学习csdn

linux 6下面用udev配置asm磁盘的注意事项_ls: cannot access /dev/asm*: no such file or direc-程序员宅基地

文章浏览阅读2k次。实验环境:虚拟机:virtualbox 5.0.24 r108355操作系统:rhel-server-6.5-x86_64看了刘相兵大大的:在Linux 6上使用UDEV解决RAC ASM存储设备名问题自己操作了一把,先前在linux5 的时候我是用asmlib来绑定ASM的,参考三思笔记,我在创建虚拟硬盘的时候用的SCSI格式的硬盘,在linux 5的时候_ls: cannot access /dev/asm*: no such file or directory

linux下Qt打包_如何在linux系统下把qt打包视频-程序员宅基地

文章浏览阅读1.1k次。1.新建Demo文件件,并将二进制可执行文件MiMouse放置在目录内2.在Demo文件夹下新建copy.sh文件touch copy.shcopy.sh文件内容如下#!/bin/bashLibDir=$PWD"/lib" #获取lib目录路径Target=$1lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))$(mkdir $LibDir) #创建lib目录for Variab_如何在linux系统下把qt打包视频

计算机网络的组成及通信子网和资源子网的划分_计算机网络可以分为通信子网和资源子网-程序员宅基地

文章浏览阅读1k次。网络操作系统:是网络软件的重要组成部分,是进行网络系统管理和通信控制的所有软件的集合,负责整个网络软件,硬件资源的管理以及网络通信和任务的调度,并提供用户与网络之间的接口,常用的网络操作系统有:Windows,Linux,Unix,netwear等。网络接口卡:简称网卡,又称为网络适配器,主要负责主机与网络之间的信息传输控制,功能是线路传输控制,如堵塞,冲突等,差错检测与恢复,代码转换以及数据帧的装配与拆装等。传输介质:用于将网络中各种设备连接起来,是数据传输的物理通道,有有线传输介质和无线传输介质之分。_计算机网络可以分为通信子网和资源子网

STM32-深入理解GPIO的8种工作模式_otg_fs_gccfg-程序员宅基地

文章浏览阅读4.6k次,点赞14次,收藏104次。对STM32中GPIO的8种工作模式做一个详细的说明_otg_fs_gccfg

推荐文章

热门文章

相关标签