本文主要参考内容:1.https://www.cnblogs.com/dengdan890730/p/6145585.html
2.https://blog.csdn.net/qq_40238526/article/details/89840463
3.https://blog.csdn.net/saltriver/article/details/78847964
4.https://blog.csdn.net/saltriver/article/details/78987170
5.https://blog.csdn.net/saltriver/article/details/78990520
6.https://blog.csdn.net/Zachary_Co/article/details/78831806
7.https://www.cnblogs.com/YiXiaoZhou/p/5891645.html
目录
1.图像是函数
我们能把一幅图像看作是一个二维函数,以灰度图像来说:定义成 f(x,y) 或者 I(x,y);任何一对空间坐标(x, y)处f的值(即函数值)看作该坐标点处的强度(intensity)或灰度。需要强调的是把图像作为二维函数时,它是一个离散函数,且取值范围有所限定,比如x, y轴的坐标值,函数取值也限定在某个区间之内。将lena图像每一点的强度在三位空间上看一下:如下图,x轴、y轴表示图像长宽的坐标,z轴表示每一点的强度\灰度值。(图像来源于链接3,为便于理解,放于此处,如有侵权。联系笔者删除)
对于彩色图像,同样可以看作是一个向量函数。f(x, y) = [r(x, y), g(x, y), b(x, y)],即为在坐标(x,y)处三个通道处函数值(在该坐标点处三个通道的灰度)组成的向量。
2.图像梯度
图像梯度表示图像灰度的变化率。得到像素点与其相邻像素的灰度值变化。
图像边缘可以使用一阶导数的极值来判断。
梯度(导数\微分):函数的变化率。
在微积分中,一维函数的一阶微分的基本定义:
图像是一个二维函数 f(x,y),则其微分是偏微分:
因为图像时一个离散的二维函数,不能无限小,因为图像是按照像素来离散的,最小的就是1像素。因此,上面的微分在图像中又变成了如下的形式():
我们利用梯度的本质目的,是要找到某像素与其相邻像素的灰度差值。原始定义的梯度计算方法只是灰度差值计算方法中的一种,还可以有其它计算方法来度量这种变化。以下图来说明(图像来源于链接3,为便于理解放于此处,如有侵权,联系笔者删除):
根据图像梯度的定义:x方向的梯度=z8-z5;y方向的梯度=z6-z5。
其实灰度差值计算算法还有很多,可以来衡量灰度变化,比方说Robert算子就是使用了交叉计算梯度。Sobel算子使用了八邻域的值来衡量梯度变化。
罗伯特(Roberts)交叉梯度算子,定义的是:
gx = z9-z5
gy = z8-z6
sobel算子的定义如下(与中心点Z5更近的点Z2,Z4,Z6,Z8的权重为2,其它对角线上的权重为1):
gx = (z7+2*z8+z9)-(z1+2*z2+z3)
gy = (z3+2*z6+z9)-(z1+2*z4+z7)
3.图像二阶导数
图像的二阶导数:求导数的导数,这对灰度变化强烈的地方会更敏感。
二阶导数突然高出(低出)零很多,表示当前像素的灰阶递进被打破,人眼视觉会感到突然出现了亮点(暗点)。如果图像灰阶是均匀地由暗到亮(如 [10 20 30 40...]),则各点的梯度=10,同时二阶导数=0,表示图像没有像素突然亮起来或暗下去。二阶导数的符号可用来判断一个转变(是从亮到暗或者相反。
对于阶跃边缘还可以使用二阶导数的过零点(zero-acrossing)判定。计算出每一像素点的二阶导数值之后,我们希望找到过零点,但图像是离散的,要找过零点还需进行拟合,拟合后的曲线找到过零点还要在离散过程很麻烦且完全没必要。这里可以直接寻找二阶导数正负交替的点作为边缘点。
二阶微分的基本定义:
图像是一个二维函数f(x,y),其二阶微分当然就是二阶偏微分(推导的时候结合上一部分介绍的的离散一阶微分):
令x=x-1,则:
于是,在x和y方向上,有:
我们把x方向和y方向的二阶导数结合在一起(这实质上就是著名的拉普拉斯二阶微分算子):
4.图示图像梯度与二阶导数的不同
用下图来展示一阶导数(梯度)和二阶导数的不同(图像来源于链接5,为便于理解放于此处,如有侵权,联系笔者删除):
由上图可以观察到:对于一阶导数,除了灰度突变的地方,其它灰度缓慢变化的地方数值相同,而且符号也相同。而二阶导数在灰度缓慢变化的地方数值为0,而在灰度突变的地方有符号相反的2个数值。也即二阶导数产生了双边缘,在边缘处,有符号相反的二阶导数值,可以强化这个边缘的对比度。
在用一阶导数进行图像增强时,用的是x梯度及y梯度的绝对值(简化后的,本来应该是平方和再开平方)加在原图像上,如上图中间列加上x方向的一阶导数的绝对值,中间四个值变为100,150,60,50,相加前100与50的灰度相差50,相加后150与60的灰度相差90,对比度显然增强了,尤其是图像中物体的轮廓和边缘,与背景大大加强了区别,这就是用梯度来增强图像的原理。
在用二阶导数进行图像增强时,它没有使用二阶导数的绝对值,而是保留了导数的符号,在原图上减去(到底用加上还是减去,与中心点f(x,y)的系数有关,这个定义的拉普拉斯二阶导数中,f(x,y)的系数是-4,是负的,原图像就要减去拉普拉斯二阶导数图像)二阶导的数值实现图像增强。如中间一列减去二阶导数后中间四个数变为:100,150,10,40;因为二阶导的双边缘,可以看到其灰度差变为了140,对比度增强了很多。
二阶导数对噪声点也更加敏感,会放大噪声的影响。如下图(图像来源于链接5,为便于理解放于此处,如有侵权,联系笔者删除)
边缘检测的边缘剖面图,图像中的边缘一般分为两种:屋脊型边缘和阶跃型边缘,如下图横坐标表示图像的一个方向(x或者y),纵坐标表示像素值(图像来源于链接5,为便于理解放于此处,如有侵权,联系笔者删除):
其中a,c子图是屋脊型边缘,向a那种函数趋势像屋脊的类型称为屋脊型边缘,c是a反方向情况,b,d是阶跃型边缘。边缘的检测可以通过一阶导数、二阶导数计算,我们以a,b图为例(c,d类似),其一阶导数,二阶导数图如下:
在实际应用中,一般只考虑阶跃边缘,因为只要采样足够或者说窗口足够小,屋脊型边缘也可以看做是阶跃边缘。
从图像中也可以看出来:
对于阶跃边缘可以使用一阶导数的极值来判断边缘。
对于阶跃边缘还可以使用二阶导数的过零点(zero-acrossing)判定。计算出每一像素点的二阶导数值之后,我们希望找到过零点,但图像是离散的,要找过零点还需进行拟合,拟合后的曲线找到过零点还要在离散过程很麻烦且完全没必要。这里可以直接寻找二阶导数正负交替的点作为边缘点。
5.LoG算子与DoG算子
LoG(Laplacian of Gaussian)算子和DoG(Difference of Gaussian)算子是图像处理中实现极值点检测(Blob Detection)的两种方法。通过利用高斯函数卷积操作进行尺度变换,可以在不同的尺度空间检测到关键点(Key Point)或兴趣点(Interest Point),实现尺度不变性(Scale invariance)的特征点检测。
LoG:
由上一节知道Laplace算子通过对图像求取二阶导数的零交叉点(zero-cross)来进行边缘检测,但是由于Laplace算子对出现的独立噪声非常敏感,所以一般先对图像进行平滑之后再使用laplace算子检测边缘。
常用的二维高斯函数如下:
原图像与高斯核函数卷积后再做laplace运算:
定义高斯拉普拉斯算子:
相当于对高斯模板先进行Laplace再与图像进行平滑。
将LOG展开,看其具体形式
所以:
也就是原图像高斯平滑后乘以与位置有关的系数。
计算出每一像素点使用LoG之后的数值之后,与laplace算子可以直接寻找二阶导数正负交替的点作为边缘点,此处只是过滤了噪点。
斑点检测是指在数字图像中找出和周围区域特性不同的区域,这些特性包括光照或颜色等。一般图像中斑点区域的像素特性相似甚至相同,某种程度而言,斑点块中所有点是相似的。
在边缘检测中,寻找的是二阶导数的零点,可是在斑点检测中寻找的是二阶导数的极值点。
如下图:对于蓝色的目标区域,红色的椭圆就是在检测边缘,黑色的椭圆就是在检测斑点区域。(图像来源于链接5,为便于理解放于此处,如有侵权,联系笔者删除)
边缘检测到斑点检测的过程对二阶导数的影响(图像来源于链接5,为便于理解放于此处,如有侵权,联系笔者删除):
这个示意图中上一行从左到右表示的是原始矩形脉冲信号,脉冲信号的周期越来越短,而下一行则表示对应周期在相同尺度下的LoG结果。可以发现总的LoG曲线其实是两条边界上产生的LoG结果函数的叠加,当两条边界足够小时,在该尺度脉冲下就被作为了blob,这时候LoG曲线的极值就对应着blob的中心。
这也说明检测blob时,尺度非常重要,不像上述示例中信息可以缩减保持同样的尺度,因为图像的大小是固定的,所以我们需要将尺度变大,只有尺度大于一定值得时候blob才可以通过LoG的极值判定。信号在不同尺度下的响应,随着尺度的增大,LoG算子的最大幅度逐渐减小,导致响应也随着尺度的增大而减小;为可以准确找到极值点,需要对LoG算子进行尺度归一化。如下图(图像来源于链接5,为便于理解放于此处,如有侵权,联系笔者删除):
从上图可以看出来,我们在检测blob时就可以使用不同的尺度计算LoG响应,选择产生最强响应的尺度,在该尺度上对应的极值就是blob的中心位置了。
在使用LoG算子进行Blob检测时,首先在不同尺寸上对图像进行LoG,然后检测在尺度空间和图像空间都是极值的点,就是blob区域的中心点。也是SIFT与SURF中采用的。
DoG算子:
DoG算子是高斯函数的差分,具体到图像中,就是将图像在不同参数下的高斯滤波结果相减,得到差分图。有理论可以推导出,检测归一化的LoG在尺度空间的极值近似于检测DoG空间的极值,由于高斯差分的计算更加简单,所以常用DoG算子近似替代LoG算子。
文中若有不妥或错误之处,还望指出。