您的位置:首页 > 汽车 > 新车 > 【OpenCV-图像梯度】Scharr算子和laplacian算子

【OpenCV-图像梯度】Scharr算子和laplacian算子

2024/10/20 8:26:52 来源:https://blog.csdn.net/weixin_44145338/article/details/142063507  浏览:    关键词:【OpenCV-图像梯度】Scharr算子和laplacian算子

1 图像梯度-Sobel算子

在这里插入图片描述

import cv2  # 导入 OpenCV 库# 读取灰度图像
img = cv2.imread('./img/pie.png', cv2.IMREAD_GRAYSCALE)  # 使用 imread 函数读取图像文件,路径为 './img/pie.png'
# cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像# 显示图像
cv2.imshow("img", img)  # 使用 imshow 函数显示图像,窗口标题为 'img'# 等待用户按键
cv2.waitKey()  # 等待用户按键事件,参数为空表示无限等待,直到按下任意键# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

在这里插入图片描述
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

  • ddepth:图像的深度
  • dx和dy分别表示水平和竖直方向
  • ksize是Sobel算子的大小
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()
# 计算图像的 x 方向梯度
# cv2.Sobel() 函数用于计算图像的梯度,用于边缘检测等图像处理任务# img 是输入图像,通常为灰度图像,但也可以是彩色图像
# cv2.CV_64F 表示输出图像的数据类型为 64 位浮点型
# 1 表示在 x 方向计算梯度(dx=1),0 表示在 y 方向不计算梯度(dy=0)
# ksize=3 表示使用 3x3 的 Sobel 内核来计算梯度# 计算 x 方向的梯度,只涉及垂直方向的边缘
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)cv_show(sobelx,'sobelx')

在这里插入图片描述
白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值

# 计算图像的 x 方向梯度
# cv2.Sobel() 函数用于计算图像的梯度,用于边缘检测等图像处理任务# img 是输入图像,通常为灰度图像,但也可以是彩色图像
# cv2.CV_64F 表示输出图像的数据类型为 64 位浮点型
# 1 表示在 x 方向计算梯度(dx=1),0 表示在 y 方向不计算梯度(dy=0)
# ksize=3 表示使用 3x3 的 Sobel 内核来计算梯度# 计算 x 方向的梯度,只涉及垂直方向的边缘
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)# 将 Sobel 运算结果转换为绝对值图像
# cv2.convertScaleAbs() 函数用于转换图像数据类型,并将图像数据的绝对值转换为 8 位无符号整数# sobelx 是之前计算得到的 x 方向梯度图像,数据类型为 64 位浮点型
# 使用 cv2.convertScaleAbs() 函数将其转换为 8 位无符号整数类型,并取绝对值
# 这个操作可以将浮点型图像转换为更适合显示和进一步处理的 8 位图像
sobelx = cv2.convertScaleAbs(sobelx)cv_show(sobelx,'sobelx')

在这里插入图片描述

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

在这里插入图片描述

分别计算x和y,再求和

import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作# 假设 sobelx 和 sobely 是已经计算好的 Sobel 处理图像
# 使用加权和操作合并 Sobel x 和 y 方向的梯度图像
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
# 参数解释:
# sobelx:Sobel x 方向的梯度图像
# sobely:Sobel y 方向的梯度图像
# 0.5:sobelx 图像的权重
# 0.5:sobely 图像的权重
# 0:加权和操作的标量值(通常用于调整亮度)# 显示加权和处理后的图像
cv_show(sobelxy, 'sobelxy')  # 使用自定义的 cv_show 函数显示图像,窗口标题为 'sobelxy'

在这里插入图片描述

1.1 分开计算

# 分开计算
import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作# 读取灰度图像
img = cv2.imread('./img/lena.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像# 计算 Sobel x 方向的梯度
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# cv2.Sobel:计算图像的梯度
# img:输入图像
# cv2.CV_64F:输出图像的数据类型为 64 位浮点数
# 1:计算 x 方向的梯度
# 0:不计算 y 方向的梯度
# ksize=3:Sobel 算子的大小为 3x3# 转换为绝对值并将数据类型转换为 8 位无符号整型
sobelx = cv2.convertScaleAbs(sobelx)
# cv2.convertScaleAbs:将图像转换为绝对值并调整为 8 位无符号整型
# 这个步骤是为了将浮点数图像转换为可以显示的格式# 计算 Sobel y 方向的梯度
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# cv2.Sobel:计算图像的梯度
# img:输入图像
# cv2.CV_64F:输出图像的数据类型为 64 位浮点数
# 0:不计算 x 方向的梯度
# 1:计算 y 方向的梯度
# ksize=3:Sobel 算子的大小为 3x3# 转换为绝对值并将数据类型转换为 8 位无符号整型
sobely = cv2.convertScaleAbs(sobely)
# cv2.convertScaleAbs:将图像转换为绝对值并调整为 8 位无符号整型# 合成 x 和 y 方向的 Sobel 图像
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
# cv2.addWeighted:对两个图像进行加权和操作
# sobelx:x 方向的 Sobel 图像
# sobely:y 方向的 Sobel 图像
# 0.5:sobelx 图像的权重
# 0.5:sobely 图像的权重
# 0:加权和操作的标量值(通常用于调整亮度)# 显示合成后的图像
cv_show(sobelxy, 'sobelxy')
# 假设 cv_show 是自定义的显示图像的函数
# 如果没有定义,使用 cv2.imshow 来显示图像:
# cv2.imshow('sobelxy', sobelxy)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

在这里插入图片描述

1.2 整体计算

import cv2  # 导入 OpenCV 库
import numpy as np  # 导入 NumPy 库,用于数组操作# 读取灰度图像
img = cv2.imread('./img/lena.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像# 计算 Sobel 边缘检测图像,计算 x 和 y 方向的梯度
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
# cv2.Sobel:计算图像的梯度
# img:输入图像
# cv2.CV_64F:输出图像的数据类型为 64 位浮点数
# 1:计算 x 方向的梯度
# 1:计算 y 方向的梯度
# ksize=3:Sobel 算子的大小为 3x3# 转换为绝对值并将数据类型转换为 8 位无符号整型
sobelxy = cv2.convertScaleAbs(sobelxy)
# cv2.convertScaleAbs:将图像转换为绝对值并调整为 8 位无符号整型
# 这个步骤是为了将浮点数图像转换为可以显示的格式# 显示加权和处理后的图像
cv_show(sobelxy, 'sobelxy')
# 假设 cv_show 是自定义的显示图像的函数
# 如果没有定义,使用 cv2.imshow 来显示图像:
# cv2.imshow('sobelxy', sobelxy)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

在这里插入图片描述

2 图像梯度-Scharr算子-laplacian算子

在这里插入图片描述

#不同算子的差异
img = cv2.imread('./img/lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) # 计算图像的拉普拉斯梯度
# cv2.Laplacian() 函数用于计算图像的二阶导数(拉普拉斯算子),用于边缘检测和细节增强# img 是输入图像,通常为灰度图像,但也可以是彩色图像
# cv2.CV_64F 表示输出图像的数据类型为 64 位浮点型
# 拉普拉斯算子用于计算图像的二阶导数,可以突出显示图像中的边缘和细节
laplacian = cv2.Laplacian(img, cv2.CV_64F)laplacian = cv2.convertScaleAbs(laplacian)   res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show(res,'res')

在这里插入图片描述

img = cv2.imread('./img/lena.jpg',cv2.IMREAD_GRAYSCALE)
cv_show(img,'img')

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com