Алгоритмы интерполяции при даунскейлинге

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

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

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

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


person Mizipzor    schedule 18.05.2009    source источник
comment
Ваше редактирование имеет правильную идею. 1,2,3,4,5,6 -> 1,5, 3,5, 5,5. Другой пример: 6,0,6,0,6,0 -> 3, 3, 3; что лучше, чем 0,0,0 или 6,6,6.   -  person tom10    schedule 19.05.2009


Ответы (6)


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

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

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

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

альтернативный текст

person Unknown    schedule 18.05.2009
comment
Таким образом, одномерный алгоритм уменьшения масштаба, который подсчитывает среднее значение, может выглядеть следующим образом (от 6 до 3 баллов): 1,2,3,4,5,6 = (1+2)/2,(3+4)/2, (5+6)/2. Правильный? Здесь выборочная сетка включает две точки во время масштабирования, но должен ли я в любом случае выбирать больше точек в большем количестве направлений? - person Mizipzor; 18.05.2009
comment
Да, вы могли бы сделать это таким образом. Больше образцов обычно означает более качественные изображения, но вы должны быть осторожны. Пиксели, находящиеся далеко от нового ядра, обычно должны вносить меньший вклад в новый пиксель, чем близкие. - person Unknown; 18.05.2009
comment
Я думаю, что изображения отсутствуют. Или вы действительно хотели отобразить это изображение обложки DVD? Не могли бы вы сделать репост изображений, пожалуйста? Это очень помогло бы. - person Joerg; 04.08.2016
comment
Очевидно, Imgur присвоил URL-адрес исходного изображения другому, не связанному с ним изображению? - person guillem; 05.08.2017

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

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

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

person Demi    schedule 18.05.2009
comment
Очень хороший ответ, мне нужна была ручка и бумага, но я думаю, что теперь я это получил. Но предположим, что мы делим размер на какое-то четное число (2,4,8), чтобы сетка образца идеально совпадала со старой пиксельной сеткой. Буду ли я тогда всегда брать равное количество пиксельных данных из каждого пикселя в каждой ячейке выборочной сетки? - person Mizipzor; 18.05.2009
comment
если это даже вы могли бы усреднить. Существует множество различных способов масштабирования изображения. - person Demi; 18.05.2009
comment
Другой способ думать об этом - в том же концептуальном ключе, когда физический размер не изменится, но изменится ширина пикселя, но вместо этого будет учитываться, сколько исходных пикселей и сколько каждого пикселя потребляет новый пиксель. Это будет хорошо работать с четными числами (например, при масштабировании по горизонтали с 4 пикселей до 2 каждый новый пиксель будет потреблять два старых пикселя — усредняйте их одинаково). - person Demi; 18.05.2009

Будь то увеличение или уменьшение масштаба, «интерполяция» на самом деле является повторной выборкой.

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

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

person Jeffrey Hantin    schedule 18.05.2009
comment
Но уменьшение масштаба с четным делителем (2, 4, 8) путем простого отбрасывания данных также приводит к ошибкам выборки, верно? - person Mizipzor; 18.05.2009
comment
Да, это определенно будет не то же самое, что «на самом деле» повторная выборка исходных данных. Однако интерполяция «угадывает», где могут быть вещи, но не гарантирует, что они действительно там. Вам нужно будет повторно выбрать исходные данные, если вы хотите, чтобы они были точными. - person sybreon; 18.05.2009
comment
Усреднение лучше, чем отбрасывание — оно может дать более плавный результат в уменьшенном масштабе. В некоторых случаях используются более сложные фильтры для взвешивания групп точек при уменьшении масштаба. При уменьшении масштаба двумерного изображения вам придется сгруппировать множество точек, а не только несколько соседних точек. - person S.Lott; 18.05.2009

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

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

person tom10    schedule 18.05.2009
comment
Можете ли вы восстановить изображение? - person Brent Bradburn; 16.09.2014
comment
@nobar: извините, но я понятия не имею, куда делось изображение, и уж точно у меня нет копии пятилетней давности. Надеюсь, SO или imagehack восстановят его ... вы знаете, как давно его нет? В противном случае у меня может быть шанс переделать его, но сейчас у меня его нет. - person tom10; 16.09.2014

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

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

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

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

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

person Wuggy    schedule 18.05.2009

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

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

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

person David    schedule 25.06.2009