图像处理中的梯度流_vb人脸识别技术、图像处理 可用于人脸图像处理、梯度分析 - CSDN
精华内容
参与话题
  • 结合对图像处理的学习和实践,大致总结了一部分图像处理研究所需的数学原理基础。这些内容主要涉及微积分、向量分析、场论、泛函分析、偏微分方程、复变函数、变分法等。总结、归纳、提取了上面这些数学课程,在...

    全文目录请见

    图像处理中的数学原理详解(Part1 总纲)

    http://blog.csdn.net/baimafujinji/article/details/48467225


    1.3.3 方向导数与梯度






    我的“图像处理中的数学原理”专栏中之系列文章由“清华大学出版社”结集出版。欢迎关注我的新书《图像处理中的数学修炼》(Applied Mathematics in Digital Image Processing)——详细介绍图像处理中的数学原理,为你打开一道通往图像世界的数学之门,详细内容及目录请见 http://blog.csdn.net/baimafujinji/article/details/48467225



    展开全文
  • processing的数据可视化实现,计算图像梯度图像切向,用箭头及线可视化数据。
  • 图像处理中的傅里叶变换

    万次阅读 2017-11-04 22:15:18
    傅立叶变换在图像处理中有非常重要的作用。因为不仅傅立叶分析涉及图像处理很多方面,傅立 叶改进算法,比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。傅立叶变换在图像处理的重要作用:  1.图像增强...

        傅立叶变换在图像处理中有非常重要的作用。因为不仅傅立叶分析涉及图像处理很多方面,傅立 叶改进算法,比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。傅立叶变换在图像处理的重要作用:

       1.图像增强与图像去噪

          绝 大部分噪音都是图像的高频分量,通过低通滤波器来滤除高频——噪声; 边缘也是图像的高频分量,可以通过添加高频分量来增强原始图像的边缘;

      2.图像分割之边缘检测

         提 取图像高频分量

      3.图像特征提取:

         形状特征:傅里叶描述子

         纹 理特征:直接通过傅里叶系数来计算纹理特征

         其他特征:将提取的特征值进行傅里叶变 换来使特征具有平移、伸缩、旋转不变性

      4.图像压缩

         可以直接通过傅里叶系数来压缩数据;常用的离散余弦变换是傅立叶变换的实变换;傅立叶变换。

        傅里叶变换是将 时域信号分解为不同频率的正弦信号或余弦函数叠加之和。连续情况下要求原始信号在一个周期内满足绝对可积条件。离散情况下,傅里叶变换一定存在。冈萨雷斯 版<图像处理>里面的解释非常形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜 色由波长(或频率)来决定。傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它的光谱或频率谱。同样,傅立叶变 换使我们能通过频率成分来分析一个函数。

        傅立叶变换有很多优良的性质。

        如线性, 对称性(可以用在计算信号的傅里叶变换里面);

        时移性:函数在时域中的时移,对 应于其在频率域中附加产生的相移,而幅度频谱则保持不变;

        频移性:函数在时域中乘 以e^jwt,可以使整个频谱搬移w。这个也叫调制定理,通讯里面信号的频分复用需要用到这个特性(将不同的信号调制到不同的频段上同时传输);

       卷积定理:时域卷积等于频域乘积;时域乘积等于频域卷积(附加一个系数)。(图像处理里面 这个是个重点)。

       信号在频率域的表现。

        在频域中,频率越大说明原始信号变化速度越快;频率越小说明原始信号越平缓。当频率为0时,表示直 流信号,没有变化。因此,频率的大小反应了信号的变化快慢。高频分量解释信号的突变部分,而低频分量决定信号的整体形象。

        在图像处理中,频域反应了图像在空域灰度变化剧烈程度,也就是图像灰度的变化速度,也就是图像的梯 度大小。对图像而言,图像的边缘部分是突变部分,变化较快,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像平缓变化部分则为低频分 量。也就是说,傅立叶变换提供另外一个角度来观察图像,可以将图像从灰度分布转化到频率分布上来观察图像的特征。书面一点说就是,傅里叶变换提供了一条从 空域到频率自由转换的途径。对图像处理而言,以下概念非常的重要:

        图像高频分量: 图像突变部分;在某些情况下指图像边缘信息,某些情况下指噪声,更多是两者的混合;

        低 频分量:图像变化平缓的部分,也就是图像轮廓信息

        高通滤波器:让图像使低频分量抑 制,高频分量通过

        低通滤波器:与高通相反,让图像使高频分量抑制,低频分量通过

        带通滤波器:使图像在某一部分的频率信息通过,其他过低或过高都抑制

        带阻滤波器,是带通的反。

    模板运算与卷积定理

        在时域内做模板运算,实际上就是对图像进行卷积。 模板运算是图像处理一个很重要的处理过程,很多图像处理过程,比如增强/去噪(这两个分不清楚),边缘检测中普遍用到。根据卷积定理,时域卷积等价与频域 乘积。因此,在时域内对图像做模板运算就等效于在频域内对图像做滤波处理。

    比如说 一个均值模板,其频域响应为一个低通滤波器;在时域内对图像作均值滤波就等效于在频域内对图像用均值模板的频域响应对图像的频域响应作一个低通滤波。

        图像去噪

        图像去噪 就是压制图像的噪音部分。因此,如果噪音是高频额,从频域的角度来看,就是需要用一个低通滤波器对图像进行处理。通过低通滤波器可以抑制图像的高频分量。 但是这种情况下常常会造成边缘信息的抑制。常见的去噪模板有均值模板,高斯模板等。这两种滤波器都是在局部区域抑制图像的高频分量,模糊图像边缘的同时也 抑制了噪声。还有一种非线性滤波-中值滤波器。中值滤波器对脉冲型噪声有很好的去掉。因为脉冲点都是突变的点,排序以后输出中值,那么那些最大点和最小点 就可以去掉了。中值滤波对高斯噪音效果较差。

        椒盐噪声:对于椒盐采用中值滤波可以 很好的去除。用均值也可以取得一定的效果,但是会引起边缘的模糊。

    高斯白噪声:白 噪音在整个频域的都有分布,好像比较困难。

    冈萨雷斯版图像处理P185:算术均值 滤波器和几何均值滤波器(尤其是后者)更适合于处理高斯或者均匀的随机噪声。谐波均值滤波器更适合于处理脉冲噪声。

        图像增强

    有时候感觉图像增 强与图像去噪是一对矛盾的过程,图像增强经常是需要增强图像的边缘,以获得更好的显示效果,这就需要增加图像的高频分量。而图像去噪是为了消除图像的噪 音,也就是需要抑制高频分量。有时候这两个又是指类似的事情。比如说,消除噪音的同时图像的显示效果显著的提升了,那么,这时候就是同样的意思了。

        常见的图像增强方法有对比度拉伸,直方图均衡化,图像锐化等。前面两个是在空域进行基于像 素点的变换,后面一个是在频域处理。我理解的锐化就是直接在图像上加上图像高通滤波后的分量,也就是图像的边缘效果。对比度拉伸和直方图均衡化都是为了提 高图像的对比度,也就是使图像看起来差异更明显一些,我想,经过这样的处理以后,图像也应该增强了图像的高频分量,使得图像的细节上差异更大。同时也引入 了一些噪音。

        对图像二维傅立叶变换的意义

    众所周至,傅立叶变换可以将连续或离散的函数序列从空域映射到频域上,因此,傅立叶变换是信息与信号学中不可获缺的强大工具。但是,由于傅立 叶变换在学习时是以一大堆公式的形式给出的,因此很多人(包括我在内)往往在做了一大堆习题掌握了变换的数学表示却对其变换后的物理意义一无所知,尤其是 自学的时候更是晕头转向。

         这里假设大家对傅立叶变换的数学表示已经很熟悉了,撇开傅立叶变换本身和其在其他领域的应用不谈,只谈图像傅立叶变换前后的对应关系。我们知道傅立叶变换 以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,我们习惯用一个二维矩阵表示空间上各点,则图像可由 z=f(x,y)来表示。由于空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就由梯度来表示,这样我们可以通过观察图像得知物体在三维 空间中的对应关系。为什么要提梯度?因为实际上对图像进行二维傅立叶变换得到频谱图,就是图像梯度的分布图,当然频谱图上的各点与图像上各点并不存在一一 对应的关系,即使在不移频的情况下也是没有。傅立叶频谱图上我们看到的明暗不一的亮点,实际上图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的 频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅立叶变换后 的频谱图,也叫功率图(看看频谱图的各点的计算公式就知道为什么叫功率图了:)),我们首先就可以看出,图像的能量分布,如果频谱图中暗的点数更多,那么 实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差 异较大的。对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了可以清晰地看出图像频率分布以外,还有一个好 处,它可以分离出有周期性规律的干扰信号,比如正玄(sin的正玄,找不到这个字,郁闷)干扰,一副带有正玄干扰,移频到原点的频谱图上可以看出除了中心 以外还存在以某一点为中心,对称分布的亮点集合,这个集合就是干扰噪音产生的,这时可以很直观的通过在该位置放置带阻滤波器消除干扰。



    数学公式:

    1维的离散序列的DFT变换公式为:

     

    2维的离散矩阵的DFT变换公式为:

    1.使用模板处理图像相关概念:     

          模板:矩阵方块,其数学含义是一种卷积运算。
          卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相
                    乘,所有乘积之和作为区域中心像素的新值。
          卷积核:卷积时使用到的权用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行、列都是奇数,
                  是一个权矩阵。
          卷积示例:
                  3 * 3 的像素区域R与卷积核G的卷积运算:
                  R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9
                

    2.使用模板处理图像的问题:
           边界问题:当处理图像边界像素时,卷积核与图像使用区域不能匹配,卷积核的中心与边界像素点对应,
                     卷积运算将出现问题。
           处理办法:
                  A. 忽略边界像素,即处理后的图像将丢掉这些像素。
                  B. 保留原边界像素,即copy边界像素到处理后的图像。

    3.常用模板:



    例子1.:

    //【1】以灰度模式读取原始图像并显示
    	Mat srcImage = imread("1.jpg", 0);
    	if(!srcImage.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; } 
    	imshow("原始图像" , srcImage);   
    
    	//【2】将输入图像延扩到最佳的尺寸,边界用0补充
    	int m = getOptimalDFTSize( srcImage.rows );
    	int n = getOptimalDFTSize( srcImage.cols ); 
    	//将添加的像素初始化为0.
    	Mat padded;  
    	copyMakeBorder(srcImage, padded, 0, m - srcImage.rows, 0, n - srcImage.cols, BORDER_CONSTANT, Scalar::all(0));
    
    	//【3】为傅立叶变换的结果(实部和虚部)分配存储空间。
    	//将planes数组组合合并成一个多通道的数组complexI
    	Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
    	Mat complexI;
    	merge(planes, 2, complexI);         
    
    	//【4】进行就地离散傅里叶变换
    	dft(complexI, complexI);           
    
    	//【5】将复数转换为幅值,即=> log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
    	split(complexI, planes); // 将多通道数组complexI分离成几个单通道数组,planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
    	magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude  
    	Mat magnitudeImage = planes[0];
    
    	//【6】进行对数尺度(logarithmic scale)缩放
    	magnitudeImage += Scalar::all(1);
    	log(magnitudeImage, magnitudeImage);//求自然对数
    
    	//【7】剪切和重分布幅度图象限
    	//若有奇数行或奇数列,进行频谱裁剪      
    	magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols & -2, magnitudeImage.rows & -2));
    	//重新排列傅立叶图像中的象限,使得原点位于图像中心  
    	int cx = magnitudeImage.cols/2;
    	int cy = magnitudeImage.rows/2;
    	Mat q0(magnitudeImage, Rect(0, 0, cx, cy));   // ROI区域的左上
    	Mat q1(magnitudeImage, Rect(cx, 0, cx, cy));  // ROI区域的右上
    	Mat q2(magnitudeImage, Rect(0, cy, cx, cy));  // ROI区域的左下
    	Mat q3(magnitudeImage, Rect(cx, cy, cx, cy)); // ROI区域的右下
    	//交换象限(左上与右下进行交换)
    	Mat tmp;                           
    	q0.copyTo(tmp);
    	q3.copyTo(q0);
    	tmp.copyTo(q3);
    	//交换象限(右上与左下进行交换)
    	q1.copyTo(tmp);                 
    	q2.copyTo(q1);
    	tmp.copyTo(q2);
    
    	//【8】归一化,用0到1之间的浮点值将矩阵变换为可视的图像格式
    	//此句代码的OpenCV2版为:
    	//normalize(magnitudeImage, magnitudeImage, 0, 1, CV_MINMAX); 
    	//此句代码的OpenCV3版为:
    	normalize(magnitudeImage, magnitudeImage, 0, 1, NORM_MINMAX); 
    
    	//【9】显示效果图
    	imshow("频谱幅值", magnitudeImage); 

    函数解读:

    C++: intgetOptimalDFTSize(int vecsize)

    源码解读;

    copyMakeBorder

    C++: void copyMakeBorder(InputArraysrc, OutputArray dst, int top, int bottom,                                                        int left,int right, intborderType, const Scalar& value=Scalar())

    src: 源图像

    dst: 目标图像,和源图像有相同的类型,dst.cols=src.cols+left+right; dst.rows=src.rows+dst.top+dst.bottom

    top:

    bottom:

    left:

    right: 以上四个参数指定了在src图像周围附加的像素个数。

    borderType: 边框类型

    value: 当borderType==BORDER_CONSTANT时需要指定该值。


    例子2.

    1. int cv::getOptimalDFTSizeint size0 )  
    2. {  
    3.    int a = 0, b = sizeof(optimalDFTSizeTab)/sizeof(optimalDFTSizeTab[0]) -1;  
    4.    if( (unsigned)size0 >= (unsigned)optimalDFTSizeTab[b] )  
    5.        return -1;  
    6.    
    7.    while( a < b )//二分查找合适的size  
    8.     {  
    9.        int c = (a + b) >> 1;  
    10.        if( size0 <= optimalDFTSizeTab[c] )  
    11.            b = c;  
    12.        else  
    13.            a = c+1;  
    14.     }  
    15.    
    16.     returnoptimalDFTSizeTab[b];  
    17. }</span>  

    optimalDFTSizeTab定义在namespace cv中,里边的数值为2^x*3^y*5^z

    static const int optimalDFTSizeTab[] = {1,2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16,…,                                                                                       2123366400, 2125764000};

     

     


    示例代码:

    1. <span style="font-size:18px;">#include <opencv2/core/core.hpp>  
    2. #include<opencv2/highgui/highgui.hpp>  
    3. #include<opencv2/imgproc/imgproc.hpp>  
    4. #include <iostream>  
    5.    
    6. using namespace cv;  
    7. using namespace std;  
    8.    
    9. int main(){  
    10.        Matsrc = imread("fruits.jpg");  
    11.        if(src.empty())  
    12.        {  
    13.               return-1;  
    14.        }  
    15.    
    16.        Matsrc_gray;  
    17.        cvtColor(src,src_gray,CV_RGB2GRAY);//灰度图像做傅里叶变换  
    18.    
    19.        intm = getOptimalDFTSize(src_gray.rows);//2,3,5的倍数有更高效率的傅里叶转换  
    20.        intn = getOptimalDFTSize(src_gray.cols);  
    21.    
    22.        Matdst;  
    23.        ///把灰度图像放在左上角,在右边和下边扩展图像,扩展部分填充为0;  
    24.        copyMakeBorder(src_gray,dst,0,m-src_gray.rows,0,n-src_gray.cols,BORDER_CONSTANT,Scalar::all(0));  
    25.        cout<<dst.size()<<endl;  
    26.    
    27.        //新建一个两页的array,其中第一页用扩展后的图像初始化,第二页初始化为0  
    28.        Matplanes[] = {Mat_<float>(dst), Mat::zeros(dst.size(), CV_32F)};  
    29.        Mat  completeI;  
    30.        merge(planes,2,completeI);//把两页合成一个2通道的mat  
    31.    
    32.        //对上边合成的mat进行傅里叶变换,支持原地操作,傅里叶变换结果为复数。通道1存的是实部,通道2存的是虚部。  
    33.        dft(completeI,completeI);  
    34.    
    35.        split(completeI,planes);//把变换后的结果分割到各个数组的两页中,方便后续操作  
    36.        magnitude(planes[0],planes[1],planes[0]);//求傅里叶变换各频率的幅值,幅值放在第一页中。  
    37.    
    38.        MatmagI = planes[0];  
    39.        //傅立叶变换的幅度值范围大到不适合在屏幕上显示。高值在屏幕上显示为白点,  
    40.        //而低值为黑点,高低值的变化无法有效分辨。为了在屏幕上凸显出高低变化的连续性,我们可以用对数尺度来替换线性尺度:  
    41.        magI+= 1;  
    42.        log(magI,magI);//取对数  
    43.        magI= magI(Rect(0,0,src_gray.cols,src_gray.rows));//前边对原始图像进行了扩展,这里把对原始图像傅里叶变换取出,剔除扩展部分。  
    44.    
    45.    
    46.        //这一步的目的仍然是为了显示。 现在我们有了重分布后的幅度图,  
    47.        //但是幅度值仍然超过可显示范围[0,1] 。我们使用 normalize() 函数将幅度归一化到可显示范围。  
    48.        normalize(magI,magI,0,1,CV_MINMAX);//傅里叶图像进行归一化。  
    49.    
    50.    
    51.        //重新分配象限,使(0,0)移动到图像中心,  
    52.        //在《数字图像处理》中,傅里叶变换之前要对源图像乘以(-1)^(x+y)进行中心化。  
    53.        //这是是对傅里叶变换结果进行中心化  
    54.        intcx = magI.cols/2;  
    55.        intcy = magI.rows/2;  
    56.    
    57.        Mattmp;  
    58.        Matq0(magI,Rect(0,0,cx,cy));  
    59.        Matq1(magI,Rect(cx,0,cx,cy));  
    60.        Matq2(magI,Rect(0,cy,cx,cy));  
    61.        Matq3(magI,Rect(cx,cy,cx,cy));  
    62.    
    63.         
    64.        q0.copyTo(tmp);  
    65.        q3.copyTo(q0);  
    66.        tmp.copyTo(q3);  
    67.    
    68.        q1.copyTo(tmp);  
    69.        q2.copyTo(q1);  
    70.        tmp.copyTo(q2);  
    71.    
    72.         
    73.    
    74.        namedWindow("InputImage");  
    75.        imshow("InputImage",src);  
    76.    
    77.        namedWindow("SpectrumImage");  
    78.        imshow("SpectrumImage",magI);  
    79.    
    80.        waitKey();  
    81.        return0;  
    82. }</span>  


    图像卷积原理:

    图像处理-线性滤波-1 基础(相关算子、卷积算子、边缘效应)

    这里讨论利用输入图像中像素的小邻域来产生输出图像的方法,在信号处理中这种方法称为滤波(filtering)。其中,最常用的是线性滤波:输出像素是输入邻域像素的加权和。

     

    1.相关算子(Correlation Operator)

           定义:image image ,其中h称为相关核(Kernel).

            

      步骤:

            1)滑动核,使其中心位于输入图像g的(i,j)像素上

            2)利用上式求和,得到输出图像的(i,j)像素值

            3)充分上面操纵,直到求出输出图像的所有像素值

     

      例:

    A = [17  24      15            h = [8     6
         23      14  16                 3     7
             13  20  22                 4     2]
         10  12  19  21             
         11  18  25     9]

    计算输出图像的(2,4)元素=image

    image

    Matlab 函数:imfilter(A,h)

     

    2.卷积算子(Convolution)

    定义:image image ,其中

       步骤:

            1)将围绕中心旋转180度

            2)滑动核,使其中心位于输入图像g的(i,j)像素上

            3)利用上式求和,得到输出图像的(i,j)像素值

            4)充分上面操纵,直到求出输出图像的所有像素值

           例:计算输出图像的(2,4)元素=image

           image

    Matlab 函数:Matlab 函数:imfilter(A,h,'conv')% imfilter默认是相关算子,因此当进行卷积计算时需要传入参数'conv'

    3.边缘效应

    当对图像边缘的进行滤波时,核的一部分会位于图像边缘外面。

    image

    常用的策略包括:

    1)使用常数填充:imfilter默认用0填充,这会造成处理后的图像边缘是黑色的。

    2)复制边缘像素:I3 = imfilter(I,h,'replicate');

    image

       

    4.常用滤波

    fspecial函数可以生成几种定义好的滤波器的相关算子的核。

    例:unsharp masking 滤波

    1
    2
    3
    4
    5
    I = imread('moon.tif');
    h = fspecial('unsharp');
    I2 = imfilter(I,h);
    imshow(I), title('Original Image')
    figure, imshow(I2), title('Filtered Image')
     
     

    图像处理-线性滤波-2 图像微分(1、2阶导数和拉普拉斯算子)

    更复杂些的滤波算子一般是先利用高斯滤波来平滑,然后计算其1阶和2阶微分。由于它们滤除高频和低频,因此称为带通滤波器(band-pass filters)。

    在介绍具体的带通滤波器前,先介绍必备的图像微分知识。

    1 一阶导数

    连续函数,其微分可表达为image ,或image                         (1.1)

    对于离散情况(图像),其导数必须用差分方差来近似,有

                                       image,前向差分 forward differencing                  (1.2)

                                       image ,中心差分 central differencing                     (1.3)

    1)前向差分的Matlab实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    function dimg = mipforwarddiff(img,direction)
    % MIPFORWARDDIFF     Finite difference calculations 
    %
      DIMG = MIPFORWARDDIFF(IMG,DIRECTION)
    %
     Calculates the forward-difference for a given direction
     IMG       : input image
     DIRECTION : 'dx' or 'dy'
     DIMG      : resultant image
    %
      See also MIPCENTRALDIFF MIPBACKWARDDIFF MIPSECONDDERIV
      MIPSECONDPARTIALDERIV
      
      Omer Demirkaya, Musa Asyali, Prasana Shaoo, ... 9/1/06
      Medical Image Processing Toolbox
      
    imgPad = padarray(img,[1 1],'symmetric','both');%将原图像的边界扩展
    [row,col] = size(imgPad);
    dimg = zeros(row,col);
    switch (direction)   
    case 'dx',
       dimg(:,1:col-1) = imgPad(:,2:col)-imgPad(:,1:col-1);%x方向差分计算,
    case 'dy',
       dimg(1:row-1,:) = imgPad(2:row,:)-imgPad(1:row-1,:); 
    otherwise, disp('Direction is unknown');
    end;
    dimg = dimg(2:end-1,2:end-1);

    2)中心差分的Matlab实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function dimg = mipcentraldiff(img,direction)
    % MIPCENTRALDIFF     Finite difference calculations 
    %
      DIMG = MIPCENTRALDIFF(IMG,DIRECTION)
    %
     Calculates the central-difference for a given direction
     IMG       : input image
     DIRECTION : 'dx' or 'dy'
     DIMG      : resultant image
    %
      See also MIPFORWARDDIFF MIPBACKWARDDIFF MIPSECONDDERIV
      MIPSECONDPARTIALDERIV
      
      Omer Demirkaya, Musa Asyali, Prasana Shaoo, ... 9/1/06
      Medical Image Processing Toolbox
      
    img = padarray(img,[1 1],'symmetric','both');
    [row,col] = size(img);
    dimg = zeros(row,col);
    switch (direction)
        case 'dx',
            dimg(:,2:col-1) = (img(:,3:col)-img(:,1:col-2))/2;
        case 'dy',
            dimg(2:row-1,:) = (img(3:row,:)-img(1:row-2,:))/2;
        otherwise,
            disp('Direction is unknown');
    end
    dimg = dimg(2:end-1,2:end-1);
    1   

    实例:技术图像x方向导数

    1
    2
    I = imread('coins.png'); figure; imshow(I);
    Id = mipforwarddiff(I,'dx'); figure, imshow(Id);

          image image

        原图像                           x方向1阶导数

     

    2 图像梯度(Image Gradient)

    图像I的梯度定义为image  ,其幅值为image 。出于计算性能考虑,幅值也可用image 来近似。

    Matlab函数

    1)gradient:梯度计算

    2)quiver:以箭头形状绘制梯度。注意放大下面最右侧图可看到箭头,由于这里计算横竖两个方向的梯度,因此箭头方向都是水平或垂直的。

    实例:仍采用上面的原始图像

    1
    2
    3
    4
    5
    I = double(imread('coins.png'));
    [dx,dy]=gradient(I);
    magnitudeI=sqrt(dx.^2+dy.^2);
    figure;imagesc(magnitudeI);colormap(gray);%梯度幅值
    hold on;quiver(dx,dy);%叠加梯度方向

            image image

                             梯度幅值          梯度幅值+梯度方向

     

    3 二阶导数

    对于一维函数,其二阶导数image ,即image 。它的差分函数为

                                     image                  (3.1)

     

    3.1 普拉斯算子(laplacian operator)

    3.1.2 概念

    拉普拉斯算子是n维欧式空间的一个二阶微分算子。它定义为两个梯度向量算子的内积

                              image       (3.2)

    其在二维空间上的公式为:    image                (3.3)

     

    对于1维离散情况,其二阶导数变为二阶差分

    1)首先,其一阶差分为image

    2)因此,二阶差分为

              image

    3)因此,1维拉普拉斯运算可以通过1维卷积核image 实现

     

    对于2维离散情况(图像),拉普拉斯算子是2个维上二阶差分的和(见式3.3),其公式为:

    image   (3.4)

    上式对应的卷积核为

                           image

    常用的拉普拉斯核有:

                          image

    3.1.2 应用

    拉普拉斯算子会突出像素值快速变化的区域,因此常用于边缘检测。

     

     

    Matlab里有两个函数

    1)del2

    计算公式:image image  

    2)fspecial:图像处理中一般利用Matlab函数fspecial

    h = fspecial('laplacian', alpha) returns a 3-by-3 filter approximating the shape of the two-dimensional Laplacian operator.
    The parameter alpha controls the shape of the Laplacian and must be in the range 0.0 to 1.0. The default value for alpha is 0.2.

     

    3.1.3 资源

    http://fourier.eng.hmc.edu/e161/lectures/gradient/node8.html (非常清晰的Laplacian Operator介绍,本文的主要参考)

    http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm

     

     
     
     
     

    sift算法

     

    尺度不变特征转换(Scale-invariant feature transform 或 SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe 在1999年所发表,2004年完善总结。

    Sift算法就是用不同尺度(标准差)的高斯函数对图像进行平滑,然后比较平滑后图像的差别,
    差别大的像素就是特征明显的点。

    sift可以同时处理亮度,平移,旋转,尺度的变化,利用特征点来提取特征描述符,最后在特征描述符之间寻找匹配


    五个步骤

    1构建尺度空间,检测极值点,获得尺度不变性

    2特征点过滤并进行经确定位,剔除不稳定的特征点

    3 在特征点处提取特征描述符,为特征点分配方向直

    4声称特征描述子,利用特征描述符寻找匹配点

    5计算变换参数

    当2幅图像的sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为2幅图像中关键点的相似性判定量度


    尺度空间:

    尺度就是受delta这个参数控制的表示

    而不同的L(x,y,delta)就构成了尺度空间,实际上具体计算的时候即使连续的高斯函数,都要被离散为矩阵来和数字图像进行卷积操作

    L(x,y,delta)=G(x,y,e)*i(x,y)

    尺度空间=原始图像(卷积)一个可变尺度的2维高斯函数G(x,y,e)


    G(x,y,e) = [1/2*pi*e^2] * exp[ -(x^2 + y^2)/2e^2] 


    为了更有效的在尺度空间检测到稳定的关键点,提出了高斯差分尺度空间,利用不同尺度的高斯差分核与原始图像i(x,y)卷积生成

    D(x,y,e)=(G(x,y,ke)-G(x,y,e))*i(x,y)

    =L(x,y,ke)-L(x,y,e)

    (为避免遍历每个像素点)


    高斯卷积:

    在组建一组尺度空间后,再组建下一组尺度空间,对上一组尺度空间的最后一幅图像进行二分之一采样,得到下一组尺度空间的第一幅图像,然后进行像建立第一组尺度空间那样的操作,得到第二组尺度空间,公式定义为
             L(x,y,e) = G(x,y,e)*I(x,y)

        图像金字塔的构建:图像金字塔共O组,每组有S层,下一组的图像由上一组图像降采样得到、

    高斯差分

        在尺度空间建立完毕后,为了能够找到稳定的关键点,采用高斯差分的方法来检测那些在局部位置的极值点,即采用俩个相邻的尺度中的图像相减,即公式定义为:
            D(x,y,e) = ((G(x,y,ke) - G(x,y,e)) * I(x,y) 
                     = L(x,y,ke) - L(x,y,e)
     咱们再来具体阐述下构造D(x,y,e)的详细步骤:
        1、首先采用不同尺度因子的高斯核对图像进行卷积以得到图像的不同尺度空间,将这一组图像作为金子塔图像的第一层。
        2、接着对第一层图像中的2倍尺度图像(相对于该层第一幅图像的2倍尺度)以2倍像素距离进行下采样来得到金子塔图像的第二层中的第一幅图像,对该图像采用不同尺度因子的高斯核进行卷积,以获得金字塔图像中第二层的一组图像。
        3、再以金字塔图像中第二层中的2倍尺度图像(相对于该层第一幅图像的2倍尺度)以2倍像素距离进行下采样来得到金字塔图像的第三层中的第一幅图像,对该图像采用不同尺度因子的高斯核进行卷积,以获得金字塔图像中第三层的一组图像。这样依次类推,从而获得了金字塔图像的每一层中的一组图像,
     4、对上图得到的每一层相邻的高斯图像相减,就得到了高斯差分图像,如下述第一幅图所示。下述第二幅图中的右列显示了将每组中相邻图像相减所生成的高斯差分图像的结果,限于篇幅,图中只给出了第一层和第二层高斯差分图像的计算
    sift算法
     

     

    图像处理之卷积概念

     

    我们来看一下一维卷积的概念.
    连续空间的卷积定义是 f(x)与g(x)的卷积是 f(t-x)g(x) 在t从负无穷到正无穷的积分值.t-x要在f(x)定义域内,所以看上去很大的积分实际上还是在一定范围的.
    实际的过程就是f(x) 先做一个Y轴的反转,然后再沿X轴平移t就是f(t-x),然后再把g(x)拿来,两者乘积的值再积分.想象一下如果g(x)或者f(x)是个单位的阶越函数. 那么就是f(t-x)与g(x)相交部分的面积.这就是卷积了.
    把积分符号换成求和就是离散空间的卷积定义了.

     

    么在图像中卷积卷积地是什么意思呢,就是图像f(x),模板g(x),然后将模版g(x)在模版中移动,每到一个位置,就把f(x)与g(x)的定义域相交的元素进行乘积并且求和,得出新的图像一点,就是被卷积后的图像. 模版又称为卷积核.卷积核做一个矩阵的形状.


    卷积定义上是线性系统分析经常用到的.线性系统就是一个系统的输入和输出的关系是线性关系.就是说整个系统可以分解成N多的无关独立变化,整个系统就是这些变化的累加.
    如 x1->y1, x2->y2; 那么A*x1 + B*x2 -> A*y1 + B*y2 这就是线性系统. 表示一个线性系统可以用积分的形式 如 Y = Sf(t,x)g(x)dt S表示积分符号,就是f(t,x)表示的是A B之类的线性系数.
    看上去很像卷积呀,,对如果f(t,x) = F(t-x) 不就是了吗.从f(t,x)变成F(t-x)实际上是说明f(t,x)是个线性移不变,就是说 变量的差不变化的时候,那么函数的值不变化. 实际上说明一个事情就是说线性移不变系统的输出可以通过输入和表示系统线性特征的函数卷积得到.


    http://dept.wyu.edu.cn/dip/DIPPPT2005/����������ϵͳ.ppt


    谈起卷积分当然要先说说冲击函数—-这个倒立的小蝌蚪,卷积其实就是为它诞生的。”冲击函数”是狄拉克为了解决一些瞬间作用的物理现象而提出的符号。
    古人曰:”说一堆大道理不如举一个好例子”,冲量这一物理现象很能说明”冲击函数”。在t时间内对一物体作用F的力,我们可以让作用时间t很小,作用力F很大,但让Ft的乘积不变,即冲量不变。于是在用t做横坐标、F做纵坐标的坐标系中,就如同一个面积不变的长方形,底边被挤的窄窄的,高度被挤的高高的,在数学中它可以被挤到无限高,但即使它无限瘦、无限高、但它仍然保持面积不变(它没有被挤没!),为了证实它的存在,可以对它进行积分,积分就是求面积嘛!于是”卷积” 这个数学怪物就这样诞生了。说它是数学怪物是因为追求完美的数学家始终在头脑中转不过来弯,一个能瘦到无限小的家伙,竟能在积分中占有一席之地,必须将这个细高挑清除数学界。但物理学家、工程师们确非常喜欢它,因为它解决了很多当时数学家解决不了的实际问题。最终追求完美的数学家终于想通了,数学是来源于实际的,并最终服务于实际才是真。于是,他们为它量身定做了一套运作规律。于是,妈呀!你我都感觉眩晕的卷积分产生了。
    例子:
    有一个七品县令,喜欢用打板子来惩戒那些市井无赖,而且有个惯例:如果没犯大罪,只打一板,释放回家,以示爱民如子。
    有一个无赖,想出人头地却没啥指望,心想:既然扬不了善名,出恶名也成啊。怎么出恶名?炒作呗!怎么炒作?找名人呀!他自然想到了他的行政长官——县令。
    无赖于是光天化日之下,站在县衙门前撒了一泡尿,后果是可想而知地,自然被请进大堂挨了一板子,然后昂首挺胸回家,躺了一天,嘿!身上啥事也没有!第二天如法炮制,全然不顾行政长管的仁慈和衙门的体面,第三天、第四天……每天去县衙门领一个板子回来,还喜气洋洋地,坚持一个月之久!这无赖的名气已经和衙门口的臭气一样,传遍八方了!
    县令大人噤着鼻子,呆呆地盯着案子上的惊堂木,拧着眉头思考一个问题:这三十个大板子怎么不好使捏?……想当初,本老爷金榜题名时,数学可是得了满分,今天好歹要解决这个问题:
    ——人(系统!)挨板子(脉冲!)以后,会有什么表现(输出!)?
    ——费话,疼呗!
    ——我问的是:会有什么表现?
    ——看疼到啥程度。像这无赖的体格,每天挨一个板子啥事都不会有,连哼一下都不可能,你也看到他那得意洋洋的嘴脸了(输出0);如果一次连揍他十个板子,他可能会皱皱眉头,咬咬牙,硬挺着不哼
    (输出1);揍到二十个板子,他会疼得脸部扭曲,象猪似地哼哼(输出3);揍到三十个板子,他可能会象驴似地嚎叫,一把鼻涕一把泪地求你饶他一命(输出5);揍到四十个板子,他会大小便失禁,勉
    强哼出声来(输出1);揍到五十个板子,他连哼一下都不可能(输出0)——死啦!
    县令铺开坐标纸,以打板子的个数作为X轴,以哼哼的程度(输出)为Y轴,绘制了一条曲线:
    ——呜呼呀!这曲线象一座高山,弄不懂弄不懂。为啥那个无赖连挨了三十天大板却不喊绕命呀?
    —— 呵呵,你打一次的时间间隔(Δτ=24小时)太长了,所以那个无赖承受的痛苦程度一天一利索,没有叠加,始终是一个常数;如果缩短打板子的时间间隔(建议 Δτ=0.5秒),那他的痛苦程度可就迅速叠加了;等到这无赖挨三十个大板(t=30)时,痛苦程度达到了他能喊叫的极限,会收到最好的惩戒效果,再多打就显示不出您的仁慈了。
    ——还是不太明白,时间间隔小,为什么痛苦程度会叠加呢?
    ——这与人(线性时不变系统)对板子(脉冲、输入、激励)的响应有关。什么是响应?人挨一个板子后,疼痛的感觉会在一天(假设的,因人而异)内慢慢消失(衰减),而不可能突然消失。这样一来,只要打板子的时间间隔很小,每一个板子引起的疼痛都来不及完全衰减,都会对最终的痛苦程度有不同的贡献:
    t个大板子造成的痛苦程度=Σ(第τ个大板子引起的痛苦*衰减系数)
    [衰减系数是(t-τ)的函数,仔细品味]
    数学表达为:y(t)=∫T(τ)H(t-τ)
    ——拿人的痛苦来说卷积的事,太残忍了。除了人以外,其他事物也符合这条规律吗?
    ——呵呵,县令大人毕竟仁慈。其实除人之外,很多事情也遵循此道。好好想一想,铁丝为什么弯曲一次不折,快速弯曲多次却会轻易折掉呢?
    ——恩,一时还弄不清,容本官慢慢想来——但有一点是明确地——来人啊,将撒尿的那个无赖抓来,狠打40大板!
    卷积及拉普拉斯变换的通俗解释–对于我这类没学过信号系统的人来说太需要了
    卷积(convolution, 另一个通用名称是德文的Faltung)的名称由来,是在于当初定义它时,定义成 integ(f1(v)*f2(t-v))dv,积分区间在0到t之间。举个简单的例子,大家可以看到,为什么叫”卷积”了。比方说在(0,100)间积分,用简单的辛普生积分公式,积分区间分成100等分,那么看到的是f1(0)和f2(100)相乘,f1(1)和f2(99)相乘,f1(2)和f2 (98)相乘,……… 等等等等,就象是在坐标轴上回卷一样。所以人们就叫它”回卷积分”,或者”卷积”了。
    为了理解”卷积”的物理意义,不妨将那个问题”相当于它的时域的信号与系统的单位脉冲响应的卷积”略作变化。这个变化纯粹是为了方便表达和理解,不影响任何其它方面。将这个问题表述成这样一个问题:一个信号通过一个系统,系统的响应是频率响应或波谱响应,且看如何理解卷积的物理意义。
    假设信号函数为f, 响应函数为g。f不仅是时间的函数(信号时有时无),还是频率的函数(就算在某一固定时刻,还有的地方大有的地方小);g也是时间的函数(有时候有反应,有时候没反应),同时也是频率的函数(不同的波长其响应程度不一样)。那我们要看某一时刻 t 的响应信号,该怎么办呢?
    这就需要卷积了。
    要看某一时刻 t 的响应信号,自然是看下面两点:
    1。你信号来的时候正赶上人家”系统”的响应时间段吗?
    2。就算赶上系统响应时间段,响应有多少?
    响 应不响应主要是看 f 和 g 两个函数有没有交叠;响应强度的大小不仅取决于所给的信号的强弱,还取决于在某频率处对单位强度响应率。响应强度是信号强弱和对单位强度信号响应率的乘积。”交叠”体现在f(t1)和g(t-t1)上,g之所以是”(t-t1)”就是看两个函数错开多少。
    由于 f 和 g 两个函数都有一定的带宽分布(假若不用开头提到的”表述变化”就是都有一定的时间带宽分布),这个信号响应是在一定”范围”内广泛响应的。算总的响应信号,当然要把所有可能的响应加起来,实际上就是对所有可能t1积分了。积分范围虽然一般在负无穷到正无穷之间;但在没有信号或者没有响应的地方,积也是白积,结果是0,所以往往积分范围可以缩减。
    这就是卷积及其物理意义啊。并成一句话来说,就是看一个时有时无(当然作为特例也可以永恒存在)的信号,跟一个响应函数在某一时刻有多大交叠。
    *********拉普拉斯*********
    拉普拉斯(1729-1827) 是法国数学家,天文学家,物理学家。他提出拉普拉斯变换(Laplace Transform) 的目的是想要解决他当时研究的牛顿引力场和太阳系的问题中涉及的积分微分方程。
    拉普拉斯变换其实是一个数学上的简便算法;想要了解其”物理”意义 — 如果有的话 — 请看我举这样一个例子:
    问题:请计算十万乘以一千万。
    对于没学过指数的人,就只会直接相乘;对于学过指数的人,知道不过是把乘数和被乘数表达成指数形式后,两个指数相加就行了;如果要问究竟是多少,把指数转回来就是。
    “拉 普拉斯变换” 就相当于上述例子中把数转换成”指数” 的过程;进行了拉普拉斯变换之后,复杂的微分方程(对应于上例中”复杂”的乘法) 就变成了简单的代数方程,就象上例中”复杂”的乘法变成了简单的加减法。再把简单的代数方程的解反变换回去(就象把指数重新转换会一般的数一样),就解决了原来那个复杂的微分方程。
    所以要说拉普拉斯变换真有” 物理意义”的话,其物理意义就相当于人们把一般的有理数用指数形式表达一样。
    另外说两句题外话:
    1 。拉普拉斯变换之所以现在在电路中广泛应有,根本原因是电路中也广泛涉及了微分方程。
    2。拉普拉斯变换与Z变换当然有紧密联系;其本质区别在于拉氏变换处理的是时间上连续的问题,Z变换处理的是时间上分立的问题。
    Signals, Linear Systems, and Convolution
    Download from here
     
    我们都知道卷积公式,但是它有什么物理意义呢?平时我们用卷积做过很多事情,信号处理时,输出函数是输入函数和系统函数的卷积;在图像处理时,两组幅分辨率不同的图卷积之后得到的互相平滑的图像可以方便处理。卷积甚至可以用在考试作弊中,为了让照片同时像两个人,只要把两人的图像卷积处理即可,这就是一种平滑的过程,可是我们怎么才能真正把公式和实际建立起一种联系呢?生活中就有实例:
         比如说你的老板命令你干活,你却到楼下打台球去了,后来被老板发现,他非常气愤,扇了你一巴掌(注意,这就是输入信号,脉冲),于是你的脸上会渐渐地(贱贱地)鼓起来一个包,你的脸就是一个系统,而鼓起来的包就是你的脸对巴掌的响应。
          好,这样就和信号系统建立起来意义对应的联系。下面还需要一些假设来保证论证的严谨:假定你的脸是线性时不变系统,也就是说,无论什么时候老板打你一巴掌,打在你脸的同一位置(这似乎要求你的脸足够光滑,如果你说你长了很多青春痘,甚至整个脸皮处处连续处处不可导,那难度太大了,我就无话可说了),你的脸上总是会在相同的时间间隔内鼓起来一个相同高度的包来,并且假定以鼓起来的包的大小作为系统输出。好了,那么,下面可以进入核心内容——卷积了!
          如果你每天都到楼下去打台球,那么老板每天都要扇你一巴掌,不过当老板打你一巴掌后,你5分钟就消肿了,所以时间长了,你甚至就适应这种生活了……如果有一天,老板忍无可忍,以0.5秒的间隔开始不间断的扇你的过程,这样问题就来了:第一次扇你鼓起来的包还没消肿,第二个巴掌就来了,你脸上的包就可能鼓起来两倍高,老板不断扇你,脉冲不断作用在你脸上,效果不断叠加了,这样这些效果就可以求和了,结果就是你脸上的包的高度岁时间变化的一个函数了(注意理解)!
          如果老板再狠一点,频率越来越高,以至于你都辨别不清时间间隔了,那么,求和就变成积分了。可以这样理解,在这个过程中的某一固定的时刻,你的脸上的包的鼓起程度和什么有关呢?和之前每次打你都有关!但是各次的贡献是不一样的,越早打的巴掌,贡献越小,这就是说,某一时刻的输出是之前很多次输入乘以各自的衰减系数之后的叠加而形成某一点的输出,然后再把不同时刻的输出点放在一起,形成一个函数,这就是卷积。卷积之后的函数就是你脸上的包的大小随时间变化的函数。本来你的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么?反映到公式上,f(a)就是第a个巴掌,g(x-a)就是第a个巴掌在x时刻的作用程度,乘起来再叠加就ok了,这就是卷积!
         最后提醒各位,请勿亲身尝试……

    卷积的物理意义?
    在信号与系统中,两个函数所要表达的物理含义是什么?例如,一个系统,其单位冲激响应为h(t),当输入信号为f(t)时,该系统的输出为y(t)。为什么y(t)是f(t)和h(t)的卷积?(从数学推导我明白,但其物理意义不明白。)y(t)是f(t)和h(t)的卷积表达了一个什么意思?

    卷积(convolution, 另一个通用名称是德文的Faltung)的名称由来,是在于当初定义它时,定义成 integ(f1(v)*f2(t-v))dv,积分区间在0到t之间。举个简单的例子,大家可以看到,为什么叫“卷积”了。比方说在(0,100)间积分,用简单的辛普生积分公式,积分区间分成100等分,那么看到的是f1(0)和f2(100)相乘,f1(1)和f2(99)相乘,f1(2)和f2(98)相乘,......... 等等等等,就象是在坐标轴上回卷一样。所以人们就叫它“回卷积分”,或者“卷积”了。
    为了理解“卷积”的物理意义,不妨将那个问题“相当于它的时域的信号与系统的单位脉冲响应的卷积”略作变化。这个变化纯粹是为了方便表达和理解,不影响任何其它方面。将这个问题表述成这样一个问题:一个信号通过一个系统,系统的响应是频率响应或波谱响应,且看如何理解卷积的物理意义。
    假设信号函数为f, 响应函数为g。f不仅是时间的函数(信号时有时无),还是频率的函数(就算在某一固定时刻,还有的地方大有的地方小);g也是时间的函数(有时候有反应,有时候没反应),同时也是频率的函数(不同的波长其响应程度不一样)。那我们要看某一时刻 t 的响应信号,该怎么办呢?
    这就需要卷积了。
    其实卷积积分应用广泛用在信号里面,一个是频域一个是时域
     

    卷积是个啥?我忽然很想从本质上理解它。于是我从抽屉里翻出自己珍藏了许多年,每每下决心阅读却永远都读不完的《应用傅立叶变换》。
     
    3.1 一维卷积的定义
     
    函数f(x)与函数h(x)的卷积,由函参量的无穷积分

      定义。这里参量x和积分变量α皆为实数;函数f和h可实可复。
     
    定义虽然找到了,但我还是一头雾水。卷积是个无穷积分吗?那它是干啥用的?再往后翻:几何说明、运算举例、基本性质,一堆的公式,就是没有说它是干啥用的。我于是坐在那呆想,忽然第二个困扰我的问题冒了出来:傅立叶变换是个啥?接着就是第三个、第四个、……、第N个问题。
     
    傅立叶变换是个啥?听说能将时域上的东东变到频域上分析?哎?是变到频域上还是空间域上来着?到底啥是时域,频域,空间域?
     
    上网查傅立叶变换的物理意义,没发现明确答案,倒发现了许多和我一样晕着问问题的人。结果又多出了许多名词,能量?功率谱?图像灰度域?……没办法又去翻那本教材。
     
    1.1 一维傅立叶变换的定义与傅立叶积分定理
     
    设f(x)是实变量x的函数,该函数可实可复,称积分

    为函数f(x)的傅立叶变换。
     
    吐血,啥是无穷积分来着?积分是啥来着?还能记起三角函数和差化积、积化和差公式吗?我忽然有种想把高中课本寻来重温的冲动。
     
    卷积主要是为了将信号运算从时域转换为频域。
    信号的时域的卷积等于频域的乘积。
    利用这个性质以及特殊的δ函数可以通过抽样构造简单的调制电路
     
     
    我比较赞同卷积的相关性的作用  在通信系统中的接收机部分MF匹配滤波器等就是本质上的相关
    匹配滤波器最简单的形式就是原信号反转移位相乘积分得到的近似=相关
    相关性越好得到的信号越强   这个我们有一次大作业做的  做地做到呕吐  呵呵
    还有解调中一些东西本质就是相关
     

    卷积公式  解释  卷积公式是用来求随机变量和的密度函数(pdf)的计算公式。  定义式:  z(t)=x(t)*y(t)= ∫x(m)y(t-m)dm.   已知x,y的pdf,x(t),y(t).现在要求z=x+y的pdf. 我们作变量替显,令  z=x+y,m=x. 雅可比行列式=1.那么,z,m联合密度就是f(z,m)=x(m)y(z-m)*1. 这样,就可以很容易求Z的在(z,m)中边缘分布  即fZ(z)=∫x(m)y(z-m)dm..... 由于这个公式和x(t),y(t)存在一一对应的关系。为了方便,所以记 ∫x(m)y(z-m)dm=x(t)*y(t)   长度为m的向量序列u和长度为n的向量序列v,卷积w的向量序列长度为(m+n-1),   u(n)与v(n)的卷积w(n)定义为: w(n)=u(n)@v(n)=sum(v(m)*u(n-m)),m from 负无穷到正无穷;   当m=n时w(1) = u(1)*v(1)   w(2) = u(1)*v(2)+u(2)*v(1)   w(3) = u(1)*v(3)+u(2)*v(2)+u(3)*v(1)   …   w(n) = u(1)*v(n)+u(2)*v(n-1)+ … +u(n)*v(1)   …   w(2*n-1) = u(n)*v(n)   当m≠n时,应以0补齐阶次低的向量的高位后进行计算  这是数学中常用的一个公式,在概率论中,是个重点也是一个难点。

      卷积公式是用来求随机变量和的密度函数(pdf)的计算公式。
      定义式:
      z(t)=x(t)*y(t)= ∫x(m)y(t-m)dm.
      已知x,y的pdf,x(t),y(t).现在要求z=x+y的pdf. 我们作变量替显,令
      z=x+y,m=x. 雅可比行列式=1.那么,t,m联合密度就是f(z,m)=x(m)y(z-m)*1. 这样,就可以很容易求Z的在(z,m)中边缘分布
      即fZ(z)=∫x(m)y(z-m)dm..... 由于这个公式和x(t),y(t)存在一一对应的关系。为了方便,所以记 ∫x(m)y(z-m)dm=x(t)*y(t)
     
    卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。castlman的书对卷积讲得很详细。
    高斯变换就是用高斯函数对图像进行卷积。高斯算子可以直接从离散高斯函数得到:
    for(i=0; i<N; i++)
    {
    for(j=0; j<N; j++)
    {
    g[i*N+j]=exp(-((i-(N-1)/2)^2+(j-(N-1)/2)^2))/(2*delta^2));
    sum += g[i*N+j];
    }
    }
    再除以 sum 得到归一化算子
    N是滤波器的大小,delta自选
    首先,再提到卷积之前,必须提到卷积出现的背景。卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有任何意义的,除了那个所谓褶反公式上的数学意义和积分(或求和,离散情况下)。
    信号与线性系统,讨论的就是信号经过一个线性系统以后发生的变化(就是输入输出和所经过的所谓系统,这三者之间的数学关系)。所谓线性系统的含义,就是,这个所谓的系统,带来的输出信号与输入信号的数学关系式之间是线性的运算关系。
    因此,实际上,都是要根据我们需要待处理的信号形式,来设计所谓的系统传递函数,那么这个系统的传递函数和输入信号,在数学上的形式就是所谓的卷积关系。
    卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。

    参考:

    http://www.cnblogs.com/a-toad/archive/2008/10/24/1318921.html

    http://blog.sina.com.cn/s/blog_6d0e97bb01013op2.html

    展开全文
  • 自《图像处理中的数学修炼》原书第一版于2017年2月上市以来,加印重印多次,在京东和当当等主流在线购书网站上已经累计有超过3200个有效购买评论,并且在这两个网站上的好评度都超过99%。结合第一版书籍读者给出的...

    自《图像处理中的数学修炼》原书第一版于2017年2月上市以来,加印重印多次,在京东和当当等主流在线购书网站上已经累计有超过3200个有效购买评论,并且在这两个网站上的好评度都超过99%。结合第一版书籍读者给出的反馈,同时为了适应相关技术的快速发展,在首版发行三年之后的2020年,笔者再度与清华大学出版社合作,乘势推出全新的《图像处理中的数学修炼》(第2版)。
    《图像处理中的数学修炼》(第2版)当前,第一、二版书籍同时在售。你可以从任意主流电商购书平台上买,例如:

    新版的《图像处理中的数学修炼》全书共分十二章(*第一版书一共是八章):其中前五章主要是图像处理中最重要、最常用的数学基础,这也是每个期望进行图像处理研究和学习的人必须要掌握的基础,这部分内容包括:

    • 第1章 必不可少的数学基础(主要是微积分和场论)
    • 第2章 更进一步的数学内容(包括傅立叶变换、凸优化、数值计算、偏微分方程等)
    • 第3章 泛函分析及变分法
    • 第4章 概率论基础
    • 第5章 统计推断

    第六至第十二章(共7章)则结合图像处理领域比较流行的研究话题,举例说明前五章中数学基础在图像处理中的具体应用。这部分内容包括:

    • 第6章 子带编码与小波变换
    • 第7章 正交变换与图像压缩
    • 第8章 无所不在的高斯分布(主要是各种微分算子及边缘保持的图像去噪平滑技术)
    • 第9章 空间域图像平滑与降噪(维纳滤波、双边滤波、导引滤波、字典学习等)
    • 第10章 图像融合与抠图技术(例如贝叶斯抠图技术、泊松方程应用等)
    • 第11章 处理彩色图像(色彩空间理论与彩色图像增强,例如CLAHE等)
    • 第12章 图像去雾(介绍三个比较经典的图像去雾算法原理及其实现)

    你可以从【代码下载链接】中获取本书的配套代码。

    文末,我们给出本书的目录,以期帮助读者可以更好地了解书籍内容,从而辅助购买决策!


    第1章 必不可少的数学基础

    1.1 极限及其应用
      1.1.1 数列的极限
      1.1.2 级数的敛散  
      1.1.3 函数的极限  
      1.1.4 极限的应用
    1.2 微分中值定理
      1.2.1 罗尔中值定理
      1.2.2 拉格朗日中值定理
      1.2.3 柯西中值定理
      1.2.4 泰勒公式
      1.2.5 黑塞矩阵与多元函数极值
    1.3 向量代数与场论
      1.3.1 牛顿-莱布尼茨公式
      1.3.2 内积与外积
      1.3.3 方向导数与梯度
      1.3.4 曲线积分
      1.3.5 格林公式
      1.3.6 积分与路径无关条件
      1.3.7 曲面积分
      1.3.8 高斯公式与散度
      1.3.9 斯托克斯公式与旋度
    本章参考文献

     

    第2章 更进一步的数学内容

    2.1 傅里叶级数展开
      2.1.1 函数项级数的概念
      2.1.2 函数项级数的性质
      2.1.3 傅里叶级数的概念
      2.1.4 傅里叶变换的由来
      2.1.5 卷积定理及其证明
    2.2 凸函数与詹森不等式
      2.2.1 凸函数的概念
      2.2.2 詹森不等式及其证明
      2.2.3 詹森不等式的应用
    2.3 常用经典数值解法
      2.3.1 牛顿迭代法
      2.3.2 雅可比迭代
      2.3.3 高斯迭代法
      2.3.4 托马斯算法
    2.4 有限差分法求解偏微分方程
      2.4.1 椭圆方程
      2.4.2 有限差分法
      2.4.3 方程组求解
    本章参考文献

     

    第3章 泛函分析及变分法

    3.1 勒贝格积分理论
      3.1.1 点集的勒贝格测度
      3.1.2 可测函数及其性质
      3.1.3 勒贝格积分的定义
      3.1.4 积分序列极限定理
    3.2 泛函与抽象空间
      3.2.1 线性空间
      3.2.2 距离空间
      3.2.3 赋范空间
      3.2.4 巴拿赫空间
      3.2.5 内积空间
      3.2.6 希尔伯特空间
      3.2.7 索伯列夫空间
    3.3 从泛函到变分法
      3.3.1 理解泛函的概念
      3.3.2 变分的概念
      3.3.3 变分法的基本方程
      3.3.4 理解哈密尔顿原理
      3.3.5 等式约束下的变分
      3.3.6 巴拿赫不动点定理
      3.3.7 有界变差函数空间
    本章参考文献

     

    第4章 概率论基础

    4.1 概率论的基本概念
      4.2 随机变量数字特征
      4.2.1 期望
      4.2.2 方差
      4.2.3 矩与矩母函数
      4.2.4 协方差与协方差矩阵
    4.3 基本概率分布模型
      4.3.1 离散概率分布
      4.3.2 连续概率分布
    4.4 概率论中的重要定理
      4.4.1 大数定理
      4.4.2 中央极限定理
    4.5 经验分布函数
    4.6 贝叶斯推断

      4.6.1 先验概率与后验概率
      4.6.2 共轭分布
    本章参考文献

     

    第5章 统计推断

    5.1 随机采样
    5.2 参数估计

      5.2.1 参数估计的基本原理
      5.2.2 单总体参数区间估计
      5.2.3 双总体均值差的估计
      5.2.4 双总体比例差的估计
    5.3 假设检验
      5.3.1 基本概念
      5.3.2 两类错误
      5.3.3 均值检验
    5.4 极大似然估计
      5.4.1 极大似然法的基本原理
      5.4.2 求极大似然估计的方法
    本章参考文献

     

    第6章 子带编码与小波变换

    6.1 图像编码的理论基础
      6.1.1 率失真函数
      6.1.2 香农下边界
      6.1.3 无记忆高斯信源
      6.1.4 有记忆高斯信源
    6.2 子带编码基本原理
      6.2.1 数字信号处理基础
      6.2.2 多抽样率信号处理
      6.2.3 图像信息子带分解
    6.3 哈尔函数及其变换
      6.3.1 哈尔函数的定义
      6.3.2 哈尔函数的性质
      6.3.3 酉矩阵与酉变换
      6.3.4 二维离散线性变换
      6.3.5 哈尔基函数
      6.3.6 哈尔变换
    6.4 小波及其数学原理
      6.4.1 小波的历史
      6.4.2 小波的概念
      6.4.3 多分辨率分析
      6.4.4 小波函数的构建
      6.4.5 小波序列展开
      6.4.6 离散小波变换
      6.4.7 连续小波变换
      6.4.8 小波的容许条件与基本特征
    6.5 快速小波变换算法
      6.5.1 快速小波正变换
      6.5.2 快速小波逆变换
      6.5.3 图像的小波变换
    6.6 小波在图像处理中的应用
    本章参考文献

     

    第7章 正交变换与图像压缩

    7.1 傅里叶变换
      7.1.1 信号处理中的傅里叶变换
      7.1.2 数字图像中的傅里叶变换
      7.1.3 快速傅里叶变换的算法
    7.2 离散余弦变换
      7.2.1 基本概念及数学描述
      7.2.2 离散余弦变换的快速算法
      7.2.3 离散余弦变换的意义与应用
    7.3 沃尔什-阿达马变换
      7.3.1 沃尔什函数
      7.3.2 离散沃尔什变换及其快速算法
      7.3.3 沃尔什变换的应用
    7.4 卡洛南-洛伊变换
      7.4.1 主成分变换的推导
      7.4.2 主成分变换的实现
      7.4.3 基于KL变换的图像压缩
    本章参考文献

     

    第8章 无所不在的高斯分布

    8.1 卷积积分与邻域处理
      8.1.1 卷积积分的概念
      8.1.2 模板与邻域处理
      8.1.3 图像的高斯平滑
    8.2 边缘检测与微分算子
      8.2.1 哈密尔算子
      8.2.2 拉普拉斯算子
      8.2.3 高斯拉普拉斯算子
      8.2.4 高斯差分算子
    8.3 保持边缘的平滑处理
      8.3.1 各向异性扩散滤波
      8.3.2 基于全变差的方法
    8.4 多尺度空间及其构建
      8.4.1 高斯滤波与多尺度空间的构建
      8.4.2 基于各向异性扩散的尺度空间
    本章参考文献

     

    第9章 空间域图像平滑与降噪

    9.1 自适应图像降噪滤波器
    9.2 约束复原与维纳滤波
      9.2.1 用于图像复原的逆滤波方法
      9.2.2 维纳滤波的实现
      9.2.3 限制性图像复原的数学推导
    9.3 双边滤波
    9.4 导向滤波
    9.5 字典学习与图像去噪
    本章参考文献

     

    第10章 图像融合与抠图技术

    10.1 基于数学物理方程的方法
      10.1.1 泊松方程的推导
      10.1.2 图像的泊松编辑
      10.1.3 离散化数值求解
      10.1.4 基于稀疏矩阵的解法
    10.2 基于贝叶斯推断的方法
    本章参考文献

     

    第11章 处理彩色图像

    11.1 从认识色彩开始
      11.1.1 什么是颜色
      11.1.2 颜色的属性
      11.1.3 光源能量分布图
    11.2 CIE色度图
      11.2.1 CIE色彩模型的建立
      11.2.2 CIE色度图的理解
      11.2.3 CIE色度图的后续发展
    11.3 常用的色彩空间
      11.3.1 RGB颜色空间
      11.3.2 CMY/CMYK颜色空间
      11.3.3 HSV/HSB颜色空间
      11.3.4 HSI/HSL颜色空间
      11.3.5 Lab颜色空间
      11.3.6 YUV/YCbCr颜色空间
    11.4 色彩空间的转换方法
      11.4.1 RGB转换到HSV的方法
      11.4.2 RGB转换到HSI的方法
      11.4.3 RGB转换到YUV的方法
      11.4.4 RGB转换到YCbCr的方法
    11.5 基于直方图的色彩增强
      11.5.1 普通直方图均衡
      11.5.2 CLAHE算法
      11.5.3 直方图规定化
    本章参考文献

     

    第12章 图像去雾

    12.1 暗通道先验的去雾算法
      12.1.1 暗通道的概念与意义
      12.1.2 暗通道去雾霾的原理
      12.1.3 算法实现与应用
    12.2 优化对比度增强算法
      12.2.1 计算大气光值
      12.2.2 透射率的计算
      12.2.3 实验结果与分析
    12.3 基于Retinex的图像去雾算法
      12.3.1 单尺度Retinex算法
      12.3.2 多尺度Retinex算法与MSRCR
    本章参考文献

    展开全文
  • 本文是一篇关于深度学习优化方法——梯度下降的介绍性文章。作者通过长长的博文,简单介绍了梯度下降的概念、优势以及两大挑战。文中还配有大量生动形象的三维图像,有兴趣的亲了解一下? 从很大程度上来说,深度...

    本文是一篇关于深度学习优化方法——梯度下降的介绍性文章。作者通过长长的博文,简单介绍了梯度下降的概念、优势以及两大挑战。文中还配有大量生动形象的三维图像,有兴趣的亲了解一下?

    从很大程度上来说,深度学习实际上是在解决大量烦人的优化问题。神经网络仅仅是一个非常复杂的函数,包含数百万个参数,这些参数代表的是一个问题的数学解答。以图像分类为例,AlexNet 就是一个数学函数,它以代表图像 RGB 值的数组为输入,生成一组分类得分的输出。

    实质上,通过训练神经网络,我们是在最小化一个损失函数。这个损失函数的值衡量了我们网络的性能在给定数据集上离完美还差多少。

    损失函数

    简单起见,假设我们的网络只有两个参数。实际上,这个数量是在十亿左右,但是我们在这篇文章中会坚持使用两个参数的例子,以便我们在做一些可视化的尝试时不会把自己逼疯。一个很棒的损失函数的轮廓可能是这样的。

    损失函数的轮廓

    为何我说这是一个很棒的损失函数?因为拥有这种轮廓的损失函数就像圣诞老人一样,是不存在的。然而,它仍然是一个不错的教学工具,有助于全面了解关于梯度下降的一些最重要的想法。那么,我们从这里开始吧。

    x 轴和 y 轴分别代表两个权值,z 轴代表在给定两个特定权值的情况下损失函数的值。我们的目标就是找到损失最小的特定权值,这个点被称作损失函数的最小值点。

    你一开始就随机初始化了权值,所以你的神经网络可能会表现得像喝醉了的你一样,把猫的图片归类为人。这样的情况对应的是损失函数轮廓中的 A 点,此处的网络性能十分差,因此损失也很高。

    我们需要寻找一种能够导航到「谷底」B 点处的方法,这里的损失函数值最小。那么我们要怎么做呢?

    梯度下降

    初始化权值的时候,我们处于损失函数图形中的 A 点。首先要做的就是查看 x-y 平面中所有可能的方向,看看哪个方向是损失函数的值下降最陡峭的方向。这个就是我们必须移动的方向,它恰恰与梯度的方向相反。梯度是高维导数的另一种说法,它给出了最陡峭的上升方向。

    要想理解这个概念,请看下图。在曲面的任何一点,我们都能够定义一个与其相切的平面。在更高维度,我们总能够定义一个超平面,但在这里我们还是坚持使用 3 维空间。然后,在这个平面上有无限个方向。其中,准确来说只有一个使函数上升最快的方向,这个方向由梯度给出,与之相反的方向就是下降最快的方向。这就是算法名称的来源,我们沿着梯度的方向进行下降,所以就叫做梯度下降。

    现在,既然已经有了前进方向,我们必须决定需要采取步子的大小,而控制下降步幅大小的参数即学习率。为了保证降到最小值,我们必须谨慎地选择学习率。

    如果移动得太快,我们可能越过最小值,沿着「山谷」的山脊蹦蹦跳跳,永远都不可能到达最小值。如果移动太慢,训练可能花费太长的时间,根本就不可行,此外太慢的学习率也容易让算法陷入极小值,我们会在本文后面的部分讨论。

    一旦有了梯度和学习率,我们就开始行动,然后在最终到达的任何位置重新计算梯度,然后重复这个过程。

    梯度的方向告诉我们哪个方向上升的最快,它的幅值则表示最陡峭的上升/下降有多陡。所以,在最小值的地方,曲面轮廓几乎是平坦的,我们期望得到几乎为零的梯度。事实上,最小值点的梯度就是 0。

    梯度下降过程

    使用太大的学习率

    在实践中,我们可能永远无法精确地达到最小值,但是我们能够在最小值附近的平坦区域震荡。当我们在这个区域震荡时,损失值几乎是我们能够达到的最小值,并且不会有很大的变化,因为我们是在真实的最小值附近跳动。通常,当损失值在预定的数字内没有提升的时候我们会停止迭代,例如 10 次或者 20 次迭代。当这种情况发生时,我们就说训练已经收敛了,或者说收敛已经实现了。

    常见的错误

    让我稍微偏离主题一会。如果搜索梯度下降的可视化图,你很可能会看到一个起于一个点、终于最小值点的轨迹,就像前文动画所展示的一样。然而,这个关于梯度下降的描述并不准确。我们得到的轨迹完全局限在 x-y 平面内,这个平面包含权重。

    正如上面的动画所描述的,梯度下降并不涉及在 z 轴方向上的移动。因为仅由 x 轴和 y 轴方向描述的权重是自由参数。实际得到的轨迹是定义在 x-y 平面中的,如下图所示:

    实际的梯度下降轨迹

    x-y 平面中的每一个点代表着一个唯一的权重组合,而我们希望有一组由最小值描述的权重。

    基本方程

    描述梯度下降更新规则的基本方程是:

    每一次迭代中都执行更新。此处,w 是权重向量,它位于 x-y 平面。我们从这个向量中减去学习率α乘上损失函数相对于权重的梯度。梯度是一个向量,它给出了损失函数上升最快的方向。下降最快的方向恰好和梯度方向相反,这就是为什么要从权重向量中减去梯度向量的原因。

    如果想象向量对你来说有一些难度,那么,几乎同样的更新规则同时适用于网络的每一个权重。唯一的变化是,我们现在对每个权重单独执行更新,上述方程中的梯度被替换为梯度向量沿着特定权重方向的投影。

    对所有的权重同时执行更新。

    在做减法之前,我们用学习率与梯度向量相乘。这是我们之前讨论过的步骤。要知道,即使我们保持学习率不变,步长也会因为梯度大小,即损失函数轮廓的陡峭性变化而变化。随着我们接近最小值点,梯度会接近于 0,我们会以越来越小的步长接近最小值点。

    理论上而言,这样很好,因为我们希望当接近一个最小值的时候算法能够采取更小的步长。步长太大有可能导致跳过最小值,并且在最小值脊梁之间来回跳动。

    梯度下降中常用的一个技术是采用可变的学习率,而不是固定的学习率。初始时,我们可以使用较大的学习率。但是到了后来,随着接近最小值点,我们需要慢下来。实现这种策略的一种方法就是模拟退火,也就是衰减的学习率。在这种情况下,学习率在股东能够数量的迭代次数中逐渐减小。

    梯度下降挑战之一:局部极小值

    到目前为止,梯度下降的故事听起来真的很美好。现在,我来揭开它的面纱。还记得我之前说过有种损失函数很好,而这种损失函数是不存在的这句话吗?它们确实是不存在的。

    首先,神经网络是复杂的函数,我们在假设的函数中引入了大量的非线性变换。得到的损失函数看起来并不太好,同样只有一个我们可以收敛到的最小值点。事实上,这种理想的损失函数被称作「凸函数」(总是向上弯曲的函数),而深度网络的损失函数很难是凸的。实际上,它们很可能是这样的:

    在上图中,存在梯度为 0 的局部极小值点。然而,我们想要达到的全局最小值点,却是无法实现的。现在,如果你将权值初始化在 A 点,那么你将会收敛到局部极小值点,而且,一旦你收敛到这个极小值点,梯度下降将没法使你离开这里。

    梯度下降是由梯度驱动的,它在任何一个极小值点都会为 0。局部极小值之所以被称作局部极小值,是因为损失函数在该点的值在局部区域是最小的。而全局最小值被称作全局最小值,是因为在损失函数在该点的值在整个区域最小。

    更糟糕的是,由于我们考虑的那个 3 维损失函数轮廓在实际中是从没有发生过的,损失函数的轮廓可能更加复杂。在实践中,我们的神经网络大约会有 10 亿个权重,给我们一个大约(10 亿+1)维的函数。

    事实上,很难想象一个如此多维度的函数是什么样子的。然而,深度学习领域如今人才济济,人们已经想出了以 3D 的形式可视化损失函数轮廓的方法。最近的一篇论文提出了一种名为「Filter Normalization」的技术,该项技术解释了超出本文范围的内容。然而,它确实让我们看到了我们所处理的损失函数的潜在复杂性。例如,下图是 VGG-56 在 CIFAR-10 数据集上构建的损失函数的 3D 架构。

    一个复杂的损失函数图像(图源:https://www.cs.umd.edu/~tomg/projects/landscapes/)

    正如你所看到的,到处都是局部极小值点。

    梯度下降挑战之二:鞍点

    关于梯度下降的局限性,我们得到的基本教训是:一旦到达梯度为 0 的区域,不管极小值点的质量如何,它都几乎无法逃离。我们面临的另一种问题是鞍点,它们的形状如下:

    鞍点

    你也可以在之前的图片中看到两座山峰相遇时候的鞍点。

    鞍点得名于它的形状类似于马鞍。尽管它在 x 方向上是一个最小值点,但是它在另一个方向上是局部最大值点,并且,如果它沿着 x 方向变得更平坦的话,梯度下降会在 x 轴振荡并且不能继续根据 y 轴下降,这就会给我们一种已经收敛到最小值点的错觉。

    随机性的解救

    那么,我们如何在尝试收敛到全局最优值的同时摆脱局部极小值和鞍点呢?答案是使用随机梯度下降。

    到目前为止,我们一直使用通过对训练集上的所有可能样本的损失值求和得到的损失函数进行梯度下降。如果我们进入局部极小值或者鞍点,我们就会被困住。帮助梯度下降摆脱这些困境的一种方法就是随机梯度下降。

    在随机梯度下降中,我们不是通过对所有损失函数求和来计算损失函数的梯度,而是通过计算仅仅一个随机抽样(不替换)例子的损失梯度来采取步骤。随机梯度下降中的每个样本都是随机选择的,相比之下,早期方法在一个批量中处理所有的样本,因此称为批量梯度下降。

    更新规则也做了相应的改变。

    这意味着,我们每一步采用的损失函数都不同于实际的损失函数(它是每一个样本的损失函数的和)。这种「一个样本损失函数」在某一特定点的梯度实际上可能指向与「所有样本损失函数」的梯度略有不同的方向。

    也就是说,尽管「所有样本损失函数」的梯度可能把我们推向一个局部极小值,或者使我们困在一个鞍点,但是这种「一个样本损失函数」的梯度可能指向一个不同的方向,并有可能帮助我们避开这些情况。

    「所有样本损失函数」的一个局部最小值点也应该考虑在内。如果我们采用批量梯度下降,那么我们会被困在这里,因为这里的梯度始终会指向局部最小值点。但是,如果我们使用随机梯度下降,这个点可能不在「一个样本损失函数」轮廓的局部最小值周围,这使得我们远离局部最小值点。

    即使我们陷在「一个样本损失函数」的局部最小值点,下一个随机采样点的「一个样本损失函数」的损失情况也可能不同,从而使我们能够继续移动。

    当它收敛的时候,它会收敛到几乎所有「一个样本损失函数」的最小值。也有经验显示,鞍点是极不稳定的,轻轻一推就可以摆脱。

    所以,这是否意味着在实践中应该使用这种一个样本的随机梯度下降呢?

    批大小

    答案是否定的。尽管从理论上而言,随机梯度下降可能给我们带来最好的结果,但是从计算角度而言,它并不是一个非常可行的选择。当我们使用由所有单个损失函数相加得到的函数进行梯度下降时,所有单个损失函数的梯度可以并行计算,而使用随机梯度下降的时候,梯度的计算必须一个一个的顺序进行。

    因此,我们所做的是一个平衡的行为。我们使用固定数量(例如 16、32 或者 128 个)的样本形成一个 mini-batch 来构建损失函数,而不是使用整个数据集或者单个样本。这个词与一次处理所有样本形成了对比,它通常被称作批梯度下降。选择 mini-batch 的大小是为了保证我们有足够的随机性摆脱局部最小值,同时可以利用足够的并行计算力。

    重新审视局部极小值:它们并没有你想象的那么糟糕

    不要急着反对局部极小值,最近的研究表明局部最小值并不一定就是坏的。在神经网络的损失情况下,最小值实在太多了,好的局部极小值可能和全局最小值一样好。

    我为什么说好?是因为你仍可能陷入由不稳定的训练样本导致的局部极小值中。好的局部极小值,或者文献中提到的最优局部极小值,在给定神经网络的高维损失函数中也可能是大量存在的。

    你可能还会注意到,很多神经网络都在执行分类任务。如果一个局部极小值对应着 0.7—0.8 的正确标签分数,而全局最小值能够产生 0.95-0.98 的正确标签分数,那么两者输出的预测标签结果将是相同的。

    最小值的一个理想属性是它应该在平坦的一面。为什么?因为平坦的最小值很容易收敛到,而且越过最小值或者在最小值的脊梁之间跳跃的可能性更小。

    更重要的是,我们期望测试集的损失曲面与我们训练的训练集的损失曲面略有不同。对处于平坦又较宽处的极小值,由于这种变化,损失不会有太大变化,但处于相对较窄处的极小值不是这样。我们要指出的一点是,更平坦处的最小值能够更好地泛化,因此是可取的。

    重新审视学习率

    近来,针对损失函数中的次优最小值,关于学习率调度的研究激增。即使学习率下降,也有可能陷入局部极小值。传统上,要么在固定次数的迭代之后训练完成,要么在损失值没有改善的情况下,固定次数的迭代(比如 10 次)之后训练停止。这种情况在文献中被称为早停。

    使用较快的学习率也有助于我们在训练中更早地跳过一些局部极小值。

    人们也把早停和学习率衰减结合起来,在迭代 10 次后损失函数没有改善的情况下学习率开始衰减,最终在学习率低于某个确定的阈值时停止。

    近年来,循环学习率变得流行起来,在循环学习率中,学习率是缓慢增加的,然后缓慢减小,以一种循环的形式持续着。

    Leslie N. Smith 提出的 Triangular 和 Triangular2 循环学习率方法。左侧的最大学习率和最小学习率保持不变。右侧的区别在于每个周期之后学习率减半。图源:Hafidz Zulkifli

    所谓暖重启的随机梯度下降,基本上是将学习率退火到一个下限,然后将学习率恢复到初始值。

    对于学习率如何下降,我们也有不同的计划,例如,从指数衰减到余弦衰减。

    余弦退火与重启相结合

    最近的一篇论文介绍了一种叫做「随机加权平均」的技术。作者提出了一种方法,首先收敛到最小值,缓存权重,然后将学习率恢复到更高的值。然后,这种更高的学习率将算法从最小值推到损失面中的随机点。然后使算法再次收敛到另一个最小值。重复几次,最后,他们对所有缓存权重集的预测进行平均,以产生最终预测。

    随机加权平均技术

    结论

    所以,这是梯度下降的介绍性文章,这是深度学习优化工作的驱动力,因为关于反向训练的开创性论文显示,可以通过计算梯度来训练神经网络。然而,关于梯度下降还有一个我们在这篇文章中没有谈到的缺失部分,那就是解决 pathological curvature 的问题。对经典随机梯度下降的扩展,如动量、RMSProp 和 Adam,被用来克服这个关键问题。

    展开全文
  • 计算机视觉图像处理之Task04

    千次阅读 2020-07-06 23:14:45
    用HOG算子进行行人检测介绍算法流程图像处理运用Gamma公式对图像Gamma公式图像展示计算图像梯度代码计算梯度直方图计算方法BLOCK归一化目的计算代码实践 介绍 HOG特征算子是在深度学习之前非常流行的一种图像特征...
  • 图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的...
  • 图像梯度和散度

    千次阅读 2018-12-06 16:11:03
    参考: https://blog.csdn.net/yes1989yes/article/details/73139236 https://blog.csdn.net/u011240016/article/details/52724926 ... h...
  • 数字图像处理中常用图像分割算法有哪些? 1.多数的图像分割算法 2.图像边缘分割 3.图像阈值分割 4.基于区域的分割 5.形态学分水岭算法 多数的图像分割算法 均是基于灰度值的不连续和相似的性质。在前者,...
  • 综述---图像处理中的注意力机制

    万次阅读 多人点赞 2019-09-30 11:40:33
    论文阅读: 图像分类的注意力机制(attention) 介绍了Spatial transformer networks、Residual Attention Network、Two-level Attention、SENet、Deep Attention ...快速理解图像处理中注意力机制的应用 主要讲解...
  • (1)基于阈值的分割方法:可在各种颜色空间或不同通道完成阈值、自适应阈值、 (2)基于边缘的分割方法:各种边缘检测算子 (3)基于区域的分割方法:分水岭、区域归并与分裂 (4)图割分割:最大(最小割)...
  • 图像处理经典文献

    千次阅读 2018-01-29 10:43:26
    我们所说的图像处理实际上就是数字图像处理,是把真实世界的连续三维随机信号投影到传感器的二维平面上,采样并量化后得到二维矩阵。数字图像处理就是二维矩阵的处理,而从二维图像恢复出三维场景就是计算机视觉...
  • 图像处理岗位面试题搜罗汇总

    万次阅读 多人点赞 2018-06-21 15:11:46
    原文...传统图像处理部分 图像处理基础知识 彩色图像、灰度图像、二...
  • 图像处理职位面试题汇总(1)

    万次阅读 多人点赞 2014-04-06 13:36:16
    Matlab 读、写及显示一幅图像的命令各是什么?解:第一、Matlab图像函数是imread( )。imread 函数用于读入各种图像文件,其一般的用法为:[X,MAP]=imread(‘filename’,‘fmt’)其中,X,MAP分别为读出的...
  • 【试题汇总】图像处理职位面试题库笔试题汇总(1) 返回脚本百事通 Matlab编程部分 1. Matlab 读、写及显示一幅图像的命令各是什么? 解:第一、Matlab读图像函数是imread( )。imread 函数用于读入...
  • 医学图像处理综述

    千次阅读 2019-07-10 19:38:06
    医学图像处理的对象是各种不同成像机理的医学影像,临床广泛使用的医学成像种类主要有X-射线成像 (X-CT)、核磁共振成像(MRI)、核医学成像(NMI)和超声波成像(UI)四类。在目前的影像医疗诊断,主要是通过...
  • 检测是计算机视觉任务的主要任务之一,而且应用很广泛。检测技术可以帮助人类检测那些容易被肉眼忽略的错误;也可以”帮助“自动驾驶汽车感知空间信息。无疑自动化的检测技术的广泛应用将为我们带来效率与安全。 ...
  • 图像处理常见问题

    2018-10-28 22:58:31
    1. Matlab 读、写及显示一幅图像的命令各是什么? 解:第一、Matlab图像函数是imread( )。imread 函数用于读入各种图像文件,其一般的用法为:[X,MAP]=imread(‘filename’,‘fmt’) 其中,X,MAP分别为...
  • 图像处理之霍夫变换圆检测算法

    千次阅读 2017-08-15 09:35:20
    图像处理之霍夫变换圆检测算法 之前写过一篇文章讲述霍夫变换原理与利用霍夫变换检测直线, 结果发现访问量还是蛮 多,有点超出我的意料,很多人都留言说代码写得不好,没有注释,结构也不是很清晰,所以 我萌发...
  • 梯度幅相似性偏差 GMSD(以下使用GMSD作为简称)的提出主要是受到图像梯度场对于图像退化比较敏感这一事实的启发提出的。GMSD出现比较晚(2013年),在此之前有很多比较流行的评估指标比如VIF和FSIM等等,但是在当时...
1 2 3 4 5 ... 20
收藏数 16,841
精华内容 6,736
关键字:

图像处理中的梯度流