Upload
graiden-hogan
View
42
Download
0
Embed Size (px)
DESCRIPTION
Painterly Rendering with Curved Brush Strokes of Multiple Sizes. Aaron Hertzman, NYU Presented by: Shreeganesh Ramanan. Introduction. Painterly Rendering is a method of reproducing artistic style and expression of a painting using a source image and/or 3D models An Image Space Technique - PowerPoint PPT Presentation
Citation preview
Painterly Rendering with Curved Brush Strokes of
Multiple Sizes
Aaron Hertzman, NYU
Presented by: Shreeganesh Ramanan
Introduction
• Painterly Rendering is a method of reproducing artistic style and expression of a painting using a source image and/or 3D models
• An Image Space Technique• A few steps beyond what
PhotoshopTM offers.
A Sampler
A Sampler
Things to discuss
• “curved brush strokes of multiple sizes”
• Implementation details(as little as possible )
• Various parameters and what they can do
So you want to be an artist ?
• Do you have lot of time ?
• A huge smattering of skill ?
• That elusive thing called talent
• And some canvas, paints, a subject, and a dirty rag you call work clothes
Or we can turn to NPR
Previous Work…
• One brush size only
• No multiple passes to refine style
• Support for one style only
• Image looks “flattened”
Previous Work..
• But details need different sized strokes
CBS of MS improves quality
Advantages
• Faster than painting– Can be used for interactive rendering
• Multiple brush sizes allow for varying detail and continuous color regions
• Multipass method similar to how artist paint
• Different parameters create different styles
Main Loopfunction paint (sourceImage, R1 … Rn)
{
canvas := a new constant color image
// paint the canvas
for each brush radius Ri,
from largest to smallest do
{
// apply Gaussian blur
referenceImage = sourceImage * G(fσRi)
// paint a layer
paintLayer(canvas, referenceImage, Ri)
}
return canvas
}
Painting a Layerfunction paintLayer(canvas, referenceImage, R) {
S := a new set of strokes, initially empty
D := difference(canvas, referenceImage)
grid := fg R
for x=0 to imageWidth stepsize grid do {
for y=0 to imageHeight stepsize grid do {
M := the region(x-grid/2…x+grid/2, y-grid/2…y+grid/2)
areaError := sumOfError(M, D) / grid2
if (areaError > T) then {
(x1, y1) := maxPoint(areaError)
stroke := makeStroke(R, x1, y1, referenceImage)
add stroke to S
}
} }
paint all strokes S on canvas – random order
}
Curved Brush Strokes
• Anti-aliased cubic B-Splines• Each stroke models the color
gradient of reference image• Representation– Control Points– Color– Size of brush
Spline Stroke Algorithmfunction makeSplineStroke(x0, y0, R, refImage) {
strokeColor = refImage.color(x0, y0)
K := new stroke, radius R, color strokeColor
add point (x0, y0) to K
(x, y) := (x0, y0)
(lastDx, lastDy) := (0, 0)
for i=1 to maxStrokeLength do {
if (i > minStrokeLength and (|refImage.color(x,y) – canvas.color(x,y)| < |refImage.color(x,y)-strokeColor)) then return K
if (refImage.gradientMag(x,y) ==0) then return K
(gx, gy) := refImage.gradientDirection(x, y)
(dx, dy) := (-gy, gx)
if (lastDx * dx + lastDy * dy < 0) then
(dx, dy) = (-dx, -dy)
(dx, dy) := fc * (dx,dy) + (1-fc) * (lastDx,lastDy)
(dx, dy) := (dx,dy)/(dx2 + dy2)1/2
(x, y) := (x + R*dx, y + R*dy)
(lastDx, lastDy) := (dx, dy)
add the point (x, y) to K
}
return K }
Calculating Control Points
θ0
G0
(x0, y0)
D1
(x1, y1)
(x2, y2)
D0
G1
θ1
G2
Parameters of Style
• Approximation Threshold (T)
• Brush Sizes – Smallest (Ri), Number (n), Size Ratio (Ri-1/Ri)
• Curvature Filter (fc)
• Blur Factor (fσ)
• Min and max stroke lengths (minLength, maxLength)
• Opacity (α)
• Grid size (fg)
• Color Jitter (jh, js, jv, jr, jg, jb)
Experiments in Style
Source Image
Experiments in Style
Impressionist
Experiments in Style
Expressionist
Experiments in Style
Colorist Wash
Experiments in Style
Pointillist