Solution to the First Image Processing Homework
This post originally appeared on the Software Carpentry website.
We had technical issues during yesterday's online tutorial (again), so I have recorded the solution to the image processing exercise we gave the students in Indiana and Toronto. I'd be very grateful for feedback (not just from students): is this a useful way to present ideas? Or should we put our effort into debugging [name of web conferencing software goes here]?
{% assign video_title="Solution to First Image Processing Homework" %} {% assign video_slug="zwl1W4PjaMI" %} {% assign video_time="00:16:25" %} {% include youtube %}My final code is:
import sys
from PIL import Image
#--------------------
def on_boundary(temp, xsize, ysize, func):
for x in range(xsize):
for y in (0, ysize-1):
r, g, b = data[x, y]
data[x, y] = func(r, g, b)
for y in range(ysize):
for x in (0, xsize-1):
r, g, b = data[x, y]
data[x, y] = func(r, g, b)
#--------------------
def for_each_pixel(temp, xsize, ysize, func):
for x in range(xsize):
for y in range(ysize):
r, g, b = data[x, y]
data[x, y] = func(r, g, b)
#--------------------
def halve_red(r, g, b):
return r/2, g, b
#--------------------
def double_green_blue(r, g, b):
return r, 2*g, 2*b
#--------------------
def set_black(r, g, b):
return 0, 0, 0
#--------------------
assert len(sys.argv) == 4, \
"Usage: program operation infile outfile"
operation_name = sys.argv[1]
input_filename = sys.argv[2]
output_filename = sys.argv[3]
picture = Image.open(input_filename)
xsize, ysize = picture.size
data = picture.load()
if operation_name == 'halve_red':
for_each_pixel(data, xsize, ysize, halve_red)
elif operation_name == 'double_green_blue':
for_each_pixel(data, xsize, ysize, double_green_blue)
elif operation_name == 'erase':
for_each_pixel(data, xsize, ysize, set_black)
else:
assert False, \
"Unknown operation: " + operation_name
picture.save(output_filename)Later: Indiana U's Michael Hansen has posted an alternative solution that goes into more detail. Thanks!