图像预处理-图像边缘检测(流程)

一.高斯滤波

        因为图像边缘检测就是把像素值有差异的地方提取出来,所以噪声会有很大影响,因此需要对图像进行平滑处理高斯滤波是流程中常用的方法。

二.计算图像的梯度与方向

过程中通常使用sobel算子进行梯度计算,在OpenCV中,默认使用 G=|G(x)+G(y)| 来计算梯度值。

这个角度值其实是当前边缘的梯度方向,若梯度方向不是0°、45°、90°、135°这种特定角度,那么就要用到插值算法来计算当前像素点在其方向上进行插值的结果,然后进行比较并判断是否保留该像素点。

- 为-22.5°~22.5°,或-157.5°~157.5°,则认为边缘为水平边缘;

- 为22.5°~67.5°,或-112.5°~-157.5°,则认为边缘为45°边缘;

- 为67.5°~112.5°,或-67.5°~-112.5°,则认为边缘为垂直边缘;

- 为112.5°~157.5°,或-22.5°~-67.5°,则认为边缘为135°边缘;

三.非极大值抑制

        经过第二步得到的边缘不经过处理是没办法使用的,因为高斯滤波去噪边缘会模糊,得到的边缘像素点非常多,因此需要对其进行一些过滤操作,而非极大值抑制就是一个很好的方法。即检查每个像素点的梯度方向上的相邻像素,并保留梯度值最大的像素,将其他像素抑制为零

四.双阈值筛选

经过非极大值抑制之后,我们还需要设置阈值来进行筛选。

        当某一像素位置的幅值超过最高阈值时,该像素必是边缘像素;当幅值低于最低阈值时,该像素必不是边缘像素;幅值处于最高像素与最低像素之间时,如果它能连接到一个高于阈值的边缘时,则被认为边缘像素,否则就不会被认为是边缘。

五.实现边缘检测的流程函数

edges = cv2.Canny(image, threshold1, threshold2)

- threshold1阈值,用于决定可能的边缘点。

- threshold2阈值,用于决定强边缘点。

- 即使读到的是彩色图也可以进行处理。

import cv2 as cvimg = cv.imread('../images/lvbo2.png')gray1 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 手动进行高斯滤波再调用canny边缘检测
img2 = cv.GaussianBlur(img, (3, 3), 1)gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)# 二值化处理方便观察
ret, binary = cv.threshold(gray1, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
ret, binary1 = cv.threshold(gray2, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)# 利用内置高斯滤波器进行边缘检测
edge = cv.Canny(binary, 30, 70)
edge1 = cv.Canny(binary1, 30, 70)cv.imshow('edge', edge)
cv.imshow('edge1', edge1)
cv.waitKey(0)
cv.destroyAllWindows()

        可以发现,提前手动进行去噪处理效果更好,虽然canny函数内置了高斯滤波,但根据要求进行去噪预处理可以得到更好的效果。

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

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

相关文章

ChatBEV:一种理解 BEV 地图的可视化语言模型

25年3月来自上海交大、上海AI实验室、同济大学和MAGIC的论文“ChatBEV: A Visual Language Model that Understands BEV Maps”。 交通场景理解对于智能交通系统和自动驾驶至关重要,可确保车辆安全高效地运行。虽然 VLM 的最新进展已显示出整体场景理解的前景&…

武装Burp Suite工具:xia SQL自动化测试_插件

武装Burp Suite工具:xia SQL自动化测试_插件 插件作者介绍:本插件仅只插入单引号,没有其他盲注啥的,且返回的结果需要人工介入去判断是否存在注入,如果需要所有注入都测试,请把burp的流量转发到xray。 目录…

线段树讲解(小进阶)

目录 前言 一、线段树知识回顾 线段树区间加减 区间修改维护: 区间修改的操作: 区间修改update: 线段树的区间查询 区间查询: 区间查询的操作: 递归查询过程: 区间查询query: 代码&…

neo4j中节点内的名称显示不全解决办法(如何让label在节点上自动换行)

因为节点过多而且想让节点中所有文字都显示出来而放大节点尺寸 从neo4j中导出png,再转成PDF来查看时,要看清节点里面的文字就得放大5倍才行 在网上看了很多让里面文字换行的办法都不行 然后找到一个比较靠谱的办法是在要显示的标签内加换行符 但是我的节点上显示的是…

SQL进阶知识:五、存储过程和函数

今天介绍下关于存储过程和函数的详细介绍,并结合MySQL数据库提供实际例子。 在MySQL中,存储过程(Stored Procedures)和函数(Functions)是数据库编程的重要组成部分,它们可以封装SQL语句&#xf…

CONDA:用于 Co-Salient 目标检测的压缩深度关联学习(总结)

摘要 一 介绍 二 有关工作 三 提出的方法 图2:我们的凝聚式深度关联(CONDA)模型的整体流程图。具体来说,凝聚式深度关联(CONDA)模型首先利用图像特征来计算超关联。然后,全像素超关联由对应诱…

node.js 实战——(path模块 知识点学习)

path 模块 提供了操作路径的功能 说明path. resolve拼接规范的绝对路径path. sep获取操作系统的路径分隔符path. parse解析路径并返回对象path. basename获取路径的基础名称path. dirname获取路径的目录名path. extname获得路径的扩展名 resolve 拼接规范的绝对路径 const…

Kimi做内容社区,剑指小红书?

原创科技新知AI新科技组作者丨樱木编辑丨江蓠 主编丨九黎 对于当前融资形势并不明朗的大模型六小龙来说,该如何生存下去,似乎成了各家急需解决的问题。 根据PitchBook数据,今年一季度风险投资机构在中国AI领域共完成144笔交易,投…

opencv--图像滤波

图像滤波 含义 方法 噪声是怎么产生的 线性滤波 概念 利用窗口对图像中的像素进行加权求和的滤波方式。 图像来源于小虎教程。 图像的滤波是二维滤波的过程。 滤波器窗口: 滤波器窗口(也称为卷积核或模板)是一个小的矩阵(通常为…

Java 实现SpringContextUtils工具类,手动获取Bean

SpringContextUtils 工具类实现 下面是一个完整的 Spring 上下文工具类实现,用于从 Spring 容器中获取 Bean。这个工具类考虑了线程安全、性能优化和易用性,并提供了多种获取 Bean 的方式。 完整实现代码 import org.springframework.beans.BeansExce…

基于 Vue 2 开发的分页卡片列表组件(带懒加载和点击事件)

功能目标&#xff1a; CardList.vue 中支持分页&#xff0c;每页显示指定数量的卡片。添加“加载中”动画。支持懒加载&#xff1a;滚动到底部自动加载下一页。点击卡片的事件逻辑由 Card.vue 内部发出&#xff0c;并由 CardList 向上传递。 主页面文件 Home.vue <templat…

【数据结构和算法】6. 哈希表

本文根据 数据结构和算法入门 视频记录 文章目录 1. 哈希表的概念1.1 哈希表的实现方式1.2 哈希函数&#xff08;Hash Function&#xff09;1.3 哈希表支持的操作 2. Java实现 在前几章的学习中&#xff0c;我们已经了解了数组和链表的基本特性&#xff0c;不管是数组还是链表…

【python】如何将文件夹及其子文件夹下的所有word文件汇总导出到一个excel文件里?

根据你的需求,这里提供一套完整的Python解决方案,支持递归遍历子文件夹、提取Word文档内容(段落+表格),并整合到Excel中。以下是代码实现及详细说明: 一个单元格一个word的全部内容 完整代码 # -*- coding: utf-8 -*- import os from docx import Document import pand…

leetcode-位运算

位运算 371. 两整数之和 题目 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - &#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a; a 1, b 2 输出&#xff1a; 3 示例 2&#xff1a; 输入&#xff1a; a 2, b 3 输出&#xff1a; 5 提示&am…

飞帆控件:在编辑模式下额外加载的库

飞帆是一个自由的控件设计平台。在飞帆中&#xff0c;我们可以很方便地创建基于 Vue 2 组件的控件&#xff0c;并使用控件来搭建网页。 他山之石&#xff0c;可以攻玉。在创建控件中&#xff0c;使用 js 、css 依赖库能让我们的控件更强大。 有些时候&#xff0c;在编辑模式下…

GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)

今天偶然发现天梯赛的代码还保存着&#xff0c;于是决定写下这篇题解&#xff0c;也算是复盘一下了 L1本来是打算写的稳妥点&#xff0c;最后在L1-6又想省时间&#xff0c;又忘记了insert&#xff0c;replace这些方法怎么用&#xff0c;也不想花时间写一个文件测试&#xff0c…

编码转换器

大批量转换编码 可以将整个工程文件夹从GB18030转为UTF-8 使用Qt C制作 项目背景 比较老的工程&#xff0c;尤其是keil嵌入式的工程&#xff0c;其文本文件&#xff08;.c、.cpp、.h、.txt、……&#xff09;编码为gb2312&#xff0c;这为移植维护等带来了不便。现在uit-8用…

STL 核心模块

很好&#xff01;你想深入 STL&#xff08;Standard Template Library&#xff09;和容器算法&#xff0c;是学习 C 非常关键的一步。下面我给你整理一份STL 容器 算法的入门指南&#xff0c;适合从零起步掌握这部分内容。 &#x1f31f; 一、STL 核心模块 STL 分为三大块&am…

2024沈阳区域赛,D - Dot Product Game

题目链接 树状数组求逆序对 #include<bits/stdc.h> using namespace std; using lllong long; typedef pair<int,int>PII; typedef priority_queue<int> upq; typedef priority_queue<int,vector<int>,greater<int>> dpq; const int M99…

简易博客点赞系统实现

简易博客点赞系统 好久没写 Java 了&#xff0c;整个简单的项目进行康复训练。 基于 Spring Boot SSM MySQL Mybatis-Plus Knife4j Swagger 的一个简易博客点赞系统 开源地址&#xff1a;https://github.com/FangMoyu/simple-thumb 功能 登录获取当前登录用户获取博客…