HalconDotNet中的边缘检测详解

news2024/9/17 3:15:10

文章目录

  • 简介
  • 一、Sobel边缘检测
  • 二、Canny边缘检测
  • 三、Laplace边缘检测
  • 四、Prewitt边缘检测
  • 六、Roberts边缘检测
  • 总结


简介

  边缘检测是图像处理中的一个重要步骤,用于识别图像中灰度变化明显的区域,这些区域通常对应于物体的边界。HalconDotNet提供了多种边缘检测方法,每种方法都有其特定的应用场景和优缺点。

一、Sobel边缘检测

  Sobel边缘检测是一种基于卷积的边缘检测方法,通过计算图像在水平和垂直方向上的梯度来检测边缘。Sobel算子对噪声有一定的抑制作用,适用于处理含有噪声的图像。

详细说明

  Sobel算子通过两个3x3的卷积核分别计算图像在水平和垂直方向上的梯度,然后将这两个梯度的平方和开方得到边缘强度。Sobel算子对边缘的响应较强,但对噪声的响应较弱,因此在处理含有噪声的图像时表现较好。

C#示例代码

using HalconDotNet;

class Program
{
    static void Main(string[] args)
    {
        // 初始化Halcon
        HOperatorSet.SetSystem("width", 512);
        HOperatorSet.SetSystem("height", 512);

        // 读取图像
        HObject image;
        HOperatorSet.ReadImage(out image, "printer_chip/printer_chip_01");

        // Sobel边缘检测
        HObject edges;
        HOperatorSet.SobelAmp(image, out edges, "sum_abs", 3);

        // 创建窗口并显示图像
        HWindow window = new HWindow(0, 0, 512, 512, 0, "visible", "");
        window.DispObj(edges);

        // 等待用户输入
        HOperatorSet.WaitSeconds(10);

        // 释放资源
        image.Dispose();
        edges.Dispose();
        window.Dispose();
    }
}

二、Canny边缘检测

  Canny边缘检测是一种多阶段的边缘检测算法,通过高斯滤波、梯度计算、非极大值抑制和双阈值处理来检测边缘。Canny算法能够有效地抑制噪声,同时保留图像中的重要边缘。

详细说明

  Canny算法首先使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。然后计算图像的梯度幅值和方向,并进行非极大值抑制,以保留梯度方向上的局部最大值。最后,通过双阈值处理来确定真正的边缘。Canny算法能够检测出较细的边缘,适用于高精度边缘检测。

C#示例代码

using HalconDotNet;

class Program
{
    static void Main(string[] args)
    {
        // 初始化Halcon
        HOperatorSet.SetSystem("width", 512);
        HOperatorSet.SetSystem("height", 512);

        // 读取图像
        HObject image;
        HOperatorSet.ReadImage(out image, "printer_chip/printer_chip_01");

        // Canny边缘检测
        HObject edges;
        HOperatorSet.CannyEdges(image, out edges, 2, 20, 40);

        // 创建窗口并显示图像
        HWindow window = new HWindow(0, 0, 512, 512, 0, "visible", "");
        window.DispObj(edges);

        // 等待用户输入
        HOperatorSet.WaitSeconds(10);

        // 释放资源
        image.Dispose();
        edges.Dispose();
        window.Dispose();
    }
}

三、Laplace边缘检测

  Laplace边缘检测是一种基于二阶导数的边缘检测方法,通过计算图像的拉普拉斯算子来检测边缘。Laplace算子对噪声较为敏感,通常需要结合高斯滤波器使用。

详细说明

  Laplace算子通过计算图像的二阶导数来检测边缘,能够检测出图像中的零交叉点,即灰度变化最快的点。由于Laplace算子对噪声较为敏感,通常需要先对图像进行高斯滤波,以减少噪声的影响。Laplace算子适用于检测图像中的细节和细小边缘。

C#示例代码

using HalconDotNet;

class Program
{
    static void Main(string[] args)
    {
        // 初始化Halcon
        HOperatorSet.SetSystem("width", 512);
        HOperatorSet.SetSystem("height", 512);

        // 读取图像
        HObject image;
        HOperatorSet.ReadImage(out image, "printer_chip/printer_chip_01");

        // Laplace边缘检测
        HObject edges;
        HOperatorSet.Laplace(image, out edges, "absolute", 3, "n_4");

        // 创建窗口并显示图像
        HWindow window = new HWindow(0, 0, 512, 512, 0, "visible", "");
        window.DispObj(edges);

        // 等待用户输入
        HOperatorSet.WaitSeconds(10);

        // 释放资源
        image.Dispose();
        edges.Dispose();
        window.Dispose();
    }
}

四、Prewitt边缘检测

  Prewitt边缘检测是一种基于卷积的边缘检测方法,通过计算图像在水平和垂直方向上的梯度来检测边缘。Prewitt算子与Sobel算子类似,但对噪声的抑制能力稍弱。

详细说明

  Prewitt算子通过两个3x3的卷积核分别计算图像在水平和垂直方向上的梯度,然后将这两个梯度的平方和开方得到边缘强度。Prewitt算子对边缘的响应较强,但对噪声的响应较弱,因此在处理含有噪声的图像时表现较好。Prewitt算子适用于检测图像中的主要边缘。

C#示例代码

using HalconDotNet;

class Program
{
    static void Main(string[] args)
    {
        // 初始化Halcon
        HOperatorSet.SetSystem("width", 512);
        HOperatorSet.SetSystem("height", 512);

        // 读取图像
        HObject image;
        HOperatorSet.ReadImage(out image, "printer_chip/printer_chip_01");

        // Prewitt边缘检测
        HObject edges;
        HOperatorSet.PrewittAmp(image, out edges);

        // 创建窗口并显示图像
        HWindow window = new HWindow(0, 0, 512, 512, 0, "visible", "");
        window.DispObj(edges);

        // 等待用户输入
        HOperatorSet.WaitSeconds(10);

        // 释放资源
        image.Dispose();
        edges.Dispose();
        window.Dispose();
    }
}

六、Roberts边缘检测

  Roberts边缘检测是一种基于一阶导数的边缘检测方法,通过计算图像在45度和135度方向上的梯度来检测边缘。Roberts算子对噪声较为敏感,适用于处理细节丰富的图像。

详细说明

  Roberts算子通过两个2x2的卷积核分别计算图像在45度和135度方向上的梯度,然后将这两个梯度的平方和开方得到边缘强度。Roberts算子对边缘的响应较强,但对噪声的响应也较强,因此在处理含有噪声的图像时表现较差。Roberts算子适用于检测图像中的细节和细小边缘。

C#示例代码

using HalconDotNet;

class Program
{
    static void Main(string[] args)
    {
        // 初始化Halcon
        HOperatorSet.SetSystem("width", 512);
        HOperatorSet.SetSystem("height", 512);

        // 读取图像
        HObject image;
        HOperatorSet.ReadImage(out image, "printer_chip/printer_chip_01");

        // Roberts边缘检测
        HObject edges;
        HOperatorSet.Roberts(image, out edges, "sum_abs");

        // 创建窗口并显示图像
        HWindow window = new HWindow(0, 0, 512, 512, 0, "visible", "");
        window.DispObj(edges);

        // 等待用户输入
        HOperatorSet.WaitSeconds(10);

        // 释放资源
        image.Dispose();
        edges.Dispose();
        window.Dispose();
    }
}

总结

  五种常见的边缘检测方法及其详细说明,每种方法都有其特定的应用场景和优缺点,开发者可以根据实际需求选择合适的方法进行边缘检测。

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

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

相关文章

基于yolov8的电动车佩戴头盔检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的电动车佩戴头盔检测系统利用了YOLOv8这一先进的目标检测模型,旨在提高电动车骑行者的安全意识,减少因未佩戴头盔而导致的交通事故风险。YOLOv8作为YOLO系列的最新版本,在检测速度和精度上均进行了优化,…

✨机器学习笔记(一)—— 监督学习和无监督学习

1️⃣ 监督学习(supervised learning) ✨ 两种主要类型的监督学习问题: 回归(regression):predict a number in infinitely many possible outputs. 分类(classification)&#xff1…

C#串口助手初级入门

1.创建项目 修改项目名称与位置,点击创建 2.进入界面 在视图中打开工具箱,鼠标拖动,便可以在窗口添加控件,右边可以查看与修改属性 3.解决方案资源管理器 发布之前,需要修改相关的信息,比如版本号&#x…

Lombok jar包引入和用法

大家好,今天分享一个在编写代码时的快捷方法。 当我们在封装实体类时,会使用set、get等一些方法。如下图,不但费事还影响代码的美观。 那么如何才能减少代码的冗余呢,首先lib中导入lombok的jar包并添加库。 此处我已导入&#xf…

插件:清理maven错误缓存.bat

插件:https://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd7zenhttps://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd7zen没错误缓存时: 有错误缓存时:

真实案例分享:零售企业如何避免销售数据的无效分析?

在零售业务的数据分析中,无效分析不仅浪费时间和资源,还可能导致错误的决策。为了避免这种情况,企业必须采取策略来确保他们的数据分析工作能够产生实际的商业价值。本文将通过行业内真实的案例,探讨零售企业如何通过精心设计的数…

springboot数据库连接由localhost改成IP以后访问报错500(2024/9/7

步骤很详细,直接上教程 情景复现 一.没改为IP之前正常 二.改完之后报错 问题分析 SQL没开启远程连接权限 解决方法 命令行登入数据库 mysql -u root -p切换到对应数据库 use mysql;设置root用户的连接权限允许其他IP连接数据库 update user set host % whe…

jmeter执行python脚本,python脚本的Faker库

jmeter安装 jython的插件jar包 通过如下地址下载jython-standalone-XXX.jar包并放到jmeter的XXX\lib\ext目录下面 Downloads | JythonThe Python runtime on the JVMhttps://www.jython.org/download.html 重启jmeter在JSR223中找到jython可以编写python代码执行 python造数据…

一种快速生成CSV的方法

事情是这个样子的 在QQ群在聊把如何100万数据导出成CSV文件?会不会很慢? 俺回了一句“现在的机器性能好,没啥问题”。 然后大家开始谈论机器的配置了。哎,俺的机器配置有点差。 然后俺就进行了一个测试。 测试数据 数据定义…

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums &#xff0c;它含有 n 个非负整数。 每一步操作中&#xff0c;你需要&#xff1a; 选择一个满足 1 < i < n 的整数 i &#xff0c;且 nums[i] > 0 。 将 num…

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …

.Net6/.Net8(.Net Core) IIS中部署 使用 IFormFile 上传大文件报错解决方案

描述 最近使用.Net6 WebAPI IFormFile对象接收上传文件时大于30MB(兆)的文件就会报错 原因分析 IIS上传文件有大小默认限制大约28.6MB 解决办法 .无论是Net6还是.Net8写法都一样 方法一&#xff1a;IIS可视化操作 1.打开Internet Information Services (llS)管理器&…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688&#xff0c;功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算&#xff0c;可支持 16 路高清视频实时分析&#xff0c;灵活应对图像、语音、自…

LeetCode --- 413周赛

题目列表 3274. 检查棋盘方格颜色是否相同 3275. 第 K 近障碍物查询 3276. 选择矩阵中单元格的最大得分 3277. 查询子数组最大异或值 一、检查棋盘方格颜色是否相同 题目给定两个字符串来表示两个方格的坐标&#xff0c;让我们判断这两个方格的颜色是否相同&#xff0c;这…

C++——关联式容器(2):AVL树(平衡二叉树)

2.AVL树 2.1 AVL树的概念 在学习了二叉搜索树后&#xff0c;我们发现了二叉搜索树可以根据大小比较来进行类似于折半查找的操作&#xff0c;使得搜索时间复杂度达到logn的水准。但是在面对极端情况下&#xff0c;如近似有序的序列&#xff0c;那么整棵树的时间复杂度就有可能退…

【Godot4.3】多边形的斜线填充效果基础实现

概述 图案&#xff08;Pattern&#xff09;填充是一个非常常见的效果。其中又以斜线填充最为简单。本篇就探讨在Godot4.3中如何使用Geometry2D和CanvasItem的绘图函数实现斜线填充效果。 基础思路 Geometry2D类提供了多边形和多边形以及多边形与折线的布尔运算。按照自然的思…

Spring-@Bean的处理流程

Bean前置知识 1 需要再Configuration Class中才能被解析 2 静态Bean也就是标注在static方法上的 实例Bean标注在普通方法上的 所有的Bean在创建之前都会变成BeanDefinition,其中有这样两个属性&#xff1a; setFactoryMethodName&#xff1a;静态方法 setFactoryBeanName&…

【详解 Java 注解】

前言&#xff1a; 注解&#xff08;Annotation&#xff09;是Java中的一种特殊符号&#xff0c;用来为代码提供额外的信息。它不会改变程序的逻辑&#xff0c;只是用来给编译器或工具提供指示。例如&#xff0c;Override 表示一个方法是重写了父类的方法&#xff0c;Deprecated…

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 大语言模型已被广泛采用&#xff0c;但推理时需要大量的GPU内…

GPU 带宽功耗优化

移动端GPU 的内存结构&#xff1a; 先简述移动端内存cache结构&#xff1b;上图的UMA结构 on-Chip memory 包括了 L1、L2 cache&#xff0c;非常关键的移动端的 Tiles 也是保存在 on-chip上还包括寄存器文件&#xff1a;提供给每个核心使用的极高速存储。 共享内存&#xff08…