В чем идея масштабирования изображения с помощью Lanczos? - PullRequest
25 голосов
/ 06 декабря 2009

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

Может ли кто-нибудь здесь объяснить основную идею, лежащую в основе масштабирования изображения с использованием lanczos (как масштабирования, так и уменьшения), и почему это приводит к более высокому качеству?

У меня есть опыт анализа Фурье, и в прошлом я занимался обработкой сигналов, но не в отношении обработки изображений, так что не бойтесь использовать такие термины, как "частотная характеристика" и такие в своем ответе: )

РЕДАКТИРОВАТЬ: я думаю, что я действительно хочу знать, это концепция и теория использования фильтра свертки для интерполяции.

(Примечание: я уже читал статью в Википедии о повторной выборке Ланцоша, но в ней не было достаточно подробностей)

Большое спасибо!

1 Ответ

34 голосов
/ 07 декабря 2009

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

Тем не менее, я продолжу некоторые теории ...


Поскольку вы знакомы с анализом Фурье для обработки сигналов, вам на самом деле не нужно знать гораздо больше, чтобы применить его к обработке изображений - все фильтры, представляющие непосредственный интерес, являются «отделимыми», что в основном означает, что вы можете применять их независимо в направлениях х и у. Это уменьшает проблему передискретизации (2-D) изображения к проблеме передискретизации (1-D) сигнала. Вместо функции времени (t) ваш сигнал является функцией одной из осей координат (скажем, x); все остальное точно так же.

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

Итак. Пока вы отфильтровываете нежелательные частоты от оригинала, вы хотите сохранить как можно большую часть исходного сигнала. Кроме того, вы не хотите искажать сохраняемый сигнал. Наконец, вы хотите максимально полно погасить нежелательные частоты. Это означает - теоретически - что хороший фильтр должен быть «коробочной» функцией в частотном пространстве: с нулевым откликом для частот выше среза, единичным откликом для частот ниже среза и ступенчатой ​​функцией между ними. И, теоретически, этот ответ достижим: как вы, возможно, знаете, прямой фильтр sinc даст вам именно это.


Есть две проблемы с этим. Во-первых, прямой sinc-фильтр не ограничен и не очень быстро падает; это означает, что выполнение простой свертки будет очень медленным. Вместо прямой свертки быстрее использовать БПФ и выполнять фильтрацию в частотном пространстве ...

Однако, если вы действительно используете прямой фильтр sinc, проблема в том, что он на самом деле выглядит не очень хорошо! Как говорится в соответствующем вопросе, перцептивно присутствуют звенящие артефакты, и практически нет полностью удовлетворительного способа справиться с отрицательными значениями, возникающими в результате «недолета».

Наконец, тогда: один из способов решения этой проблемы - начать с фильтра sinc (из-за его хороших теоретических свойств) и настраивать его до тех пор, пока у вас не появится что-то, что также решит ваши другие проблемы. В частности, это даст вам что-то вроде фильтра Ланцоша:

Lanczos filter:       L(x)     = sinc(pi x) sinc(pi x/a) box(|x|<a)
frequency response: F[L(x)](f) = box(|f|<1/2) * box(|f|<1/2a) * sinc(2 pi f a)

    [note that "*" here is convolution, not multiplication]
       [also, I am ignoring normalization completely...]

Обратите внимание, что в этом нет магии. Доступно большое разнообразие окон, которые работают примерно так же. Кроме того, для a = 1 и 2 частотная характеристика не очень похожа на ступенчатую функцию. Тем не менее, я надеюсь, что это ответит на ваш вопрос «почему sinc» и даст вам некоторое представление о частотных характеристиках и т. Д.

...