CS 151: Lab #4

Lab Exercise 4: Images

Main course page

Tasks

  1. Get your picture taken.
  2. On the Desktop, make a folder called lab4. Then download the following files to it.
  3. Open a text editor (e.g TextWrangler). Create a new file called show.py. Put a comment at the top of the file with your name and the date. Save it in the lab4 folder.
  4. After the comment line, write the command to tell python to import the graphics package, the display package, and the sys package:

    import graphics
    import display
    import sys

  5. Download your picture from the photo directory. You are also welcome to use any of the following images.
  6. When you download your picture, you will want to make a smaller copy of it and convert it to a ppm format. You can do this using the convert command.

    convert myImage.jpg -scale 25% mySmallImage.ppm

    The convert program is a very powerful application for manipulating images. If you want to find out more about it, check out the ImageMagick web site.

  7. The first thing we're going to do is create a simply program that will read in an image and display it in a window. We'll use the command line to specify which image to view.

    Create a main function in your show.py file. Give it one argument, which will be the list of strings the user typed on the command line. The main function should do the following.

    1. Test if there are at least two strings from the command line. If not, print a usage message and exit using the exit() function.
    2. Load the file specified in the second string of the command line as a Pixmap. You can do this by calling the function graphics.Pixmap with the filename as the argument and assigning the result to a variable. The filename will be the second element in the list of strings from the command line.
    3. Use the displayPixmap function in the display package to create a window and display the Pixmap. You went over this function in class. It takes two arguments, which are the Pixmap to display and the title. Use the filename as the title of the window. The displayPixmap function returns a window reference, which you need to assign to a variable. That means the variable to hold the window reference must be on the left side of an assignment and the function call must be on the right.
    4. Finally, call the getMouse method of the window. That means you type the name of the variable holding the window reference, then .getMouse() to call the method. This will wait for a mouse click in the window and then go on to the next instruction. If there is no next instruction, the program will terminate.

    Below the main function, put a conditional call to it, using the method we learned last week. Pass the main function the list sys.argv.

    if __name__ == "__main__":
        main(sys.argv)
    

    Once complete, try out your show function.

  8. The second thing we're going to do in lab is figure out how to manipulate pixels in an image. Each pixel in a color image has three values (r, g, b). Each pixel is addressed by its row and column. There are rows x columns pixels in an image. The Zelle graphics library (graphics.py) contains two functions that make it easy to get and set pixels if you have a Pixmap object. The three lines below demonstrate how you would read in a Pixmap from a file (which we did above) and then swap the red and blue channels of pixel 42 (x) 35 (y).
        pm = graphics.Pixmap( 'mypixmap.ppm' )
        (r, g, b) = pm.getPixel( 42, 35 )
        pm.setPixel( 42, 35, (b, g, r ) )
    
  9. Create a new file called lab4.py. Do the usual stuff of putting your name and a data at the top. Then import graphics and sys. Save it in your lab4 directory.
  10. Create a function named something like swapRedBlue that takes in one argument, which will be a Pixmap object. The algorithm is written below as comments, properly indented. Read through them and make sure you understand the process. Then fill in the python code.
    def swapRedBlue( pmap ):
        # loop over each row i
            # loop over each column j
                # get the r, g, b values of the pixel indexed by (j, i)
                # set the pixel indexed by (j, i)  to the value (b, g, r)
        # return
    
  11. Create a main function that takes in an argument which is the list of strings from the command line. As above, first test if there are enough arguments and print out a usage statement and exit if there are not. If there are enough arguments, then open the image, store the result in a Pixmap variable. Pass the Pixmap to the swapRedBlue function, then save the result to a file. If your pixmap variable were pmap, then you could save it by using

    pmap.save('myfilename.ppm')

    You can pass whatever filename name you want to the save function. I'd recommend not having spaces in the name.

    When you are done, run your lab4 program. Then look at the result with your show program. Now, perhaps, you see why command line parameters are useful beasts.

Once you have finished the lab, go ahead and get started on project 4.