Opencv图像梯度

@fuxianjun

Soble

图像接度计算的是围像变化的速度,对于图像的边缘部分,其灰度值变化较大,棉度值也较大:相反对于限像中比较平滑的部分,其灰度值变化较小,相应的梯度值也权小,定低馆

严格来讲,图像梯度计算需要求导数,但是图像梯度一般通过计 算像素值的差来得到梯度的近似值(近似导数值)。

例如,图中的左右两幅图分别描述了图像的水平边界和垂直边界。

针对左图,通过垂直方向的线条A和线条B的位置,可以计算图像水平方向的边界:

●对于线条A和线条B,其右侧像素值与左侧像素值的差值不为零,因此是边界。

●对于其余列,其右侧像素值与左侧像素值的差值均为零,因此不是边界。

针对右图,通过水平方向的线条A和线条B的位置,可以计算图像垂直方向的边界:

●对于线条A和线条B,其下侧像素值与上侧像素值的差值不为零,因此是边界。

●对于其余行,其下侧像素值与上侧像素值的差值均为零,因此不是边界。

Soble算子及函数使用

        在Opencv中,使用函数cv2.Sobel()实现Sobel算子运算,其语法形式为:

dst=cv2.Sobel(src,ddepth,dx,dy,[,ksize[,scale[,delta[,bordderYype]]]])式中:

●dst代表目标图像。

●src代表原始图像。

●ddepth代表输出图像的深度。其具体对应关系如表。

●dx代表x方向上的求导阶数。
●dy代表y方向上的求导阶数。
●ksize 代表Sobel核的大小。该值为-1时,则会使用Scharr算子进行运算。
●scale代表计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的。

●delta代表加载目标图像dst上的值,改值是可以选的,默认为0.

●borderType代表边界样式。该参数的具体类型及值如表。

编程实现计算peppa的sobel边缘

​
import cv2
import numpy as np
peppa = cv2.imread("peppa.png",0)
sobelx = cv2.Sobel(peppa,cv2.CV_64F,1,0)
sobelx=cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(peppa,cv2.CV_64F,1,0)
sobely=cv2.convertScaleAbs(sobely)
sobel_demo = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow("sobel_demo",sobel_demo)
cv2.waitKey(0)
cv2.destroyAllWindows()

​

Scharr算子及函数使用:

        在离散的空间上,有很多方法可以用来计算近似导数,在使用3x3的Sobel算子时,可能 计算结果并不太精准。OpenCV 提供了Schar 算子,该算子具有和Sobel算子同样的速度,且精度更高。可以将Scharr算子看作对Sobel算子的改进,其核通常为:

                                                

OpenCV提供了函数cv2.Scharr(来计算Scharr算子,其语法格式如下:

dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )

●dst代表目标图像。

●src代表原始图像。

●ddepth代表输出图像的深度。

●dx代表x方向上的求导阶数。
●dy代表y方向上的求导阶数。
●scale代表计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的。

●delta代表加载目标图像dst上的值,改值是可以选的,默认为0.

●borderType代表边界样式。该参数的具体类型及值如表。

Laplacian算子及函数使用

        Laplacian (拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。例如,一个3x3大小的Laplacian算子如图所示。



Laplacian算子类似二阶Sobel导数,需要计算两个方向的梯度值。例如,在图中:

●左图是Laplacian算子。

●右图是一个简单图像,其中有9个像素点。

计算像素点P5的近似导数值,如下:

                        P5lap=(P2 +P4+P6+ P8)-4*P5

图展示了像素点与周围点的一一些实例,其中:

●在左图中,像素点P5与周围像素点的值相差较小,得到的计算结果值较小,边缘不明显。

●在中间的图中,像素点P5与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。

●在右图中,像素点P5与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。

        需要注意,在上述图像中,计算结果的值可能为正数,也可以为负数。所以,需要对计算结果取绝对值,以保证后续运算和显示都是正确的。

在OpenCV内使用函数cv2.Laplacian0实现I aplacian算子的计算,该函数的语法格式为: dst = cv2.Laplacian( src, ddepth[, ksize[, scale[, delta[, borderType]]]] )式中:

●dst代表目标图像。

●src代表原始图像。

●ddepth代表目标图像的深度。

●ksize代表用于计算二阶导数的核尺寸大小。该值必须是正的奇数。

●scale代表计算Laplacian值的缩放比例因子,该参数是可选的。默认情况下,该值为1,表示不进行缩放。

●delta 代表加到目标图像上的可选值,默认为0。

●borderType代表边界样式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值