Python OpenCV精讲系列 - 边缘检测深入理解(十三)

news2024/10/1 11:01:30

在这里插入图片描述

💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖
本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识别等多个领域。适合希望在计算机视觉方向上建立坚实基础的技术人员及研究者。每一课不仅包含理论讲解,更有实战代码示例,助力读者快速将所学应用于实际项目中,提升解决复杂视觉问题的能力。无论是入门者还是寻求技能进阶的开发者,都将在此收获满满的知识与实践经验。

引言

边缘检测是计算机视觉和图像处理中的一个关键环节,用于识别图像中的显著边界。OpenCV 提供了多种边缘检测算法,这些算法可以帮助我们从图像中提取有用的信息。本文将详细介绍 OpenCV 中几种常用的边缘检测方法及其应用场景,并提供详细的代码示例。

边缘检测基础

在讨论具体的边缘检测算法之前,我们先简单回顾一下边缘检测的基本概念。

什么是边缘?

边缘是指图像中像素强度发生急剧变化的地方。在图像处理中,边缘通常代表物体的边界或表面属性的变化。

边缘检测的目的

  • 物体分割:帮助识别图像中的不同物体。
  • 特征提取:用于后续的图像处理和分析。
  • 纹理分析:分析图像中的纹理特征。

边缘检测的基本步骤

  1. 预处理:通常包括灰度化和去噪。
  2. 增强:使用微分算子增强边缘。
  3. 检测:使用阈值或特定算法检测边缘。
  4. 定位:精确定位边缘的位置。

在这里插入图片描述

常用的边缘检测算法

OpenCV 支持多种边缘检测算法,包括但不限于:

Sobel 滤波器

Sobel 滤波器用于检测图像的水平和垂直边缘。

Sobel算子原理

Sobel 算子使用一对 3×3 卷积核来计算图像的梯度近似值。该算子分别沿 x 和 y 方向计算梯度,然后结合这两个方向的梯度来得到最终的边缘强度。

Sobel算子卷积核
  • 水平方向:
    [
    G_x = \begin{bmatrix}
    -1 & 0 & 1 \
    -2 & 0 & 2 \
    -1 & 0 & 1
    \end{bmatrix}
    ]
  • 垂直方向:
    [
    G_y = \begin{bmatrix}
    -1 & -2 & -1 \
    0 & 0 & 0 \
    1 & 2 & 1
    \end{bmatrix}
    ]
Sobel算子应用
import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用Sobel滤波
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

# 将结果转换为8位
sobelx = np.abs(sobelx)
sobely = np.abs(sobely)
sobelx = np.uint8(sobelx)
sobely = np.uint8(sobely)

# 显示结果
cv2.imshow('Sobel X', sobelx)
cv2.imshow('Sobel Y', sobely)
cv2.waitKey(0)
cv2.destroyAllWindows()

Laplacian 滤波器

Laplacian 滤波器用于检测图像的二阶导数,以突出边缘。

Laplacian算子原理

Laplacian 算子基于二阶导数,可以检测图像中像素强度的突然变化。通常情况下,Laplacian 算子会先对图像进行高斯模糊处理,以减少噪声的影响。

Laplacian算子应用
# 应用Laplacian滤波
laplacian = cv2.Laplacian(image, cv2.CV_64F)

# 将结果转换为8位
laplacian = np.abs(laplacian)
laplacian = np.uint8(laplacian)

# 显示结果
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

Canny 边缘检测

Canny 边缘检测是一种经典的边缘检测算法,它能够找到图像中的强边缘。

Canny边缘检测算法步骤
  1. 应用高斯滤波:减少噪声影响。
  2. 计算梯度强度和方向:使用Sobel算子。
  3. 非极大抑制:只保留局部最大值。
  4. 双阈值检测和连接边缘:使用高低两个阈值来决定哪些边缘是真实的。
Canny边缘检测应用
# 应用Canny边缘检测
edges = cv2.Canny(image, 100, 200)

# 显示结果
cv2.imshow('Canny Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Roberts 滤波器

Roberts 滤波器是一种简单的边缘检测方法,它使用两个 2x2 的核来计算梯度。

Roberts算子卷积核
  • 水平方向:
    [
    G_x = \begin{bmatrix}
    +1 & 0 \
    0 & -1
    \end{bmatrix}
    ]
  • 垂直方向:
    [
    G_y = \begin{bmatrix}
    0 & +1 \
    -1 & 0
    \end{bmatrix}
    ]
Roberts算子应用
# 应用Roberts滤波器
roberts_cross_v = np.array([[1, 0], [0, -1]])
roberts_cross_h = np.array([[0, 1], [-1, 0]])

vertical = cv2.filter2D(image, cv2.CV_64F, roberts_cross_v)
horizontal = cv2.filter2D(image, cv2.CV_64F, roberts_cross_h)

# 合并水平和垂直方向的结果
roberts_combined = cv2.addWeighted(vertical, 0.5, horizontal, 0.5, 0)

# 显示结果
cv2.imshow('Roberts Edge Detection', roberts_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

Prewitt 滤波器

Prewitt 滤波器与 Sobel 滤波器类似,用于检测图像的水平和垂直边缘。

Prewitt算子卷积核
  • 水平方向:
    [
    G_x = \begin{bmatrix}
    -1 & 0 & +1 \
    -1 & 0 & +1 \
    -1 & 0 & +1
    \end{bmatrix}
    ]
  • 垂直方向:
    [
    G_y = \begin{bmatrix}
    -1 & -1 & -1 \
    0 & 0 & 0 \
    +1 & +1 & +1
    \end{bmatrix}
    ]
Prewitt算子应用
# 定义Prewitt滤波器核
prewitt_x = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]])
prewitt_y = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]])

# 应用Prewitt滤波
prewitt_x_result = cv2.filter2D(image, -1, prewitt_x)
prewitt_y_result = cv2.filter2D(image, -1, prewitt_y)

# 显示结果
cv2.imshow('Prewitt X', prewitt_x_result)
cv2.imshow('Prewitt Y', prewitt_y_result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

高级边缘检测技术

除了上述标准的边缘检测算法之外,还有一些高级技术可以用来提高边缘检测的效果。

自适应阈值

自适应阈值可以根据图像的不同区域自动调整阈值,这对于处理光照不均匀的图像非常有用。

自适应阈值应用
# 应用自适应阈值
thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

# 显示结果
cv2.imshow('Adaptive Threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

Hough 变换

Hough 变换是一种用于检测图像中直线和圆等形状的算法。它可以用来检测边缘上的直线。

Hough变换应用
# 应用Hough变换
edges = cv2.Canny(image, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

# 在原图上绘制检测到的直线
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)

# 显示结果
cv2.imshow('Hough Transform', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结

边缘检测是计算机视觉和图像处理中的一项重要技术。OpenCV 提供了多种边缘检测算法,可以帮助我们从图像中提取有用的信息。通过上述介绍的方法和技术,我们可以有效地检测图像中的边缘,这对于后续的图像分析和处理至关重要。

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

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

相关文章

地质工程专业职称申报条件详细解读

一、初级(助理)地质工程工程师评审条件: 1、理工类或者地质工程类专业毕业 2、专科毕业满3年或本科毕业满1年 3、研究生毕业,从事本专业技术工作,当年内考核认定 二、中级地质工程工程师评审条件: 1、理工…

解决远程连接AlpineLinux Mysql/MariaDB 无法连接的问题

&#x1f525;博客介绍&#xff1a; EvLast &#x1f3a5;系列专栏&#xff1a; << C项目>> <<数据结构与算法>> << 算法入门>> &#x1f3a5; 当前专栏:<< C项目>> 专题 : 解决开发中的日常Bug &#x1f44d;&#x1f44…

服务端的 Session 详解

0x01&#xff1a;Session 简介 Session 是在 Cookie 的基础上发展的&#xff0c;其主要功能和 Cookie 一样&#xff0c;都是为了解决 HTTP 无状态的痛点&#xff0c;和 Cookie 不同的是&#xff0c;它是将大部分数据存储在了服务端&#xff0c;而只给用户一个 SESSID&#xff…

django学习入门系列之第十点《A 案例: 员工管理系统21》

文章目录 16 Ajax(订单案例)16.9 编辑想要去数据库中获取数据时:对象/字典将具体内容的错误信息传入到前端&#xff08;Ajax&#xff09;将数据库数据传入前端&#xff08;Ajax&#xff09;清空新建订单的数据 16.10 编辑后保存 往期回顾 16 Ajax(订单案例) 16.9 编辑 点击编辑…

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测 目录 TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料预测效果

Python第一篇:Python解释器

一&#xff1a;python解释器 python解释器是一款程序&#xff0c;用于解释、执行Python源代码。 一般python解释器都是c python使用c编写的&#xff0c;还有j python用java编写的。 二&#xff1a;python下载 三&#xff1a;使用示例 python进入控制台&#xff0c;python。 三…

【react案例】实现评论列表

1. 需求 展示评论列表实现删除功能 2.1 只有自己的评论才展示删除按钮 2.2 点击删除按钮&#xff0c;删除当前评论tab切换&#xff08;点击对应tab&#xff0c;对tab文案高亮处理&#xff09;评论高亮评论排序&#xff08;最新、最热&#xff09; 2. 实现思路 useState维护评…

基于vue框架的大同传统文化非物质文化宣传管理系统jzo9d(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,非遗类型,文化遗产 开题报告内容 基于Vue框架的大同传统文化非物质文化宣传管理系统开题报告 一、研究背景 在全球化加速的今天&#xff0c;传统文化的保护与传承面临着前所未有的挑战。大同&#xff0c;作为中国历史文化名城&a…

职场能力强的人都在做什么---今日头条

【职场里,能力强的人都在做哪些事... - 今日头条】https://m.toutiao.com/is/ikn6kt9q/ 知识雷达 2024-09-21 16:33 目录 职场里,能力强的人都在做哪些事呢? 1、复盘; 2、多角度思考;3、记录信息; 4、永远积极主动;5、主动获取信息差; 6、明确人和人的关系;7、…

STM32杂项

STM32杂项 1.启动过程2.中断3.GPIO4.Systick5.串口printf6.独立看门狗 记录单片机在工作中遇到的问题和特殊情况。 1.启动过程 M3/M4/M7内核复位后&#xff0c;做的第一件事&#xff1a; 1.从地址0x0000 0000处取出堆栈指针MSP的初始值&#xff0c;该值就是栈顶地址。 2.从地址…

2024必备中英互译利器全知道

现在英语目前还是学习最广泛的第二语言&#xff0c;所以很多资料都有英文的版本。如果外语不好&#xff0c;那中英互译翻译工具就能帮我们解决这个问题。今天我们一起来探讨下有哪些好用的翻译工具。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc 这个工具…

【linux】进度条

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.屏幕缓冲区换行&#xff08;LF, \n&#xff09;和回车&#xff08;CR, \r&#xff09;换行回车在屏幕缓冲区中的作用代码块1&#xff1a;代码块2&#xff1a; 02.进度条优化版…

SpringBoot3+Swagger3(最新版springdoc-openapi教程)

第一步&#xff1a;引入springdoc-openapi依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version></dependency> 第二步&#xff1a; 配置…

打开ffmpeg编码器的时候报错:avcodec_open2()返回-22

[h264_v4l2m2m 0x555555617a00] Could not find a valid device [h264_v4l2m2m 0x555555617a00] cant configure encoder 前言&#xff1a;先做一个操作&#xff0c;查找编码器的时候&#xff0c;使用名字查找的方式&#xff1a; const AVCodec *avcodec_find_encoder_by_n…

ubuntu数据硬盘故障导致系统启动失败

背景&#xff1a; 系统盘损坏或者/etc/fatab误修改导致开机启动挂载失败系统无法启动 解决方法 重启

BFS 解决最短路径问题, 迷宫中离入口最近的出口,最小基因变化,单词接龙,为高尔夫比赛砍树

文章目录 1926. 迷宫中离入口最近的出口433. 最小基因变化127. 单词接龙675. 为高尔夫比赛砍树 1926. 迷宫中离入口最近的出口 边权为1的最短路径问题 我们要知道上下左右都是可以走的 &#xff08;用队列&#xff09;走过的地方不要在走了&#xff0c;这样会进入死循环&#x…

零信任内网安全访问

随着互联网的持续发展&#xff0c;便捷的共享方式极大地提高了企业的生产力和工作效率&#xff0c;但随之也给企业内网带来了极大的安全隐患。企业内网承载大量的核心资产和机密数据&#xff0c;一旦受到攻击可能会造成大量损失&#xff0c;因此&#xff0c;如何通过零信任内网…

快手一面:给定一棵二叉树,要求将其转换为其镜像?

目录标题 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09;问题描述示例解题思路代码实现详细分析复杂度分析优点注意事项&#x1f495; 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09; 问题描述 给定一棵二叉树&#xff…

探索AI新纪元:揭秘Mammoth库的神秘面纱

文章目录 探索AI新纪元&#xff1a;揭秘Mammoth库的神秘面纱背景&#xff1a;为何选择Mammoth&#xff1f;简介&#xff1a;Mammoth是什么&#xff1f;安装&#xff1a;如何获取Mammoth&#xff1f;使用&#xff1a;Mammoth的基本函数场景应用&#xff1a;Mammoth在实际中的运用…

基于Python大数据的B站热门视频的数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…