480 likes | 489 Views
This article explores different programming languages for compressing graphics, discussing their effectiveness, limitations, and the importance of matching the language to the complexity of the image. It also introduces an expressive language for image compression that offers high compression rates and control over multiresolution and perceptual artifacts.
E N D
Programming Languages for Compressing Graphics Morgan McGuire Shriram Krishnamurthi John F. Hughes Brown University { morgan | sk | jfh}@cs.brown.edu
Describing Images (1) setPixel(0,0,BLUE); setPixel(1,0,BLUE); setPixel(2,0,BLUE); … setPixel(50,0,WHITE); … setPixel(100,0,RED); setPixel(101,0,RED); …
The Cost of Bandwidth • Major cost of doing business on the web • Yahoo!: 65,000,000 pages/day • Valve: 1M €/software patch • Image compression is a one-shot activity • Low vs. high bandwidth users • Multiresolution
Describing Images (2) repeat 50 times setNextPixel(BLUE); repeat 50 times setNextPixel(WHITE); repeat 50 times setNextPixel(RED); nextRow(); repeat 50 times setNextPixel(BLUE); …
American Flag Doesn’t compress as well as the French flag in the “repeat n times” language.
Adding More Primitives drawRectangle(BLUE, …); drawRectangle(RED, …); drawRectangle(WHITE, …); drawStar(WHITE, …); … Is this enough?
Describing Complex Images • JPEG: language consists of frequency domain instructions • GIF: language consists of setPixel and dictionary lookup • Preferred format depends on the image
Observations • Images are programs • Even within one language, many possible descriptions produce similar images • Lossy compression • Description length depends on language and image complexity • Best compression when the language matches the image
The Obvious Compression Scheme • Compress the image in several formats • TGA, GIF, JPG, SVG, SWF • Choose the best • Add a byte to the front of the file specifying the compression language
Problems with the Obvious Scheme • None of the formats may be particularly good for our image • Even JPEG tops out around 50:1, has serious artifacts • Lacking ideal features like: • Multiresolution • Time/Space tradeoff • Introduction of new formats requires new browser plug-ins
Describing Complex Images How can we do better than the obvious approach for images like this?
Using an Expressive Language (compose (vertical-gradient BLUE WHITE) (polygon DARK-BLUE …) (polygon BLACK …) (* (polygon …) (blur tree-texture) YELLOW))
Using an Expressive Language • What if we design a really expressive language for representing images? • Because the “data” is a program the decompressor is part of the “data” • Each image gets its own custom format • High compression • We have control over multiresolution, perceptual artifacts • Package for the web as a plug-in • We only need to upgrade the plug-in when the language itself changes What’s wrong with this plan?
Example setPixel Language Expressive Language ? setPixel(0,0,WHITE); setPixel(1,0,WHITE); setPixel(2,0,WHITE); … (blur (+ (rotate (banana)) (distort (* RED (circle))) …) 2 Mb 2 kb
The Encoding Problem ? Pierre can’t code!
The Encoding Problem Photoshop menu EMACS setPixel(0,0,WHITE); setPixel(1,0,WHITE); setPixel(2,0,WHITE); … (blur (+ (rotate (banana)) (distort (* RED (circle))) …) 2 Mb 2 kb
Where is the “Save as Code” Menu? • It is easy to convert from an image to programs in the GIF/JPG language • More expressive language = harder conversion • How much harder?
Much Harder! • Converting the image into a program that produces it is a search problem • The search space is the space of all possible programs • This is an infinitely large space
Tempering Expressiveness “Good” compression languages are ones where: • Expressive power is large • Searching is easy How do we make searching easy?
Steerable Search Techniques • Genetic Algorithms • Inject domain information through fitness function • Metropolis Search • Inject domain information through transition probabilities • Simulated Annealing • Inject domain information through gradient estimation
Perceptual Fitness Function • Tweaking this is the domain-expert’s job • Perfect fitness function not necessary (or possible!) e (i ) = edge filter, b (i ) = convolve with Gaussian, |ix| = color magnitude
Designing the Language • Desirable language properties for compression • Expresses many images compactly • There are many programs for which another, shorter program exists that produces visually similar output • Desirable search properties • Mutations safety • All programs terminate
The Evolver Language Scalar := real between 0 and 1 Vector := Scalar x Scalar x Scalar Matrix := Vector* Value := Matrix | Scalar | Vector Operator := Add | Collage | Blur | Noise | … Call := Operator x Expr* Expr := Call | Scalar | Vector
The Evolver Language • Automatic coercion between Matrix, Vector, Scalar • Every operator has the same domain and range • Primitives include stock images and textures • No looping constructs • No functions!
l: Not the Ultimate Compressor! • Copying code is sometimes good • Multiple instances of a pattern in an image often differ slightly • Hard to evolve both definition and multiple applications
Added Benefits of Search • Artist can save the image immediately • Webmaster uses Evolver toolkit to search for an equivalent program • It is easy to find a large program quickly • Webmaster lets Evolver continue to run • Upload new, smaller encodings as they are found • More time = less space = less cost • Multiple constraints: size, time, artifacts, decompression time
Proof of Concept TGA 1:1 (128x128)
Proof of Concept JPG 24:1 (64x64)
Proof of Concept Evolver 50:1, infinite detail resolution
Proof of Concept TGA Evolver JPG
Lake Matheson Original
Lake Matheson Original Compressed 50:1
Gradient Original Compressed
Aspens Original
Aspens Original Compressed 54:1
Maples Original
Maples Code Collage(HueShift(HueShift(Min(RockImage(), Collage(Rotate(0.22693111, {0.4339271, -0.060890462, -0.14983156}), {0.9689341, -0.31166452, 1.0}, EnvironmentMap(Interpolate(Derivative({0.5260445, -0.9943271, -0.83629435}), FishImage(), 0.22693111), Collage(VSplit(VGradient(), Interpolate(Min(RockImage(), Collage(0.22693111, {0.90638816, -0.3161332, 1.0}, EnvironmentMap({0.3538252, -0.11179591, 0.76402247}, {0.3538252, -0.11179591, 0.76402247}))), -0.75621074, Derivative(HueShift(LowColorNoise(), {-0.60136193, -0.9961748, 0.956824})))), {-0.6025814, -0.5151359, -0.2444776}, MiniBlur(Blur({0.48381335, 0.37744927, 0.18049468})))))), LeafImage()), LeafImage()), Rotate(Rotate(Interpolate(Max(Rotate(LeafImage(), Cosine({0.13357106, -0.48899084, 0.46273336})), LeafImage()), {0.26036343, -0.2474052, 0.3318561}, Add(Rotate(Interpolate(Max(LowNoise(), LeafImage()), {0.26036343, -0.2474052, 0.3318561}, Add(Rotate(Interpolate({0.26036343, -0.2474052, 0.3318561}, {0.26036343, -0.2474052, 0.3318561}, Max(Rotate(Blur(Noise()), FrequencyStars()), BitAnd(VSplit(LeafImage(), {-0.3782095, 0.06973941, 0.7708523}), Collage(Blur({0.19214037, 0.7060751, 0.9632803}), {-0.94875985, 0.9535051, 0.9628181}, {-0.94875985, 0.9535051, 0.9628181})))), FrequencyStars()), Zoom({0.84155905, 0.44450688, -0.6368634}, Interpolate(0.97325927, {0.43938103, 0.8003519, -0.8865588}, FrequencyStars())))), FrequencyStars()), Zoom({1.0, 0.35874906, -0.42753658}, {1.0, 0.35874906, -0.42753658}))), FrequencyStars()), {0.30287892, -0.7879979, 0.756324}), Distort(Distort(HueShift(Distort(Distort(Distort(HueShift(Distort(Rotate(Distort(Distort(HueShift(Distort(Rotate(Distort(Distort(Blur(Distort(Distort(RockImage(), ArcTangent(ExpandRange(ColorNoise()))), ArcTangent(ExpandRange(ColorNoise())))), ArcTangent(ExpandRange(ColorNoise()))), ArcTangent(ColorNoise())), RockImage()), ArcTangent(ColorNoise())), RockImage()), ColorNoise()), Blur(Add({0.214469, -0.05106278, -0.8334819}, Blur(Blur({-0.44914088, 0.86714524, -0.038012877}))))), Distort(Distort(Blur(Distort(Distort(-0.32682085, SunriseImage()), ArcTangent(0.84263784))), LeafImage()), ArcTangent(ColorNoise()))), ArcTangent(ColorNoise())), ExpandRange(RockImage())), 0.315652), ColorNoise()), Blur(ExpandRange(Add({0.44753784, 0.15750253, -0.9017423}, {0.214469, -0.05106278, -0.8334819})))), ExpandRange(RockImage())), ColorNoise()), Blur(Rotate({0.10588625, 0.2359776, -0.20337643}, {0.2809281, -0.97692156, -0.49766022}))))
Maples Original Compressed 56:1
Multi-resolution JPEG 14:1 Evolver 56:1
Multi-resolution JPEG 14:1 Evolver 56:1
Related work • Searching for programs • Massalin’s Superoptimizer • Frigo & Johnson’s FFTW • Palsberg, Lucier & Mamillapalli • Karl Sims • Programmatic image compression • Fractal compression • MPEG-7 • Steerable search techniques in graphics • MLT • Radiosity
Conclusions • It is tractable to search the space of all programs! • The “visually similar” criterion makes computer graphics an interesting domain • Keep using JPEG for now…
Future directions • Improve image quality/compression • How can the design of searchable languages be formalized? • How do expressive constructs affect the search problem? • Other interesting domains: animation, audio compression, image search, robot controllers
Questions http://www.cs.brown.edu/people/morgan/evolver