联系我们
- 地 址:北京市海淀区北四环西路9号 ,主 营:人脸识别,活体检测,身份证识别,银行卡识别,名片识别,车牌识别,OCR识别等及智能识别技术。
- 电 话:13146317170 廖经理
- 传 真:
- 邮 箱:398017534@qq.com
深度学习图像卷积与滤波
深度学习图像卷积与滤波
之前在学习CNN的时分,有对卷积停止一些学习和整理,后来就烂尾了,如今略微整理下,先放上来,以提示和交流。
一、线性滤波与卷积的根本概念
线性滤波能够说是图像处置最根本的办法,它能够允许我们对图像停止处置,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处置的二维图像。然后,关于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。
对图像和滤波矩阵停止逐一元素相乘再求和的操作就相当于将一个二维的函数挪动到另一个二维函数的一切位置,这个操作就叫卷积或者协相关。卷积和协相关的差异是,卷积需求先对滤波矩阵停止180的翻转,但假如矩阵是对称的,那么两者就没有什么差异了。
Correlation 和 Convolution能够说是图像处置最根本的操作,但却十分有用。这两个操作有两个十分关键的特性:它们是线性的,而且具有平移不变性shift-invariant。平移不变性指我们在图像的每个位置都执行相同的操作。线性指这个操作是线性的,也就是我们用每个像素的邻域的线性组合来替代这个像素。这两个属性使得这个操作十分简单,由于线性操作是最简单的,然后在一切中央都做同样的操作就更简单了。
实践上,在信号处置范畴,卷积有普遍的意义,而且有其严厉的数学定义,但在这里不关注这个。
2D卷积需求4个嵌套循环4-double loop,所以它并不快,除非我们运用很小的卷积核。这里普通运用3x3或者5x5。而且,关于滤波器,也有一定的规则请求:
1)滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称谓,例如5x5大小的核的半径就是2。
2)滤波器矩阵一切的元素之和应该要等于1,这是为了保证滤波前后图像的亮度坚持不变。当然了,这不是硬性请求了。
3)假如滤波器矩阵一切元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,假如小于1,那么得到的图像就会变暗。假如和为0,图像不会变黑,但也会十分暗。
4)关于滤波后的构造,可能会呈现负数或者大于255的数值。对这种状况,我们将他们直接截断到0和255之间即可。关于负数,也能够取绝对值。
二、神奇的卷积核
上面说到,对图像的滤波处置就是对图像应用一个小小的卷积核,那这个小小的卷积核到底有哪些魔法,能让一个图像从惨不忍睹变得秀色可餐。下面我们一同来领略下一些简单但不简单的卷积核的魔法。
2.1、啥也不做
哈哈,大家能够看到啥了吗?这个滤波器啥也没有做,得到的图像和原图是一样的。由于只要中心点的值是1。邻域点的权值都是0,对滤波后的取值没有任何影响。
下面我们动点真格的。
2.2、图像锐化滤波器Sharpness Filter
图像的锐化和边缘检测很像,首先找到边缘,然后把边缘加到原来的图像上面,这样就强化了图像的边缘,使图像看起来愈加锐利了。这两者操作统一同来就是锐化滤波器了,也就是在边缘检测滤波器的根底上,再在中心的位置加1,这样滤波后的图像就会和原始的图像具有同样的亮度了,但是会愈加锐利。
我们把核加大,就能够得到愈加精密的锐化效果
另外,下面的滤波器会更强调边缘:
主要是强调图像的细节。最简单的3x3的锐化滤波器如下:
实践上是计算当前点和四周点的差异,然后将这个差异加到原来的位置上。另外,中间点的权值要比一切的权值和大于1,意味着这个像素要坚持原来的值。
2.3、边缘检测Edge Detection
我们要找程度的边缘:需求留意的是,这里矩阵的元素和是0,所以滤波后的图像会很暗,只要边缘的中央是有亮度的。
为什么这个滤波器能够寻觅到程度边缘呢?由于用这个滤波器卷积相当于求导的离散版本:你将当前的像素值减去前一个像素值,这样你就能够得到这个函数在这两个位置的差异或者斜率。下面的滤波器能够找到垂直方向的边缘,这里像素上和下的像素值都运用:
再下面这个滤波器能够找到45度的边缘:取-2不为了什么,只是为了让矩阵的元素和为0而已。
那下面这个滤波器就能够检测一切方向的边缘:
为了检测边缘,我们需求在图像对应的方向计算梯度。用下面的卷积核来卷积图像,就能够了。但在实践中,这种简单的办法会把噪声也放大了。另外,需求留意的是,矩阵一切的值加起来要是0.
2.4、浮雕Embossing Filter
浮雕滤波器能够给图像一种3D阴影的效果。只需将中心一边的像素减去另一边的像素就能够了。这时分,像素值有可能是负数,我们将负数当成阴影,将正数当成光,然后我们对结果图像加上128的偏移。这时分,图像大局部就变成灰色了。
下面是45度的浮雕滤波器
我们只需加大滤波器,就能够得到愈加夸大的效果了
这种效果十分的漂亮,就像是将一副图像雕琢在一块石头上面一样,然后从一个方向照亮它。它和前面的滤波器不同,它是非对称的。另外,它会产生负数值,所以我们需求将结果偏移,以得到图像灰度的范围。
A:原图像。B:锐化。C:边缘检测。D:浮雕
2.5、均值含糊Box Filter (Averaging)
我们能够将当前像素和它的四邻域的像素一同取均匀,然后再除以5,或者直接在滤波器的5个中央取0.2的值即可,如下图:
能够看到,这个含糊还是比拟温顺的,我们能够把滤波器变大,这样就会变得粗暴了:留意要将和再除以13.
所以,假如你想要更含糊的效果,加大滤波器的大小即可。或者对图像应用屡次含糊也能够。
2.6、高斯含糊
均值含糊很简单,但不是很平滑。高斯含糊就有这个优点,所以被普遍用在图像降噪上。特别是在边缘检测之前,都会用来移除细节。高斯滤波器是一个低通滤波器。
2.7、运动含糊Motion Blur
运动含糊能够经过只在一个方向含糊到达,例如下面9x9的运动含糊滤波器。留意,求和结果要除以9。
这个效果就仿佛,摄像机是从左上角挪动的右下角。
三、卷积的计算
对图像处置而言,存在两大类的办法:空域处置和频域处置!空域处置是指直接对原始的像素空间停止计算,频率处置是指先对图像变换到频域,再做滤波等处置。
3.1、空域计算-直接2D卷积
3.1.1、2D卷积
直接2D卷积就是一开端说的那样,关于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。
直接的完成也称为暴力完成brute force,由于它严厉依照定义来完成,没有任何优化。当然了,在并行完成里面,它也是比拟灵敏的。另外,也存在一个优化版本,假如我们的kernel是separable可分的,那么就能够得到一个快5倍左右的卷积办法。
2.1.2、边境处置
那卷积核遇到图像边缘怎样办?例如图像顶部的像素,它的上面曾经没有像素了,那么它的值如何计算?目前有四种主流的处置办法,我们用一维卷积和均值滤波来阐明下。
我们在1D图像中,用每个像素和它的二邻域的均匀值来取代它的值。假定我们有个1D的图像I是这样的:
对非图像边境的像素的操作比拟简单。假定我们对I的第四个像素3做部分均匀。也就是我们用2,3和7做均匀,来取代这个位置的像素值。也就是,均匀会产生一副新的图像J,这个图像在相同位置J (4) = (I(3)+I(4)+I(5))/3 = (2+3+7)/3 = 4。同样,我们能够得到J(3) = (I(2)+I(3)+I(4))/3 =(4+2+3)/3 = 3。需求留意的是,新图像的每个像素都取决于旧的图像,在计算J (4)的时分用J (3)是不对的,而是用I(3),I(4)和I(5)。所以每个像素都是它和它邻域两个像素的均匀。均匀是线性的操作,由于每个新的像素都是旧像素的线性组合。
对卷积,也有必需要思索的状况是,在图像边境的时分,怎样办?J(1)的值应该是什么?它取决于I(0),I(1)和I(2)。但是我们没有I(0)呀!图像左边没有值了。有四种方式来处置这个问题:
1)第一种就是想象I是无限长的图像的一局部,除了我们给定值的局部,其他局部的像素值都是0。在这种状况下,I(0)=0。所以J(1) = (I(0) + I(1) + I(2))/3 = (0 + 5 + 4)/3= 3. 同样,J(10) = (I(9)+I(10)+I(11))/3 = (3+ 6 + 0)/3 = 3.
2)第二种办法也是想象I是无限图像的一局部。但没有指定的局部是用图像边境的值停止拓展。在我们的例子中,由于图像I最左边的值I(1)=5,所以它左边的一切值,我们都以为是5 。而图像右边的一切的值,我们都以为和右边境的值I(10)一样,都是6。这时分J(1) = (I(0) + I(1) + I(2))/3 = (5 + 5 + 4)/3= 14/3. 而J(10) = (I(9)+I(10)+I(11))/3 = (3 + 6 + 6)/3 = 5。
3)第三种状况就是以为图像是周期性的。也就是I不时的反复。周期就是I的长度。在我们这里,I(0)和I(10)的值就是一样的,I(11)的值和I(1)的值也是一样的。所以J(1) = (I(0) + I(1) + I(2))/3= (I(10) + I(1)+ I(2))/3 = (6 + 5 + 4)/3 = 5 。
4)最后一种状况就是不论其他中央了。我们觉得I之外的状况是没有定义的,所以没方法运用这些没有定义的值,所以要运用图像I没有定义的值的像素都没方法计算。在这里,J(1)和J(10)都没方法计算,所以输出J会比原图像I要小。
这四种办法有各自的优缺陷。假如我们想象我们运用的图像只是世界的一个小窗口,然后我们需求运用窗口边境外的值,那么普通来说,外面的值和边境上的值是简直类似的,所以第二种办法可能更说得过去。
2.2、频域计算-快速傅里叶变换FFT卷积
这个快速完成得益于卷积定理:时域上的卷积等于频域上的乘积。所以将我们的图像和滤波器经过算法变换到频域后,直接将他们相乘,然后再变换回时域(也就是图像的空域)就能够了。
o表示矩阵逐元素相乘。那用什么办法将空域的图像和滤波器变换到频域了。那就是鼎鼎大名的Fast Fourier Transformation 快速傅里叶变换FFT(其实,在CUDA里面,曾经完成了FFT了)。
要在频域中对一副图像停止滤波,滤波器的大小和图像的大小必需要匹配,这样两者的相乘才容易。由于普通滤波器的大小比图像要小,所以我们需求拓展我们的kernel,让它和图像的大小分歧。
由于CUDA中的FFT完成是周期的,所以kernel的值也要布置成这样,以支持这种周期性。
为了保证图像边境的像素也能够得到响应输出,我们也需求拓展我们的输入图像。同时,拓展的方式也要支持周期表达。
假如只是运用卷积定理,没有对输入停止任何修正的话,那么我们得到的是周期卷积的结果。但这可能不是我们要的,由于周期卷积会对输入数据停止周期填补,引入一些artifacts。
给定N长度的I和K,为了得到线性卷积,我们需求对I和K停止zero padding。为什么要补0,由于DFT假定了输入是无限和周期的,周期是N。
如上图,关于I和K,假如没有padding的话,隐含着会假定I和K是周期的,以他们的长度N为周期。图中原本N长度的I和K都是黑色虚线的局部,然后假如没有padding,隐含着就会在N之外,加上同样的无数个I,如红色虚线局部,加上了一个周期。对K也是这样。假如是zero padding的话,在黑色虚线的其他中央都全是0了,如图中蓝色局部。将I和K卷积,假如没有padding,如黑色虚线,会有红色那局部的artifact。假如有padding,就是蓝色实线。
四、实验代码
一、线性滤波与卷积的根本概念
线性滤波能够说是图像处置最根本的办法,它能够允许我们对图像停止处置,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处置的二维图像。然后,关于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。
对图像和滤波矩阵停止逐一元素相乘再求和的操作就相当于将一个二维的函数挪动到另一个二维函数的一切位置,这个操作就叫卷积或者协相关。卷积和协相关的差异是,卷积需求先对滤波矩阵停止180的翻转,但假如矩阵是对称的,那么两者就没有什么差异了。
Correlation 和 Convolution能够说是图像处置最根本的操作,但却十分有用。这两个操作有两个十分关键的特性:它们是线性的,而且具有平移不变性shift-invariant。平移不变性指我们在图像的每个位置都执行相同的操作。线性指这个操作是线性的,也就是我们用每个像素的邻域的线性组合来替代这个像素。这两个属性使得这个操作十分简单,由于线性操作是最简单的,然后在一切中央都做同样的操作就更简单了。
实践上,在信号处置范畴,卷积有普遍的意义,而且有其严厉的数学定义,但在这里不关注这个。
2D卷积需求4个嵌套循环4-double loop,所以它并不快,除非我们运用很小的卷积核。这里普通运用3x3或者5x5。而且,关于滤波器,也有一定的规则请求:
1)滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称谓,例如5x5大小的核的半径就是2。
2)滤波器矩阵一切的元素之和应该要等于1,这是为了保证滤波前后图像的亮度坚持不变。当然了,这不是硬性请求了。
3)假如滤波器矩阵一切元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,假如小于1,那么得到的图像就会变暗。假如和为0,图像不会变黑,但也会十分暗。
4)关于滤波后的构造,可能会呈现负数或者大于255的数值。对这种状况,我们将他们直接截断到0和255之间即可。关于负数,也能够取绝对值。
二、神奇的卷积核
上面说到,对图像的滤波处置就是对图像应用一个小小的卷积核,那这个小小的卷积核到底有哪些魔法,能让一个图像从惨不忍睹变得秀色可餐。下面我们一同来领略下一些简单但不简单的卷积核的魔法。
2.1、啥也不做
哈哈,大家能够看到啥了吗?这个滤波器啥也没有做,得到的图像和原图是一样的。由于只要中心点的值是1。邻域点的权值都是0,对滤波后的取值没有任何影响。
下面我们动点真格的。
2.2、图像锐化滤波器Sharpness Filter
图像的锐化和边缘检测很像,首先找到边缘,然后把边缘加到原来的图像上面,这样就强化了图像的边缘,使图像看起来愈加锐利了。这两者操作统一同来就是锐化滤波器了,也就是在边缘检测滤波器的根底上,再在中心的位置加1,这样滤波后的图像就会和原始的图像具有同样的亮度了,但是会愈加锐利。
我们把核加大,就能够得到愈加精密的锐化效果
另外,下面的滤波器会更强调边缘:
主要是强调图像的细节。最简单的3x3的锐化滤波器如下:
实践上是计算当前点和四周点的差异,然后将这个差异加到原来的位置上。另外,中间点的权值要比一切的权值和大于1,意味着这个像素要坚持原来的值。
2.3、边缘检测Edge Detection
我们要找程度的边缘:需求留意的是,这里矩阵的元素和是0,所以滤波后的图像会很暗,只要边缘的中央是有亮度的。
为什么这个滤波器能够寻觅到程度边缘呢?由于用这个滤波器卷积相当于求导的离散版本:你将当前的像素值减去前一个像素值,这样你就能够得到这个函数在这两个位置的差异或者斜率。下面的滤波器能够找到垂直方向的边缘,这里像素上和下的像素值都运用:
再下面这个滤波器能够找到45度的边缘:取-2不为了什么,只是为了让矩阵的元素和为0而已。
那下面这个滤波器就能够检测一切方向的边缘:
为了检测边缘,我们需求在图像对应的方向计算梯度。用下面的卷积核来卷积图像,就能够了。但在实践中,这种简单的办法会把噪声也放大了。另外,需求留意的是,矩阵一切的值加起来要是0.
2.4、浮雕Embossing Filter
浮雕滤波器能够给图像一种3D阴影的效果。只需将中心一边的像素减去另一边的像素就能够了。这时分,像素值有可能是负数,我们将负数当成阴影,将正数当成光,然后我们对结果图像加上128的偏移。这时分,图像大局部就变成灰色了。
下面是45度的浮雕滤波器
我们只需加大滤波器,就能够得到愈加夸大的效果了
这种效果十分的漂亮,就像是将一副图像雕琢在一块石头上面一样,然后从一个方向照亮它。它和前面的滤波器不同,它是非对称的。另外,它会产生负数值,所以我们需求将结果偏移,以得到图像灰度的范围。
A:原图像。B:锐化。C:边缘检测。D:浮雕
2.5、均值含糊Box Filter (Averaging)
我们能够将当前像素和它的四邻域的像素一同取均匀,然后再除以5,或者直接在滤波器的5个中央取0.2的值即可,如下图:
能够看到,这个含糊还是比拟温顺的,我们能够把滤波器变大,这样就会变得粗暴了:留意要将和再除以13.
所以,假如你想要更含糊的效果,加大滤波器的大小即可。或者对图像应用屡次含糊也能够。
2.6、高斯含糊
均值含糊很简单,但不是很平滑。高斯含糊就有这个优点,所以被普遍用在图像降噪上。特别是在边缘检测之前,都会用来移除细节。高斯滤波器是一个低通滤波器。
2.7、运动含糊Motion Blur
运动含糊能够经过只在一个方向含糊到达,例如下面9x9的运动含糊滤波器。留意,求和结果要除以9。
这个效果就仿佛,摄像机是从左上角挪动的右下角。
三、卷积的计算
对图像处置而言,存在两大类的办法:空域处置和频域处置!空域处置是指直接对原始的像素空间停止计算,频率处置是指先对图像变换到频域,再做滤波等处置。
3.1、空域计算-直接2D卷积
3.1.1、2D卷积
直接2D卷积就是一开端说的那样,关于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。
直接的完成也称为暴力完成brute force,由于它严厉依照定义来完成,没有任何优化。当然了,在并行完成里面,它也是比拟灵敏的。另外,也存在一个优化版本,假如我们的kernel是separable可分的,那么就能够得到一个快5倍左右的卷积办法。
2.1.2、边境处置
那卷积核遇到图像边缘怎样办?例如图像顶部的像素,它的上面曾经没有像素了,那么它的值如何计算?目前有四种主流的处置办法,我们用一维卷积和均值滤波来阐明下。
我们在1D图像中,用每个像素和它的二邻域的均匀值来取代它的值。假定我们有个1D的图像I是这样的:
对非图像边境的像素的操作比拟简单。假定我们对I的第四个像素3做部分均匀。也就是我们用2,3和7做均匀,来取代这个位置的像素值。也就是,均匀会产生一副新的图像J,这个图像在相同位置J (4) = (I(3)+I(4)+I(5))/3 = (2+3+7)/3 = 4。同样,我们能够得到J(3) = (I(2)+I(3)+I(4))/3 =(4+2+3)/3 = 3。需求留意的是,新图像的每个像素都取决于旧的图像,在计算J (4)的时分用J (3)是不对的,而是用I(3),I(4)和I(5)。所以每个像素都是它和它邻域两个像素的均匀。均匀是线性的操作,由于每个新的像素都是旧像素的线性组合。
对卷积,也有必需要思索的状况是,在图像边境的时分,怎样办?J(1)的值应该是什么?它取决于I(0),I(1)和I(2)。但是我们没有I(0)呀!图像左边没有值了。有四种方式来处置这个问题:
1)第一种就是想象I是无限长的图像的一局部,除了我们给定值的局部,其他局部的像素值都是0。在这种状况下,I(0)=0。所以J(1) = (I(0) + I(1) + I(2))/3 = (0 + 5 + 4)/3= 3. 同样,J(10) = (I(9)+I(10)+I(11))/3 = (3+ 6 + 0)/3 = 3.
2)第二种办法也是想象I是无限图像的一局部。但没有指定的局部是用图像边境的值停止拓展。在我们的例子中,由于图像I最左边的值I(1)=5,所以它左边的一切值,我们都以为是5 。而图像右边的一切的值,我们都以为和右边境的值I(10)一样,都是6。这时分J(1) = (I(0) + I(1) + I(2))/3 = (5 + 5 + 4)/3= 14/3. 而J(10) = (I(9)+I(10)+I(11))/3 = (3 + 6 + 6)/3 = 5。
3)第三种状况就是以为图像是周期性的。也就是I不时的反复。周期就是I的长度。在我们这里,I(0)和I(10)的值就是一样的,I(11)的值和I(1)的值也是一样的。所以J(1) = (I(0) + I(1) + I(2))/3= (I(10) + I(1)+ I(2))/3 = (6 + 5 + 4)/3 = 5 。
4)最后一种状况就是不论其他中央了。我们觉得I之外的状况是没有定义的,所以没方法运用这些没有定义的值,所以要运用图像I没有定义的值的像素都没方法计算。在这里,J(1)和J(10)都没方法计算,所以输出J会比原图像I要小。
这四种办法有各自的优缺陷。假如我们想象我们运用的图像只是世界的一个小窗口,然后我们需求运用窗口边境外的值,那么普通来说,外面的值和边境上的值是简直类似的,所以第二种办法可能更说得过去。
2.2、频域计算-快速傅里叶变换FFT卷积
这个快速完成得益于卷积定理:时域上的卷积等于频域上的乘积。所以将我们的图像和滤波器经过算法变换到频域后,直接将他们相乘,然后再变换回时域(也就是图像的空域)就能够了。
o表示矩阵逐元素相乘。那用什么办法将空域的图像和滤波器变换到频域了。那就是鼎鼎大名的Fast Fourier Transformation 快速傅里叶变换FFT(其实,在CUDA里面,曾经完成了FFT了)。
要在频域中对一副图像停止滤波,滤波器的大小和图像的大小必需要匹配,这样两者的相乘才容易。由于普通滤波器的大小比图像要小,所以我们需求拓展我们的kernel,让它和图像的大小分歧。
由于CUDA中的FFT完成是周期的,所以kernel的值也要布置成这样,以支持这种周期性。
为了保证图像边境的像素也能够得到响应输出,我们也需求拓展我们的输入图像。同时,拓展的方式也要支持周期表达。
假如只是运用卷积定理,没有对输入停止任何修正的话,那么我们得到的是周期卷积的结果。但这可能不是我们要的,由于周期卷积会对输入数据停止周期填补,引入一些artifacts。
给定N长度的I和K,为了得到线性卷积,我们需求对I和K停止zero padding。为什么要补0,由于DFT假定了输入是无限和周期的,周期是N。
如上图,关于I和K,假如没有padding的话,隐含着会假定I和K是周期的,以他们的长度N为周期。图中原本N长度的I和K都是黑色虚线的局部,然后假如没有padding,隐含着就会在N之外,加上同样的无数个I,如红色虚线局部,加上了一个周期。对K也是这样。假如是zero padding的话,在黑色虚线的其他中央都全是0了,如图中蓝色局部。将I和K卷积,假如没有padding,如黑色虚线,会有红色那局部的artifact。假如有padding,就是蓝色实线。
四、实验代码
上一条:人脸识别,安卓ios人脸检测识别SDK
下一条:什么是人工智能