图像梯度(opencv-c++)

图像梯度

梯度

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)

设二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在平面区域D上具有一阶连续偏导数,则对于每一个点P(x,y)都可定出一个向量

{ ∂ f ∂ x , ∂ f ∂ x } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ \{\frac {\partial f}{\partial x},\frac {\partial f}{\partial x}\}=f_x(x,y)\bar i+f_y(x,y)\bar j {xf,xf}=fx(x,y)iˉ+fy(x,y)jˉ,该函数就称为函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点P(x,y)的梯度,记作gradf(x,y)或 ▽ f ( x , y ) \triangledown f(x,y) f(x,y)

g r a d f ( x , y ) = ▽ f ( x , y ) = { ∂ f ∂ x , ∂ f ∂ x } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ gradf(x,y)=\triangledown f(x,y)=\{\frac {\partial f}{\partial x},\frac {\partial f}{\partial x}\}=f_x(x,y)\bar i+f_y(x,y)\bar j gradf(x,y)=f(x,y)={xf,xf}=fx(x,y)iˉ+fy(x,y)jˉ
其中 ▽ = ∂ ∂ x i ˉ + ∂ ∂ x j ˉ \triangledown =\frac {\partial }{\partial x}\bar i+\frac {\partial }{\partial x}\bar j =xiˉ+xjˉ 称为(二维的)向量微分算子或Nabla算子

视频讲解

图像梯度推导

在微积分中,一维函数的一阶微分的基本定义是这样的:
d f d x = lim ⁡ ϵ → 0 f ( x + ϵ ) − f ( x ) ϵ \frac {df}{dx} = \lim_{\epsilon\rightarrow0}\frac {f(x+\epsilon)-f(x)}{\epsilon} dxdf=ϵ0limϵf(x+ϵ)f(x)
而图像是一个二维函数f(x,y),其微分当然就是偏微分。因此有:
∂ f ( x , y ) ∂ x = lim ⁡ ϵ → 0 f ( x + ϵ , y ) − f ( x , y ) ϵ ∂ f ( x , y ) ∂ y = lim ⁡ ϵ → 0 f ( x , y + ϵ ) − f ( x , y ) ϵ \frac {\partial f(x,y)}{\partial x} = \lim_{\epsilon\rightarrow0}\frac {f(x+\epsilon, y)-f(x, y)}{\epsilon}\\ \frac {\partial f(x,y)}{\partial y} = \lim_{\epsilon\rightarrow0}\frac {f(x, y+\epsilon)-f(x, y)}{\epsilon} xf(x,y)=ϵ0limϵf(x+ϵ,y)f(x,y)yf(x,y)=ϵ0limϵf(x,y+ϵ)f(x,y)
因为图像是一个离散的二维函数, ϵ \epsilon ϵ不能无限小,我们的图像是按照像素来离散的,最小的 ϵ \epsilon ϵ就是1像素。因此,上面的图像微分又变成了如下的形式( ϵ = 1 \epsilon=1 ϵ=1):
∂ f ( x , y ) ∂ x = f ( x + 1 , y ) − f ( x , y ) = g x ∂ f ( x , y ) ∂ y = f ( x , y + 1 ) − f ( x , y ) = g y \frac {\partial f(x,y)}{\partial x} = f(x+1,y)-f(x,y)=gx\\ \frac {\partial f(x,y)}{\partial y} = f(x,y+1)-f(x,y)=gy xf(x,y)=f(x+1,y)f(x,y)=gxyf(x,y)=f(x,y+1)f(x,y)=gy
这分别是图像在(x, y)点处x方向和y方向上的梯度,从上面的表达式可以看出来,图像的梯度相当于2个相邻像素之间的差值。

梯度算法(opencv)

梯度简单来说就是求导。OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器: S o b e l Sobel Sobel S c h a r r Scharr Scharr L a p l a c i a n 。 Laplacian。 Laplacian什么叫高通呢?其实就是和图像模糊相反。图像模糊是让低频通过,阻挡高频,这样就可以去除噪点,让锐利的边缘变平滑。高通滤波器就是让高频通过,阻挡低频,可以让边缘更加明显,增强图像。

Sobel算子

G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] ∗ A a n d G y = [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] ∗ A G_x = \begin{bmatrix} -1 & 0 & +1 \\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{bmatrix}*A \qquad and \qquad G_y = \begin{bmatrix}-1 & -2 & -1 \\ 0 & 0 & 0 \\ +1 & +2 & +1\end{bmatrix}*A Gx= 121000+1+2+1 AandGy= 10+120+210+1 A

S o b e l Sobel Sobel算子是高斯平滑和微分操作的结合体,所以他的抗噪声能力很好。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值。可以设定求导的方向( X X X Y Y Y)。还可以设定使用的卷积核大小( k s i z e ksize ksize)。当 k s i z e = − 1 ksize=-1 ksize=1时,会使用 3 x 3 3x3 3x3 S c h a r r Scharr Scharr滤波器,他的效果要比 3 x 3 3x3 3x3 S o b e l Sobel Sobel滤波器好,而且速度相同,所以在使用 3 x 3 3x3 3x3滤波器时应该尽量使用 S c h a r r Scharr Scharr滤波器(一般就用 S o b e l Sobel Sobel算子即可)。

前一个 S o b e l Sobel Sobel矩阵与原始图像A进行卷积操作后得到的是右边的像素值减去左边的像素值;后一个 S o b e l Sobel Sobel矩阵与原始图像A进行卷积操作后得到的是下边的像素值减去上边的像素值。

o p e n c v ( c + + )中的定义 opencv(c++)中的定义 opencvc++)中的定义

void Sobel(cv::InputArray src, cv::OutputArray dst, int ddepth, int dx, int dy, int ksize = 3, double scale = (1.0), double delta = (0.0), int borderType = 4)

Scharr算子

G x = [ − 3 0 + 3 − 10 0 + 10 − 3 0 + 3 ] ∗ A a n d G y = [ − 3 − 10 − 3 0 0 0 + 3 + 10 + 3 ] ∗ A G_x = \begin{bmatrix} -3 & 0 & +3 \\ -10 & 0 & +10 \\ -3 & 0 & +3 \end{bmatrix}*A \qquad and \qquad G_y = \begin{bmatrix}-3 & -10 & -3 \\ 0 & 0 & 0 \\ +3 & +10 & +3\end{bmatrix}*A Gx= 3103000+3+10+3 AandGy= 30+3100+1030+3 A

其实就是将 S o b e l Sobel Sobel算子的数增大了,这样对边缘的检测更敏感。

o p e n c v ( c + + ) opencv(c++) opencvc++中的定义

void Scharr(cv::InputArray src, cv::OutputArray dst, int ddepth, int dx, int dy, double scale = (1.0), double delta = (0.0), int borderType = 4)

Laplacian 算子

拉普拉斯算子:拉普拉斯算子(Laplace Operator)是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)
△ f = ▽ 2 f = ▽ . ▽ f = ∑ i = 1 n ∂ 2 f ∂ x i 2 \vartriangle f = \triangledown^2 f=\triangledown . \triangledown f=\sum_{i=1}^n \frac {\partial^2 f}{\partial x^2_i} f=2f=.f=i=1nxi22f

在图像中

L a p l a c i a n Laplacian Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。

o p e n c v ( c + + ) opencv(c++) opencvc++中的定义

void cv::Laplacian(cv::InputArray src, cv::OutputArray dst, int ddepth, int ksize = 1, double scale = (1.0), double delta = (0.0), int borderType = 4)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值