美文网首页
局部拉普拉斯滤波器

局部拉普拉斯滤波器

作者: 学而时习之_不亦说乎 | 来源:发表于2017-08-01 00:05 被阅读338次

    拉普拉斯金字塔用于在多个尺度上对图像进行分析,其应用范围广泛,如压缩、纹理合成 和调和化等。但其在边缘处理方向的应用非常少,因为拉普拉斯算子为二阶差分,其方向信息丢失,常产生双像素,对噪声有双倍加强作用,因此它很少直接用于边缘检测。一般是将高斯滤波和拉普拉斯边缘检测结合在一起,即Laplacian of Gaussian (LoG)算子优化而成的-----先用高斯算子对图像进行平滑(去掉噪声的影响),然后采用拉普拉斯算子根据二阶微分过零点来检测图像边缘。局部拉普拉斯滤波器创新的使用拉普拉斯的方法来进行边缘的检测,并且区分出图像中的大尺度边缘和小尺度细节。

    我们首先通过一个实际的例子,来对拉普拉斯滤波器有一个直观的了解,其中laplacian_pyramid函数,以及与其相关的函数可以再图像金字塔这篇文章中找到。

    close all
    m = 4;
    n = 4;
    k = 1;
    
    %--------------------原始信号构建---------------------%
    figure
    %生产随机噪声信号
    D = rand(1,200)*0.5;
    subplot(m,n,k);
    plot(D);
    ylim([-4 4]);
    title('高频细节信号');
    k = k +1;
    %产生一个阶跃信号
    E = [zeros(1,100),5*ones(1,100)];
    subplot(m,n,k);
    plot(E);
    title('阶跃信号');
    k = k + 1;
    
    %产生一个缓慢变化的信号S
    S = 1:1:200;
    S = 0.6*sin(pi/200.*S);
    subplot(m,n,k);
    plot(S)
    ylim([-1,1]);
    title('缓慢变化信号');
    k = k + 1;
    
    %得到最终信号signal
    signal  = D + E + S;
    subplot(m,n,k);
    plot(signal)
    title('1D信号');
    k = k + 1;
    
    D_py = laplacian_pyramid(D,4);
    E_py = laplacian_pyramid(E,4);
    S_py = laplacian_pyramid(S,4);
    signal_py = laplacian_pyramid(signal,4);
    
    %--------------------得到第一层拉普拉斯金字塔---------------------%
    subplot(m,n,k);
    plot(D_py{1});
    ylim([-2 2])
    title('高频细节信号 L0 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(E_py{1});
    title('阶跃信号 L0 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(S_py{1});
    ylim([-1,1]);
    title('缓慢变化信号 L0 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(signal_py{1});
    title('1D信号 L0 ');
    k = k +1;
    
    %--------------------得到第二层拉普拉斯金字塔---------------------%
    subplot(m,n,k);
    plot(D_py{2});
    ylim([-2 2])
    title('高频细节信号 L1 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(E_py{2});
    title('阶跃信号 L1 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(S_py{2});
    title('缓慢变化信号 L1 ');
    ylim([-1,1]);
    k = k +1;
    
    subplot(m,n,k);
    plot(signal_py{2});
    title('1D信号 L1 ');
    k = k +1;
    
    %--------------------得到第三层拉普拉斯金字塔---------------------%
    subplot(m,n,k);
    plot(D_py{3});
    ylim([-2 2])
    title('高频细节信号 L2 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(E_py{3});
    title('阶跃信号 L2 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(S_py{3});
    ylim([-1,1]);
    title('缓慢变化信号 L2 ');
    k = k +1;
    
    subplot(m,n,k);
    plot(signal_py{3});
    title('1D信号 L2 ');
    k = k +1;
    

    通过上面的代码,我们可以得到如下的图像:

    • Local Edge-Detail Separation(局部边缘-细节分割)
      其中,图像中的第一行是原始信号心态,后续行为相应信号在不同层次的拉普拉斯金字塔信号。比如第一行中最后一列的1D信号为前面的高频信号、阶跃信号和缓慢变化信号之和。缓慢变化信号在不同层次的拉普拉斯金字塔中表现出来的信号几乎均为零信号(第三列)。这一点不难理解,缓慢渐变信号的一阶导数为一个固定斜率的信号,二阶导数则为接近零。我们可以将第四列信号看做第一列信号(高频信号)和第二列信号(阶跃信号)之和,并且在靠近边缘的地方,我们可以认为第四列信号近似第二列信号,而在在远离边缘的地方,第四列信号近似第一列信号。很显然的,如果我们对第四列信号进行类似阈值分割的操作,可以很容易的得到边缘和细节信号。
    • Range Compression(范围压缩)
      首先,我们来看一看这样的情况:
      小边缘和大边缘
      在右边的图中,边缘信号比较大,从0-40的范围,而左边图中,边缘信号比较小,从0-6,我们可以认为左边的信号是右边的信号对边缘进行压缩,并且保留了细节的结果。那我们来比较一下两个信号对应的拉普拉斯金字塔的区别。在波形上,它们非常相似,只是小边缘信号的振幅比较小。换个角度来看这个问题,如果我们对大边缘信号的拉普拉斯金字塔中代表边缘的系数进行压缩,就可以得到小边缘的拉普拉斯金字塔,那么最后通过重建,我们就可以得到小边缘信号,相当于对大边缘进行了压缩,同时保留了细节,换言之,实现了Edge-aware滤波。那么,如何对大边缘信号的拉普拉斯信号进行重构呢?对其信号的改变如何影响最后生成的结果呢?这些有待我们使用进一步的实验来探索。

    利用拉普拉斯来进行范围压缩的思路如下:针对输入信号I,如果我们希望得到range compressed之后的输出I',那我们可以首先构建输出信号I'的拉普拉斯金字塔信号{L[I']},利用该金字塔信号来重构I'信号,而这个拉普拉斯金字塔信号{L[I']}对大的边缘信号进行了相应的压缩,所以得到的输出I'也就是压缩后的结果了。现在所有的问题都落在了,如何构建这个拉普拉斯金字塔信号{L[I']}上。

    (未完待续)

    相关文章

      网友评论

          本文标题:局部拉普拉斯滤波器

          本文链接:https://www.haomeiwen.com/subject/qjjskxtx.html