opencv——图像梯度计算

    • Sobel算子

步骤1:读取原图像

import cv2
img=cv2.imread("pie.png",cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

ps:梯度是指图像某一个像素点两边的颜色差异值,两边颜色相同的像素点梯度为0,所以只有边界像素点才有梯度。

步骤2:Sobel算子计算图像梯度

是指水平方向色差,是指竖直方向色差,

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destrayAllWindows()
#水平方向x的sobel梯度
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#从左到右参数分别为原图像,图像深度ddepth,水平方向x,竖直方向dy,sobel模板的尺寸
sobelx=cv2.convertScaleAbs(sobelx)
cv_show(sobelx,"sobelx")
#竖直方向y的sobel梯度
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
cv_show(sobely,"sobely")
#水平方向x和竖直方向y的sobel梯度和
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,"sobelxy")

ps:白-黑是正数,黑-白就为负数,但在opencv里负数会被截断为0,即为黑,因此需要对其取绝对值。

    • scharr算子

ps:scharr模板比sobel模板对梯度更加敏感。

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)
cv_show(scharrxy,"scharrxy"0
    • laplacian(拉普拉斯)算子

ps:拉普拉斯算子运用到二阶导,与前面两种算子来说更加敏感,但对噪音点也更加敏感。

laplacian=cv2.Laplacian(img,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
cv_show(laplacian,"laplacian")
    • Sobel、Scharr、Laplacian三种算子计算梯度间的效果比较

import numpy as np
res=np.hstack(sobelxy,scharrxy,laplacian)
cv_show(res,"res")

a、scharr算子对边界像素描述要比sobel算子更加细致,可以获得更加丰富的边界信息。

b、laplacian算子因为对噪音更加敏感,描述边界像素的效果不是特别好,因此一般不单独使用laplacian算子

### 使用 OpenCV 进行图像梯度计算 为了更好地理解和应用图像梯度的概念,在此提供一段 Python 代码来展示如何利用 OpenCV 库执行这一过程。这段程序会读取一张图片并分别采用 Sobel 和 Laplacian 方法解其 X 方向、Y 方向以及整体的梯度。 ```python import cv2 import numpy as np from matplotlib import pyplot as plt def calculate_gradients(image_path): img = cv2.imread(image_path, 0) laplacian = cv2.Laplacian(img,cv2.CV_64F) sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5) 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() calculate_gradients('example.jpg') # 替换为实际路径下的文件名 ``` 上述脚本定义了一个名为 `calculate_gradients` 的函数,该函数接收一个参数即待处理图像的位置字符串。接着依次调用了三个不同的方法——拉普拉斯算子(Laplacian)、索贝尔X轴导数(Sobel X) 及 索贝尔Y轴导数 (Sobel Y),以此获得不同维度上的梯度信息[^1]。 此外,还展示了如何使用 Matplotlib 来可视化原始灰度图及其对应的三种梯度表示形式。这有助于直观感受各种算法对于捕捉边缘和其他显著结构的有效性差异[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一瞬にして失う

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值