Я пытаюсь дублировать эффект двустороннего фильтра (сохранение краев, диапазон значений цвета), используя ограниченный набор примитивов в существующем наборе инструментов фильтров SVG. Я пробовал несколько подходов. Моей самой успешной на сегодняшний день является операция с тремя частями, которая делает обнаружение края Sobel, расширяет границы Sobel, извлекает пиксели, соответствующие этим краям, с помощью операции компоновки, gaussian размывает исходное изображение, а затем компонует обратно исходные пиксели пикселей поверх размытое изображение. Результат сохраняет ребра, но не знает о цветовых диапазонах.
<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"/>
Вы можете увидеть оригинал, gaussianBlur, этот фильтр и в правом нижнем углу, настоящий двусторонний фильтр:
http://codepen.io/mullany/details/Dbyxt
Как вы можете видеть, это не ужасный результат, но он не очень близок к двустороннему фильтру. Этот метод также работает только с изображениями с оттенками серого, поскольку он использует различия яркости для поиска краев - поэтому края между цветами подобной яркости не обнаружены.
Итак, вопрос заключается в том, существует ли алгоритм варианта сохраняющего края диапазона цветового диапазона (ориентированный вид края, двусторонний и т.д.), который может быть построен с использованием ограниченных примитивов, доступных в SVG - для тех, кто не знаком с SVG являются:
- gaussian blur
- свертка (любой размер ядра)
- разъедать/Разбавить
- цветная матрица
- все операции компоновки сапогов портера
- основные операции смешивания (умножение, экран, осветление, затемнение)
- примитив переноса компонента, который позволяет преобразовывать цветовые каналы с помощью поиска в таблице (а также перекрывать/перекрывать определенные значения).
Доступно только цветовое пространство RGB. Многочисленные итерации прекрасны, и любой ориентированный граф этих операций может быть построен.
Update:
Я успешно создал срединный фильтр, используя feBlend lighten и затемненный как операторы Max и Min в сортировке пузырьков (благодаря помощи cs.stackexchange.com). Однако это неэффективно: http://codepen.io/mullany/pen/dmbvz и не имеет понимания цветового диапазона двустороннего фильтра.