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 plt

img=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_8U

sobelx64f = 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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Amazon 实验③】Amazon WAF功能增强之追踪 Amazon WAF RequestID,排查误杀原因

文章目录 1. 方案介绍2. 架构图3. 操作演示 本实验将介绍如何利用 Amazon LambdaEdge,在 Amazon CloudFront 自定义错误页面 上展示每个由 Amazon WAF 返回的“403 Forbidden”错误的 Request ID。通过这个唯一的 WAF Request ID,网站运维工程师能够快速…

Swift 周报 第四十一期

文章目录 前言新闻和社区2024 年 Swift Student Challenge 公布现推出超过 30 个新的开发者活动 提案正在审查的提案 Swift论坛话题讨论推荐博文关于我们 前言 本期是 Swift 编辑组整理周报的第四十一期,每个模块已初步成型。各位读者如果有好的提议,欢…

不受父容器大小约束的TextView

序言 为了实现以下效果,特意开发了一个自定义控件。主要是红色的点赞数和评论数。 问题分析 自定义控件 该控件主要是在于忽略的父容器的大小限制,这样可以展示出全部内容。注意父容器的属性中需要下列配置。 package com.trs.myrb.view.count;impor…

[JS设计模式]Flyweight Pattern

Flyweight pattern 享元模式是一种结构化的设计模式,主要用于产生大量类似对象而内存又有限的场景。享元模式能节省内存。 假设一个国际化特大城市SZ;它有5个区,分别为nanshan、futian、luohu、baoan、longgang;每个区都有多个图…

Java 基础学习(十三)集合框架、List集合

1 集合框架 1.1 Collection 1.1.1 集合框架概述 Java 集合框架是一组实现了常见数据结构(如列表、树集和哈希表等)的类和接口,用于存储一组数据。 开发者在使用Java的集合类时,不必考虑数据结构和算法的具体实现细节&#xff…

使用selenium webdriver和mitmproxy代理模拟用户点击抓包(抓华为应用商城app数据)

文章目录 安装PythonMacWindows 安装程序需要的依赖安装chorm驱动编写代码自动化程序开始抓包 问题处理 本文简单记录一下使用selenium webdriver和mitmproxy代理模拟用户点击抓包的过程。 用于模拟真实的用户访问网站,达到抓包的目的。 作者水平有限,可…

深度解析自动化测试流程(纯干货)

今天就通过这篇文章给大家深度解析一下自动化测试的流程。 自动化测试的流程和功能测试其实挺相似的,整个流程也是按照需求分析及测试计划阶段、测试设计阶段、测试执行和测试总结阶段,总结下来就是下面一张图,ppt中纯手绘,效果不…

天猫数据分析(软件工具)-2023年11月天猫保健品行业分析报告:市场需求扩容,年轻人是主流群体

近年来,随着健康经济、颜值经济的兴起,越来越多的年轻人加入养生大军,成为保健食品市场上的一股新力量,带动市场扩容。根据鲸参谋电商数据分析平台的相关数据显示,今年11月份,天猫平台上保健食品的销量为24…

怎么提取视频中的背景音乐?

当我们在刷视频的时候,有时候听到一个背景音乐很好听,但是又不知道歌名,比如英语歌,这个时候我们很难找到这首歌,相信有很多朋友会遇到这样的问题,不知道怎么弄,下面小编给大家推荐一些方法帮助…

主流数据库体系结构

MySQL 我们通常所说的 MySQL 数据库服务器由一个实例(instance)以及一个数据库(database)组成。实例包括一组后台进程/线程和许多内存结构,用于管理数据库;数据库由一组磁盘文件组成,用于存储数…

【数论】欧拉函数

前置知识&#xff1a;分解质因数 一个数可以被分解为质因数乘积 n &#xff0c;其中的pi都是质因数 欧拉函数介绍 朴素法求欧拉函数 思路&#xff1a;边分解质因数边算欧拉函数 void get_primes() {int n; cin >> n;int ans 0;int res n;for (int i 2; i < n /…

docker部署个人网站项目记录(前后端分离)

背景 项目是前后端分离&#xff0c;前端有三部分&#xff0c;分别是 个人网站&#xff08;blog&#xff09;网站后台管理系统&#xff08;admin&#xff09;数据大屏&#xff08;datascreen&#xff09; 后端是基于nodejs写的后台服务 后台接口服务&#xff08;todo-nodejs…

表情识别-情感分析-人脸识别(代码+教程)

表情识别是计算机视觉领域中的一个重要研究方向&#xff0c;它的目标是通过分析人脸表情来判断人的情绪状态。表情识别在很多领域都有广泛的应用&#xff0c;如情感分析、人机交互、智能驾驶等。本文将从以下几个方面来阐述表情识别的相关内容。 一、表情识别的基本原理 表情识…

面试 Java 算法高频题五问五答第二期

面试 Java 算法高频题五问五答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 寻找峰值: 主要思想&#xff1a;二分查找&#xff0c;利用get函数&#xff0…

操作系统 day15(信号量)

信号量机制 之前学习了这些解决进程互斥的方案 *但它们都无法实现“让权等待”&#xff0c;于是Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法----信号量机制 总结&#xff1a;一个信号量对应一种资源。信号量的值这种资源的剩余数量&#xff08;信号量的值如果小于…

Python实现广义最小二乘法线性回归模型(GLS算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义最小二乘法&#xff08;Generalized Least Squares&#xff09;是一种回归分析方法&#xff0c;适…

NLP论文阅读记录 - | 文本生成的动量校准

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法3.1 神经文本生成3.2 动量校准 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 消融实验 五 总结 前言 Momentum Calibration for Text Generat…

MyBatis 关联查询

目录 一、一对一查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a; 2、创建account和user实体类 3、创建AccountMapper 接口 4、创建并配置AccountMapper.xml 5、测试 二、一对多查询&#xff08;sqlMapper配置文件&#xff09; 1、需求&#xff1a;…

2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

如何通过蓝牙串口启动智能物联网?

1、低功耗蓝牙(BLE)介绍 BLE 技术是一种低成本、短距离、可互操作的鲁棒性无线技术&#xff0c;工作在免许可的 2,4 GHZ 工业、科学、医学(Industrial Scientific Medical&#xff0c;ISM)频段。BLE在设计之初便被定位为一种超低功耗(Ultra Low Power&#xff0c;ULP)无线技术&…