opencv图像形态学(边缘检测算法实例)

news2024/9/21 20:25:06

引言

图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。在OpenCV中,图像形态学操作通过一系列的数学运算来实现,如腐蚀、膨胀、开运算、闭运算等。这些操作在图像处理、计算机视觉和模式识别等领域有着广泛的应用。

一、图像边缘检测

边缘检测:是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域

1.边缘检测原理

边缘检测的基本原理是基于图像中局部区域与周围区域之间的灰度变化。当图像中存在灰度变化时,这种变化通常被视为边缘。在实际应用中,梯度可以通过不同的算法来计算,如Sobel算子、Prewitt算子等。这些算法通过应用特定的卷积核(或模板)到图像上,来计算每个像素点的梯度。

边缘检测的主要步骤

  1. 滤波:由于边缘检测算法主要基于图像强度的一阶和二阶导数,但这些导数对噪声非常敏感,因此滤波是边缘检测前的必要步骤。常用的滤波器是高斯滤波器,它通过离散化的高斯函数产生一组归一化的高斯核,然后基于这些高斯核对图像灰度矩阵的每一点进行加权求和,从而实现图像的平滑处理。
  2. 增强:增强算法的目的是将图像中灰度有显著变化的点(即潜在的边缘点)凸显出来。一般通过计算梯度幅值来完成。梯度是一个向量,表示图像中亮度变化的方向和速率。梯度的幅值反映了亮度变化的强度,因此可以通过计算每个像素点的梯度幅值来增强边缘信息。
  3. 检测:在增强后的图像中,虽然边缘信息得到了凸显,但并非所有梯度幅值较大的点都是真正的边缘点。因此,需要通过阈值化来检测边缘点。即设定一个或多个阈值,将梯度幅值大于阈值的点视为边缘点。
  4. 定位与连接:在检测到边缘点后,需要进一步确定边缘的精确位置,并将检测到的边缘点连接成完整的边缘轮廓。这通常涉及到对边缘点的进一步处理和分析,如亚像素边缘定位、霍夫变换、轮廓跟踪等。

常见的边缘检测算法

  1. Sobel算子:Sobel算子是基于一阶导数的边缘检测算子,它利用像素上下左右邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。Sobel算子有两个,一个是检测水平边缘的,另一个是检测垂直边缘的。
  2. Laplacian算子:Laplacian算子是基于二阶导数的边缘检测算子,它对噪声比较敏感,但能够检测到更细致的边缘。Laplacian算子可以检测两个方向上的边,但通常需要先对图像进行平滑处理以减少噪声的影响。
  3. Canny边缘检测:Canny边缘检测是一种多级边缘检测算法,它结合了高斯滤波、梯度计算、非极大值抑制和双阈值处理等多个步骤,能够以较低的错误率检测边缘,并且检测到的边缘精确定位在真实边缘的中心。Canny边缘检测算法是目前应用最广泛的边缘检测算法之一。

算法实现:

1.Sobel算子:
import cv2  
  
# 读取图片
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)  
  
# 使用Sobel算子检测x方向的边缘,结果以64位浮点数存储  
monkey_x_64 = cv2.Sobel(monkey, cv2.CV_64F, dx=1, dy=0)  
  
# 将64位浮点数结果转换为8位无符号整数,便于显示  
monkey_x_full = cv2.convertScaleAbs(monkey_x_64)  
  
# 使用Sobel算子检测y方向的边缘,结果以64位浮点数存储  
monkey_y_64 = cv2.Sobel(monkey, cv2.CV_64F, dx=0, dy=1)  
  
# 将64位浮点数结果转换为8位无符号整数,便于显示  
monkey_y_full = cv2.convertScaleAbs(monkey_y_64)  
  
# 将x和y方向的边缘图像加权合并  
monkey_xy_full = cv2.addWeighted(monkey_x_full, 0.5, monkey_y_full, 0.5, 0)  # 这里我调整了权重为0.5和0.5,您可以根据需要调整  
  
# 显示合并后的边缘图像  
cv2.imshow("monkey_xy", monkey_xy_full)  
  
# 等待按键操作  
cv2.waitKey(0)  
  
# 关闭所有OpenCV窗口  
cv2.destroyAllWindows()

前后对比

2.Canny边缘检测
import cv2  
  
# 读取图片,注意文件名更正为 monkey.jpg  
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)  
  
# 显示原始灰度图片  
cv2.imshow('Original Monkey', monkey)  
cv2.waitKey(0)  
  

# 使用Canny边缘检测算法  
monkey_canny = cv2.Canny(monkey, 50, 100)  
  
# 显示Canny边缘检测结果,注意窗口命名以避免混淆  
cv2.imshow('Canny Edges', monkey_canny)  
cv2.waitKey(0)  
  
# 关闭所有OpenCV窗口  
cv2.destroyAllWindows()

前后对比

3.Laplacian算子

import cv2  
  
# 读取图片,注意文件名更正为 monkey.jpg  
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)  

# 应用Laplacian算子检测边缘  
monkey_lap = cv2.Laplacian(monkey, cv2.CV_64F)  
monkey_lap_full = cv2.convertScaleAbs(monkey_lap)  
  
# 显示Laplacian边缘检测结果  
cv2.imshow('Laplacian Edges', monkey_lap_full)  
cv2.waitKey(0) 

除了上述算法外,还有Prewitt算子、Roberts算子、Scharr算子等多种边缘检测算法可供选择。这些算法各有优缺点,在实际应用中需要根据具体需求和图像特点选择合适的算法。

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

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

相关文章

Python自动化必会技能-Excel文件读取

01 重点 在自动化测试过程中,经常需要使用excel文件来存储测试用例,那么在表格内设计好了测试用例数据后,如何通过自动化读取呢?此时就需要测试小姐姐动手写“代码”了~ 本文主要介绍通过python来读取表格数据。Python读取表格的…

C语言的函数递归

目录 前言 一、递归是什么? 1. 递归的思想 2. 递归的限制条件 二、递归举例 1. 求n的阶乘 1.1 思路分析 1.2 画图推演 2. 顺序打印⼀个整数的每⼀位 2.1 思路分析 2.2 画图推演 三、递归与迭代 四、求第n个斐波那契数 总结 前言 我们在函数上已经非常…

《父母爱情》:找结婚对象,别只看有房有车有颜,这4个特点更重要!

点击上方△腾阳 关注 转载请联系授权 你好,我是腾阳。 最近,我重温了电视剧《父母爱情》,不禁被剧中人物的情感纠葛和生活琐事深深吸引。 在当今社会,许多人在选择结婚对象时,往往只关注房子、车子、颜值&#xff0…

2020年B题高穿越沙漠教社杯全国大学生数学建模竞赛题目与分析

↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ​ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓…

DHECDH密钥交互算法

1. 引言 在现代通信中,数据的安全性至关重要。无论是网络浏览、电子邮件,还是移动支付,保护数据不被窃听和篡改都是首要任务。密钥交换是保障通信安全的关键技术之一,其中最著名的两个算法是 Diffie-Hellman (DH) 和 椭圆曲线 Di…

用Python实现时间序列模型实战——Day 8: 季节性ARIMA模型 (SARIMA)

一、学习内容 1. SARIMA 模型的定义与公式推导 SARIMA 模型: SARIMA 模型是扩展了 ARIMA 模型的一种方法,全称为季节性自回归积分滑动平均模型(Seasonal AutoRegressive Integrated Moving Average)。它结合了 ARIMA 模型的非季…

和字符串有关的经典OJ题——字符串的逆置和字符串的翻转

学习完字符串有关的函数之后,那当然在这个章节有两道经典的子题也要给大家分享一下。 分别是字符串的逆置和字符串的翻转。 一、字符串的逆置: 1. 问题描述: 问题很容易理解:对于用户任意给定的字符串,就比如说是原…

MFC自定义消息实例

1、新建一个SHOW名称的对话框文件 2、在SHOWDlg.h中添加代码 #define WM_Display (WM_USER100)afx_msg LRESULT OnDisplay(WPARAM wParam, LPARAM lParam);3、在SHOWDlg.cpp中添加代码 BEGIN_MESSAGE_MAP(CSHOWDlg, CDialog)...ON_MESSAGE(WM_Display, OnDisplay) END_MESSA…

全面解读 HTTP 缓存机制:200 内存与硬盘缓存、304 状态码

更多内容:孔乙己大叔 在探讨网页性能优化时,HTTP 缓存机制是不可或缺的一环。它不仅能够减少数据传输量,降低带宽消耗,还能显著提升网页的加载速度和用户体验。本文将深入解析 HTTP 状态码 200 和 304 在缓存机制中的作用&#xf…

不懂就问,净水器到底过滤了什么?

在水质问题日益受到关注的今天,净水器已成为许多家庭的必备品。然而,对于净水器究竟能够过滤掉多少脏东西,很多人可能并不十分清楚。 净水器的核心功能是去除水中的杂质和有害物质,确保我们饮用的水更加安全和健康。这就如同我们…

【kafka】在Linux系统中部署配置Kafka的详细用法教程分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

零工市场 Java 版源码开发:开启灵活就业新潮流

现如今,数字化经济发展的越来越迅速,那么灵活就业的方式也就更加受到大众的青睐。其中,零工市场的兴起为求职者和招聘方提供了更加便捷、高效的对接平台。 系统概述 零工市场系统是一个连接求职者和招聘方的在线平台,主要功能包…

Carmeker C接口

本文主要是简单介绍如何将C代码的模型嵌入到carmaker中运行 一.项目创建与例程生成 在创建项目的时候勾选source选项,勾选后才能在项目目录下生成src的文件夹 在src文件夹下,存在大量IPG的例程,这些例程简单介绍了如何使用了src的接口 编译…

递归 与 dfs 综合练习(四)

目录 一、单词搜索 1.题目链接:79. 单词搜索 2.题目描述: 3.解法 🌴算法思路: 🌴算法代码: 一、黄金矿工 1.题目链接:1219. 黄金矿工 2.题目描述: 3.解法 🌴算…

《从C/C++到Java入门指南》- 25.final 关键字

final 关键字 final 变量 final变量可以理解为C中的const,变量一经定义无法修改。 public class Main {public static void main(String args[]) {final double PI 3.1415926;System.out.println(PI);// PI 3.14; // 尝试修改会报错} }final 方法 一个定义为f…

私有仓库

创建私有仓库,在企业中分享项⽬ # 创建仓库 # 重启docker服务 # 为要上传的镜像添加标记 1.拉取registry 2.创建挂载⽬录 3.启动容器,映射端⼝,挂载⽬录 4.访问仓库 5.配置pull和push,修改daemon.json 6.修改了配置⽂件,重启docke…

WordPress资源产品展示类主题 官网主题 CeoNova-Pro_v4.4

WordPress资源产品展示类主题 官网主题 CeoNova-Pro_v4.4 开心版 CeoNova-Pro主题是一款轻量级、且简洁大气、产品官网类主题,定位于高端产品官网、同时包含了知识付费、定制服务、问答社区、论坛交流、网址导航、以及付费产品购买下载等全方位覆盖。 CeoNova主题…

C#和数据类型转换

C#是一种强类型语言,这意味着每个变量的类型在编译时都是已知的。数据类型转换是指将一种数据类型的值转换为另一种数据类型的过程。在C#中,数据类型转换分为隐式转换和显式转换。本文将详细探讨这两种转换方式,并提供字符转16进制的解决方案…

除尘雾炮机的寿命一般是多久呢,需要维护吗

除尘雾炮机的寿命一般是5-10年左右,但具体寿命会受到设备质量、使用环境、使用频率及维护保养情况等多种因素的影响。朗观视觉小编接下来带您扒一扒! 除尘雾炮机的寿命影响因素 设备质量:高质量的雾炮机采用优质材料和先进工艺制造&#xff…

自动化数据汇总:使用Python从多个数据源汇总数据

目录 引言 一、理论基础 1.1 数据源介绍 1.2 数据处理流程 1.3 常用库介绍 二、实践操作 2.1 数据读取 2.1.1 从CSV文件读取数据 2.1.2 从Excel文件读取数据 2.1.3 从数据库读取数据 2.2 数据处理 2.2.1 数据合并 2.3 数据汇总 2.4 数据存储 2.4.1 存储到CSV文件…