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的人来说:
只有RGB颜色空间可用.多次迭代很好,可以构造这些操作的任何有向图.
更新:
我成功地使用feBlend创建了一个中值滤波器,使其在冒泡排序中变亮并变暗为Max和Min运算符(感谢cs.stackexchange.com的帮助).然而,这是低效的:http://codepen.io/mullany/pen/dmbvz,并且缺乏双边滤波器的颜色范围感知.
我应该说我没有任何图形方面的经验来证明这一点,但是从数学的角度来看,我认为这可以模拟定义双边滤波器的方程:
给定您的图像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个项相加。这给您最终的图像。