Cómo lograr un efecto de respiración alucinante (deriva visual) en una foto estática

¿Cómo puedo lograr un efecto de deriva visual trippy como si la imagen estuviera respirando?

Consulte la sección Los componentes visuales de una experiencia psicodélica : deriva visual o, más precisamente , este fragmento de este video .

Cualquier solución de software está bien, pero estaría más emocionado con una implementación en Processing o Javascript

¿Qué quiere decir con una implementación en "Procesamiento"? Si está tratando de hacer esto programáticamente, puede ser más adecuado para Stack Overflow. ¿Puede también describir el efecto más directamente en su pregunta? El enlace de YouTube que proporciona ya está inactivo por motivos de derechos de autor y el otro enlace podría dejar de funcionar en el futuro. Si bien las aclaraciones externas son útiles, es mejor si su pregunta aún puede mantenerse sola sin ellas.
Processing es un lenguaje de programación orientado a la manipulación de video y efectos visuales. procesando.org
Por cierto, probablemente podría sostener una foto frente a la cámara y moverla para obtener el efecto que desee. No se verá perfecto, por supuesto, pero es una opción.

Respuestas (1)

Puede lograr un efecto como este con un par de filtros de distorsión de la mayoría de los paquetes de edición de video o gráficos en movimiento. Por ejemplo, en FCPX/Motion, puede aplicar un par de filtros de distorsión Bulge en la parte superior derecha e inferior izquierda y ajustar la escala y el radio según corresponda.

En términos de implementarlo usted mismo, acepto que es una pregunta para StackOverflow (una vez que haya intentado escribirlo usted mismo). El algoritmo es bastante sencillo. Para todos los píxeles dentro del radio, aplique una función de mapeo a lo largo del vector desde el centro hasta el punto actual. Por ejemplo (en pseudocódigo):

distort (vec2 center, float radius, float amount)
{
    for (each pixel in the image)
    {
        vec2 dir = pixel.coord - center;
        float dist = dir.length()
        if (dist >= radius)
        {
            outPixel = pixel;
        }
        else
        {
            float percent = dist / radius;
            float newPos = pow(percent, amount);
            dir = dir / dist;
            vec2 newCoord = dir * newPos * radius;
            outPixel = getPixel(newCoord);
        }
    }
}