{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "/* \n", "* @Author: paul\n", "* @Date: 2016-02-25 17:35:32\n", "* @Last Modified by: paul\n", "* @Last Modified time: 2016-02-25 17:45:54\n", "*/\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " sheet = '../css/custom.css'\n", " styles = open(sheet, \"r\").read() \n", " return HTML(styles)\n", "css_styling()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Python OOP 1: Basics and Initialisation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This exercise is designed to motivate the use of object oriented programming in scientific computation via a simplified case using images. Your task is to program the Python `classes` which reads in the data from a file, manipulates the data and plots the image." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import os\n", "import matplotlib.pyplot as plt\n", "import matplotlib.cm as cm\n", "import numpy as np\n", "import sys\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Portable Greymap ( `.pgm`) Format" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You have been provided with some image files i.e. `img1, .. img4` in the `data` directory in *portable greymap* (.pgm) format. Although admittedly a primitive image format, `.pgm` files are simple to manipulate as they contain only one pixel grey value per $x, y$ pixel in the image: the scale runs from 0 (black) to 255 (white). This represents a common task in scientific computing where you must read in some field data on a grid of points. **You are provided with the code to read and reshape this data from a file!**\n", "\n", "Here's a demonstration of a greymap image that might be stored in `.pgm` format using a simple gradient of white to black - it is displayed here using a contour plot:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 255. 253.20422535 251.4084507 ..., 131.0915493 129.29577465\n", " 127.5 ]\n", " [ 253.20422535 251.4084507 249.61267606 ..., 129.29577465 127.5\n", " 125.70422535]\n", " [ 251.4084507 249.61267606 247.81690141 ..., 127.5 125.70422535\n", " 123.9084507 ]\n", " ..., \n", " [ 131.0915493 129.29577465 127.5 ..., 7.18309859\n", " 5.38732394 3.5915493 ]\n", " [ 129.29577465 127.5 125.70422535 ..., 5.38732394 3.5915493\n", " 1.79577465]\n", " [ 127.5 125.70422535 123.9084507 ..., 3.5915493 1.79577465\n", " 0. ]]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Nx = 72\n", "Ny = 72\n", "img_x = np.linspace(1, 0, Nx)\n", "img_y = np.linspace(1, 0, Ny)\n", "X, Y = np.meshgrid(img_x, img_y)\n", "\n", "# Generate the gradient image - this could be stored in .pgm format!\n", "img_z = (X+Y) * 255*0.5\n", "print(img_z)\n", "\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111, aspect='equal')\n", "ax.contourf(img_x, img_y, img_z, 20, cmap=cm.Greys_r)\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Task breakdown\n", "\n", "Create a `SquareImage` class which reads (portable greymap, '.pgm') image data from a file. The class should implement the following:\n", "\n", "\n", "1. The Initialiser method `__init__(self, ...)`, which takes a string `filename` as an argument and\n", " - stores $Nx$ and $Ny$ as *instance attributes*, both equal to 72 (this isn't robust, but simplifies the exercise)\n", " \n", " - calculates and stores $x$ and $y$ as *instance attrbutes*. These are again the regularly spaced pixel $x$ and $y$ values from 1 to 0 (image colour values in pgm files start from top right pixel) - use linspace from 1 to 0 with $Nx$ and $Ny$ points respectively\n", " \n", " - Read and store image grey levels in `filename` as an *instance attribute*, $z$. The line for extracting this data from the files is the same as before,\n", " >`np.loadtxt(filename, skiprows=4).reshape(self.Nx, self.Ny)`\n", "\n", "2. An `add_image` method which takes an `image` argument, and adds the z component of image to `self.z`\n", " - don't forget to add `self` as the first argument! Instance methods require us to be specific\n", "\n", "3. A `plot` method which takes no extra arguments, and plots the current instance attributes $z$ as a contour vs $x$ and $y$ (also instance attributes). As this exercise is not testing your matplotlib, we provide the code for the function here:\n", "\n", " > `fig = plt.figure()\n", " > ax = fig.add_subplot(111, aspect='equal')\n", " > ax.contourf(self.x, self.y, self.z, cmap=cm.Greys_r)\n", " > plt.show()`\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Implement the SquareImage class here:\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# The image file names\n", "names = ['img1.pgm', 'img2.pgm', 'img3.pgm', 'img4.pgm']\n", "files = [os.path.join('data', name) for name in names]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following cell has left out some code where indicated - Fill them in!" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "ename": "NameError", "evalue": "name 'image' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;31m# image = ...\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mimage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 8\u001b[0m \u001b[0mimgs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mimage\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# objects are first class instances: add to a list\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 'image' is not defined" ] } ], "source": [ "# Instantiate the class and plot each picture. \n", "imgs = []\n", "for f in files:\n", " # Produce an instance of SquareImage, passing 'f' as an argument\n", " # image = ...\n", " \n", " print(image)\n", " imgs.append(image) # objects are first class instances: add to a list\n", " \n", " # Use the 'plot' method to plot the instance\n", " # ...\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extension\n", "\n", "Now that we can read in image data from a file, extend your `SquareImages` class above so that if the filename is `None` (python keyword), we store the $z$ attribute as `np.zeros([Nx, Ny])`.\n", "\n", "* This will require an if statement, e.g.:\n", " > `if filename is None`\n", " > store z as zeros\n", " > `else`\n", " > read and store z data\n", " \n", "* The default `filename` argument should be `None`, so that SquareImage() produces an 'empty' image." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Create an 'empty' SquareImage \n", "combined = SquareImage()\n", "print(combined.z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now use the `add_image` method of the empty image to add on the contents of all other image in the list of `imgs`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# EXERCISE: Loop over the list of images and add on each image's z values to `combined':\n", "# ...\n", "# ...\n", "\n", "\n", "# Plot\n", "combined.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# [Solutions](../soln/04-Classes_basics.ipynb)\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }