Можно ли имитировать размытие через изображения?

9

Я использую libGDX для андроид игры; насколько я могу судить, у него нет API для размытия.

Читая в Википедии, кажется, что размытие формируется путем установки значений RGB каждого пикселя на среднее значение всех смежных значений. Что не представляется возможным в libGDX - установка данных пикселей.

Так что мой вопрос прост:

Можно ли имитировать (приличное) размытие, используя только изображения?

Я могу потенциально наложить несколько (по количеству, прозрачности, типу) изображений; но могу ли я создать убедительное размытие, как это?

Я испытываю желание сказать «нет», но, возможно, кто-то еще достиг чего-то подобного. Для ясности я хочу, чтобы набор из 1+ общих изображений я мог рендерить поверх ЛЮБОГО изображения, чтобы создать эффект размытия.

ashes999
источник
хороший вопрос! Я сам думал о том же самом!
Даниил говорит: восстанови Монику
@ DantheMan на какой платформе?
ashes999
Unity3d или язык затенения CG.
Даниэль говорит: восстанови Монику
Вы предлагаете накладывать прозрачные изображения друг на друга. Если вы немного сместите их, вы будете усреднять пиксели, достигая размытия
Джефф
1
@ ashes999, если вы ищете «волшебное изображение», которое можно наложить на вещи, чтобы они выглядели размытыми, этого не существует. Альфа-смешение (наложение) не то же самое, что размытие, извините.
Натан Рид

Ответы:

7

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

Алгоритмически это будет выглядеть примерно так:

clear output_image to 0
foreach offset, weight in filter_kernel:
    output_image += input_image * weight, shifted by offset

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

Натан Рид
источник
+1 хороший ответ. В моем случае у меня нет аддитивной способности.
ashes999
0

Размытие может быть дорогой операцией, возможно, подойдет другой подход, например:

  1. Сохраните несколько копий изображения, размытого в нескольких разных направлениях (например, кратного 45 градусам), а затем отобразите наиболее близкое изображение во время выполнения. Это обеспечит высочайшую производительность за счет использования памяти.
  2. Уменьшите изображение, а затем вернитесь к полноразмерному сглаживанию / сглаживанию. Часто это можно сделать с помощью графического оборудования с очень небольшим влиянием на производительность.
Люк Ван Ин
источник
Это не будет работать, потому что оно должно быть динамическим, то есть я не могу знать точную настройку экрана заранее.
ashes999