hellou

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算子:

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

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

posted on   云上u  阅读(29)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示