Q: Gaussian blur

Вот значит пишу свой Gaussian Blur, прямо по статье в Википедии

Ну не совсем прямо, конечно, а в два прохода и (буду) с использованием hardware linear interpolation в GPU, чтобы поменьше самплить, но вопрос мой не в этом.

Хочется: чтобы попугаи в моем фильтре были бы такими же, как у Фотошопа. И вот тут загвоздка:

  • "Радиус" на который нужно делать convolution kernel - три сигмы.
  • Соответственно, при сигме меньше 0.167 (радиусе меньше 0.5) - весь наш радиус вписывается "в пиксель" и размытия не происходит. Ну, не должно происходить.
  • Однако если ставить радиус 0.3-0.5, то размытие видно, причем с радиусом 0.5 - даже без увеличения. С радиусом 0.2 я вижу "следы" размытия, и только при сильном увеличении.

Отсюда вопрос, может быть фотошоповский "радиус" это на самом деле "сигма"? Кто знает?

Нет, можно матлаб поставить и разобраться, но может быть ответ уже известен?

UPD: в доке на ImageJ пишут, что фотошоповский радиус - это сигма (http://rsb.info.nih.gov/ij/developer/api/ij/plugin/filter/GaussianBlur.html), но хотелось бы независимого подтверждения.

UPD2: Chris Cox: Radius == std. deviation. Получается, что Radius=0.1 не должен ничего размывать (ну и прямо скажем, я не вижу размытия даже на 500% увеличения), вроде сходится.

Comments

кстати о... вам не сложно если есть минута попробовать в ACR (Camera Raw) есть ли такой эффект с курсором (spot healing) когда его resize (радиус/диаметер кружка) мышкой нажав кнопку на ней - прыгает ли курсор в новую позицию когда кнопку на мышке отпускаешь - см. иллюстрацию на youtube = https://youtu.be/ZQu7FbSkFFU

Cox утверждает что это баг в драйвере карты (у меня iGPU = 4600 и dGPU = nvidia), а вовсе не в ACR (и у него так не прыгает).

желательно в Windows 10

Z / V

Прыгает в новую. Win 8.1, Nvidia 970

На других системах фотошопа нет сейчас.

A логично ли утверждение Cox'а что это _не_ код в ACR /отвечает за прыжок/ ?

Z / V

Откуда мне знать.

Я не поленился и проверил. Короче, фотошоповский радиус - это "почти" сигма, однако вычисления там довольно странные и невоспроизводимые. Я сгенерил маленькую восьмибитную картинку с рандомными пикселами в диапазоне 50...200 и прогнал её с шагом в 0.1 через фотошоп, ImageJ и ImageMagic и самописный алгоритм как в Википедии. В сухом остатке - ImageJ и ImageMagic делают вычисления абсолютно честно (если попиксельно вычесть картинки, то разница будет строго нулевая и в согасии с референсным алгоритмом). Визуально результат фотошопа не отличается от референсного алгоритма, однако если подойти к вопросу более дотошно и вычесть картинки, то получим заметное расхождение в несколько уровней серого, причём довольно большое расхождение, которое не списать на ошибки округления. Визуально этого не видно, но оно есть. У меня правда под руками только Photoshop Elements 6.0, но не думаю, что алгоритм блюра отличается от "взрослого" фотошопа. Эмпирически я побаловался - при радиусе 0.1 картинка действительно не меняется, как и ожидается. Радиус 0.2 однако соответсвует сигме 0.39, радиус 0.3 - это сигма 0.55, 0.4 - это 0.65, 0.5 - это 0.70, 0.6 - это 0.75 и так далее. Радиус 1.0 соответствует сигме 1.1 и затем разница нивелируется - радиусам 2, 2.5 и 3.0 соответствуют сигмы 2, 2.5 и 3.0.

Спасибо!

Но я так делать не буду (потому что перебор), в настройках напишу радиус, а это будет сигма.

А, кстати, идея аккуратно пересчитать сигму в радиус отнюдь не лишена смысла - тогда при вводе 0.5 ничего размазываться не будет, а при вводе, скажем, "3" ну и будет происходить размывание примерно на три пиксела, как пользователь и ожидает (чтоб сомнений не было, ему можно и честную сигму показать). Понятно, что там гаусс, так что надо будет прикинуть чтобы пересчёт корректно происходил, но мне кажется так пользоваться будет удобнее, если оперировать в терминах радиуса, ну или диаметра размытия. Я просто для рентгеновских картинок как раз такое делаю, может так и реализую.

Это подразумевает образованного пользователя. Который знает что такое gaussian blur и чего-то там от сигмы ожидает.

На практике же, (наш) пользователь ожидает "примерно как у фотошопа". У которого задается "радиус", а на самом деле сигма для >1 и чуть больше сигмы для 0.1..1.0

Так как мне этот блюр нужен, чтобы следующим шагом сделать экранный шарпенинг - я особо мудрить в этом месте что-то не хочу.