1.像素一二阶导数的意义
下面导数是数学中的定义
一阶导数定义:
{
f
′
(
x
)
=
lim
Δ
x
→
0
f
(
x
+
Δ
x
)
−
f
(
x
)
Δ
x
f
′
(
x
)
=
lim
Δ
x
→
0
f
(
x
)
−
f
(
x
−
Δ
x
)
Δ
x
\begin{cases} f'(x)=\lim_{\Delta x\to0}\frac{f(x+\Delta{x})-f(x)}{\Delta{x}}\\\\ f'(x)=\lim_{\Delta x\to0}\frac{f(x)-f(x-\Delta{x})}{\Delta{x}} \end{cases}
⎩⎪⎨⎪⎧f′(x)=limΔx→0Δxf(x+Δx)−f(x)f′(x)=limΔx→0Δxf(x)−f(x−Δx)
两者在数学上是等价的。
f
′
(
x
)
=
lim
Δ
x
→
0
f
(
x
+
Δ
x
)
−
f
(
x
)
Δ
x
=
lim
Δ
x
→
0
f
(
x
)
−
f
(
x
−
Δ
x
)
Δ
x
f'(x)=\lim_{\Delta x\to0}\frac{f(x+\Delta{x})-f(x)}{\Delta{x}}=\lim_{\Delta x\to0}\frac{f(x)-f(x-\Delta{x})}{\Delta{x}}
f′(x)=Δx→0limΔxf(x+Δx)−f(x)=Δx→0limΔxf(x)−f(x−Δx)
二阶导数定义:
{
f
′
′
(
x
)
=
lim
Δ
x
→
0
f
′
(
x
+
Δ
x
)
−
f
′
(
x
)
Δ
x
f
′
′
(
x
)
=
lim
Δ
x
→
0
f
′
(
x
)
−
f
′
(
x
−
Δ
x
)
Δ
x
\begin{cases} f''(x)=\lim_{\Delta x\to0}\frac{f'(x+\Delta{x})-f'(x)}{\Delta{x}} \\ \\ f''(x)=\lim_{\Delta x\to0}\frac{f'(x)-f'(x-\Delta{x})}{\Delta{x}} \end{cases}
⎩⎪⎨⎪⎧f′′(x)=limΔx→0Δxf′(x+Δx)−f′(x)f′′(x)=limΔx→0Δxf′(x)−f′(x−Δx)
在数字图像处理中,像素点是离散的,并且最小的间距为1,也就是相邻像素之间距离为1,所以
Δ
x
\color{red}\Delta{x}
Δx 最趋近于0的取值是1,即
Δ
x
=
1
\color{red}\Delta{x}=1
Δx=1,
因此有:
一阶导数:
{
f
′
(
x
)
=
f
(
x
+
1
)
−
f
(
x
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
1
)
f
′
(
x
)
=
f
(
x
)
−
f
(
x
−
1
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
2
)
\begin{cases} f'(x)=f(x+1)-f(x) \quad \quad .......................................... \quad(1) \\ \\ f'(x)=f(x)-f(x-1) \quad\quad .......................................... \quad(2) \end{cases}
⎩⎪⎨⎪⎧f′(x)=f(x+1)−f(x)..........................................(1)f′(x)=f(x)−f(x−1)..........................................(2)
由(1)(2)得到:
f
′
(
x
)
=
f
(
x
+
1
)
−
f
(
x
−
1
)
2
(3)
\color{red}f'(x)=\frac{f(x+1)-f(x-1)}{2}\tag{3}
f′(x)=2f(x+1)−f(x−1)(3)
二阶导数:
{
f
′
′
(
x
)
=
f
′
(
x
+
1
)
−
f
′
(
x
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
4
)
f
′
′
(
x
)
=
f
′
(
x
)
−
f
′
(
x
−
1
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
5
)
\begin{cases} f''(x)=f'(x+1)-f'(x) \quad \quad .......................................... \quad(4) \\ \\ f''(x)=f'(x)-f'(x-1) \quad \quad .......................................... \quad(5) \\ \end{cases}
⎩⎪⎨⎪⎧f′′(x)=f′(x+1)−f′(x)..........................................(4)f′′(x)=f′(x)−f′(x−1)..........................................(5)
由(4)(5)得到:
f
′
′
(
x
)
=
f
′
(
x
+
1
)
−
f
′
(
x
−
1
)
2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
6
)
\quad \quad \quad \quad \quad \quad \quad \quad \quad\color{red}f''(x)=\frac{f'(x+1)-f'(x-1)}{2} .......................................... \quad(6)
f′′(x)=2f′(x+1)−f′(x−1)..........................................(6)
由(1),用
x
−
1
x-1
x−1替换
x
x
x可得:
f
′
(
x
−
1
)
=
f
(
x
)
−
f
(
x
−
1
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
7
)
\quad \quad \quad \quad \quad \quad \quad \quad \quad f'(x-1)=f(x)-f(x-1)\quad \quad .......................................... \quad(7)
f′(x−1)=f(x)−f(x−1)..........................................(7)
由(2),用
x
+
1
x+1
x+1替换
x
x
x可得:
f
′
(
x
+
1
)
=
f
(
x
+
1
)
−
f
(
x
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
8
)
\quad \quad \quad \quad \quad \quad \quad \quad \quad f'(x+1)=f(x+1)-f(x)\quad \quad .......................................... \quad(8)
f′(x+1)=f(x+1)−f(x)..........................................(8)
把(7)(8)带入(6)得到:
f
′
′
(
x
)
=
(
f
(
x
+
1
)
−
f
(
x
)
)
−
(
f
(
x
)
−
f
(
x
−
1
)
)
2
=
f
(
x
+
1
)
−
2
f
(
x
)
+
f
(
x
−
1
)
2
\begin{aligned} f''(x)&=\frac{(f(x+1)-f(x))-(f(x)-f(x-1))}{2}\\&=\frac{f(x+1)-2f(x)+f(x-1)}{2} \end{aligned}
f′′(x)=2(f(x+1)−f(x))−(f(x)−f(x−1))=2f(x+1)−2f(x)+f(x−1)
即:
f
′
′
(
x
)
=
f
(
x
+
1
)
−
2
f
(
x
)
+
f
(
x
−
1
)
2
(9)
\color{red}f''(x)=\frac{f(x+1)-2f(x)+f(x-1)}{2}\tag{9}
f′′(x)=2f(x+1)−2f(x)+f(x−1)(9)
由把(8)(2)带入(4)得到:
f
′
′
(
x
)
=
f
′
(
x
+
1
)
−
f
′
(
x
)
=
(
f
(
x
+
1
)
−
f
(
x
)
)
−
(
f
(
x
)
−
f
(
x
−
1
)
)
=
f
(
x
+
1
)
+
f
(
x
−
1
)
−
2
f
(
x
)
\begin{aligned} f''(x)&=f'(x+1)-f'(x)\\&=(f(x+1)-f(x))-(f(x)-f(x-1))\\&=f(x+1)+f(x-1)-2f(x) \end{aligned}
f′′(x)=f′(x+1)−f′(x)=(f(x+1)−f(x))−(f(x)−f(x−1))=f(x+1)+f(x−1)−2f(x)
即:
f
′
′
(
x
)
=
f
(
x
+
1
)
+
f
(
x
−
1
)
−
2
f
(
x
)
(10)
\color{red}f''(x)=f(x+1)+f(x-1)-2f(x)\tag{10}
f′′(x)=f(x+1)+f(x−1)−2f(x)(10)
我们看到(9)和(10)都是二阶导,但是他们相差2倍的关系。我们的目的是找到边缘,边缘就是该像素位置的一阶导(方向导数)最大或者说梯度(因为方向导数模最大的方向就是梯度方向),要使得一阶导最大(即取极值),就要求二阶导等于0时,所以,这个系数并不影响。而二阶导为0,就是公式(10)等于0。
zhz:二阶导为0时,是极值,既可以极大值,也可以极小值,极小值就是像素值为0了。如果一张图的非细节部分的像素全为100的话,那么非细节部分像素的二阶导也为0;
拉普拉斯算子
就是利用二阶导数来检测边缘:
假设有一个函数
f
(
t
)
f(t)
f(t),他的函数显示如下(a), 一阶导是(b),二阶导是 (c )
你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘
(它们也可能出现在无意义的平滑区
位置),但是我们可以过滤掉这些点。拉普拉斯算子
就是利用二阶导数来检测边缘.
关于拉普拉斯算子更细节的介绍请参考:
差分近似图像导数算子之Laplace算子
2.边缘检测
2.1 Sobel算子
Sobel算子的数字中间那一行或者那一列比其他的行或列大,可能是因为最靠近中心点像素吧。
以sobel算子为例,本来中间那一行应该是0.5 0 0.5
,但是却定为-2 0 2
,是因为乘以一个系数(这里乘了4)并不影响,因为图像的每一个像素都是相同的处理,所以并不影响。
2.2 Laplacian算子
可以看到,拉普拉斯算子需要用到中心点的像素值,而sobel算子只用一阶导
,可以不用中心点的像素值,公式(3),只需要中心像素点的(x或y方向)前一个像素与后一个像素的差值即可。
拉普拉斯是二阶导,这里需要使用
f
′
′
(
x
)
f''(x)
f′′(x)包含中心点像素
f
(
x
)
f(x)
f(x)的公式,即公式(10)。
由于图像是二维的,所以在y方向上还需要使用二阶导:
f
′
′
(
y
)
=
f
(
y
+
1
)
+
f
(
y
−
1
)
−
2
f
(
y
)
\color{red}f''(y)=f(y+1)+f(y-1)-2f(y)
f′′(y)=f(y+1)+f(y−1)−2f(y)
所以卷积核中心综合x、y方向,就变成了
−
2
−
2
=
−
4
-2-2=-4
−2−2=−4.
上面这个算子指检测水平和竖直边缘。
上面这个卷积核指检测水平和竖直边缘,还检测斜对角边缘。
2.3 Canny边缘检测
3.边缘检测算子计算后,像素值<0 与 >255的问题:
由于像素值范围在[0-255]
,是unsigned char
,而卷积核(算子)的权重有正有负,所以卷积后计算出来的像素值有三种情况:
- 可能会
小于0
; - 可能会
大于255
; - 可能会是小数;
因此,在进行有正负权重的卷积计算之前,我们需要把像素值全都转化为signed int
型,即16位有符号类型,计算完成后,在把结果由signed int
型转化为unsigned char
型。但是不能直接转,可能会把负数转为特别大的数。
- 如果数字>255,那么转化为255;
- 如果数字<0,那么转化为0;
- 如果数字为100.6,那么转化为100或者101,就是用
std::round()
或者std::ceil()
或者std::floor()
函数;
opecv中有具体的api可以调用,以拉普拉斯边缘检测算子为例:
//因为输入图像的深度是 CV_8U ,这里我们必须定义 ddepth = CV_16S 以避免外溢。
cv::Laplacian(src_img, dst_img, CV_16S, 3, 1, 0);
//绝对值处理
cv::convertScaleAbs(dst_img, laplaci);
目前没研究cv::convertTo()
和cv::convertScaleAbs()
有什么区别。