Алгоритмы интерполяции при уменьшении масштаба
Я пытаюсь понять сокращение. Я вижу, как можно использовать алгоритмы интерполяции, такие как бикубический и ближайший сосед, при увеличении масштаба, чтобы "заполнить пробелы" между старыми, известными точками (пикселями, в случае изображений).
Но уменьшение? Я не вижу, как можно использовать любую технику интерполяции. Там нет пробелов для заполнения!
Я застрял с этим надолго, подтолкни меня в правильном направлении. Как вы интерполируете, когда вы фактически удаляете известные данные?
Редактировать: Предположим, у нас есть одномерное изображение с одним цветным каналом на точку. Алгоритм уменьшения масштаба, масштабируемый от 6 до 3 точек по среднему значению пикселя, выглядит следующим образом: 1,2,3,4,5,6 = (1+2)/2,(3+4)/2,(5+6)/2 Я на правильном пути? Является ли эта интерполяция уменьшением масштаба, а не просто отбрасыванием данных?
7 ответов
Здесь у вас есть исходное изображение вверху, затем наивный алгоритм удаления в середине и интерполяционный внизу.
Рассмотрим большой прожектор. Свет в центре самый яркий, а свет по краям становится темнее. Когда вы сияете дальше, ожидаете ли вы, что луч света внезапно потеряет темноту у краев и станет сплошным контуром света?
Нет, и то же самое происходит здесь с логотипом stackru. Как вы можете видеть в первом уменьшении масштаба, картинка потеряла мягкость по краям и выглядит ужасно. Второе уменьшение позволило сохранить гладкость по краям путем усреднения окружения пикселей.
Простой фильтр свертки, который вы можете попробовать, - это добавить значения RGB для пикселя и всех других пикселей, окружающих его, и выполнить простое усреднение. Затем замените пиксель на это значение. Затем вы можете отбросить соседние пиксели, поскольку вы уже включили эту информацию в центральный пиксель.
Если концептуализировать исходный пиксель как имеющий ширину 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).
Таким образом, не нужно действительно отбрасывать данные - нужно просто рассчитать соответствующие соотношения от соседей (в концептуальном пространстве, где физический размер всего изображения не меняется). Это усреднение, а не строгий пропуск / отбрасывание.
На двумерном изображении отношения сложнее рассчитать, но суть та же. Интерполируйте и извлекайте больше значения из ближайших исходных "соседей". Результирующее изображение должно выглядеть очень похоже на оригинал, при условии, что нижняя выборка не очень серьезная.
Будь то масштабирование или уменьшение масштаба, происходящая "интерполяция" фактически является повторной выборкой.
Если количество выборок в уменьшенной версии не является четным делителем полного числа выборок (пикселей и т. Д.), Простое отбрасывание данных приведет к ошибкам выборки, которые появляются на изображении как "неровности". Если вместо этого вы интерполируете, где новые выборки будут лежать в пространстве между существующими выборками, используя один из упомянутых вами алгоритмов, результаты будут намного более плавными.
Вы можете осмыслить это как сначала масштабирование до наименьшего общего кратного старого и нового размера, а затем уменьшение, отбрасывая выборки, только без фактического создания промежуточного результата.
Этот эскиз показывает сечение нескольких пикселей, которые начинаются с трех пикселей (черная кривая) и уменьшаются до двух пикселей (красная кривая) с использованием интерполяции (синяя кривая). Интерполяция определяется из исходных трех пикселей, и два последних пикселя устанавливаются на значение интерполяции в центре каждого конечного пикселя. (Если здесь неясно, вертикальная ось показывает интенсивность каждого пикселя для одного цветового канала.)
Независимо от того, масштабируем мы или нет, нам нужно определить (с некоторой степенью точности), какое будет значение цвета в точке между двумя пикселями.
Давайте возьмем одну строку пикселей:
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
(Конечно, мы хотим сделать это в двух измерениях, а не в одном, но это тот же принцип.)
Таким образом, независимо от того, мы должны интерполировать, чтобы определить правильное значение выборки. В зависимости от того, насколько точными мы хотим получить результаты, существуют разные методы интерполяции. В идеале, мы должны были бы правильно пересчитать все математические операции, но даже это просто сложная интерполяция!
Если вы используете оконный sinc-фильтр, такой как lanczos, он фактически отфильтровывает высокочастотные детали, которые не могут быть представлены в более низком разрешении. Усредняющий фильтр не делает этого, вызывая артефакты. Фильтр sinc также производит более четкое изображение и работает как для увеличения, так и для уменьшения масштаба.
Если вы увеличите изображение с помощью sinc, а затем уменьшите его до исходного размера, вы получите почти такое же изображение обратно, тогда как, если вы просто усредните пиксели при уменьшении, вы получите нечто более размытое, чем оригинал., Если вы использовали преобразование Фурье для изменения размера, которое пытается приблизить оконный сигнал, вы получите точное исходное изображение обратно, за исключением ошибок округления.
Тем не менее, некоторые люди не любят, когда вокруг острых краев появляются небольшие звуки от фильтра sinc. Я бы посоветовал усреднить для уменьшения масштаба векторной графики, и sinc для уменьшения масштаба фотографий.