2017-09-25 11:18:57 dengheCSDN 阅读数 866
  • 卷积网络中特征的N种使用方式

    卷积神经网络视频教程,该课程以卷积神经网络处理图像为例,探讨了卷积得到的特征图(feature maps)的特性和运用,展示了特征在数据重建、图像生成、对抗样本、相似图查找等等领域的广泛运用,并辅以代码示例,帮助学员更好地理解深度学习和传统机器学习,乃至传统计算机视觉的关系。

    1729 人正在学习 去看看 CSDN讲师

     本文主要介绍了图像处理中卷积和滤波的相关原理。

一、线性滤波与卷积的基本概念

      线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。

      对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积或者协相关。卷积和协相关的差别是,卷积需要先对滤波矩阵进行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,就是蓝色实线。

 四、实验代码

      这是第二部分的Matlab实验代码:

  1. clear,close all, clc  
  2.    
  3. %% readimage  
  4. image =imread('test.jpg');  
  5.    
  6. %% definefilter  
  7. % -----Identity filter -----  
  8. kernel =[000  
  9.                      010  
  10.                      000];  
  11.    
  12. % -----Average Blur -----  
  13. kernel =[010  
  14.                      111  
  15.                      010] / 5;  
  16.    
  17. % -----Gaussian Blur -----  
  18. kernel =fspecial('gaussian'5 , 0.8);  
  19.    
  20. % -----Motion Blur -----  
  21. kernel =[10000  
  22.                      01000  
  23.                      00100  
  24.                      00010  
  25.                      00001] / 5;  
  26.                       
  27. % -----Edges Detection -----  
  28. kernel =[-1, -1, -1  
  29.                      -18, -1  
  30.                      -1, -1, -1];  
  31.    
  32. % -----Sharpen filter -----  
  33. kernel =[-1, -1, -1  
  34.                      -19, -1  
  35.                      -1, -1, -1];  
  36.                       
  37. % -----Emboss filter -----  
  38. kernel =[-1, -10  
  39.                      -1,  0,1  
  40.                      0,   1,1];  
  41.                       
  42. %% convolethe image with defined kernel or filter  
  43. result =zeros(size(image));  
  44. result(:,:, 1) = conv2(double(image(:, :, 1)), double(kernel), 'same');  
  45. result(:,:, 2) = conv2(double(image(:, :, 2)), double(kernel), 'same');  
  46. result(:,:, 3) = conv2(double(image(:, :, 3)), double(kernel), 'same');  
  47.    
  48. %% showthe result  
  49. imshow(image);  
  50. figure  
  51. imshow(uint8(result))  

五、参考文献

[1] Correlation and Convolution.pdf

[2] Lode's Computer GraphicsTutorial Image Filtering


声明:转载自 : http://blog.csdn.net/zouxy09/article/details/49080029

2018-06-27 16:30:41 heiheiya 阅读数 426
  • 卷积网络中特征的N种使用方式

    卷积神经网络视频教程,该课程以卷积神经网络处理图像为例,探讨了卷积得到的特征图(feature maps)的特性和运用,展示了特征在数据重建、图像生成、对抗样本、相似图查找等等领域的广泛运用,并辅以代码示例,帮助学员更好地理解深度学习和传统机器学习,乃至传统计算机视觉的关系。

    1729 人正在学习 去看看 CSDN讲师

定义  

  卷积是图像处理中很常见的操作,它通过计算原图像和一个卷积核的加权和来对图像进行滤波。根据卷积核的不同,可以完成对图像的模糊、锐化、降噪、边缘检测等其他功能。

  离散二维卷积公式可以表示为,

  

  上述公式中,f即表示原图像,g表示卷积核。卷积核的中心总是对准当前计算的像素点。

  在OpenGL中可以使用GLSL语言对shader进行编程,在shader中计算卷积。这个过程应该放在fragment shader中进行,但是在计算一个点的卷积时需要周围点的像素值共同计算,但当前的fragment是不能访问其他fragment的值。一个办法是将原图像以纹理的形式绑定到texture memory,就可以共享了。

  不同的卷积核可以完成不同的图像处理效果。

一、 平滑

 

  图像平滑可以衰减图像中的高频分量。最常见的平滑是领域均值滤波,它的卷积核的每一个值都等于1,比如一个3x3的卷积核是这样的,

  

  最终该点像素值等于该领域内像素的均值。

  这样的卷积可以写成如下shader,

// maximum size supported by this shaderconst 
int MaxKernelSize = 25; 
// array of offsets for accessing the base imageuniform 
vec2 Offset[MaxKernelSize]; 
// size of kernel (width * height) for this executionuniform 
int KernelSize; 
// final scaling valueuniform 
vec4 ScaleFactor; // image to be convolveduniform 
sampler2D BaseImage; 
void main(){    
int i;    
vec4 sum = vec4(0.0);     
for (i = 0; i < KernelSize; i++)        
    sum += texture2D(BaseImage,gl_TexCoord[0].st + Offset[i]);     
gl_FragColor = sum * ScaleFactor;}

  图像平滑通常被用来做图像降噪,这对稠密的或者纯色的区域表现很好,但是它有一个副作用就是会滤掉高频分量,也就是会影响到图像边缘信息。如果对越接近中心的值给予越来的权重,就能在降噪的同时保持好边缘信息,比如高斯滤波器。

下图是对一副灰度图像分别做了均值滤波和高斯滤波的效果。

 

  

 

  但是随着卷积核的增大,对纹理的读取次数以核的维度的平方增加,核越大,计算效率越低。但是对于像高斯这样的滤波器,一个widthxheight大小的卷积核,可以分成水平widthx1和垂直1xheight两个一维的卷积。虽然这样每个像素会增加一次写操作,但是纹理的读取却从widthxheight减少到width+height次。

 

二、 边缘检测

  使用拉普拉斯卷积核可以实现边缘检测,

  

  最终效果如下所示。

  

三、 锐化

 

  完成锐化一个简单常用的方法是把边缘检测的结果与原图像相加。为控制锐化的程度,需要给边缘检测的图像乘以一个权重。锐化时使用的是负的拉普拉斯卷积核。

  shader如下:

// maximum size supported by this shaderconst 
int MaxKernelSize = 25; 
// array of offsets for accessing the base imageuniform 
vec2 Offset[MaxKernelSize]; 
// size of kernel (width * height) for this executionuniform 
int KernelSize;
// value for each location in the convolution kerneluniform 
vec4 KernelValue[MaxKernelSize]; 
// scaling factor for edge imageuniform
vec4 ScaleFactor; 
// image to be convolveduniform
sampler2D BaseImage; 
void main(){    
int i;    
vec4 sum = vec4(0.0);     
for (i = 0; i < KernelSize; i++)    {        
    vec4 tmp = texture2D(BaseImage, 
    gl_TexCoord[0].st + Offset[i]);        
    sum += tmp * KernelValue[i];   }
vec4 baseColor = texture2D(BaseImage,vec2(gl_TexCoord[0]));    
gl_FragColor = ScaleFactor * sum + baseColor;}

  最后出来的效果如下图。

2016-04-05 14:37:36 traumland 阅读数 529
  • 卷积网络中特征的N种使用方式

    卷积神经网络视频教程,该课程以卷积神经网络处理图像为例,探讨了卷积得到的特征图(feature maps)的特性和运用,展示了特征在数据重建、图像生成、对抗样本、相似图查找等等领域的广泛运用,并辅以代码示例,帮助学员更好地理解深度学习和传统机器学习,乃至传统计算机视觉的关系。

    1729 人正在学习 去看看 CSDN讲师

首先什么是卷积?

    WIKI     https://en.wikipedia.org/wiki/Convolution

    公式如果忘了话可以看看这个http://open.163.com/movie/2006/1/C/M/M6TUO44DQ_M6TUPUBCM.html

上公式





f 中心遍历过h ,  卷积就完成了

C++: void filter2D( InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), 

                                                                    double delta=0, int borderType=BORDER_DEFAULT )

ddepth
desired depth of the destination image; if it is negative, it will be the same as src.depth() ; the following com
– src.depth() = CV_8U , ddepth = -1/ CV_16S / CV_32F / CV_64F
– src.depth() = CV_16U / CV_16S , ddepth = -1/ CV_32F / CV_64F
– src.depth() = CV_32F , ddepth = -1/ CV_32F / CV_64F

kernel – convolution kernel (or rather a correlation kernel), a single-channel floating point
matrix; if you want to apply different kernels to different channels, split the image into
separate color planes using split() and process them individually.
anchor – anchor of the kernel that indicates the relative position of a filtered point within the
kernel; the anchor should lie within the kernel; default value (-1,-1) means that the anchor
is at the kernel center.
delta – optional value added to the filtered pixels before storing them in dst .
borderType – pixel extrapolation method (see borderInterpolate() for details).
– src.depth() = CV_64F , ddepth = -1/ CV_64F
when ddepth=-1 , the output image will have the same depth as the source.


参考

1.http://www.cse.psu.edu/~rtc12/CSE486/   lecture 3

2.opencv cookbook 2nd edition 52页,170页 

3.http://blog.csdn.net/zouxy09/article/details/49080029     这个讲的非常好    直观详细






2015-11-03 20:59:34 u012300569 阅读数 581
  • 卷积网络中特征的N种使用方式

    卷积神经网络视频教程,该课程以卷积神经网络处理图像为例,探讨了卷积得到的特征图(feature maps)的特性和运用,展示了特征在数据重建、图像生成、对抗样本、相似图查找等等领域的广泛运用,并辅以代码示例,帮助学员更好地理解深度学习和传统机器学习,乃至传统计算机视觉的关系。

    1729 人正在学习 去看看 CSDN讲师

介绍一下卷积:就是一种算子 

直接上例子:

[ 1 2 3 4 5 4 3 2 1] (《==原始向量)卷积 [ 2 0 -2] (《=卷积模板 )

过程:

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] (零填充)

[-2 0 2]《----[ 2 0 -2]     (翻转180度)

↓  (开始)

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

[-2 0 2]

↓ (结果 [0 2 1 2 3 4 5 4 3 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

   [-2 0 2]

↓ (结果 [0 2 4 2 3 4 5 4 3 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

      [-2 0 2]

↓ (结果 [0 2 4 4 3 4 5 4 3 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

         [-2 0 2]

↓ (结果 [0 2 4 4 4 4 5 4 3 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

            [-2 0 2]

↓ (结果 [0 2 4 4 4 4 5 4 3 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

               [-2 0 2]

↓ (结果 [0 2 4 4 4 4 0 4 3 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

                  [-2 0 2]

↓ (结果 [0 2 4 4 4 4 0 -4 3 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

                     [-2 0 2]

↓ (结果 [0 2 4 4 4 4 0 -4 -4 2 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

                        [-2 0 2]

↓ (结果 [0 2 4 4 4 4 0 -4 -4 -4 1 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

                           [-2 0 2]

↓ (结果 [0 2 4 4 4 4 0 -4 -4 -4 -4 0 0] )

[ 0 0 1 2 3 4 5 4 3 2 1 0 0] 

                              [-2 0 2]

↓ (结果 [0 2 4 4 4 4 0 -4 -4 -4 -4 -2 0] )

[0 2 4 4 4 4 0 -4 -4 -4 -4 -2 0] 《===(全部卷积结果)

[4 4 4 4 0 -4 -4 -4 -4] 《===(裁截后的卷积结果)

下面来个图片的卷积:

A卷积G


原始图片像素阵A如下:

               

1 3 2 0 4                    

1 0 3 2 3 

0 4 1 0 5 

 2 3 2 1 4

 3 1 0 4 2 

卷积模板 G

-1 0 1

-2 0 2

-1 0 1



原始图做零填充结果 9*9        

 0 0 0 0 0 0 0 0 0                   

 0 0 0 0 0 0 0 0 0                

 0 0 1 3 2 0 4 0 0                    

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

 

模板做180度翻转结果3*3

1 0 -1

2 0 -2

1 0 -1

 

开始做卷积 

第1次蓝色为模板作用区域

 0 0 0 0 0 0 0 0 0                

 0 0 0 0 0 0 0 0 0                

 0 0 1 3 2 0 4 0 0                

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

 

 

 

 

 

 

 

 

 第1次卷积结果

 0 0 0 0 0 0 0 0 0                

 0 -1 0 0 0 0 0 0 0                

 0 0 1 3 2 0 4 0 0                

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

 

第2次蓝色为模板作用区域

 0 0 0 0 0 0 0 0 0                

 0 0 0 0 0 0 0 0 0                

 0 0 1 3 2 0 4 0 0                

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

第2次卷积结果

 0 0 0 0 0 0 0 0 0                

 0 -1 -3 0 0 0 0 0 0                

 0 0 1 3 2 0 4 0 0                

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

 

第3次蓝色为模板作用区域

 0 0 0 0 0 0 0 0 0                

 0 0 0 0 0 0 0 0 0                

 0 0 1 3 2 0 4 0 0                

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

 

 

第3次卷积结果

 0 0 0 0 0 0 0 0 0                

 0 -1 -3 -1 0 0 0 0 0                

 0 1 3 2 0 4 0 0                

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

 

。。。。。。。。经过漫长的模板移动。。。。。。。。。。

 

第49次蓝色为模板作用区域

 0 0 0 0 0 0 0 0 0                

 0 0 0 0 0 0 0 0 0                

 0 0 1 3 2 0 4 0 0                

 0 0 1 0 3 2 3 0 0

 0 0 0 4 1 0 5 0 0

 0 0 2 3 2 1 4 0 0

 0 0 3 1 0 4 2 0 0

 0 0 0 0 0 0 0 0 0 

 0 0 0 0 0 0 0 0 0

第49次卷积结果

 0 0  0  0  0  0  0  0  0                

 0 -1  -3 -1 -3  -2  0  4  0                

 0 -3  -6  -4  4  -4  2  11  0                

 0 -3  -7  -6  3  -6  2  15  0

 0 -3  -11 -4 8 -10  3  17  0

 0 -7 -11  2  5 -10  6  15  0

 0 -8  -5  6 -4  -6  9  8  0

 0 3  1  3  -3  -2  4  2  0 

 0 0  0  0  0  0  0  0  0

 

裁截后的卷积结果

              

-6  -4  4  -4  2             

-7  -6  3  -6  2

-11 -4  8 -10  3  

-11  2  5 -10  6  

-5  6 -4  -6  9  




2019-12-21 12:10:57 weixin_42730997 阅读数 58
  • 卷积网络中特征的N种使用方式

    卷积神经网络视频教程,该课程以卷积神经网络处理图像为例,探讨了卷积得到的特征图(feature maps)的特性和运用,展示了特征在数据重建、图像生成、对抗样本、相似图查找等等领域的广泛运用,并辅以代码示例,帮助学员更好地理解深度学习和传统机器学习,乃至传统计算机视觉的关系。

    1729 人正在学习 去看看 CSDN讲师

数字图像处理总结2

卷积运算和图像滤波


卷积运算

对图像的操纵分为点操作,代数操作,几何操作和领域操作。
卷积运算就是领域操作中的一个,而提到卷积,就不得不说他的姊妹correlation。
话不多说,先看公式:
convolution : fw=(a,b)wf(xa,yb)w(a,b)f*w=\sum_{(a,b)\in w}f(x-a,y-b)w(a,b)
correlation : fw=(a,b)wf(x+a,y+b)w(a,b)f \circ w=\sum _{(a, b) \in w}f(x+a, y+b)w(a, b)
f是原图,k是kernel。a, b是kernel中的点坐标,默认kernel的中心坐标为(0,0)。
可以看出两者的区别主要是原图的坐标变换是+ or -
而且因为convolution是 - ,在代码中具体运算时,需要将kernel旋转180180^\circ
一句话描述卷积的过程:对一个以某点为中心,kernel大小的原图区域,对应乘上旋转过的kernel的元素并求和,结果来作为kernel中心那个像素的新的灰度值,对图中所有点作该操作,就是一个卷积。


图像滤波

图像滤波就是用不同的kernel进行卷积操作。
根据kernel的不同,又分为很多目的不同的操作,如边缘检测、图像平滑等。
下面就举几个常见的例子:


Edge Detection

典型算子:
Roberts:
1001 \left | \begin{matrix} -1 & 0 \\ 0 & 1 \\ \end{matrix} \right |
0110 \left | \begin{matrix} 0 & -1 \\ 1 & 0 \\ \end{matrix} \right |

Prewitt:
111000111 \left | \begin{matrix} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \\ \end{matrix} \right |
101101101 \left | \begin{matrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \\ \end{matrix} \right |
Sobel:
121000121 \left | \begin{matrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \\ \end{matrix} \right |
101202101 \left | \begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \\ \end{matrix} \right |
通过观察可以看出,这三个算子都强调不同像素间的差,其实就是离散形式的导数,所以这三个算子都是在求图片的梯度。
而求梯度,就是突出变化,也就是能够得到图片中像素值变化剧烈的地方,也就是边缘。


图像平滑

典型算子:
平均滤波:
[1/91/91/91/91/91/91/91/91/9] \left [ \begin{matrix} 1/9 & 1/9 & 1/9 \\ 1/9 & 1/9 & 1/9 \\ 1/9 & 1/9 & 1/9 \\ \end{matrix} \right ]
中值滤波:
这个算子不是寻常的计算算子,而是将3x3范围内的中值作为中心的灰度值。
是一种统计学算子。
Gaussian:
G(x,y)=1/2πσ2×ex2+y2/2σ2G(x,y)={1/{2\pi \sigma^2}} \times e^{-{x^2+y^2}/{2\sigma^2}}
这个式子指的是高斯滤波器对应位置的值,其中一个关键元素是σ\sigma,是方差,在滤波时一般自己选定,他决定了高斯分布的峰高和宽(越大越矮、宽)


Code

实现时主要是依赖于opencv的

cv2.filter2D(img,-1,filter)

这里的算法都可以在我的GitHub里的项目里找到
该项目是一个包括阈值分割、卷积滤波、形态学和灰度形态学的数字图像处理算法集合
且带有GUI,有很好的演示效果
觉得可以别忘了star哦

1

博文 来自: Europe233
没有更多推荐了,返回首页