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')