》》点赞,收藏+关注,理财&技术不迷路《《
目录:
![00bbc2e5f0043caf87df031470989b43.png](https://i-blog.csdnimg.cn/blog_migrate/c4b38e69b6464f39765c53f8f824593f.png)
在高等数学中我们了解到梯度不是一个实数,他是一个向量,是有方向有大小的。现在以一个二元函数来举例,假设一二元函数f(x,y),在某点的梯度有:
![1ed20cd1ab4a6a7d78487c5ae23a271c.png](https://i-blog.csdnimg.cn/blog_migrate/a778f7768f6476934e6939f7c10e7759.png)
整理后得到:
![ff1b368a3e99b49c0bb6592bcf9f1935.png](https://i-blog.csdnimg.cn/blog_migrate/1ced80f59b4b2db4bd2d7975796531ca.png)
其实也就是他的方向导数。梯度的方向是函数变化最快的方向,沿着梯度的方向容易找到最大值。
图像梯度的产生:图像中每两个像素做差,结果赋值给原来像素,像素之间的差值形成的图像就是梯度图像。
图像梯度很重要的两个算子:sobel算子和拉普拉斯里面。
在一幅模糊图像中的物体的轮廓不明显,轮廓边缘灰度变化不强烈,从而导致层次感不强,而在清晰图片中的物体轮廓边缘灰度变化明显,层次感强。那么这种灰度变化明显不明显怎么去定义呢?
可以使用导数(梯度),衡量图像灰度的变化率,因为图像就是函数。正因如此,我们引入的图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导。
![64ff7e5a555023b4ed2074b9679826f9.png](https://i-blog.csdnimg.cn/blog_migrate/d49f4c8e835791431d6fe40a8528b4cb.png)
在上边这幅图中可以看出,如果一副图像的相邻灰度值有变化,那么梯度就存在,如果图像相邻的像素没有变化,那么梯度就是0,把梯度值和相应的像素相加,那么灰度值没有变化的,像素就没有变化,灰度值变了,像素值也就变了。我们看到,相加后的新图像,原图像像素点100与90亮度只相差10,现在是110与90,亮度相差20了,对比度显然增强了,尤其是图像中物体的轮廓和边缘,与背景大大加强了区别,这就是用梯度来增强图像的原理。将图像函数f(x,y)梯度表达式表示出来:
![f96dd9ce41afc917ab406eb224edfb73.png](https://i-blog.csdnimg.cn/blog_migrate/83990f48d5cac446c7df8f0430b4bce8.png)
幅度:
![2b076b6d6af85f8873b47262b4135049.png](https://i-blog.csdnimg.cn/blog_migrate/78e59acfd532fab3844c00d16b567df1.png)
方向角:
![93b906ead09823714211a40353581e41.png](https://i-blog.csdnimg.cn/blog_migrate/e18c7f8cdab56e18a5bd598986e390cc.png)
11.1 一阶导数与sobel算子
![2cca0df7bd10c3a8150734e2d5c8bb2e.png](https://i-blog.csdnimg.cn/blog_migrate/7e5923f39d58372067f0e2527254d1df.png)
sobel算子,主要用作边缘检测,是离散差分算子,用来运算图像梯度函数的灰度近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或者法矢量。
书上的sobel模板不是卷积模板,而是协相关模板,卷积的话要先将模板旋转180度以后再与图像做相关操作
![610c1849468167a9d5308f1da48b5853.png](https://i-blog.csdnimg.cn/blog_migrate/f3f726951520ab87475031ccc994a5b2.png)
系数加起来都是等于零的。
![d77cb6d262ea6d0e7411b85ab4c9d37d.png](https://i-blog.csdnimg.cn/blog_migrate/ee4c85f064e3bf0682ed1483233172d0.png)
具体计算为,每个像素(灰度值)与模板对应位置元素相乘求和(类似于CNN中的卷积,其实是协相关运算),来计算该点灰度的大小:
![e9605d7fbc8d1c03c6e749a11a55b46a.png](https://i-blog.csdnimg.cn/blog_migrate/6dfcf48bb9b1652b3fd0d5419ae91c1b.png)
通常,为了提高效率使用不开平方的近似值:
![5d375780faa4f5c50c290cbc7e7d2367.png](https://i-blog.csdnimg.cn/blog_migrate/76a0bb015a1ac2b376a21b2eeb3b1eb1.png)
然后可用以下公式计算梯度方向:
![4aa61fcc9b7d2c2842fcb9a9a863e0b3.png](https://i-blog.csdnimg.cn/blog_migrate/57495b74a8c71ff9ce49f3460c0ab963.png)
11.2 Sobel代码实现
这里有几个点需要注意:
Sobel算子用来计算图像灰度函数的近似梯度。Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
OpenCV的Sobel函数原型为:
Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]])
src参数表示输入需要处理的图像。
ddepth参数表示输出图像深度,针对不同的输入图像,输出目标图像有不同的深度。(一般源图像都为CV_8U,为了避免溢出,一般ddepth参数选择CV_32F)
dx参数表示x方向上的差分阶数,1或0 。
dy参数表示y 方向上的差分阶数,1或0 。
dst参数表示输出与src相同大小和相同通道数的图像。
ksize参数表示Sobel算子的大小,必须为1、3、5、7。
scale参数表示缩放导数的比例常数,默认情况下没有伸缩系数。
delta参数表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
borderType表示判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAUL
![fee5dd35517a720dce75bdbf2a3e5845.png](https://i-blog.csdnimg.cn/blog_migrate/b2ccf4c35abb287d20080f4a1ddfe90c.png)
![a9a1972202d3cf2c1e80264192f9f667.png](https://i-blog.csdnimg.cn/blog_migrate/c19b6ddef80721aab00e9dad9cf0ec64.jpeg)
11.3 Scharr算子(sobel增强版)
当我们用sobel算子没法得到一个很好很明显的边缘的时候,我们可以采用Scharr算子,它是sobel算子的增强版。
当一些很弱的边缘我们无法用sobel算子提取到的话,我们可以调用Scharr算子,但是这种更强的提取方法也有一个缺点:它会更加突出噪声。
![69795c977a88d88dedd4c13e79ed8ecf.png](https://i-blog.csdnimg.cn/blog_migrate/eb2fd2903b76ca17cdf6526a3b7b2de5.png)
![ab2f799d250298167bad7acdbfa3f718.png](https://i-blog.csdnimg.cn/blog_migrate/25b6761d23e1e1754aceedc88ea4eb16.jpeg)
11.4 二阶导数/laplace
![9e9d7b8a0d63e0ee437616c919ef6d32.png](https://i-blog.csdnimg.cn/blog_migrate/12682b8416dca0da8f336760ffa3bee4.png)
你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是我们可以过滤掉这些点。
为了更适合于数字图像处理,将该方程表示为离散形式:
![9720f811dcc06401a536759e66d6d754.png](https://i-blog.csdnimg.cn/blog_migrate/5ce871aca844b1c8c82543e5f5a79b1e.png)
另外,拉普拉斯算子还可以表示成模板的形式,以便更好编程需要。如图。
![3016b5f62f370173268163954b883061.png](https://i-blog.csdnimg.cn/blog_migrate/881fdf288dc17b13a55379bc8137e216.png)
图1(a)表示离散拉普拉斯算子的模板,图1(b)表示其扩展模板,图1(c)则分别表示其他两种拉普拉斯的实现模板。从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮。因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。一般增强技术对于陡峭的边缘和缓慢变化的边缘很难确定其边缘线的位置。但此算子却可用二次微分正峰和负峰之间的过零点来确定,对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。同梯度算子一样,拉普拉斯算子也会增强图像中的噪声,有时用拉普拉斯算子进行边缘检测时,可将图像先进行平滑处理。
图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。拉普拉斯锐化的基本方法可以由下式表示:
![6857a89b2bd5ff7c2d52db8c31d0475c.png](https://i-blog.csdnimg.cn/blog_migrate/df13c8434224258b6ce8b5e124dd584a.png)
这种简单的锐化方法既可以产生拉普拉斯锐化处理的效果,同时又能保留背景信息,将原始图像叠加到拉普拉斯变换的处理结果中去,可以使图像中的各灰度值得到保留,使灰度突变处的对比度得到增强,最终结果是在保留图像背景的前提下,突现出图像中小的细节信息。但其缺点是对图像中的某些边缘产生双重响应。
11.5 Laplacian代码实现
OpenCV的Laplacian函数原型为:
Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
src参数表示输入需要处理的图像。
ddepth参数表示输出图像深度,针对不同的输入图像,输出目标图像有不同的深度。(一般源图像都为CV_8U,为了避免溢出,一般ddepth参数选择CV_32F)
dst参数表示输出与src相同大小和相同通道数的图像。
ksize参数表示用于计算二阶导数滤波器的孔径大小,大小必须是正数和奇数。
scale参数表示计算拉普拉斯算子值的比例因子,默认情况下没有伸缩系数。
delta参数表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
borderType表示判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。
![0c16582fb90a7873728e7add57b90ffc.png](https://i-blog.csdnimg.cn/blog_migrate/830a7dc47dd4df623578de9f2ceddeb7.png)
11.6 手动定义laplace
![3d428d71afbc2c576a1fbc06dceb280e.png](https://i-blog.csdnimg.cn/blog_migrate/1bdcef17dea155ff6b1489a9f8c1a1fd.png)
![a4b6f1961571dc26916ff495d1a32a08.png](https://i-blog.csdnimg.cn/blog_migrate/23240c28ba264fb63463d9310ed80058.jpeg)