OpenCV-Python(18):图像梯度

目录

背景介绍及应用

学习目标

原理

Sobel算子和Scharr算子

Laplacian 算子

代码示例

重要提醒 


背景介绍及应用

        图像的梯度是指图像中每个像素点的强度变化情况。计算图像的梯度可以帮助我们了解图像中物体的边界和纹理等信息。梯度在计算机视觉和图像处理领域有着广泛的应用,以下是一些常见的应用场景:

  1. 边缘检测:梯度可以帮助我们找到图像中物体之间的边界。通过计算图像的梯度,我们可以检测出物体的边缘,从而实现目标检测、物体识别和图像分割等任务。
  2. 图像增强:梯度可以帮助我们增强图像中的细节和纹理。通过计算图像的梯度,我们可以强调图像中的边缘和纹理,从而提高图像的清晰度和质量。
  3. 光照估计:梯度可以帮助我们估计图像中的光照条件。通过计算图像的梯度,我们可以分析图像中的亮度变化,从而了解图像的光照情况,进而进行光照校正和图像增强等操作。
  4. 特征提取:梯度可以帮助我们提取图像中的特征。通过计算图像的梯度,我们可以得到图像中的边缘和纹理等特征,从而用于图像分类、目标识别和图像检索等任务。

学习目标

  • 掌握图像梯度、图像边界等重要术语
  • 使用到的函数有cv2.Sobel()、cv2.Schar()、cv2.Laplacian() 等

原理

        梯度简单来说就是求导。OpenCV 提供了三种不同的梯度滤波器,或者说是高通滤波器,分别是Sobel,Scharr 和Laplacian。Sobel,Scharr 其实就是求一阶或二阶导数。Scharr 是对Sobel(使用小的卷积核求解梯度角度梯度角度时的优化)。Laplacian 是求二阶导数。

Sobel算子和Scharr算子

        Sobel算子和Scharr算子都是常用的图像梯度计算算子,用于边缘检测和图像增强等任务。它们可以计算图像在水平和垂直方向上的梯度,并且可以根据梯度的大小来判断图像中的边缘。

        Sobel算子是一种离散的差分算子,可以用于计算图像的一阶导数。它分为水平和垂直两个方向的算子,分别表示为Sobel_x和Sobel_y。这两个算子可以通过卷积运算来计算图像在水平和垂直方向上的梯度。Sobel算子的计算公式如下:

Sobel_x = [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]

Sobel_y = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]

        Scharr算子是Sobel算子的一种改进版本,它使用了一种更加精确的差分算法,可以提供更好的梯度近似。Scharr算子也分为水平和垂直两个方向的算子,分别表示为Scharr_x和Scharr_y。Scharr算子的计算公式如下:

Scharr_x = [[-3, 0, 3], [-10, 0, 10], [-3, 0, 3]]

Scharr_y = [[-3, -10, -3], [0, 0, 0], [3, 10, 3]]

使用Sobel算子和Scharr算子可以通过卷积运算来计算图像的梯度。具体步骤如下:

  1. 将图像转换为灰度图像,如果图像已经是灰度图像则可以省略此步骤。
  2. 对图像进行平滑处理,可以使用高斯滤波器来进行平滑。
  3. 使用Sobel算子或Scharr算子进行卷积运算,计算图像在水平和垂直方向上的梯度。
  4. 根据梯度的大小来判断图像中的边缘,可以使用阈值来过滤掉低强度的边缘。
  5. 可选的,可以对图像进行非极大值抑制来细化边缘。
  6. 可选的,可以使用双阈值法来进一步筛选边缘,选择具有足够强度的边缘。

3x3 的Scharr 滤波器卷积核如下: 

Laplacian 算子

        Laplacian算子是一种常用的图像二阶导数算子,用于图像增强、边缘检测和特征提取等任务。它可以通过计算图像的二阶导数来检测图像中的边缘和纹理特征。

Laplacian算子的计算公式如下:

Laplacian = [[0, 1, 0], [1, -4, 1], [0, 1, 0]]

使用Laplacian算子可以通过卷积运算来计算图像的二阶导数。具体步骤如下:

  1. 将图像转换为灰度图像,如果图像已经是灰度图像则可以省略此步骤。
  2. 对图像进行平滑处理,可以使用高斯滤波器来进行平滑。
  3. 使用Laplacian算子进行卷积运算,计算图像的二阶导数。
  4. 根据导数的大小来判断图像中的边缘和纹理特征,可以使用阈值来过滤掉低强度的特征。
  5. 可选的,可以对图像进行非极大值抑制来细化边缘。
  6. 可选的,可以使用双阈值法来进一步筛选特征,选择具有足够强度的特征。

代码示例

下面的代码分别使用以上三种滤波器对同一幅图像操作。使用的卷积核是5x5 的。

# -*- coding: utf-8 -*-import cv2
import numpy as np
from matplotlib import pyplot as pltimg=cv2.imread('dave.jpg',0)#cv2.CV_64F 输出图像的深度(数据类型)可以使用-1, 与原图像保持一致np.uint8
laplacian=cv2.Laplacian(img,cv2.CV_64F)# 参数1,0 为只在x 方向求一阶导数􈙽最大可以求2阶导数。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)# 参数0,1 为只在y 方向求一阶导数􈙽最大可以求2阶导数。
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])plt.show()

效果如下:

重要提醒 

        在查看上面这个例子的注释时不知到你有没有注意到,我们可以使用参数-1 来设定输出图像的深度(数据类型)与原图像保持一致,但是我们在代码中使用的却是cv2.CV_64F。这是为什么呢?想想一下一个从黑到白的边界的导数是正数,而一个从白到黑的边界点导数却是负数。如果原图像的深度是np.int8 时,所有的负值会被截断变成0,换句话说就就是把边界信息丢失掉所以如果这两种边界你都想检测到,最好的的办法就是将输出的数据类型设置的更高,比cv2.CV_16S,cv2.CV_64F 等。取绝对值然后再把它转回到cv2.CV_8U。下面的示例演示了输出图片的深度不同造成的不同效果。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('boxs.png',0)# Output dtype = cv2.CV_8U
sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=5)# 也可以将参数􄕭为-1
#sobelx8u = cv2.Sobel(img,-1,1,0,ksize=5)
# Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8Usobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])plt.show()

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

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

相关文章

超分辨数据集:Set5 Set14 BSD100 Urban100 Manga109

DIV2K数据集官网上很好找到,但是网上流传的Set5 14 BSD100,Urban100 Manga109都是私人进行处理过的版本,各个处理方式都不同,为了统一方式写了这篇文章。 官方的DIV2K x2、x3、x4的LR图片使用下面matlab代码生成(已经经过测试最后…

基于单片机设计的指纹锁(读取、录入、验证指纹)

一、前言 指纹识别技术是一种常见的生物识别技术,利用每个人指纹的唯一性进行身份认证。相比于传统的密码锁或者钥匙锁,指纹锁具有更高的安全性和便利性,以及防止钥匙丢失或密码泄露的优势。 基于单片机设计的指纹锁项目是利用STC89C52作为…

ARM GIC(三) gicv2架构

ARM的cpu,特别是cortex-A系列的CPU,目前都是多core的cpu,因此对于多core的cpu的中断管理,就不能像单core那样简单去管理,由此arm定义了GICv2架构,来支持多核cpu的中断管理 一、gicv2架构 GICv2,支持最大8个core。其框图如下图所示: 在gicv2中,gic由两个大模块组成: …

华为OD机试真题-园区参观路径-2023年OD统一考试(C卷)

题目描述:园区某部门举办了Family Day,邀请员工及其家属参加;将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;家属参观园区时,只能向右和向下园区前进;求从起始园区到终点园区会有多少条不同的参观路径; 输入描述:第一行为园区长和宽;后面每一行…

集群与分布式的概念及区别

目前在工作中经常接触到集群的概念,通过这篇文章总结一下集群的几种方式以及和分布式对比学习 1.集群(Cluster) 集群是由多个计算机节点组成的网络,旨在共同提供服务,并确保高性能和高可用性。在高可用集群中&#xf…

conda环境下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令,报命令无法识别,错误信息如下: PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径&a…

Redis原理之网络通信协议笔记

目录 1. RESP协议 ​2. 自定义Socket连接Redis 1. RESP协议 2. 自定义Socket连接Redis public class MyRedisClient {static Socket s;static PrintWriter writer;static BufferedReader reader;static Object obj;public static void main(String[] args) {try {// 1.建立连…

Redis(非关系型数据库)

Redis(非关系型数据库) 文章目录 Redis(非关系型数据库)认识Redis(Remote Dictionary Server)1.Redis的基本介绍2.Redis的应用场景2.1 取最新N个数据的操作2.2 排行榜应用,取TOP N操作2.3 需要精准设定过期时间的应用2.4 计数器应用2.5 Uniq 操作,获取某段时间所有数…

threejs中变换相关的知识点总结

一, 前言 在threejs的使用过程中经常会遇到需要移动旋转缩放之类的变换的情况,而可以实现这一目的的方法也有很多,如: translate,scale,rotateX,applyMatrix4,position.set,rotateOnWorldAxis… 等等, 很多方法可供选择。有的是作用在geometry上的, 有的是作用在me…

回归分析笔记

回归分析 回归分析: 寻找两个或多个变量之间的函数关系(相关关系) 一元和线性 y β 0 β 1 x ε \begin{aligned} y&\beta_0\beta_1x\varepsilon\\ \end{aligned} y​β0​β1​xε​ 误差项 ε \varepsilon ε是一个期望值为0的随机变量,即 E ( ε ) 0 …

mysql 23-2day 数据库查询(DQL)

目录 数据库查询(DQL)环境:准备一个表格作为查询环境查看数据根据要求查看数据运算查询as 可以修改字段名字 进行查询查询所有部门拼接两个字段查询 2017年入职的员工一个是空null 一个是空白查询 NULL集合排序查询查看有那些组通配符正则查询函数 数据库查询(DQL) …

如何搭建Web自动化测试框架?

在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短,迭代速度越来越快,只会点点点,不懂开发的手工测试,已经无法满足如今的…

Java---泛型讲解

文章目录 1. 泛型类2. 泛型方法3. 泛型接口4. 类型通配符5. 可变参数6. 可变参数的使用 1. 泛型类 1. 格式&#xff1a;修饰符 class 类名 <类型>{ }。例如&#xff1a;public class Generic <T>{ }。 2. 代码块举例&#xff1a; public class Generic <T>{…

防火墙双机热备(HCIA)

目录 一、冗余分类 1、双机热备的产生 2、热备和冷备 二、VRRP VRRP注意事项 VRRP通告报文 三、VGMP 两种VGMP组 VGMP优先级 四、HRP 五、双机热备基本组网与配置 配置步骤 一、冗余分类 物理冗余&#xff1a;单设备改多设备&#xff0c;多线路连接。 网络冗余&a…

ssm420基于JavaEE的企业人事管理信息系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本企业人事管理信息系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

【2023年网络安全优秀创新成果大赛专刊】银行数据安全解决方案(天空卫士)

在2023年网络安全优秀创新成果大赛&#xff0c;成都分站中&#xff0c;天空卫士银行数据安全方案获得优秀解决方案奖。与此同时&#xff0c;天空卫士受信息安全杂志邀请&#xff0c;编写《银行数据安全解决方案》。12月6日&#xff0c;天空卫士编写的《银行数据安全解决方案》做…

山西电力市场日前价格预测【2023-12-23】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-23&#xff09;山西电力市场全天平均日前电价为505.77元/MWh。其中&#xff0c;最高日前电价为807.08元/MWh&#xff0c;预计出现在08:15。最低日前电价为332.81元/MWh&#xff0c;预计…

类文件结构

类文件结构 回顾一下字节码 在 Java 中&#xff0c;JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff09;&#xff0c;它不面向任何特定的处理器&#xff0c;只面向虚拟机。Java 语言通过字节码的方式&#xff0c;在一定程度上解决了传统解释型语…

数据分析基础之《numpy(4)—ndarry运算》

一、逻辑运算 当我们要操作符合某一条件的数据时&#xff0c;需要用到逻辑运算 1、运算符 满足条件返回true&#xff0c;不满足条件返回false # 重新生成8只股票10个交易日的涨跌幅数据 stock_change np.random.normal(loc0, scale1, size(8, 10))# 获取前5行前5列的数据 s…

《A++ 敏捷开发》-1 如何改善

1 如何改善 敏捷开发过程改进案例 5月 A公司一直专门为某电信公司提供针对客服、线上播放等服务。 张工是公司的中层管理者&#xff0c;管理好几个开发团队&#xff0c;有5位项目经理向他汇报。 他听说老同学的团队都开始用敏捷开发&#xff0c;很感兴趣&#xff0c;便参加了…