计算机视觉OpenCV(四):图像梯度处理和边缘检测

2023-11-05

图像梯度处理

1. Sobel算子

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

ddepth:输出图像的深度,-1 表示采用的是与原图像相同的深度。

在这里插入图片描述

dx:代表 x 方向上的求导阶数,0 表示这个方向上没有求导,一般为 0、1、2。
dy:代表 y 方向上的求导阶数,0 表示这个方向上没有求导,一般为 0、1、2。
ksize:代表 Sobel 算子的大小,必须为 1、3、5、7。该值为 -1 时,则会使用 Scharr 算子进行运算。

复习一下前面学习过的函数
图像混合/叠加:cv2.addWeighted(src1, 权重1, src2, 权重2, gamma=0)
公式: d s t = s r c 1 ∗ 权重 1 + s r c 2 ∗ 权重 2 + 偏移量 g a m m a dst = src1 * 权重1 + src2 * 权重2 + 偏移量 gamma dst=src1权重1+src2权重2+偏移量gamma

square.png原图:
在这里插入图片描述

import cv2
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread("square.png",cv2.IMREAD_GRAYSCALE)

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx) #函数cv2.convertScaleAbs()对一个随机数组取绝对值

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)  

sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) #x、y求和
#sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3) 
#直接设置dx=dy=1,得到的sobelxy效果一般般,没有上面的方法好(可自行尝试)

result = np.hstack((sobelx,sobely,sobelxy))
cv_show("sobelx-sobely",result)

在这里插入图片描述

# 实例
#import、函数cv_show与前面一样,省略,仅修改下面
img = cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)

result = np.hstack((img,sobelxy))
cv_show("img-sobelxy",result)
plt.imshow(result)

在这里插入图片描述

2. Scharr算子

cv2.Scharr(src,ddepth, dx, dy)

和 sobel 算子相比,scharr 算子临近像素的权重更大,scharr 算子能计算出更小的梯度变化,故精确度更高。

3. Laplacian算子

cv2.Laplacian(src,ddepth) 

Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理

4. 不同算子的比较

import cv2
import numpy as np

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) #Sobel算子
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3) 
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0) 
sobelxy = cv2.convertScaleAbs(sobelxy) 

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0) #Scharr算子
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 
scharrxy = cv2.convertScaleAbs(scharrxy)  

laplacian = cv2.Laplacian(img,cv2.CV_64F) #Laplacian算子
laplacian = cv2.convertScaleAbs(laplacian)   

result = np.hstack((sobelxy,scharrxy,laplacian))
cv_show("sobel-scharr-laplacian",result)

在这里插入图片描述
使用 sobel 算子的轮廓要更清晰,scharr 算子的轮廓的细节更多,laplacian 获得的结果边缘信息较浅。

Canny边缘检测

Canny 边缘检测算子是 John F. Canny 于 1986 年开发出来的一个多级边缘检测算法。
Canny 边缘检测算法可以分为以下 5 个步骤
(1)应用高斯滤波来平滑图像,目的是去除噪声
(2)找寻图像的强度梯度
(3)应用非最大抑制技术来消除边误检(本来不是但检测出来是)
(4)应用双阈值的方法来决定可能的(潜在的)边界
(5)利用滞后技术来跟踪边界

双阈值检测:
梯度值 > maxVal:则处理为边界
minVal < 梯度值 < maxVal:连有边界则保留,否则舍弃
梯度值 < minVal:则舍弃

edge = cv2.Canny(image, minVal, maxVal)

必要参数:
image:需要处理的原图像,该图像必须为单通道的灰度图;
minVal:阈值 1,较小的阈值 1 用于将间断的边缘连接起来;
maxVal:阈值 2,较大的阈值 2 用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。

import cv2
import numpy as np

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)

c1=cv2.Canny(img,80,150) #阈值不同,效果不同
c2=cv2.Canny(img,50,100)

result = np.hstack((c1,c2))
cv_show("result",result)

在这里插入图片描述

本笔记记录学习OpenCV,若有错误,欢迎批评指正,学习交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机视觉OpenCV(四):图像梯度处理和边缘检测 的相关文章

  • 将 Poetry 与 PyEnv 一起使用并遇到 Python 版本问题

    我正在使用 WSL2 Ubuntu 我一直在学习使用 Fastapi 进行后端 API 开发的课程 我相信我的 Ubuntu 默认 python 是 3 8 我正在尝试使用 python 3 10 0 进行开发 我做了以下事情 pyenv安
  • Pygame 让精灵按照给定的旋转行走

    很久以前我做了一个Scratch脚本 我想用Pygame将其转换为Python 有很多示例显示图像的旋转 但我想知道如何更改精灵的旋转以使其沿给定方向移动 而不更改图像 这是我的暂存代码 这是我的 Pygame 精灵类 class Star
  • Pandas 在列级别连接数据帧时添加键

    根据 Pandas 0 19 2 文档 我可以提供keys参数来创建结果多索引 DataFrame 一个例子 来自 pandas 文档 是 result pd concat frames keys x y z 我将如何连接数据框以便我可以在
  • 从 Python 将分层 JSON 数据写入 Excel xls?

    我想将一些数据从 python 写入 xlsx 我目前将其存储为 JSON 但它从 Python 中输出什么并不重要 单个文章的 JSON 如下所示 Word Count 50 Key Words Blah blah blah Foo Fr
  • Scrapy Splash,如何处理onclick?

    我正在尝试抓取以下内容 我能够收到响应 但我不知道如何访问以下项目的内部数据以抓取它 我注意到访问这些项目实际上是由 JavaScript 和分页处理的 这种情况我该怎么办 下面是我的代码 import scrapy from scrapy
  • 为什么在 __init__ 函数中声明描述符类会破坏描述符功能?

    在下面的 B 类中 我想要 set 每当您赋值给 A 类中的函数时 就会调用该函数B a 相反 将值设置为B a覆盖B a与价值 C类分配给C a工作正常 但我想为每个用户类都有一个单独的 A 实例 即我不想在 C 的一个实例中更改 a 来
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • 如何不断地将 STDOUT 发送到我的 python TCP 服务器?

    我有简单的 python echo 服务器 它使用套接字 并向客户端回显随机数 我有另一个程序 每 2 秒将值打印到标准输出 如果它只是一个脚本 我可以像这样重定向 stdout python script py 并像这样在脚本中获取它da
  • Python:绘制甘特图的模块

    有没有一个好的Python绘图模块甘特图 http en wikipedia org wiki Gantt chart 我试过了开罗情节 http linil wordpress com 2008 09 16 cairoplot 11 但它
  • 如何在python中访问矩阵每个元素的相邻单元格?

    这里 如果两个单元共享边界 则它们被认为是相邻的 例如 A 5 6 4 2 1 3 7 9 8 这里 索引 0 0 的相邻元素位于索引 0 1 和 1 0 处 索引 1 1 的相邻元素位于索引 0 1 1 0 2 1 处 和 1 2 假设你
  • 如何删除 pip 安装的所有软件包?

    如何从当前激活的虚拟环境中卸载 pip 安装的所有软件包 我发现这个片段作为替代解决方案 与重新创建 virtualenv 相比 删除库更加优雅 pip freeze xargs pip uninstall y 如果您通过 VCS 安装了软
  • 使用 conda 安装额外功能

    With pip我们可以使用方括号安装子包 例如与阿帕奇气流 https pythonhosted org airflow installation html pip install airflow all 有类似的东西吗conda或者我必
  • 向结构化 numpy 数组添加字段

    将字段添加到结构化 numpy 数组的最简洁方法是什么 是否可以破坏性地完成 或者是否有必要创建一个新数组并复制现有字段 每个字段的内容是否连续存储在内存中 以便可以有效地完成此类复制 如果您使用 numpy 1 3 还有 numpy li
  • 从 python 文件调用 Julia 函数

    我能够创建一个 docker 环境 然后按照这个线程我有一个用 Julia 编写的高性能函数 如何从 Python 中使用它 https stackoverflow com questions 64241264 i have a high
  • datetime strftime 不输出正确的时间戳

    下列 gt gt gt from dateutil parser import parse gt gt gt parse 2013 07 02 00 00 00 0000 datetime datetime 2013 7 2 0 0 tzi
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 具有行业级约束的 SciPy 投资组合优化

    尝试在这里优化投资组合权重分配 通过限制风险来最大化我的回报函数 我可以毫无问题地通过简单的约束 所有权重之和等于 1 找到产生我的回报函数的优化权重 并做出另一个约束 即我的总风险低于目标风险 我的问题是 如何为每个组添加行业权重界限 我
  • scikit-learn kmeans 聚类的初始质心

    如果我已经有一个可以作为初始质心的 numpy 数组 我该如何正确初始化 kmeans 算法 我正在使用 scikit learn Kmeans 类 这个帖子 具有选定初始中心的 k 均值 https stackoverflow com q
  • 具有重复值的 Sqlite 列

    就说专栏吧aSQLite 数据库的非常重复 始终有相同的 4 个值 其他值可能稍后出现 但不同值的数量将少于 1000 个 VALUES hello world it s a shame to store this str many tim
  • 如何从Python枚举类中获取所有值?

    我正在使用 Enum4 库创建一个枚举类 如下所示 class Color Enum RED 1 BLUE 2 我要打印 1 2 作为某处的列表 我怎样才能实现这个目标 您可以执行以下操作 e value for e in Color

随机推荐

  • WinNas之seafile server私人云盘搭建

    目录 部署方法 其他说明 部署方法 避免重复造车轮 直接附别人写的链接 https www kingsonho com install seafile on windows 其他说明 安装后如果需要修改web登录端口号 只在web页面上修改
  • JVM中一次完整的GC流程中是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数

    对象诞生即新生代 gt eden 在进行minor gc过程中 如果依旧存活 移动到from 变成Survivor 进行标记 当一个对象存活默认超过15次都没有被回收掉 就会进入老年代 主要的JVM参数 http ifeve com use
  • 直流减速电机通过编码器计算车轮转速、车轮速度、路程计算。

    第一步 计算Nms间隔的计数变化量 变化量var 当前读数 前次读数 第二步 计算1s间隔的计数变化量 设N 200 变化量var 5 第三步 计算1min间隔编码器的输出脉冲个数 变化量var 5 4 倍频数 第四步 计算1min间隔编码
  • 基于Unity3D的黄金矿工

    1 游戏背景 黄金矿工小游戏 是一款敏捷 经典小游戏 怀揣梦想的黄金矿工为了寻找更多金子开始了他的挖金之旅 游戏目标 使用钩子放入地下 开拓你的智慧寻找宝物 达到目标金额过关吧 2 开发工具的基本使用 本游戏开发工具选择Unity3D 20
  • Matlab yolov2 深度学习物体检测 超级简单代码

    在深度学习的物体检测方面 相比其他平台 MATLAB打包好了很多模块方法和网络 对于简单的应用 已经足够应付 大家跟着调用 稍微修改一下适应的参数就可以啦 下面我手把手教学 1 需要读取提前制作的csv文件 里面有training data
  • [A3C]:算法原理详解

    强化学习 A3C算法原理 深度强化学习框架使用异步梯度下降来优化深度神经网络控制器 提出了四种标准强化学习算法的异步变体 并证明并行actor learners在训练中具有稳定作用 使得四种方法都能成功地训练神经网络控制器 首先明确什么是A
  • 笔试,橘子称重题

    题目 甲有m个橘子分别为n克 每次找到平均数 要么丢弃比它大的 要么丢弃比它小的 将剩下的和记为s 不断循环 要求输入一些数字 其与s比较 有则输出YES 无则输出NO 第一行输入橘子个数与要比较的数字的个数 第二行输入橘子重量 第三行到结
  • 小儿机器人编程基础课

    小儿机器人编程基础课 小孩子的学习从古至今都是家长们十分关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的耐心的 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于小儿机器人编程基础课并不是很清楚 今天我们
  • 【测验1 编程题】: Python基本语法元素 (第1周)

    第一题 Hello World的条件输出 描述 获得用户输入的一个整数 参考该整数值 打印输出 Hello World 要求 如果输入值是0 直接输出 Hello World 如果输入值大于0 以两个字符一行方式输出 Hello World
  • sql server中bit类型在数据库和C#中的表示

    select count 1 from select ROW NUMBER over order by MinuteID as RowId from OA Minutes WHERE 1 1 and DelFlag false as tem
  • BLE 和 Zigbee 肉眼读数(更新ing)

    BLE1M 画相位图 可以读出preamble 01010101 同步码 01101011 通过向下向上的轨迹来肉眼读 原理是需要看如何进行调制的 toolbox中是GMSK调制 所以反着推回去 就知道画相位图能直接肉眼读数了 同理Zigb
  • JTest

    jtest解释 第一章 简介 jtest是parasoft公司推出的一款针对java语言的自动化白盒测试工具 它通过自动实现java的单元测试和代码标准校验 来提高代码的可靠性 Jtest先分析每个java类 然后自动生成junit测试用例
  • 论文精读:FairMOT: On the Fairness of Detection and Re-Identification in MultipleObject Tracking

    1 提出背景 以往的工作通常将re ID视为次要任务 其准确性受到主要检测任务的严重影响 因此 网络偏向于主检测任务 这对re ID任务不公平 2 核心思想 将MOT表示为单个网络中目标检测和reid的多任务学习 因为它允许两个任务的联合优
  • Ubuntu18.04 搭建Hadoop完全分布式环境--踩坑局

    安装Ubuntu18 04 暂时无坑 跟着CSDN教程 坑一 su root 无法切换root用户 提示 Authentication failure 填坑 sudo psswrd 然后当前用户密码 然后输入 root密码 确认 root
  • Linux环境下,通过shell脚本实现一键部署MySQL,并支持多种类型

    Linux环境下一键部署MySQL脚本 支持多种类型 前言 一 使用前须知 二 使用方法 三 shell脚本内容 总结 前言 MySQL是目前最流行的关系型数据库管理系统之一 属于 Oracle 旗下产品 由于它是开源软件 因此很多企业在
  • 业界AI 推理芯片比较

    业界AI 推理芯片比较 公司 创立时间 地点 产品 架构 算力 特色 瀚博半导体 2018年12月 上海 SV02 DSA 200TOPS 手机 12 导管 1
  • 普源示波器 电脑 连接 软件_乐高wedo2.0电脑软件安装及蓝牙连接方法

    先上一段官方视频 wedo2 0的软件下载方法如下 1 ipad端 直接去苹果应用商店下载 2 安卓端 先下载应用宝 再从应用宝里搜索wedo2 0下载安装 3 PC端 https education lego com zh cn down
  • Android:rk3588 kernel单编

    Android12 0不能直接烧写kernel img和resource img Android12 0的kernel img和resource img包含在boot img中 需要使用build sh AK 命令来编译 kernel 编译
  • 【问题解决】Java下载远程服务器资源到本地,本地提供下载服务,解决中文乱码问题

    Java下载远程服务器资源到本地 本地提供下载服务 1 通过远程访问远程URL获取服务资源 从指定URL下载文件并保存到指定目录 param filePath 文件将要保存的目录 param method 请求方法 包括POST和GET p
  • 计算机视觉OpenCV(四):图像梯度处理和边缘检测

    目录 图像梯度处理 1 Sobel算子 2 Scharr算子 3 Laplacian算子 4 不同算子的比较 Canny边缘检测 图像梯度处理 1 Sobel算子 dst cv2 Sobel src ddepth dx dy ksize d