【opencv】19.图像边缘检测算子数学原理、像素一二阶导数的意义

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Δx0Δxf(x+Δx)f(x)f(x)=limΔx0Δ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)=Δx0limΔxf(x+Δx)f(x)=Δx0limΔ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Δx0Δxf(x+Δx)f(x)f(x)=limΔx0Δ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(x1)..........................................(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(x1)(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(x1)..........................................(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(x1)..........................................(6)

由(1),用 x − 1 x-1 x1替换 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(x1)=f(x)f(x1)..........................................(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(x1))=2f(x+1)2f(x)+f(x1)
即:
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(x1)(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(x1))=f(x+1)+f(x1)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(x1)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(y1)2f(y)
所以卷积核中心综合x、y方向,就变成了 − 2 − 2 = − 4 -2-2=-4 22=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()有什么区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值