Во время изучения градиентных фильтров у меня возникало множество вопросов. Почему фильтр сделан именно так, а не иначе? В чём разница между разными фильтрами? В данной статье я собрал найденные мной ответы на эти вопросы. Предполагается, что читатель знаком с формулами на уровне чтения википедии, и поэтому я не объясняю, как применять матрицу фильтра к матрице изображения, просто чтобы не раздувать текст.

Важно: используется индексация пикселов, принятая в сообществе linux, когда пикселы нумеруются от левого верхнего угла изображения, ибо это правильно)

Пикселизация изображения

Теория цифровой обработки изображений в некотором смысле довольно сложна, потому что объектом изучения является точечная интенсивность света как функция координат изображения I(x,y), которая вполне может быть гладкой функцией, разложимой в ряд Тейлора, но у нас никогда нет значений этой функции. При начальном знакомстве с теорией можно обмануть себя и сказать, что мол мы всё же знаем значения функции, но только на дискретном наборе точек (пикселов). Но если остаться на этом уровне понимания, то смысла в формулах Собеля нет (центральные разности должны были бы дать лучший результат).

Итак, значение пиксела I_{mn} — это НЕ значение функции I(x,y) в некоей дискретной точке (x_m, y_n), а среднее значение интенсивности, взятое по площади пиксела:

I_{mn} = \frac{1}{\Delta^2}\int\limits_{-\Delta/2}^{\Delta/2} dx \int\limits_{-\Delta/2}^{\Delta/2} dy\ I(x_m + x, y_n + y)\qquad(1)

где \Delta — это ширина (она же высота) пиксела.

И это если мы забудем о том, что на настоящей цветной фотографии нет идеального деления на квадратные пикселы. Вместо этого у нас фильтр Байера, состоящий из двух зелёных, одного красного и одного синего квадратиков. Но давайте остановимся на этой формуле (1), чтобы обсудить важное, не утонув в математике.

Как видим, в формуле (1) есть две составляющих. Одна составляющая — это усреднение, когда вместо значения функции I в точке (x,y) мы знаем её среднее значение в квадратной области вокруг этой точки. Вторая составляющая — это дискретизация, когда даже средние значения функции I мы знаем не в любой точке, а только на дискретном наборе точек (x_m, y_n). Задача вычисления градиента изображения состоит в том, чтобы по сеточной функции I_{mn} вычислить производные оригинальной функции I_x(x,y) и I_y(x,y).

Давайте посмотрим, какие проблемы вносит дискретизация, а какие — усреднение.

Вычисление градиентов: влияние дискретизации

Чтобы посмотреть, какие эффекты вносит дискретизация, мы проигнорируем влияние усреднения. Другими словами мы хотим посмотреть, что получилось бы, если бы яркости пикселов I_{mn} были бы равны значениям функции I(x,y) в точках сетки (x_m, y_n). Эту, настоящую, интенсивность I(x,y) мы, как уже говорили, считаем хорошей функцией координат. Это значит, мы можем оценить точность численного вычисления производных с помощью разложения выражений в ряд Тейлора.

Рис. 1: Вычисление центральных разностей
Рис. 1: Вычисление центральных разностей

Вычисление производной по оси x в точке A (Рис. 1) с помощью "правой разности" даёт оценку

I_{x,A} \approx \frac{I_B - I_A}{\Delta} + O(\Delta) \qquad (2)

где O(\Delta) — это порядок ошибки численного приближения.

Более высокую точность даёт центральная разность

I_{x,L} \approx \frac{I_B - I_A}{\Delta} + O(\Delta^2) \qquad (3)

В этом случае ошибка приближения будет порядка \Delta^2, однако есть проблема: у нас были значения интенсивности в точках сетки A и B, а значение производной по оси x мы получили в точке L, которая НЕ лежит на нашей сетке.

"Ну и что?" — скажете вы — "У нас просто появилась новая квадратная сетка со значениями производной по оси x".

Однако в двумерном мире изображений появляется ещё одна проблема. Нам нужны производные по обеим осям, но аналогичное вычисление производной по оси y, даст производную в точке K,

I_{y,K} \approx \frac{I_C - I_A}{\Delta} + O(\Delta^2) \qquad (4)

которая не только не лежит на оригинальной сетке, но и не попадает на сетку значений производной по оси x. То есть мы не можем вычислить градиент с точностью O(\Delta^2) в одной и той же точке. В итоге мы имеем три разных сетки: значения интенсивности, значения производных по оси x и значения производных по оси y.

И тут пришёл Лоуренс Робертс (Lawrence Roberts), который решил проблему вычисления градиента в одной и той же точке. Решению дали весьма печальное название — "крест Робертса" (Roberts cross).

Рис. 2: Вычисление оператора Робертса
Рис. 2: Вычисление оператора Робертса

Лично я плАчу, когда читаю объяснение смысла креста Робертса в википедии. Там пишут про психофизические представления в теории изображений, хотя главное достижение Робертса в том, что он провёл новую систему координат x'y', наклонённую к оригинальной под углом в 45^\circ (Рис. 2), что дало возможность вычислить с помощью центральных разностей обе производные в одной и той же точке P

I_{x',P} \approx \frac{I_D - I_A}{\sqrt{2}\Delta} + O(2\Delta^2) \ ,\qquad I_{y',P} \approx \frac{I_C - I_B}{\sqrt{2} \Delta} + O(2\Delta^2) \qquad (5)

Длины отрезков между парами точек выросли: \sqrt{2}\Delta вместо \Delta в формулах (3) и (4), а значит и точность меньше, именно поэтому двойка в выражении O(2\Delta^2). Тем не менее по-прежнему второй порядок точности. Вычисление градиента по отношению к оригинальным осям координат xy можно выполнить по формулам пересчёта координат вектора при повороте системы координат на -45^\circ

I_{x,P} \propto I_{x',P} - I_{y',P} \approx \frac{I_B + I_D - (I_A + I_C)}{2\Delta} + O(2\Delta^2) \qquad (6)I_{y,P} \propto I_{x',P} + I_{y',P} \approx \frac{I_C + I_D - (I_A + I_B)}{2\Delta} + O(2\Delta^2) \qquad (7)

В матричной форме операторы будут выглядет следующим образом (общие множители обычно не используются)

I_x = \pmatrix{ -1 & 1 \cr -1 & 1 \cr } \qquad I_y = \pmatrix{ -1 & -1 \cr 1 & 1 \cr } \qquad (8)

Небольшое отклонение от темы. Раньше я думал, что вирусная идея использовать изображения из Плейбоя была запущена инженерами из Университетя Южной Калифорнии в 1973-м году фотографией Лены Шьёблом (боже... как же она, бедняжка, жила с такой фамилией?). Но нет, в 1961 году, то есть за 12 лет до Лены, Робертс в своей статье использовал картинки из Плейбоя (википедия утверждает, что и в своей диссертации тоже), правда тогда они были без обнажёнки. Многие из нас прошли период мастурбации на девочек из мужских журналов, но как-то никому из моих знакомых не приходило в голову вставлять эти картинки в научные статьи. Поэтому популярность изображения Лены среди образованной публики не перестаёт меня удивлять. И если вдруг кто-то не знает... Лену урезали, её полное изображение можно найти тут.

Но довольно невтемщины, подведём предварительные итоги. Выше мы показали, что прямолинейный подход (3) с центральными разностями даёт градиенты I_{x} в одних точках, а градиенты I_{y} — в других, в то время как подход Робертса хоть и даёт чуть худшую точность, но зато позволяет вычислять градиенты I_{x} и I_{y} в совпадающих точках сетки, а именно в углах пикселов.

Однако у Робертса всё ещё есть проблема, что значение интенсивности у нас дано в центрах пикселов, а значение градиентов — в углах. Возникает вопрос, а можно ли сделать так, чтобы значение градиента вычислялось для центра пиксела? Ответ да,
правда снова за счёт ухудшения точности.

Рис. 3: Центральные разности для фильтра размером 3 на 3
Рис. 3: Центральные разности для фильтра размером 3 на 3

В соответствии с Рис. 3 мы можем написать

I_{x,E} \approx \frac{I_F - I_D}{2\Delta} + O(4\Delta^2) \ , \qquad I_{y,E} \approx \frac{I_H - I_B}{2\Delta} + O(4\Delta^2) \qquad (9)

Формулы (9) полностью решают поставленную задачу. Точность имеет порядок O(4\Delta^2), то есть как мы и хотели, квадратична по \Delta, но множитель стал больше, ибо расстояние между вычитаемыми точками увеличилось.

Вычисление градиентов: усреднение

Пришло время вспомнить, что значение пиксела I_{mn} — это не только дискретизация пространства, но и усреднение значений интенсивности в пределах пиксела (1).

Рис. 4: Модель для проверки градиентных фильтров: прямолинейная световая граница.
Рис. 4: Модель для проверки градиентных фильтров: прямолинейная световая граница.

Чтобы увидеть, какие проблемы оно несёт, вернёмся к подходу Робертса. Для проверки его формул мы создадим изображение, состоящее из двух областей с интенсивностями 0 и 1, разделённых прямой линией (Рис. 4). Выше линии границы (по оси y) функция I(x,y) будет равна 1, а ниже линии границы — 0. Чтобы формулы давали наилучшую точность, мы проведём линию границы через точку P (на рисунке она образует положительный угол \alpha с осью x).

Теперь можно вычислить интенсивности пикселов I_{mn} по тому, какая часть площади каждого пиксела будет освещена, и получить значение градиента Робертса по формулам (6) и (7). Если обозначить угол, который вектор градиента образует с осью y как \gamma, то понятно, что в идеале мы должны получить \gamma \equiv \alpha. Давайте проверим.

При угле наклона световой границы \alpha < 45^\circ:

Пиксел C будет освещён полностью, I_{C} = 1
Пиксел B будет полностью тёмным, I_{B} = 0.
Пиксел D будет освещена частично, I_D = 1-\tan(\alpha)/2
Пиксел A будет освещен частично, I_A = \tan(\alpha)/2

Тогда по формулам (6) и (7) можно найти

\tan(\gamma) = \frac{-I_{x,P}}{I_{y,P}} = \frac{I_A + I_C - (I_B + I_D)}{I_C + I_D -(I_A + I_B)}= \frac{\tan(\alpha)}{2-\tan(\alpha)}

Откуда

\gamma(\alpha) = \arctan \left( \frac{\tan(\alpha)}{2-\tan(\alpha)} \right) \qquad (10)

Как видим, значение угла \gamma(10), вычисленное по формулам Робертса, не даёт нам \gamma\equiv\alpha. График функции (10) изображён на Рис. 5.

Рис. 5: График угла наклона вектора градиента в зависимости от угла наклона границы света для оператора Робертса.
Рис. 5: График угла наклона вектора градиента в зависимости от угла наклона границы света для оператора Робертса.

Как видно из рисунка, формула Робертса даёт точные значения наклона вектора градиента только для углов 0^\circ, 45^\circ(а также 90^\circ, 135^\circ и так далее), для остальных углов ошибка вычисления доходит примерно до 8^\circ. Для описания данной проблемы используют термин "неизотропность оператора", подразумевая, что при использовании изотропного оператора вращение изображения должно приводить к такому же повороту вектора градиента. Именно эту проблему и пытался решить Ирвин Собель в своём докладе об операторе, получившем позже его имя (а не проблему усреднения шумов, как иногда пишут).

Объяснения логики вывода, которые опубликовал Собель через 46 лет после своего доклада, можно кратко описать так: он хотел сделать изотропный оператор, поэтому усреднил 4 возможных направления, а для проверки точности они с Гарри Фельдманом зрительно (!) проверили, что всё выглядит хорошо. Несмотря на такой фривольный подход, оператор получился весьма приличный, что мы покажем ниже. Но сначала объясним логику вывода.

Вспомним, что для вычисления градиента по формулам Робертса мы использовали 4 точки, через которые можно провести линии, под углами 0^\circ, 45^\circ, 90^\circ, и так далее. То есть как раз под углами, при которых формулы Робертса дали нам правильный угол наклона градиента. Поэтому можно предположить, что если точек, используемых для вычисления будет больше, чтобы появилось больше возможных направлений, то и точность вычисления угла будет больше. То есть для начала нужно взять сетку большего размера.

На Рис. 6 изображена сетка размером 3 на 3.

Рис. 6: Вычисление градиента по формулам Собеля
Рис. 6: Вычисление градиента по формулам Собеля

Логика Собеля была следующей (смотри левую часть изображения). Мы можем вычислить градиент в точке E как центральную разность

I_{x,E} \approx \frac{I_F - I_D}{2\Delta} + O(4\Delta^2) \ , \qquad I_{y,E} \approx \frac{I_H - I_B}{2\Delta} + O(4\Delta^2) \qquad (11)

Однако можно точно также сказать, что давайте проведём оси координат (x'y') через точки AI и CG. Тогда можно вычислить центральные разности в новой координатной системе как

I_{x',E} \approx \frac{I_I - I_A}{2\sqrt{2}\Delta} + O(8\Delta^2) \ , \qquad I_{y',E} \approx \frac{I_G - I_C}{2\sqrt{2}\Delta} + O(8\Delta^2) \qquad (12)

Формулы (11) и (12) — это два различных приближённых вычисления одной и той же величины. Чтобы сделать вычисления более изотропными, мы просто усредним результаты (11) и (12). Единственное, что усреднение нужно сделать правильно, так как нам нужно найти среднее от двух векторов, заданных в разных системах координат. Поэтому сначала нужно пересчитать вектор (12) в системе (xy) с помощью формул поворота координатной системы на -45^\circ, а потом уже сложить их. Подробный вывод приводить не буду, чтобы не раздувать текст, а результирующие матрицы вы наверняка видели в википедии (в них снова избавились от общих множителей)

I_x = \pmatrix{ -1 & 0 & 1 \cr -2 & 0 & 2 \cr -1 & 0 & 1 \cr } \qquad I_y = \pmatrix{ -1 & -2 & -1 \cr 0 & 0 & 0 \cr 1 & 2 & 1 \cr } \qquad (13)

Интересно, что формулы (13) можно получить, используя логику вывода отличную от логики Собеля. Для этого рассмотрим правую часть Рис. 6. Мы можем вычислить градиент в угловой точке P по формулам Робертса (8), используя интенсивности в точках A, B, D и E. Аналогично по формулам Робертса можно вычислить градиенты в угловых точках Q, R, S. После этого градиент в точке E можно вычислить как среднее от градиентов в 4-х угловых точках P, Q, R, и S, окружающих её. Результат будет идентичен формуле (13).

Чтобы проверить изотропность оператора Собеля-Фельдмана, мы повторим схему, описанную для оператора Робертса (смотри Рис. 4 и описание к нему). А именно, мы будем проводить линии границы света через точку E, вычислять освещённости пикселов, далее по значениям освещённости пикселов вычислять угол наклона градиента, который даст оператор Собеля-Фельдмана, и сравнивать его с углом наклона линии границы света.

На Рис. 7 изображены результаты такого вычисления величины ошибки для различных схем вычисления градиента.

Рис. 7: Точность вычисления угла наклона градиента для различных фильтров.
Рис. 7: Точность вычисления угла наклона градиента для различных фильтров.

Для оператора Собеля-Фельдмана можно было бы написать аналитические формулы, аналогичные формуле (10), но я немного облегчил себе работу и вычислял освещённости пикселов, генерируя случайные наборы точек, поэтому графики получились немного шумными.

Кроме упомянутых схем Робертса и Собеля, мы также добавили результаты для операторов Шарра и Прюитта, как наиболее часто упоминающихся. Давайте кратко опишем смысл этих операторов.

Подход Шарра замечателен тем, что он, в отличие от Собеля не оценивал качество результатов на глазок, а предложил интересный подход для выбора наиболее оптимальных коэффициентов фильтра. Для этого нужно генерировать изображения плоских волн под разными углами. Настоящий градиент для такой волны известен. Можно получить градиент с помощью фильтра, а потом выбрать такие коэффициенты фильтра, которые минимизируют отличие вычисленного градиента от аналитического результата. Один из результатов оптимизации выражается формулами (14)

I_x = \pmatrix{ -3 & 0 & 3 \cr -10 & 0 & 10 \cr -3 & 0 & 3 \cr } \qquad I_y = \pmatrix{ -3 & -10 & -3 \cr 0 & 0 & 0 \cr 3 & 10 & 3 \cr } \qquad (14)

С подробностями можно ознакомиться в его диссертации (правда только на немецком языке). Теоретически он должен быть наиболее изотропным из всех возможных. Однако, как видно на Рис. 7, оператор Шарра на моей схеме проверки точности даёт худшие результаты, чем Собель. Основательного ответа, почему так случилось, у меня нет. Могу только заметить, что я использовал не синусоиды, а ступенчатые функции.

Что на самом деле использовала Джудит Прюитт для своего фильтра, сказать трудно. Оригинальной статьи в открытом доступе нет. Википедия даёт формулу (15), но если посмотреть историю изменений, то создаётся ощущение, что криворукие редакторы порядком испоганили изначальный текст и на самом деле Прюитт делала не градиентный фильтр, а оператор детектирования границ.

I_x = \pmatrix{ -1 & 0 & 1 \cr -1 & 0 & 1 \cr -1 & 0 & 1 \cr } \qquad I_y = \pmatrix{ -1 & -1 & -1 \cr 0 & 0 & 0 \cr 1 & 1 & 1 \cr } \qquad (15)

Для этого, по-видимому, использовалось 8 операторов, каждый из которых был наиболее чувствителен к углам 0, 45, 90 и так далее. То есть в каждой точке применялось 8 фильтров, и тот, который давал максимальный результат, определял один из 8-ми углов границы в данной точке. Сейчас википедия даёт нам только два оператора, вертикальной и горизонтальной границ, и предлагает использовать их как вычислялки для компонент вектора градиента.

Наша модель вычисления ошибки (Рис. 7) показывает, что этот подход почти так же плох, как оператор Робертса.

В заключение хочется сказать, что если встаёт задача выбора фильтра, то я бы порекомендовал Собеля или Шарра. Я видел людей, которые выбирали фильтры, просматривая в википедии картинки велосипеда, обработанные разными фильтрами, и, как Собель с Фельдманом, визуально пытаясь понять, какая из картинок выглядит красивее. Выше я показал, что точность вычисления — это точность вычисления угла наклона градиента, и по картинкам велосипедов это точно не оценишь.

Комментарии (28)


  1. Sdima1357
    14.01.2022 00:06
    +5

    Это не свёртка

    Типичная свёртка с ядром фильтра, это видно даже по треугольным коэффициентам, которые в свою очередь сверка двух прямоугольников. Реально лучше комбинировать собель фильтр с гауссианом, который предельный случай сверток прямоугольников(central limit theorem) Соответственно Ваш среднее значение интеграла по пихелю -тоже свёртка с прямоугольником, и в определенном смысле эквивалентна семплу в центре пикселя

    И это не производные, а конечные разности


    1. herase Автор
      14.01.2022 11:09
      +1

      Свёртка, это когда индексы одной величины увеличиваются, а второй уменьшаются, например $\sum_i A_i B_{N-i}$. Когда оба индекса идут в одну сторону, это умножение. Можете посмотреть любую статью по свёрткам в википедии. Возможно я недостаточно подробно это пояснил.

      Насчёт конечных разностей согласен.

      Насчёт 'эквивалентна sample в центре пиксела' не согласен. Sample в центре - это когда ты точно знаешь, что было в точке (если я правильно Вас понял). А матрица камеры собирает интенсивности света с конечной области и конечно никогда не скажет, что было в точке.


      1. VPryadchenko
        14.01.2022 11:13
        +4

        Когда Вы пишете про умножение матриц, это (лично меня) вводит в заблуждение больше, чем упоминание свёртки, т.к. сразу возникает ассоциация с матричным произведением, а не поэлементным умножением с последующим суммированием. И да, если фильтр двигать и получать новую сетку пикселей - это свёртка.


        1. herase Автор
          14.01.2022 11:20

          Чёрт, да, теперь доехало. Я пытался сказать, что у обоих матриц индексы при суммировании бегут в одну сторону, а не в разные как при свёртке, и написал глупость) Спасибо. Исправлю вечером.


      1. Sdima1357
        14.01.2022 11:22
        +3

        Нет это именно свёртка. Направление индексов определяет только направление семплирования ядра реакции фильтра. Именно так она и делается, потому что проход по памяти в обратном направлении дороже прямого прохода.и вообще любая линейная операция со скользящим ядром (инвариантная к положению в картинке) сводится к свертке с соответствующим ядром. Не надо придумывать новых сущностей или переопределять старые.

        Перед матрицей стоит объектив. Он всегда обеспечивает размазывание, как свертку с небольшим ядром. Так что потом без разницы как именно Вы семплируете.


        1. herase Автор
          14.01.2022 11:25

          Да, я уже разобрался. Выше написал, что я хотел сказать, что тут индексы бегут в одну сторону при суммировании, а не в разные, как при свёртке, и написал глупость. Вечером исправлю. Это, так скажем, немножко кривая свёртка, которая не даст результат, что фурье образ от такой свёртки будет равен произведению Фурье образов.


          1. Sdima1357
            14.01.2022 21:40

            Формально Вы не совсем неправы. Первая называется "свертка" , а вторая "взаимная корреляция", в матлабе соотвественно функции conv (convolution) и xcorr .

            Но на практике это одно и тоже с точностью до порядка чисел в ядре. И по логике вещей Вам нужна именно свертка как реализация дигитального фильтра


        1. 0serg
          15.01.2022 14:25
          +1

          Там не совсем в объективе дело, на сенсор ставится специальный слой размазывающая изображение (низкочастотный или антимуаровый фильтр). Типичная реализация основана на двух пленках каждая из которых слегка «двоит» изображение, одна в вертикальной плоскости, вторая в горизонтальной, совмещенных с инфракрасным фильтром. Изредка можно встретить специальные камеры без этого приспособления, но это редкость. А Pentax даже выпускал уникальный фотоаппарат где AA фильтр был реализован механически (дрожанием сенсора) и его можно было включать и выключать.


          1. Sdima1357
            15.01.2022 14:45

            Интересно. Просто для меня, все, что до сенсора - объектив :). Но немного вернусь и повторю благодаря центральной предельной теореме все PSF (функция рассеивания точки) имеют форму гауссиана.


  1. rafuck
    14.01.2022 00:10
    +1

    Как бы на формуле (1) можно было и закончить, только dy хотелось бы иметь в конце, иначе функция интенсивности I(.) может оказаться под знаком дифференциала. И, наверное, все же 1/\delta^2 перед интегралом.


    1. VPryadchenko
      14.01.2022 01:16
      +2

      Часто используемое и вполне нормальное обозначение, когда дифференциал стоит сразу после знака интеграла.


      1. Tiriet
        14.01.2022 07:58
        +2

        формула 1: перед интегралом все равно должна быть 1/delta^2.

        формулы 6-7: в знаменателях стоят sqrt(2), а должны быть просто 2.

        когда Вы пишите про точность формул, и ставите О(4*delta^2)- это неправильно.

        аппроксимация первого порядка точности f(x+dx)= f(x) + f'*dx + 0.5*f"*dx^2+1/6*f'"*dx^3+...

        погрешность аппроксимации f' = (f(x+dx)- f(x))/dx будет равна dx*0.5*f" + O(dx^2)- то есть, пропорциональна не только 0,5*dx, но еще и зависит от второй производной рассматриваемой функции.

        аппроксимация второго порядка точности (центральная разность) будет равна 1/6*dx^2*f'"

        как видите, при преходе от аппроксимации первого порядка к аппроксимации второго с удвоенной dx суммарная погрешность аппроксимации в Вашей записи будет не O(4dx^2), а O(4/6*dx^2)= О(2/3dx^2)- существенно лучше.


        1. herase Автор
          14.01.2022 11:15

          Спасибо за комментарии. Там есть какие-то опечатки, которые мне не давали исправить пока статья была в песочнице. Я вечером подробно ещё раз всё просмотрю и отпишусь или исправлю.


    1. herase Автор
      14.01.2022 11:13
      +2

      Дифференциал в начале является более удобным обозначением в тех случаях, когда у разных переменных разные границы интегрирования. В этом случая понятно, какая переменная интегрируется по какому интервалу. Когда все дифференциалы в конце это совершенно непонятно. Спасибо за замечание по квадрату, исправил.


  1. iShrimp
    14.01.2022 18:55
    +1

    Спасибо за подробное и доступное изложение.

    От себя хочу добавить, что для ещё более аккуратной (точной) растеризации изображений пиксель нужно считать не квадратом, а ядром типа Ланцоша или бикубическим.

    Исторически первой (простейшей) моделью пикселя была точка, и на этом основан алгоритм Брезенхема.

    Затем, когда пиксель стали считать квадратом, появились алгоритмы подсчёта закрашенной площади, и так работает алгоритм Ву.

    Сейчас активно развивается концепция "пиксель не квадрат" и разрабатываются полиномиальные фильтры для ещё более гладкого рендеринга (статья).

    К чему я об этом говорю? Изображение, снятое матрицей фотоаппарата, не просто получено усреднением по площади каждого пикселя. Свет рассеивается, подвергается дифракции, преломляется на микролинзах, и в результате изображение получается слегка сглаженным, так как зоны светочувствительности соседних пикселей перекрываются. Оно уже не содержит резких прямоугольных границ, под которые был заточен фильтр Собеля. Изображение размыто неким ядром, которое ближе к Гауссовскому, чем к прямоугольному, поэтому для него лучше подойдёт фильтр, основанный на гауссианах, типа Шарра.

    Похоже, эта гипотеза нуждается в численной проверке :)


    1. orekh
      14.01.2022 19:59

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


      1. Sdima1357
        14.01.2022 20:06

        "Уменьшенных"

        Их обычно тоже слегка замыливают, чтобы избавиться от алиасинга. Очень нетривиальная проблема, особенно в 3д играх


        1. orekh
          14.01.2022 20:42

          Не слегка.

          Обычная интерполяция при уменьшении более чем в 2 раза становится неприменимой. Например, при уменьшении в 3 раза, из квадрата 3х3 пикселей в результирующую картинку будет записан только центральный пиксел. Это совершенно верно, если считать пиксель точкой, но абсолютно неприемлимо на практике — границы на изображении становятся рублеными, наростает шум. Поэтому обычно для уменьшения используются суперсемплинг, мультисемплинг или сверточные фильтры — которые усредняют значения всех входных пикселей в площади выходного пикселя. Теоретически возможна постобработка фильтрами гаусса или даже fxaa к изображению уменьшенному обычной интерполяцией, но такого кроме как в статьях по обработке изображений я не видел.

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


          1. Sdima1357
            14.01.2022 21:22

            Видимо я неточно выразился. Замыливают естественно до downsampling-а или реже вместе с ним . Потом от алиасинга уже не избавишься. Постобработка уже не поможет.


            1. orekh
              14.01.2022 21:38

              Готов поспорить, что идеальное замыливание перед downsampling-ом — это фильтр Box. Соответственно: box filter + downsampling = supersampling :)


              1. Sdima1357
                14.01.2022 21:46

                Готов поспорить, что идеальное замыливание

                Проиграете. Идеального замыливания не существует.


                1. iShrimp
                  15.01.2022 13:47

                  Почему нет? Прогнать всё изображение через 2D-FFT, обнулить высокие частоты, прогнать обратно. Долго, дорого, офигенно.


                  1. Sdima1357
                    15.01.2022 14:00
                    +1

                    Совсем не офигенно. Смотрите "эффект Гиббса" . Прямоугольный спад в частотной области вызовет колебания на ступеньках. А ещё надо как то экстраполировать картинку на краях перед преобразованием.

                    Самый тихий- Гауссиан, но у него другие недостатки. Все фильтры - это компромиссы.

                    Рс. Извиняюсь за минус, промахнулся..


              1. iShrimp
                15.01.2022 14:02

                Лучше не спорить, а прочитать статью https://habr.com/ru/post/243285/ (там есть единственное упущение - забыли про гамма-коррекцию)


                1. Sdima1357
                  15.01.2022 14:30

                  Упомянутая Вами статья только приоткрывает ящик Пандоры под названием масштабирование изображений. Это поле многочисленных научных диссертаций


              1. 0serg
                15.01.2022 14:29

                Нет. Идеальное замыливание перед downsampling-ом — это фильтр Ланцоша. Ну то есть по сути Box, вот только не в пространственной области а в частотной. А с наивным box-ом я Вам могу привести картинку где downsampling x2 даст сильный муар при использовании box. Все хочу написать статью об этом, да лениво :)


                1. Sdima1357
                  15.01.2022 14:47

                  Идеальных не существует, есть только компромиссы. У Ланцоша есть отрицательная часть, которая испортит картину шахматной доски, например или вызвать переполнение.


    1. 0serg
      15.01.2022 14:37
      +1

      Квадратный пиксель плох уже тем что он плохо борется с муаром. Это очень посредственный AA фильтр. Гауссов чуть менее резок, но он не дает муара, поэтому там где гонятся за качеством стараются именно к нему идти.