CSC151.01 2009F Functional Problem Solving : Labs
Primary: [Front Door] [Schedule] - [Academic Honesty] [Instructions]
Current: [Outline] [EBoard] [Reading] [Lab] - [Assignment]
Groupings: [Assignments] [EBoards] [Examples] [Exams] [Handouts] [Labs] [Outlines] [Projects] [Readings]
References: [A-Z] [By Topic] - [Scheme Report (R5RS)] [R6RS] [TSPL4]
Related Courses: [CSC151.02 2009F (Weinman)] [CSC151.02 2009S (Davis)] [CSC151 2008S (Rebelsky)]
Misc: [SamR] [MediaScript] [GIMP]
Summary: In this laboratory, you will extend the operations you've used to transform colors into operations that transform images.
Reference:
(image-set-pixel!
image
column
row
rgb-color
)
(image-variant
image
fun
)
image
, each of whose pixels is computed
by applying fun
to the color of the
corresponding pixel in image
.
(image-transform!
image
fun
)
image
in place by setting
each pixel to the result of applying fun
to
that current pixel color.
(compose
f
g
)
((compose f g) x)
is the same as (f (g x))
.
(o
f1
f2
...
fn-1
fn
)
f
, in turn, starting with
fn
and
working backwards. The composition, when applied to a value,
x
, produces the same result as
(f1
(f2
(...
(fn-1
(fn x)))))
.
(rgb-lighter
rgb-color
)
(rgb-darker
rgb-color
)
(rgb-redder
rgb-color
)
(rgb-greener
rgb-color
)
(rgb-bluer
rgb-color
)
(rgb-rotate
rgb-color
)
(rgb-phaseshift
rgb-color
)
(rgb-complement
rgb-color
)
(image-transform-pixel!
image
column
row
func
)
col
,row
)
in image
by applying
func
to its old color and setting that
pixel to the resulting color.
In this laboratory, you will be creating a few images and manipulating others. We will also be working with some colors.
a. Create a new 4x3 image, call it canvas
, show it,
and zoom in to at least 16x resolution. (Note that a shortcut for
zooming in is to expand the window and then use View->Zoom->Fit
Image in Window.)
b. Load an existing PNG or JPEG image of your choice, call it
picture
, and show it. Please choose an image that is
not too large (say, not much more than 250x250). If you'd like, you
can find the image from the reading at
/home/rebelsky/MediaScheme/Images/kitten.png
.
a. Set a few pixels in canvas
to colors of your choice. Leave
others black or white.
b. What do you expect to happen when you use
image-variant
to complement each pixel in
canvas
, using the following instruction?
>
(image-show (image-variant canvas rgb-complement))
c. Check your answer experimentally.
d. What do you expect to have happen if you use
image-variant
to complement each pixel in
picture
? (You would use nearly the same instruction,
substituting picture
for canvas
.)
e. Check your answer experimentally.
Although we emphasized image-variant
in the reading,
the MediaScheme library also provides a procedure,
(
, that changes the image, rather
than creating a new image.
image-transform!
image
colortrans
)
a. If you have not done so already, set a few pixels in
canvas
to colors of your choice. Leave others black
or white.
b. What do you expect to happen when you use image-transform!
to complement each pixel in canvas
, using the following
instruction?
>
(image-transform! canvas rgb-complement)
c. Check your answer experimentally.
d. What do you expect to have happen if you use
image-transform!
to complement each pixel in
picture
? (You would use nearly the same instruction,
substituting picture
for canvas
.)
e. Check your answer experimentally.
f. What do you expect to have happen if you once again complement each
pixel in picture
?
g. Check your answer experimentally.
a. What do you expect to have happen if you use image-transform!
to redden each pixel in canvas
?
b. Check your answer experimentally.
c. You may have noticed that in exercise 2, we were able to undo the complement transformation by complementing again. Is there an easy way to undo the redden operation? (You do not have to write code; just explain how to do it.)
d. Are there transformations or sequences of transformations that would be impossible to undo? (That is, can you do something to an image such that there is nothing that you can do to the revised image that will bring back the original image?)
As you may have just observed, there are times that transforming an
image can be dangerous, because we cannot easily undo some transformations
(at least not without the magic “Undo” menu item). In spite
of this problem, many programmers still prefer side-effecting operations
like image-transform!
.
With your partner, come up with some reasons that it may be advantageous
to use image-transform!
rather than
image-variant
. Be prepared to share those reasons
with your classmates.
Consider the following definitions.
(define much-darker (compose rgb-darker rgb-darker)) (define red (rgb-new 255 0 0))
a. What color do you expect (much-darker red)
to compute?
(Answer the question in terms of red, green, and blue values.)
b. Check your answer experimentally.
c. Set the top-left pixel of canvas
to red
.
d. What effect do you expect the following instruction to have?
(image-transform-pixel! canvas 0 0 (compose rgb-lighter rgb-lighter))
e. Check your answer experimentally.
f. What effect do you expect the following instruction to have?
(image-transform-pixel! canvas 0 0 (compose rgb-lighter (compose rgb-lighter rgb-lighter)))
g. Check your answer experimentally.
Consider the composition (compose rgb-darker rgb-phaseshift)
.
a. Does this darken the image first or phase-shift the image first?
b. Does it matter? That is, do you get the same result either way?
c. Check your answer experimentally, using
image-variant
to compute the new images.
Earlier in this lab, we saw that some transformations had natural inverses and some did not. For example, if you complement a color twice, you get the original color. For many colors, if you lighten and then darken the color, you get the original color. (If any of the components is very large, then we may not be able to restore the original color.)
a. Consider the rgb-redder
operation. How would
you write an inverse to that operation using only the basic transformations
along with composition? (That is, you do not get to write a
lambda
expression.)
b. Test your answer using image-variant
.
For example, if you decided that the answer was to make the image
greener and bluer, you might write something like the following.
(define redder-canvas (image-variant canvas rgb-redder)) (define not-redder-canvas (image-variant redder-canvas (compose rgb-greener rgb-bluer))) (image-show redder-canvas) (image-show not-redder-canvas)
In case you were wondering, making the image greener and bluer does not invert the redder operation.
a. Consider the following instruction. What effect do you expect it to have on the red component of each pixel? What effect do you expect it to have on the overall image?
>
(image-show (image-variant picture (lambda (rgb) (rgb-new (modulo (+ (rgb-red rgb) 128) 255) (rgb-green rgb) (rgb-blue rgb)))))
b. Check your answers experimentally.
c. Write an instruction to build a variant of picture
in which
the green component of each pixel is set to 255.
d. Write an instruction to build a variant of picture
in which
the red component is restricted to the range [64..192], with numbers above
192 dropped to 192 and numbers below 64 raised to 64. In writing this,
you may want to rely on the bound
procedure you used
in a previous lab.
e. Write an instruction to build a variant of picture
in which
the red component is set to 255 minus the red component.
Explorations are intended for students interested in further exploring the design aspects of these techniques. They also provide students who finish early with extra activities that may challenge them in different ways. You may do them in any order.
While we only have a few basic transformations, there are, in some sense, an infinite number of ways to combine them. Try to find an interesting composition of basic transformations that someone might want to use as a filter.
As you have undoubtedly noticed, RGB colors are represented as integers. That means that we can transform colors with arithmetic operations as well as with component based operations. What do you think the following operations will do to your image? Try some of them to find out. Then, try a few of your own devising.
(define t1 (lambda (c) (* 2 c))) (define t2 (lambda (c) (* 3 c))) (define t2 (lambda (c) (* -1 c))) (define t3 (lambda (c) (* 256 c))) (define t4 (lambda (c) (quotient (+ color-red c) 2))) (define t5 (lambda (c) (- c color-blue)))
Make sure you save your work regularly. Some of these procedures have the potential to crash the GIMP or MediaScript.
Try developing your own interesting RGB transformation procedures and
applying them to picture
.
Primary: [Front Door] [Schedule] - [Academic Honesty] [Instructions]
Current: [Outline] [EBoard] [Reading] [Lab] - [Assignment]
Groupings: [Assignments] [EBoards] [Examples] [Exams] [Handouts] [Labs] [Outlines] [Projects] [Readings]
References: [A-Z] [By Topic] - [Scheme Report (R5RS)] [R6RS] [TSPL4]
Related Courses: [CSC151.02 2009F (Weinman)] [CSC151.02 2009S (Davis)] [CSC151 2008S (Rebelsky)]
Misc: [SamR] [MediaScript] [GIMP]
Copyright (c) 2007-9 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 2.5 License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-nc/2.5/
or send a letter to Creative Commons, 543 Howard Street, 5th Floor,
San Francisco, California, 94105, USA.