Pull to refresh

Comments 28

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как бы на формуле (1) можно было и закончить, только dy хотелось бы иметь в конце, иначе функция интенсивности I(.) может оказаться под знаком дифференциала. И, наверное, все же 1/\delta^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)- существенно лучше.

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

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

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

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

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

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

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

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

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

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

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

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

Не слегка.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Articles