如何使用一组有限的基本操作创建边缘保持模糊(类似于双边滤波器)

Mic*_*any 12 algorithm svg image-processing

我一直在尝试使用SVG过滤器的现有工具箱中的有限基本集复制双边滤镜效果(边缘保留,颜色范围感知).我尝试了很多方法.迄今为止我最成功的是三部分操作,它进行Sobel边缘检测,扩展Sobel边缘,通过合成操作提取与这些边缘对应的像素,高斯模糊源图像,然后将原始边缘像素复合回顶部.模糊的图像.结果保留边缘,但不识别颜色范围.

<filter id="surfaceBlur" color-interpolation-filters="sRGB">
        <!-- convert source image to luminance map-->
        <feColorMatrix type="luminanceToAlpha" />
        <!-- sober edge detection-->
        <feConvolveMatrix order="3" kernelMatrix="-1 -2 -1  
                                                    0 0 0  
                                                   1 2 1 "
                          preserveAlpha="true"
                         />
        <feConvolveMatrix order="3" kernelMatrix="-1 0 1  
                                                  -2 0 2 
                                                  -1 0 1 "
                          preserveAlpha="true"
                          />
      <!-- dilate the edges to produce a wider mask-->
      <feMorphology operator="dilate" radius="1"
                     result="mask"/>
      <!-- extract just the detail from the source graphic using the dilated edges -->
      <feComposite operator="in" in="SourceGraphic" in2="mask" result="detail" />
      <!-- blur the source image -->
      <feGaussianBlur stdDeviation="3" in="SourceGraphic" result="backblur"/>
       <!-- slap the detail back on top of the blur! -->
      <feComposite operator="over" in="detail" in2="backblur"/>
Run Code Online (Sandbox Code Playgroud)

你可以看到原始的,高斯布鲁尔,这个过滤器,右下角是一个真正的双边滤波器:

http://codepen.io/mullany/details/Dbyxt

正如你所看到的,这并不是一个糟糕的结果,但它并不是非常接近双边滤波器.此方法也仅适用于灰度图像,因为它使用亮度差异来查找边缘 - 因此不会检测到类似亮度的颜色之间的边缘.

所以问题是是否存在边缘保留颜色范围感知滤波器的算法变体(引导边缘视图,双边等) - 可以使用SVG中可用的有限基元构建 - 对于那些不熟悉SVG的人来说:

  • 高斯模糊
  • 卷积(任何内核大小)
  • 侵蚀/扩张
  • 颜色矩阵
  • 所有porter duff合成操作
  • 基本混合操作(乘法,屏幕,变亮,变暗)
  • 一个组件传输原语,允许使用表查找转换颜色通道(以及对特定值进行覆盖/天花板)

只有RGB颜色空间可用.多次迭代很好,可以构造这些操作的任何有向图.

更新:

我成功地使用feBlend创建了一个中值滤波器,使其在冒泡排序中变亮并变暗为Max和Min运算符(感谢cs.stackexchange.com的帮助).然而,这是低效的:http://codepen.io/mullany/pen/dmbvz,并且缺乏双边滤波器的颜色范围感知.

And*_*nes 5

我应该说我没有任何图形方面的经验来证明这一点,但是从数学的角度来看,我认为这可以模拟定义双边滤波器的方程

  • 给定您的图像I,使用颜色矩阵生成一个图像Intensity,该图像保存单个通道(例如R)中每个像素的强度。通道G和B被清零。

  • 对于双边过滤器窗口中的每个非中心像素,构造一个卷积矩阵,该卷积矩阵将特定像素与中心像素之间的差值考虑在内。例如,对于3x3的窗口,您将拥有矩阵

     0 0 0   -1 0 0    0-1 0    0 0-1    0 0 0    0 0 0    0 0 0    0 0 0        
    -1 1 0    0 1 0    0 1 0    0 1 0    0 1-1    0 1 0    0 1 0    0 1 0    
     0 0 0    0 0 0    0 0 0    0 0 0    0 0 0    0 0-1    0-1 0   -1 0 0
    
    Run Code Online (Sandbox Code Playgroud)

    您可以根据需要在此处缩放1s和-1s,以模拟双边滤波器的空间核。

  • 将每个卷积矩阵应用于Intensity地图,以获取3张图像(在3x3示例中),这些图像代表中心像素及其邻居之间强度的变化。

  • 对于这8张图像中的每张图像,使用模拟双边滤波器的范围内核的表格将原始分量传递到R。

  • 使用其他颜色矩阵将G和B通道设置为与所有8张图像中的R通道匹配。

  • 对8张图像和原始图像分别使用乘法运算符,以获得8张新图像,这些图像代表双边滤波器总和中的8个项。

  • 使用Porter-Duff运算符叠加8个图像,从而有效地将双边过滤器中的8个项相加。这给您最终的图像。