代码之家  ›  专栏  ›  技术社区  ›  momo

正在生成的内核类型

  •  2
  • momo  · 技术社区  · 6 年前

    我想从MATLAB中了解非局部均值滤波算法的实现 here . 我想了解以下代码部分产生的内核类型:

    kernel=zeros(2*f+1,2*f+1);   
    for d=1:f    
      value= 1 / (2*d+1)^2 ;    
      for i=-d:d
          for j=-d:d
              kernel(f+1-i,f+1-j)= kernel(f+1-i,f+1-j) + value ;
          end
      end
    end
    kernel = kernel ./ f;
    

    我试着看中间输出,我认为它产生了一个高斯加权核,但我不确定这是否正确。

    输出:

    kernel =
    
    0.0200    0.0200    0.0200    0.0200    0.0200
    0.0200    0.0756    0.0756    0.0756    0.0200
    0.0200    0.0756    0.0756    0.0756    0.0200
    0.0200    0.0756    0.0756    0.0756    0.0200
    0.0200    0.0200    0.0200    0.0200    0.0200
    

    论文参考: Buades-NonLocal 第3节

    2 回复  |  直到 6 年前
        1
  •  2
  •   Cris Luengo    6 年前

    Buades等人明确打算使用高斯权重。这个核,如果它是一个近似值,会产生一个非常粗糙的近似值。这就是1D中的效果 f=3 , f=10 f=100 :

    kernels

    我添加了一个高斯核进行比较。此外,高斯函数是完全各向同性的,而这种近似离它很远(因为它是由正方形组成的)。

    我发现这很奇怪,因为NL平均算法的四个嵌套循环,在使用它的地方,并没有通过在一个真正的高斯上使用这个近似来加快速度。面片差的平方乘以内核,此操作的成本与内核的生成方式或包含的值无关。

    我的建议是 make_kernel 通过这样的方法,产生了一个真正的二维高斯核:

    function kernel = make_kernel2(f)
    x = linspace(-2,2,2*f+1);
    kernel = exp(-0.5*x.^2);
    kernel = kernel .* kernel.'; % requires newer MATLAB, otherwise use bsxfun
    kernel = kernel / sum(kernel(:));
    

    我以前从未见过高斯函数的这种特殊近似(我也见过很多)。一般来说,高斯卷积是通过一个盒子核的卷积的重复应用来近似的(他们说3x足够一个相当好的近似值, but more are needed if the derivative is to be computed after

    img = imread('cameraman.tif');
    out = imfilter(img,ones(3,3)/9);
    out = imfilter(out,ones(3,3)/9);
    out = imfilter(out,ones(3,3)/9);
    

    如果不是重复应用盒子卷积,而是使用相同的积分图像计算几个不同大小的盒子卷积,并将结果相加,则得到一个与本问题中所问内核有关的卷积。这将是一个粗略的近似高斯,而不是各向同性,但它将是 非常

    img = imread('cameraman.tif');
    out = imfilter(img,ones(3,3)/9) / 3;
    out = out + imfilter(img,ones(4,4)/16) / 3;
    out = out + imfilter(img,ones(5,5)/25) / 3;
    

    我打赌这就是内核的来源。但是,通过创建这个内核,而不是单独应用各种卷积并添加结果,这种方法的所有速度优势都没有得到利用,只留下了它的许多负面方面。

        2
  •  2
  •   Andras Deak -- Слава Україні    6 年前

    (2d+1) x (2d+1) -求和为1的常量矩阵( value 只是 1*(2*d+1)^2 ). 这定义了 a box blur kernel .

    那么发生了什么呢 (2f+1) x (2f+1) 内核是由大小相同的同心盒模糊内核相加而定义的 3 x 3 , 5 x 5 (2f+1)x(2f+1) . 由于卷积是一个线性运算,盒模糊的总和将被单独应用,并且单个核的凸组合是一个有效的核。

    Cris Luengo in a comment ). 甚至对称性也不存在:高斯核是球对称的,而这些盒核有角。

    总之,我相信你的问题的答案是“不”,它可能不近似高斯核,但它仍然是一个模糊核。


    kernel = zeros(2*f+1,2*f+1);   
    for d=1:f
        kernel(f+1-d:f+1+d,f+1-d:f+1+d) = kernel(f+1-d:f+1+d,f+1-d:f+1+d) + 1/(2*d+1)^2;
    end
    kernel = kernel / f;