Алгоритмы интерполяции при уменьшении масштаба

Используйте random.choice :

import random

key_list = [
    (2, 'just', 'sd'),
    (2, 'great', 'sd'),
    (1, 'just great', 'sd')
]

max_value = max([key[0] for key in key_list])
max_keys = [key for key in key_list if key[0] == max_value]

print(random.choice(max_keys))

16
задан Mizipzor 18 May 2009 в 11:12
поделиться

6 ответов

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

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

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

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

alt text

6
ответ дан 30 November 2019 в 16:19
поделиться

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

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

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

9
ответ дан 30 November 2019 в 16:19
поделиться

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

alt text http://img391.imageshack.us/img391/3310/downsampling.png

7
ответ дан 30 November 2019 в 16:19
поделиться

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

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

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

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

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

3
ответ дан 30 November 2019 в 16:19
поделиться

Если представить исходный пиксель шириной 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).

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

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

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

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

14
ответ дан 30 November 2019 в 16:19
поделиться

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

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

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

2
ответ дан 30 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: