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]?

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!

Dialogue & Discussion

Comments must follow our Code of Conduct.

Edit this page on Github