Due: 10:30 p.m. Tuesday 18 February 2014
Summary: In this assignment, you will explore mechanisms for transforming images in two models: drawings as values, and raster graphics (images as collections of pixels). Our focus will be on using lists, iteration, and anonymous procedures within each of the models.
Purposes: To give you more experience with each of the image models. To give you more comfort with anonymous procedures. To emphasize the re-use of procedures.
Collaboration: You must work with assigned partners on this assignment. The partner assignments are available at http://www.cs.grinnell.edu/~weinman/courses/CSC151/2014S/partners.html#5. You may discuss this assignment with anyone, provided you credit such discussions when you submit the assignment.
Submitting:
Email your answer to <grader-151-01@cs.grinnell.edu>. The title of
your email should have the
form CSC-151-01 Assignment 4
and should contain your answers to all parts of the assignment.
Scheme code should be in the body of the message. You should not
attach any images; we should be able to re-create them from your code.
Warning: So that this assignment is a learning experience for everyone, we may spend class time publicly critiquing your work.
As you saw in your initial exploration of RGB colors in GIMP and MediaScript, there are a wide range of of colors possible. You may have also discovered that it is difficult to figure out what color a particular RGB triple, such as (18,223,51) represents. It is also useful to see how a variety of colors relate to each other.
It can therefore be helpful to build tools to help you understand colors and their relationships. We will start this assignment by considering such a procedure that helps do just that.
Write a procedure,
(,
that produces a simple
visualization of a list of colors by making a list of copies of some
simple shape, each colored with a different color, and each shifted
slightly from the last.
You may choose the shape, size, and amount to shift subsequent shapes.
visualize-colors
list-of-colors
number-of-colors)
For example, consider the following command
>(visualize-colors (list "red" "orange" "yellow" "green" "blue" "indigo" "violet") 7)
If we use circles of diameter 20, with each subsequent circle starting 15 units to the right of the previous circle, we should get something like the following.

Similarly, we can visualize a variety of variants of brightnesses of the color pink using the following.
>(define RGB-PINK (color->irgb "pink"))>(visualize-colors (list RGB-PINK (rgb-darker RGB-PINK) (rgb-darker (rgb-darker RGB-PINK)) (rgb-darker (rgb-darker (rgb-darker RGB-PINK))) (rgb-darker (rgb-darker (rgb-darker (rgb-darker RGB-PINK))))) 5)
Using the same visualization technique (circles of radius 20, spaced by 15 units), we would get the following image.

You will find it easier to do this assignment if you break the problem down in to steps.
map (along with an appropriate procedure)
to offset your drawings.
map (along with an appropriate procedure)
to color your drawings.
Using your visualize-colors procedure, write a procedure
(, that takes a
color and a list of color transformations (along with the list's
length) and visualizes the result of applying each transform to the color.
visualize-transformations
rgb-color
list-of-transformations
number-of-transformations)
For example,
>(visualize-transformations (color->irgb "pink") (list (lambda (rgb) rgb) rgb-darker (o rgb-darker rgb-darker) (o rgb-darker rgb-darker rgb-darker) (o rgb-darker rgb-darker rgb-darker rgb-darker)) 5)
might give

Hint: If you can turn the list of transformations
into a list of colors, you can then call
visualize-colors on that list of colors.
Do not copy and paste your code from Problem 1:
This will just make your solution to this problem more complicated
and harder to understand. (Also, if you made any errors in
visualize-colors, now you will have two places to
fix that error instead of one!)
Because humans do not perceive brightness linearly, some image formats modify the meaning of the stored values' brightness scale (0-255) to better cover the range of sensitivities with a nonlinear transformation.
The typical transformation is commonly called a Gamma
correction, for the name of the parameter used to determine
the extent of rescaling. In particular, when a color component
brightness value is on the real-valued scale of 0-1 (rather than our
discrete 0-255 scale), the transformation is given by
Vout =
Vingamma. You can
read more about this transformation at Wikipedia if you're curious,
or simply forge ahead with the assignment if you're not.
In this problem, you will implement a series of steps to do this gamma correction on an image.
a. Write a procedure ( that takes a color component
value (i.e., a signle number in the range 0-255), and applies the
gamma correction described above. Note that you'll need to rescale
the component to the range 0-1 (by dividing) before you exponentiate
and rescale it back to 0-255 (by multiplying) afterward.
transform-value
component
gamma)
b. Write a procedure (
that applies irgb-correct
irgb gamma)transform-value to each component
of irgb using gamma.
c. Write a procedure (
using image-correct
image gamma)irgb-correct with the specified
gamma value.
(image-correct kitten 2.2)
(image-correct kitten 0.45)
In the reading on homogeneous lists, we saw that it is possible to create some interesting non-representational images by making a list of some basic drawing and then transforming each drawing in the list in a different way.
a. Write a procedure, (, that makes at least 100
copies of playwith
drawing)drawing, shifts them to different
positions, scales them differently, and recolors them. The result
of playwith should be another drawing.
Note: It is okay if some pairs of transformed drawings have the same color, or the same position, or the same size. However, no two transformed drawings should have both the same position and the same size, because that means that we will not see one of the drawings.
b. Your result should produce a compelling image for at least one
input drawing (and you should tell us what that drawing is). Write
an expression (or series of expressions) that culminates in
generating such an image by calling playwith. For
example:
(image-show (drawing->image (playwith ___) ___ ___))
We will judge your solutions on their correctness, conciseness, and cleverness.
Copyright © 2007-2014 Janet Davis, Matthew Kluber, Samuel A. Rebelsky, and Jerod Weinman. (Selected materials copyright by John David Stone and Henry Walker and used by permission.)
This material is based upon work partially supported by the National Science Foundation under Grant No. CCLI-0633090. Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation.
This work is licensed under a
Creative Commons Attribution-NonCommercial 3.0 Unported License
.