图像梯度(opencv-c++)
Posted H-w-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像梯度(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 ∂x∂f,∂x∂f=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)=∂x∂f,∂x∂f=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
▽=∂x∂iˉ+∂x∂jˉ 称为(二维的)向量微分算子或Nabla算子
图像梯度推导
在微积分中,一维函数的一阶微分的基本定义是这样的:
d
f
d
x
=
lim
ϵ
→
0
f
(
x
+
ϵ
)
−
f
(
x
)
ϵ
\\frac dfdx = \\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
∂x∂f(x,y)=ϵ→0limϵf(x+ϵ,y)−f(x,y)∂y∂f(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
∂x∂f(x,y)=f(x+1,y)−f(x,y)=gx∂y∂f(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 = \\beginbmatrix -1 & 0 & +1 \\\\ -2 & 0 & +2 \\\\ -1 & 0 & +1 \\endbmatrix*A \\qquad and \\qquad G_y = \\beginbmatrix-1 & -2 & -1 \\\\ 0 & 0 & 0 \\\\ +1 & +2 & +1\\endbmatrix*A Gx=⎣ ⎡−1−2−1000+1+2+1⎦ ⎤∗AandG以上是关于图像梯度(opencv-c++)的主要内容,如果未能解决你的问题,请参考以下文章