Алгоритмы интерполяции при уменьшении масштаба - PullRequest
15 голосов
/ 18 мая 2009

Я пытаюсь понять даунскейлинг. Я вижу, как можно использовать алгоритмы интерполяции, такие как бикубический и ближайший сосед, при увеличении масштаба, чтобы «заполнить пробелы» между старыми, известными точками (пикселями, в случае изображений).

Но уменьшение? Я не вижу, как можно использовать любую технику интерполяции. Нет пробелов для заполнения!

Я застрял с этим надолго, подтолкни меня в правильном направлении. Как вы интерполируете, когда вы фактически удаляете известные данные?

Редактировать : Предположим, у нас есть одномерное изображение с одним цветным каналом на точку. Алгоритм уменьшения масштаба с масштабированием от 6 до 3 точек по среднему значению пикселя выглядит следующим образом: 1,2,3,4,5,6 = (1 + 2) / 2, (3 + 4) / 2, (5 + 6) / 2 Я на правильном пути здесь? Является ли эта интерполяция уменьшением масштаба, а не просто отбрасыванием данных?

Ответы [ 6 ]

13 голосов
/ 18 мая 2009

Если исходный пиксель концептуализируется как имеющий ширину n, то центр пикселя будет n / 2 от любого края.

Можно предположить, что эта точка в центре пикселя определяет цвет.

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

Пример: скажем, ваше изображение имеет высоту 1 пиксель и ширину 3 пикселя, и вы собираетесь уменьшать изображение только по горизонтали. Допустим, вы собираетесь изменить это до 2 пикселей в ширину. Теперь исходное изображение равно 3n, и вы поворачиваете его на 2 пикселя, поэтому каждый новый пиксель будет занимать (3/2) исходного пикселя изображения.

Не думайте больше о центрах ... центры новых пикселей находятся в (3/4) n и в (9/4) n [что составляет (3/4) + (3/2)]. Центры исходных пикселей были при (1/2) n, (3/2) n и (5/2) n. Таким образом, каждый центр находится где-то между тем местом, где мы могли бы найти исходные центры пикселей - ни один из них не совпадает с центрами исходных пикселей. Давайте посмотрим на первый пиксель на (3/4) n - он (1/4) n от исходного первого пикселя и (3/4) n от исходного второго пикселя.

Если мы хотим сохранить гладкое изображение, используйте обратную зависимость: возьмите (3/4) значений цвета первого пикселя + (1/4) значений цвета второго, поскольку новый центр пикселей концептуально будет ближе к первому исходному центру пикселя (на расстоянии n / 4), чем ко второму (на расстоянии 3n / 4).

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

На двумерном изображении отношения сложнее рассчитать, но суть та же. Интерполируйте и извлекайте больше значения из ближайших исходных «соседей». Результирующее изображение должно выглядеть очень похоже на оригинал, при условии, что нижняя выборка не очень серьезная.

8 голосов
/ 18 мая 2009

Независимо от увеличения или уменьшения масштаба, происходит "интерполяция", фактически повторная выборка.

Если количество выборок в уменьшенной версии не является четным делителем полного числа выборок (пикселей и т. Д.), Простое отбрасывание данных приведет к ошибкам выборки, которые появляются на изображении как «неровности». Если вместо этого вы интерполируете, где новые выборки будут лежать в пространстве между существующими выборками, используя один из упомянутых вами алгоритмов, результаты будут намного более плавными.

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

6 голосов
/ 18 мая 2009

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

альтернативный текст http://img391.imageshack.us/img391/3310/downsampling.png

5 голосов
/ 18 мая 2009

Здесь у вас есть исходное изображение вверху, затем наивный алгоритм удаления в середине и интерполяционный внизу.

Рассмотрим большой прожектор. Свет в центре самый яркий, а свет по краям становится темнее. Когда вы сияете дальше, ожидаете ли вы, что луч света внезапно потеряет темноту у краев и станет сплошным контуром света?

Нет, и то же самое происходит здесь с логотипом stackoverflow. Как вы можете видеть в первом уменьшении масштаба, картинка потеряла мягкость по краям и выглядит ужасно. Второе уменьшение позволило сохранить гладкость по краям путем усреднения окружения пикселей.

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

alt text

2 голосов
/ 18 мая 2009

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

Давайте возьмем одну строку пикселей:

P     P     P     P     P     P     P     P     P

и мы увеличим, мы хотим знать значения пикселей для использования в промежуточных точках:

P   P   P   P   P   P   P   P   P   P   P   P   P

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

P       P       P       P       P       P       P

(Конечно, мы хотим сделать это в двух измерениях, а не в одном, но это тот же принцип.)

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

1 голос
/ 25 июня 2009

Если вы используете оконный sinc-фильтр, такой как lanczos, он фактически отфильтровывает высокочастотные детали, которые не могут быть представлены в более низком разрешении. Усредняющий фильтр не делает этого, вызывая артефакты. Фильтр sinc также создает более четкое изображение и работает как для увеличения, так и для уменьшения масштаба.

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

Некоторым людям не нравится, когда вокруг острых краев появляются небольшие звуки, вызванные использованием фильтра sinc. Я бы посоветовал усреднить для уменьшения масштаба векторную графику и использовать для уменьшения масштаба фотографий.

...