首页 > 其他分享 >opencv学习笔记(五)

opencv学习笔记(五)

时间:2023-06-21 17:57:37浏览次数:44  
标签:imshow Sobel 梯度 图像 cv2 笔记 学习 opencv 算子

Sobel算子:

Sobel算子是一种常用的图像梯度算子,用于检测图像中的边缘。它基于离散的差分运算,通过计算图像在水平和垂直方向上的梯度来确定边缘的强度和方向。

import cv2
import numpy as np

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

# 计算水平方向的梯度(Sobel算子)
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)

# 计算垂直方向的梯度(Sobel算子)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

# 计算梯度的幅值和方向
gradient_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)
gradient_direction = np.arctan2(sobel_y, sobel_x)

# 显示原始图像和梯度图像
cv2.imshow('Original Image', image)
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Gradient Magnitude', gradient_magnitude.astype(np.uint8))
cv2.imshow('Gradient Direction', gradient_direction)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.CV_64F表示输出的梯度图像的数据类型为64位浮点数,10表示计算水平和垂直方向上的梯度,ksize=3表示使用3x3的Sobel算子内核。

 dst=cv2.Sobel(src,ddepth,dx,dy[,ksize[,scale[,delta[,borderType]]]])
        式中:dst代表目标图像;src代表原始图像;ddepth代表输出图像的深度;dx代表x方向上的求导阶数;dy代表y方向上的求导阶数;ksize代表Sobel核的大小。该值为-1时,则会使用Scharr算子进行运算;scale代表计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的;delta代表加在目标图像dst上的值,该值是可选的,默认为0;borderType代表边界样式。

在ddepth中:可以将内置参数设置为-1,以此与原图像保持一致,但是计算得到的结果可能是错误的(信息丢失)。所以为了避免信息丢失,在计算时要先使用更高的数据类型 cv2.CV_64F,再通过取绝对值将其映射为cv2.CV_8U(8位图)类型。所以,通常要将函数cv2.Sobel()内参数ddepth的值设置为“cv2.CV_64F”

计算x方向边缘(梯度):dx=1,dy=0;计算y方向边缘(梯度):dx=0,dy=1;参数dx与参数dy的值均为1:dx=1,dy=1;计算x方向和y方向的边缘叠加:通过组合方式实现。

图像梯度——Scharr算子:

Scharr算子在边缘检测和图像处理中常用,特别是在需要更平滑和准确的梯度计算时。它相对于Sobel算子具有更好的性能和结果质量。

import cv2
import numpy as np

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

# 计算水平方向的梯度(Scharr算子)
scharr_x = cv2.Scharr(image, cv2.CV_64F, 1, 0)

# 计算垂直方向的梯度(Scharr算子)
scharr_y = cv2.Scharr(image, cv2.CV_64F, 0, 1)

# 计算梯度的幅值和方向
gradient_magnitude = np.sqrt(scharr_x**2 + scharr_y**2)
gradient_direction = np.arctan2(scharr_y, scharr_x)

# 显示原始图像和梯度图像
cv2.imshow('Original Image', image)
cv2.imshow('Scharr X', scharr_x)
cv2.imshow('Scharr Y', scharr_y)
cv2.imshow('Gradient Magnitude', gradient_magnitude.astype(np.uint8))
cv2.imshow('Gradient Direction', gradient_direction)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像梯度——lapplacian算子:

import cv2
import numpy as np

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

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

# 显示原始图像和边缘图像
cv2.imshow('Original Image', image)
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

Laplacian算子在图像增强和边缘检测中非常有用。它可以帮助我们捕捉图像中的纹理、边缘和细节等信息。通过调整阈值和处理技术,可以根据应用的需求提取出不同程度的边缘和纹理特征。

优缺点总结:

Sobel算子:

  • 优点:计算速度较快;对噪声具有一定的平滑效果,有利于抑制噪声对梯度计算的干扰;可以同时计算水平和垂直方向的梯度;可以通过调整内核大小和权重来改变梯度计算的灵敏度。

  • 缺点:在边缘方向不明确或边缘模糊的情况下,可能会产生边缘响应不明显的问题。

Scharr算子:

  • 优点:相比于Sobel算子,具有更好的旋转不变性和平滑性;在边缘检测中通常能够提供更好的结果。

  • 缺点:与Sobel算子相比,计算复杂度略高;在计算水平和垂直方向的梯度时,可能会引入轻微的方向偏差。

Laplacian算子:

  • 优点:可以捕捉到图像中的二阶梯度信息,用于边缘检测和图像增强;对于纹理特征的提取效果较好。

  • 缺点:对噪声敏感,容易受到噪声的干扰;在边缘检测中,可能会产生边缘断裂或多重响应的问题。

标签:imshow,Sobel,梯度,图像,cv2,笔记,学习,opencv,算子
From: https://www.cnblogs.com/hellou/p/17496829.html

相关文章

  • MongoDB学习笔记
    MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存......
  • 大型网站技术架构 核心原理与案例分析--阅读笔记
    第一章大型网站架构演化大型网站软件系统的特点大型网站软件系统的特点高并发、大流量高可用海量数据用户分布广法、网络情况复杂安全环境恶劣需求快速变更、发布频繁渐进式发展大型网站架构演化发展历程大型网站的技术挑战主要来自庞大的用户,高并发的访问和海量的数据,任何简单......
  • 从实验中学习ResNet模型:在视频处理任务中取得显著进展
    目录引言技术原理及概念实现步骤与流程示例与应用优化与改进结论与展望"从实验中学习ResNet模型:在视频处理任务中取得显著进展"在视频处理任务中,ResNet模型已经取得了显著进展。ResNet模型是一种深度残差块神经网络,它是由ResNet系列模型发展而来的,被广泛用于图像和视频处理领域。在......
  • MySQL笔记整理
    SELECT0+'123.00';SELECT0+'123.0qwe';SELECT0+'qwe1';SELECT0+null;SELECT'123.00'/4;SELECT'123.0qwe'/4;SELECT'qwe1'/4;SELECT'1qwe'/4;SELECTnull/4;SELECTconvert(......
  • python代码-基于深度强化学习的微能源网能量管理与优化策略研究 关键词:微能源网;能量管
    python代码-基于深度强化学习的微能源网能量管理与优化策略研究关键词:微能源网;能量管理;深度强化学习;Q-learning;DQN内容::面向多种可再生能源接入的微能源网,提出一种基于深度强化学习的微能源网能量管理与优化方法。该方法使用深度Q网络(deepQnetwork,DQN)对预测负荷、风光等可......
  • iOS开发笔记 - Objective-C和JavaScript的混编
    最近看了一个对Github上面编程语言使用统计的排行榜,JavaScript真可以说是一枝独秀,很难想象20年前,这个语言只是浏览器中的装饰性语言,能做的事情也就是一点特效或者检查一下要提交给服务器的表单是否满足要求。今天的JavaScript已经是一个全栈语言,从客户端到服务器无所不在。很多编程......
  • iOS开发笔记 - 语言篇之Swift
     2014年的苹果全球开发者大会(WWDC),当CraigFederighi向全世界宣布“Wehavenewprogramminglanguage”(我们有了新的编程语言)的时候,全场响起了最热烈和持久的掌声,伴随着掌声到来的语言叫Swift。接下来CraigFederighi更是毫不掩饰的告诉大家,Swift将成为主宰iOS和Mac开发的新语言,甚......
  • 基于模型强化学习的离网微电网终身控制Python源代码
    基于模型强化学习的离网微电网终身控制Python源代码离网微网的终身控制问题包括两个任务,即对微网设备的状态进行估计和通过预测未来消费量和可再生产量来考虑不确定性的运行规划。有效控制的主要挑战来自于随时间发生的各种变化。提出了一个用于农村电气化离网微电网建模的开源强......
  • 图论 学习笔记
    图的基本概念和数据结构圆圈表示节点线是边图是V和E的二元组无向图:边没有方向(边是双向的)有向图:边有方向无权图:所有边的权重都是1有权图:权重不同;在不同的应用里,权重的意义不同 没有的边记作0或者无穷大,具体看实际应用 基本原则是进行搜索的时候,使无法通过这条边数据结构......
  • 线性代数-二次型-坐标变换笔记
    原来的二次型\(f\left(x_{1},x_{2},x_{3}\right)\)经过坐标变换变成了\(g\left(y_{1},y_{2},y_{3}\right)\)这个新的二次型$x^{\mathrm{T}}Ax$经过坐标变换变成$y^{\mathrm{T}}By$原来的二次型矩阵\(A\)变成了\(B\)(也是实对称矩阵)\(A\)和\(B\)之间的之间的关......