Class 38 — Friday November
Image mash ups
It’s simply smashing — For visitors on the Lawn — If they watch their steps
Look both ways
Gallery
- Spring 2020 art exposition
Downloads
- Module mash.py
- Module smashing.py
Rounding
Basic photo-manipulation problem-solving Python function one more time
def manip( original,
size
,color
,where
) :''' Provide a pattern for image manipulation
function
size():
determines size of new image based on the original
function
color():
determines color of new image pixel based on anoriginal pixel
function
where():
determines where on original to determinecorrespondent pixel for new image
'''
# set dimensions of the new image
nw, nh =
size( original )
# get a new appropriately sized image
new_image = Image.new( 'RGB', ( nw, nh ) )
# fill in every pixel of the new image
for nx in range( 0, nw ) : # consider every x value for the new image
for ny in range( 0, nh ) : # in tandem with every y value for the image
# set the spot to be filled in the new image
nspot = ( nx, ny )
# determine the corresponding spot of interest in the original
ospot =
where( nspot, original )
# get the pixel at the ospot
opixel = original.getpixel( ospot )
# determine the pixel for the new image
npixel =
color( opixel )
# set the nspot in the new image
new_image.putpixel( nspot, npixel )
# return the filled in new image
return new_image
Module mash.py
- Supports the creation of a new image that is a mash up of two existing images —
bg
andfg
. The new image hasbg
as its background. The pixels infg
that are dissimilar to the back screen color are copied on top of the background.
Primary function (already written)
combine( bg, fg, sx, sy, back_screen )
- Returns mash up of background image
bg
and foreground imagefg
, where the pixels infg
that are dissimilar toback_screen
are copied on top of the background.
- The mash up uses location
(sx, sy)
as the spot in the background to start the overlay offg
.
def combine(
bg
,fg
,sx
,sy
,back_screen
) :
bw, bh =
bg
.size # size of background imagefw, fh =
fg
.size # size of foreground image
copy =
bg
.copy() # get a copy of background imagenew_image = copy.convert( 'RGB' ) # to be the basis of new image
for fx in range( 0, fw ) : # consider every (fx, fy)
for fy in range( 0, fh ): # possibility of the new image
fspot = ( fx, fy ) # name spot (fx, fy )
fpixel =
fg
.getpixel( fspot ) # get fspot pixel on fg image
nx =
sx
+ fx # determine the shifted nspot on new imageny =
sy
+ fy # to paint fpixelnspot = ( nx, ny )
# check whether fpixel should be painted on new image at nspot
if (
colorable( nspot, new_image, fpixel, back_screen )
) :new_image.putpixel( nspot, fpixel )
return new_image # return the mash up
Helpful constant (already defined)
SIMILARITY_THRESHOLD = 85
- Usage: values
v1
andv2
are considered similar if the difference betweenv1
andv2
is less thanSIMILARITY_THRESHOLD
.
- Note: the difference between values
v1
andv2
is the absolute value ofv1
-
v2
.
Functions to be written
distance( p1, p2 )
- Returns the the sum of RGB differences between colors
p1
andp2
. That is, the sum of thep1
andp2
red-level difference, green-level difference, and blue-level difference.
similar( p1, p2 )
- Returns
True
if the distance between pixelsp1
andp2
is less than similarity threshold; otherwise, returnsFalse
.
is_background( p, back_screen )
- Returns
True
ifp
is similar to theback_screen
color; otherwise, returnsFalse
.
inbounds( spot, img )
- Returns
True
ifspot
lies onimg
; otherwise, returnsFalse
. That is, it returns whether the x-value and y-value forspot
are nonnegative, thespot
x-value is less thanimg
width, and thespot
y-value is less thanimg
height.
colorable( spot, img, p, back_screen )
- Returns
True
if bothspot
is a location onimg
(i.e., inbounds) and colorp
is not similar to colorback_screen
; otherwise, returnsFalse
.
© 2020 Jim Cohoon | Resources from previous semesters are available. |