{
"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
}