Graphics · Stylization

Animation Stylization
& Style Transfer

A tool that synthesizes hand-drawn-style animation from a single static drawing exemplar, with direct artistic control over how much "noise" the image has.

C++Team of three · one monthImplementation of "Color Me Noisy"
Demo video: flat digital animation re-rendered in hand-made media.

Overview

Hand-colored animation has a distinctive life to it: because every frame is painted by hand, the texture of the medium (watercolor blooms, pencil strokes, ink grain) shifts slightly from frame to frame, an effect animators call boiling. Digitally colored animation lacks this entirely and can feel sterile.

This project implements "Color Me Noisy" (Fišer et al.), which takes a flat input animation plus a single static exemplar (a drawing paired with its flat-color version) and synthesizes every frame as if it had been drawn in that medium, with direct control over how much the texture boils over time. Built in one month with Chaewon Bae and Hannah Zhang.


My contributions

Core synthesis

The PatchMatch algorithm, image reconstruction by patch voting, and the main algorithm loop.

Deformation & pyramids

Source pre-deformation via moving least squares ARAP, plus upsampling between pyramid levels.

Guidance & demos

Texture edge matching in the guidance channels, and creating the examples and demo video.


How a frame is synthesized

Each output frame is stitched together from patches of the exemplar, guided by the flat colors of the input animation.

Pre-deform

Warp the exemplar (MLS-ARAP)

The exemplar is warped to roughly match each target region using an as-rigid-as-possible deformation solved with moving least squares, so its patches actually fit the target's silhouettes.

Pyramid

Coarse-to-fine synthesis

Both images are downsampled into pyramids. Broad texture structure is established at the coarsest level, then each result seeds the next finer level.

Match

PatchMatch correspondence

For every target patch, find the exemplar patch whose flat-color guide best matches. PatchMatch computes this in near-linear time instead of doing a brute-force search.

Reconstruct

Vote & average

Every overlapping matched patch votes its textured pixels into the output; averaging the votes reconstructs a seamless stylized frame.

Correspondence objective (nearest-neighbor field φ)
$$E(\phi) = \sum_q \left\lVert G_{\text{target}}(q) - G_{\text{source}}(\phi(q)) \right\rVert^2$$

Every target patch q gets mapped to a source patch φ(q) minimizing the difference between their guidance channels (flat colors plus edge information, so texture follows region boundaries).


Results

The original flat-shaded source animation.
The stylized output with watercolor texture and temporal noise.
An animation stylized with Van Gogh's The Starry Night. Drag the slider to compare.

Style transfer from different exemplars

Source animation.
Cross-hatching style reference
Sketched ink style.
Color pencil style reference
Color pencil style.
Picasso style reference
Picasso's style.
Bonus: The Ugliest Bunny At The Petstore by Miss Vivian Osness, in the style of Picasso.

C++PatchMatchImage PyramidsMoving Least SquaresARAP Deformation