Skip to content

Instantly share code, notes, and snippets.

@edouardklein
Last active August 29, 2015 14:14
Show Gist options
  • Save edouardklein/491e3ba6dac919a97dbd to your computer and use it in GitHub Desktop.
Save edouardklein/491e3ba6dac919a97dbd to your computer and use it in GitHub Desktop.
iPython notebook - M-array
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:c68d2246484ccb315fea66290636daab228875c9ded925465c12672f05098102"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction\n",
"The algorithm is described in this paper, section 4.3 :\n",
"http://www.vs.inf.ethz.ch/edu/SS2005/DS/papers/projected/salvi-coded-light.pdf\n",
"\n",
"We will tend to use the same notations as in the paper.\n",
"\n",
"The elance job requires the matrix to be of size $641\\times481$ and to be invariant for a rotation of $\\pi$ radians.\n",
"\n",
"It suggests stitching $4$ $230\\times240$ arrays together with an extra cross in the middle. I assume there is a typo (inversion of '3' and '2' in 230) here and the suggestion is actually to stitch $4$ $320\\times240$ matrices.\n",
"\n",
"If the typo was instead to have a $461 \\times 481$ matrix in the end (inversion of '4' and '6'), it should not be too hard to change the parameters anayway.\n",
"\n",
"# Parameters\n",
"## Theory\n",
"The text of the paper do not make he relationships between the matrix parameters as easy to grasp as they could be.\n",
"\n",
"The final matrix has a size of $r\\times v$.\n",
"\n",
"The window size (the size of the submatrices that are all (except for the null one) present in the M-array) is $k_1\\times k_2$.\n",
"\n",
"To fill the window, we need a random sequence of length $n = 2^{k_1k_2} - 1$\n",
"\n",
"From then we define sub parameters $n_1$ and $n_2$ as $n_1 =2^{k_1} - 1$ and $n_2 = \\frac{n}{n_1}$.\n",
"\n",
"The $n_1 \\times n_2$ random matrix is padded on the right with $k_1 - 1$ columns and on the bottom with $k_2 - 1$ lines.\n",
"\n",
"Therefore finally : \n",
"$$r = n_1 + k_1 - 1\\\\\n",
"r = 2^{k_1} - 1 + k_1 - 1\\\\\n",
"r = 2^{k_1} + k_1 - 2$$\n",
"and \n",
"$$v = n_2 + k_2 - 1\\\\\n",
"v = \\frac{n}{n_1} + k_2 - 1\\\\\n",
"v = \\frac{2^{k_1k_2} - 1}{2^{k_1} - 1} + k_2 -1$$.\n",
"\n",
"It is interesting to notice that there is a one-to-one relationship between input parameter $k_1$ and matrix size $r$. The number of columns $v$ depends on both $k_1$ and $k_2$, though."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def matrix_size(k1, k2):\n",
" r = pow(2, k1) + k1 - 2\n",
" n = pow(2, k1*k2) - 1\n",
" n1 = pow(2, k1) - 1\n",
" assert(n % n1 == 0) # Check that n_2 is an integer\n",
" n2 = n/n1\n",
" v = n2 + k2 - 1\n",
" return r, v, n, n1, n2\n",
"matrix_size(2, 2) # Should return 4, 6, 15, 3, 5 if OK with paper"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"(4, 6.0, 15, 3, 5.0)"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Finding parameters for required size\n",
"\n",
"We would be happy to find a $r$ or $v$ of either $230$, $240$ or $320$. We will list all posible $r$ for increasing values of $k_1$."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"[matrix_size(x, 1)[0] for x in range(1, 10)]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"[1, 4, 9, 18, 35, 68, 133, 262, 519]"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It looks like it is not possible to create a matrix of exactly the required size. We will create a larger matrix that we will then truncate."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"r = 320 # 4 to test like in the paper\n",
"v = 240 # 6 to test like in the paper\n",
"k1 = 1\n",
"k2 = 2\n",
"while matrix_size(k1,k2)[0] < r:\n",
" k1+=1\n",
"while matrix_size(k1,k2)[1] < v:\n",
" k2+=1\n",
"k1,k2,matrix_size(k1,k2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"(9, 2, (519, 514.0, 262143, 511, 513.0))"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Actually creating the matrix\n",
"## Same matrix as in the paper"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def m_array(k1, k2):\n",
" big_r, big_v, n, n1, n2 = matrix_size(k1,k2)\n",
" if k1 == 2 and k2 == 2: #Assume testing like in the paper\n",
" random_sequence = list('010011000101111')\n",
" else:\n",
" random_sequence = list(map(int,rand(n)<0.5)) \n",
" M = zeros((n1, n2))\n",
" i=0\n",
" j=0\n",
" while random_sequence:\n",
" M[i,j] = random_sequence.pop(0)\n",
" i = i+1 if i+1 < n1 else 0\n",
" j = j+1 if j+1 < n2 else 0\n",
" M = hstack([M, M[:,:k2-1]])\n",
" M = vstack([M, M[:k1-1]])\n",
" return M\n",
"M = m_array(2,2) # Should output same array than in the paper.\n",
"M"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
"array([[ 0., 0., 1., 0., 1., 0.],\n",
" [ 0., 1., 0., 1., 1., 0.],\n",
" [ 1., 1., 0., 0., 1., 1.],\n",
" [ 0., 0., 1., 0., 1., 0.]])"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from matplotlib.pyplot import imshow\n",
"plt.imshow(M, cmap='Greys', interpolation='nearest')\n",
"plt.savefig('M_array_small.png')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x11268af98>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Matrix of required size\n",
"\n",
"We are going to generate a matrix of size $519\\times 514$ ($k_1 = 9$, $k_2=2$), truncate it down to $320\\times 240$, stitch four of thos together with a cross in the middle so that the whole thing is $\\pi$-rotation invariant."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def cross_stitch(r, v, full_matrix):\n",
" m = full_matrix[:r,:v]\n",
" answer = zeros((2*r+1,2*v+1))\n",
" answer[:r,:v] = m\n",
" answer[:r,v+1:] = m[:,::-1]\n",
" answer[r+1:,:v] = m[::-1]\n",
" answer[r+1:,v+1:] = m[::-1,::-1]\n",
" return answer\n",
"plt.imshow(cross_stitch(4, 6, m_array(2,2)), cmap='Greys', interpolation='nearest') # Image should be \\pi-rotation invariant"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"<matplotlib.image.AxesImage at 0x11287c7b8>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nTAAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x1127a45f8>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"M = m_array(k1,k2) # May take some time (around 5 mins on my machine)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"final_matrix = cross_stitch(320, 240, M)\n",
"plt.imshow(final_matrix, cmap='Greys', interpolation='nearest')\n",
"#To save, we use PIL to avoid unwanted interpolation\n",
"from PIL import Image\n",
"im = Image.fromarray(final_matrix*255)\n",
"im = im.convert('RGB')\n",
"im.save('M_641x481_2.bmp')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAMsAAAEACAYAAAAdo4LwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztfV3MtWlV3rpnholSEgixAQskQ1JIIGmKmtDEYgnW1tEY\n7FFtj4htetIDSZrgDJ58w5HKQekRJ7UYShRjtBqIB+UnX1JP5CfOVORXDCSgMpiGGKwHYrh7sPc9\nrO/a13Wt9ez3/b5n0+yV7OznuX/Wuta6199+f/Yz5pxxpStdqaaH9gZwpSt9t9A1WK50pSZdg+VK\nV2rSNViudKUmXYPlSldq0jVYrnSlJt2XYBljPD7G+NwY40/GGE/cDxlXutKDpnHbv2cZYzwcEZ+P\niB+LiD+LiE9ExL+dc372VgVd6UoPmO5HZXl9RHxxzvnlOee3IuI3IuKn74OcK13pgdL9CJaXRcRX\n0v1Xj2NXutJ3Nd2PYLn+/cyV/r+kR+4Dzz+LiFek+1fEobo8R2OMa0Bd6aJpzjlw7H5Ulk9GxKvG\nGI+NMR6NiJ+JiA8QMPI9v/IYW5f54T62V61DbMiDYWd7mKyt+9R+hkHtvw05yr5b9ik+Fca87s6d\nO2edNRtzdmDYS4A3fUXET8ThJ2JfjIi3k/l5EN2jvHbtxTG2Dtfj3moOeSr5DC/DzHDlNXfu3LGy\nnZyOTZ2dtuDs6M7sxvieey5OH+UfHUp7T/z61n903KHVhs05Y4zx3DujhS+vy2NuHcrIe1Amu1cy\nGJ7M18lhuqEcZhvUQ+Fwc8rWDgficToyHB2bqvutZ6r2sHVMN5DxQNqwFi0FMtD1WuNrDhVZY5lP\nHsv8mKHz/d27d08wLB4Mp3NqdFYVKMyZmN55XvHL+zIpp0WsVVJQ/BArk5/HmV2V3fH+7t27J2ea\nZSB/1DVjQTsjflc8dq0smZwDKYdTFWPdu0NnmV9hYA5b8UBsLtt2sKrK0OHrqg+zCeOr9GL6K35d\nO3ew4l6lB+rjMMD6k8Hd27DjPXX+qnwu6pbeyqnzepYpmVwVVNVahc1VD6eLC26Gvwq+c/WqKiny\nzmOV7O45K5xMjkm6l9OGLeo4QJ5n73mdKtEqW6lksfZj68XWI26VERlmxJbbBeZMij/iwZaFjaM8\nh5Pxz7jYmoyd2VKtX/cMWz7fzD/zwPe8rlPtFd2P37O0SQGuAqbKnMqZcK9rh1yFcZlSBbjCgziy\njEpWpyow/ZQ814plvqivy/4KO+pZ7XdYumfEzp8lCkW7f8BnzuWcyJVels3weq2r2rHsPGyvCiZX\n9TK2zIdVPpZBK755vOvoqKdqpVT2ZrhYEkTHzBhw/5ZzVBhZFXPVX9kt027BojL8umeHUrUg6rBd\n64EOqpzUZR2W0ZnxWVbDOTzQSh+mv8qqLBGpJMLmEHfHwZQdMeGwM6n0qc6EVSZlN4U3066VBRVA\n51WtSOaB12y/y4qqmuBa5M8CbBE7ZNU2VI5WtQoq07N2rRPw61oFk3I2Jo/hU0GgHBvtgPg6tnR+\nheMXW1kQsMo6eU9FyEc5LHM6HGfykF/O2B1Z7DCUXmytChrk5fZ25LtWKK9RFbDSk7VrlSx1ropU\nZUQ++f0iK0tFqtS7IMKMU7U5zjjq4NlBLj6stcg8KkdX7QaT54itVe2c289siE6nEkxlPyaT6ets\nyGyzxW+20u7BwrKFyvLO4ZhxWHvAjM3kM14ZGxLbk+UyPAyHklE59jkByOQx+zG7q/YPZTCdWTvF\ncLB2VwUB2oNVO9fOdbqW3X8pqUqxyhpsDo2sqo+qRjimsOVyndcx7Iin2zZsOQ8X8Ofsr9ZVOt3U\nflvPzZ25k+V8LvE5iZ7df8+y3lk2VUGDcxHaeOc4LfJ0AYUy2D3by2S4qsf2Yb/t2jzmgM6x2D5V\n8REPw7DV9gwXq2asorPKiXPOVySePStLBC+n6ARIrk2pyrRyYGdQJ9MFYyewKoxVgCF1Hb8jU9lB\nyapshDy3JpctZ1zZzZ3NceyEwUX86Fg5JWYtx6fjhJmcsVgmw2zM9FD4qrHFI+viWr2thDbJuiid\nOnogfjaGnxEWhvx+0zPr+AfKVcnB6bnrB3xnLKd8NpAyLnN41bY550QZeM1KeHZIto9h7WZklX1V\nFmaVoJLN+GdMzB5qnMllwavWqUBjOFmAIrlqWbVhu35mqTJa5TDKKFhuVavQaY1YdVGlnDkMC9LM\nHzGh41TOXJGTg7rldSrY8FqdGbMTy+DuLFiL2zlzlVgqnaoKvttnFpXxOhFfZQ/VQ6vgQRwqAytM\nVWWsqmW1VyWNTgJAvW8LkxpT+JBnhcklJIeb7WOYcIzY/CRD7RosLAO5LMLGXWZQ63Ct4+faqe6B\nE/0lFsfHBY7D5hLEVkydRKOwuaBXerh1TGeU5fyneD8Jlottw9BgWMrVGmcwFhAqE23VAVsAhhd1\nrALeOZvTc7VuLjMruc6+WR7en5N0XWJhdnSJErHhPqaT8z+Kd6/KEuGzl9l7zz0zYKcNwPFO1lIH\nhk68pXVwlapqYxQ5XRTuCl+ll0tU3epf6czwK12UPkoukXOSKS7mz13W9VIaX4sw+2AGZ0Zj2TLL\nwbVVQLoAyOOqSjBCXVRWrzKr0w15V0GHuFnlxHXMTsxGyu6dCtepIBiA+HJVVtFubRgzqCqLTEFs\nrRax7I88WWC5jNfJkKqVq9oedu2CoIPNBRST023PlD0V33xfBVn3Gs9XyVf+UummzjHign7PopRg\n6/N9lRGw8lQZi8l3laWbpVm7oRwnOwHKdHtQHmJWvBUm5zg4z+xQtZWdDoCdGyNVrdg9C76OjIv4\nT8k8Vh0OG2MGZT2z4o2OlWWxLMX4MGfE7If41stldVY5EHulG6u0rBJhps7OhVlaBRxiwiBnVbSj\nm9OhW/WQd9UJnMxVPev9oAF/dbyu03ywebc2EzqZKsdOJsu6KJuNV87N5lSmw/uuLbr6Ojt2dFAV\ng+HBcaeDq+zOvjf1IZjf/gF/jPGeMcazY4xPpbEXjzE+PMb4whjjQ2OMF6W5t4/D4/E+N8b4lwXv\nk+uOc6ys0Ml0ykBZLspEGQwHVgAcQ3kq87EKpmyD90xXtx73Kht2dXCOh7rklzpPJZslL1XJ1Xky\n3ZVtFHXasF+NiMdh7MmI+PCc89UR8dHjfYwxXhuHb81/7XHPu8cYVIY7HFVWjzJO1uN8NoRyQIWp\ng5HhRaOzIFXO5loUvK50ZWuU06FdlG1d1UQbK2K2rPaogGK6KtsyHApvdd5lsMw5fz8ivgHDb46I\n9x6v3xsR/+p4/dMR8f4557fmnF+Ow7fov57xZY6EmccF1NYsuPa4KqOI8cUxzHSuEub9TE9WzRRe\nFYh5nmV5xK6qhMrULLM7+3TJ2aXDt/IZ7BxYQlB07gf8l8w5nz1ePxsRLzle/4O498FF9hF5VUZl\nh6WyJDqAchBV9l3wuozK5DJHx8Na80xf1FPZylG1HzM1BoDDzaoJswc6Zsc5WXC6xMHsn/mzZFVV\nWEU3/j3LnHMO/yQvOsccK0J/YF7EshzLvOyA8xyOqTWsvKuS3201VPVkejJMWT/W8qn2zdlKyezY\ng5Gzt9vjOobqnDFQ2Zo1V61ldG5leXaM8dKjoO+PiK8fx/EReS8/jp2Qc1S8V8ph9shjeJ33sf34\nUrKZkzPdVBVSGY3pVyUSRS7x5HeUrYLRnQXKVdkfbcjsXQWVsp2rVi4wOveZzg2WD0TEW47Xb4mI\n303j/2aM8egY45UR8aqI+DhjoLIbM6AybuVk7mAZoXNUWQwrCpPHDlPZg1UoF/zMTjiP12i/ChNi\ny3ph0sBK5yrYuWezrvM7zjufUQGKGKVB3Csi3h8Rfx4RfxuHR3b/bES8OCI+EhFfiIgPRcSL0vpf\niMMH+89FxI8LnnO95mHgnutFedzNsWvHB6mzl2Fm89Ueps856x1Vtqx02rK+axdl00qfzt7KXm7O\n+M6J317EF1awsu3mcU1em+fzXpfxKv64P48pnLgujztdcY1ar+yGGJmODGdnPWvrlB2U3VAO0xF5\nu/Or/MDhLOZPGO8eLBFBDy7PuUPqBpOSoZwS+aiDq3iplk4FHZOFY6iHcgTHQ8mssCr9FHbHt8PL\njSMP5g/OzoWMk8W7/iFlZYysuAqUvB554D5cu/iwzz3IJ69X/FzVyVTJUzoxHd2923MOpjXnqlK2\nT5ZVycNkxc6N8UGdWIBW/uKCOdPu/8+ySGX2bDSXOda8us+BoYzuHAbxuIrUaRUyj3yPOriq2yEW\nwMw5GR6Gv1uVOrxUpsezypjdeWcsaEvlW1vsuvuf6LOskOczVe0JOnCV9dk6lXVY4CmcbD3q4bIu\nylUBquzHHBedagsedFiFFfEyZ0aeWWaVJHAdqxrMNgynsp+ji2jDIviHrDWuWhp0ik4b5NojJg/3\nMB6ufOcMxwKP8Wd8WSVl5NrEbkVl2bvS0SW56kwzH7anagNdW6jkMX+72DaMldo8XrUImGUYf/aO\nsjFLsUzNsg87MFWhXGXJVDkZ28+Co9MCKf6usrBr57hYrdgYa7OYvE57V2Ff98rnqqRwEZ9Zuq3V\neleZmpXz/J6JGZ9le5TDshjeMwwquJ2Td/YwnVQWdUFb7WE2cHZAG7CzYFndJRHEkJ08y2Hyqpat\nQ7t+FdIi11rhGpXJ1hjrU93eThVzB1xVNtzLqlPVVlT4mGyFE51MJRiVgbty0S7VXmUbpg/uyffV\nXsarGzC7Bws7DOWcaswduuPDeOBaV4Ew07EDd4fDsLIKq7ArO6j5irdKQHmMBZPSQ9kLbVO1pIoX\na/nYPRtT7Zmji/il5CKWWbZkbhxnBlTZunKsak0HG84jtmqM4e1U5XNkbbX7mnPnUa1herhAqGRV\n2IvO4GRi988s7jODaleUwVX57bQEeT/LwGwdVpBOm5IzuqoumVQ/jhhYxbgp/64+yh5ZBktiSoYK\nHlYdXOCzNld1LZ2isetPw6pxZgzXX7MDd47lsqMKHrVvjWcsLIgYbyYDx1UiUBiYPpkvrkUHZgkC\ndeu0hyw4qtZLna87Z9zH/Ma1YdV4xAV8FRJrdVSQ5Hkcx7XOSRyOLe2HO3DXAjoZWA2qrIqO6Kor\nXndsooLYtZ/KDkqG4pf3sySmZGNngOvYfIUj4oLasGwIbCEW4SE6Q1SH4ZyF7VOVogpyVuEUHpZJ\nOxm4Gl88WaVVPBAHrlNOl+dYgnDOyOSw/Z3zZ7KwGrmgYrT7T8OQVBZ2ToP3rAoxJ8ZrdGwVMIsf\nW68qinpHbC4jOkdj5CoDk1Hp1dUPdenat4sL93SrveLVpYt4pqRrpdZ1diLlOHlP50CqNo1lS6wA\nuI4dgpKB+5hOqg3rUNX6ocwtuNk+rFiqCisZTEfVErqqy/zA7anmF+3+aO+qNVEtDxtTLYPiz4IR\nZaNMDBjczyrGlgrCsLKDz7JU4KuWqyOT4WR6ujbN6Z3v3TkonM7Oqs3a6m8ncrdmq9ugAV/f6pzI\nGUZloWqN4p0xZT5qbd7DMDg+ea2SrQJG2cet6chgfLfoxezS4cPWds4OMbg11V7iZycKXeQvJW10\nm4Ne42xdxwnyPNuvxpTMCpvC52zi2iY177K/mld4UD8VtF37ZRkuqbhKUmFjVHUhLFh2/z3LKpcK\n+Cr1Rql7Xsh/Xbv9WZYLWFXJcjvCDgtboU6CYq1F1bKw+byf6aBks7YNnVfJQB0YbxWcSGgvvGZn\nj/uV/2Q9UEdGu31mYQeN11kJzEqNzHAPP+dkzFCKL/Jj1+hEWY6qKt32zgX0OY5Y7VPnUtlBEcNV\nnYnqBpBUVXF7u7wjLuABrNnBFnUyPDojO9iqBXNGUo6C/N0eJos5pmphui2XczbFp4MD1681rko5\nm2W5iIkFGiYfpWe3ejq/qpJvxAX8nqXT7qyxrQ6hjOMyoAosh41hqDChXipQOlhxnbITtkyYiVml\nUbKZLohJOTby7SQFtxdlVvy2nuui3T+zMFI9JvaXKmPmMZVFFG/VamD1y3MMH8vIGZPDjGNYfZUT\nM76q2jmZzCmRJ9pDJbOOXZGqIHN2QrmMt6se1i87EXXbNMaYKtO61ipTlfVYJsJyrgzdxaDkZHxM\nRza+teWqkg1zUMYvz3dwMh07LYyzK7OVa6Nv6hO4HnU8Xp8w2fUDPqsSXUOxfhbXOcdSRq/anapt\nUUHjkgKuq9pDxh95dtqoLYHhZKoKUwU0u1Z7OkHEeFW+sdZVtoroPSbvFWOMu2OMT48x/niM8XPH\n8Rs9Kg8dn40pJ8/vWXHWliierGSr1gJxMrn5uuuonWyMQYQ4mQ0zb+YQjDDY2TzaRNkA96BNEKdL\nmhkbO19VRasEyc6oqtgUNCjw0oh43fH6BRHx+Yh4TUS8MyJ+/jj+RET80vH6tRHxTEQ8LyIei8OX\nhD8EPOdB9JzrGl+L2Docz2vdPPJkY0qO4s9kuXeHC+W4/Uq2w8rsW9lhi34Oa8e+uNbp6fhXcpzP\npeuTWOg8Ju9rc85njtd/HRGfjcPTvG7tUXlH3ve853HMqC7j5PVMTjej4D1rudhazPSMN1uz3l12\nQ9yKqjZo6eBwsPVqDdrCVVZ1vojbtWnsfJlfZH9R56v8hNGmn4aNMR6LiB+IiI/FDR+V13UgRc7h\nca5yPrYWnanCizwVFiabyXDBis7E+HTkMj5OLnvHdVWgMTsr2TjOsLBAc9RJDIrawTLGeEFE/HZE\nvHXO+U0QsMqXopO56hCzIaqssNWx8PMNC5BKnqswLLs656oqgMLN9HJrO3Kcs6NeqqJU54P4MGkx\nvToJwHUnjA9b65J0K1jGGM+LQ6C8b865nvJ140flqcyugoQZEh0UndQ5F451WjHlVExOxoMB7Gyg\nqiULPvbOZG1tpVCW0l3ZwZ2V053xQn7srLf4imoTq6rU+WnYiIj/FhGfmXP+lzR140flVQZi5FoQ\ndhgqqzAncjxVxWFBjvwzuWrpDqvbZnRwO5nd7L3WuOrZxa2C3yUZx9NVUcRVjZ0IdK+IeENEfDsO\nP+F6+vh6PG7wqLw4/uRhzufat3vu8zuO5fVsHF9IjodbU405PbasY9eIv8LY2efkOMxb1lUYmf27\nZ+ewVZiVHrDmJBZ2/+evNEbXTpL51z72YXGtz+/In/HEOWUX1r9jq9XBiThwP85l+W6t0qErx2HN\n90wWazmVDTtnkO9xnzrfCqeSl7Edx04W7/7nLsd76XSIT7VDyCuv7eroemyFSTn0GlNOzJzZOSvK\ndm1PZy/iYTi2BLAac+M450glRsWX8d54FpcVLJ3e8rjeVooIHTDIJ6/t8qgOqosd5WzJwM5JnNO7\nNSiLYVtj5+is+HaCx9lmC48b+NlJsOz+JXv5fr3yfPmhS/DMvNb9c73n4D9JyXsqB0feFRY83IxH\nEeI7lzp80DZ5fKuu+d0FMK7Bs2GyKyyKmF8hv4rnRfzzl7rPY+wQWNbO+9j6PKfGWWZkzt2tdEqe\nyv4VqTVbDj5jcdXEXTP5qvVRycMlLiZb6aX8wVUo9K3K/hfxjZQu42UnxQy05vP7mkcZLFtVlYNh\nY46u9ME16BBsHXtH/VEe01ntZe8swyNPXOecL9sJsVSVJ9tDtVBqT96L+rsgqHxw0e7Bsqg6TFV+\nmSNtyRY5G6nMyPgrHKy9QH54rQ6KZUlVsfC+2sv2VS0OqwZb7MJ061RU1b5l/gwHYs06uCSjaLc2\nTDmlc3JXCVjlcW0B8kB5rEVxlYaR0oXpxRy903a4644sNqZa3nWtdFXJAauEs3OFM2NgPsDwO12U\n7RldRGXZYph8zTKOahXYgWOWyjxZ8CI2dUjqMJ3u6oCxpUB8W+aZ83Qzu9PLOSlLSCoRMn54hu68\n2VlVZ1Hpnunivr61qgTMQOqwlBNmWYw/w5mJHbpynDzm9HdthNNJBbGrMAybyvB5DyYi1uJ0gg9l\n5/stOmUe6jwzn05FdW3Z7j86Vu/52rVCWzKDa3UQgyrRFW8XbKpq5CyJwbP0ZdlWBQ5mWawweY3K\nzgo3znVsknmrBLbV3oiFVSCXwDr+h7RrG4aOv6jTEqxr1qooGZ0KgYZ2fDMPlZVYNnOtFnP+Tras\nsqrjz4JEZXAcU0Ge1zDMqj1DWzEeOIYdR97LiM0pX8x0EZ9ZIvRnE1Wq83zOkCybKMN1HMJVvA5+\nFXSd6oDynVOoJKLaxEqucnKnL7OPy9gqOBg/da5ZV1Z9s6wufkW7fm+YKv/qADrGVSWYtTNMBpPF\nHAWDE3myw8jrUZarQFmnzqGr9apisKDCtUofxKtsxe6r9o4lF2Uvxg9loy6ZH14z2v2rkDK5dkmV\nbVQWAxB5dg5d4XGlnemHfNihOJ2xOmTe2AJ19Gb80PlYS9RJZsoGKoMzDGy/0huxKL+ofEoFMqOL\n+GlYpw1Z1DlU5hgqOJCcI6jAc87nCPXFyqPwo74KOyYR15YhHqV7XlvJUqTshmsU/ursGV4mV9la\n0e4f8FWrEXHaErgDQp4d5dGwqh1ZlA9NtULKSRzfilTWdcFW7VfUxclapDyOWJSD5v0VThUoKqGg\n37Aq223BIi7gu45Vu8DWMwO5gFLOW7UYTD4LGiZXXa97JtsdtnOKLVWZ6eWqAWvXnI5OZySmF0s+\niBX3sEDonD9LyJ2AvYjns2SnwV7SBU9+XzyZEapq46oQa4VUJav4umBQzu4cnlUW1L2qxsxmXfxO\nf+WMjFSLpzoNVw1cG4lJofIxpIt4WvG6j6g/D+ArzznDucPEQKr6XcaLZeeMDXVhtCXjqf5brTvH\nQRxup/NWW7rqWp3hFv9A2Yy/C+rd/1My4tS43QNVGTHvdWtwbeZJMEvZ7PBxHePFMLr2xO3vBLzj\n392f9VLYla0qPRQ5+7I1jk/X5+Yl/adkJpdR17W6ZxlYlfVM2L6oTI3tXG7rGM6qMro5dGTUATMw\na8OwYjI+DG8HH86pzgBtxezp9EBiwecqZuU7TH6HLuJpxcxJXIZ2zr/mb5JtnTxX+aosi46hsOA7\nzjm9cU7x2IJlq37ONnnPTauo0tvZRfkDsd0J04t4TF7l3CwbLcpzVYnOlDNgx3iMj8tOKkCVfixb\nVq2F4610VfxdpUadGA5WxTIetbdbsZRO3YBUtmJ+p+gi2rCI3odJtn7NKwNjK9HpdztOi+0P8quy\nZNWyId58qNhqsbWqLVN41j1rnSrdVBvVtaeyFWsDcT3iYTq6s+i2YBEX9EtJNe7aABUIyjFYdsW1\nKpOxYGRjVVArfGweHZdl0oyFtTUsgLpOWjnhFrsoXZVMTChsLQuoqlNwwaOwLtr9z10ieBAwx2AK\nqTKbZbAeFytDdqSq/WH42aHhPcvASkfEwhKIk49y2XrVxqj9jD/Kdw7HMLJzVXo73qpSu3OoKi+S\nrSxjjO8ZY3xsjPHMGOMzY4xfPI7f6BF5RI4s5UxRll1UlUEeyB8NWrU7yAczYTfQsjyGSa1RLR6u\nZ1WU8a+SDRLqziqbOgvWHq5xF7Qon/Fn/uA6lyy3e1b3KM1eEfH84/sjEfEHcfii8LMfkXdcNw+i\n5z3v6zqPszk2z95x/blyFRYmh5HC6mQp3rc539Vtq56Vboy/Ohd1lkpX5ifnyJ0kFjqPyfub4+Wj\nEfFwRHwjbuEReUROmZUxa+S1+M7453ccZ3uzobLcdc9wsXvcn/mzTK10qVqmSh9sr9DmDBtrVaqq\nrmyGtmf64D2OM11Qf4aL7WWYHHWez/LQGOOZODwK7+6c89Nxw0fkZdDoeEuJNa/KKDrjemcOhweM\nMvI74mNOzvaj4dk9k88O1yUO5wwOr+KtWmAWfE5Htr7Cm/e5c8Hzw+BDfVgAMH/Jc8wPkcoP+HPO\nb0fE68YYL4yI/znGeBPMzwG/ZEQWjv9TTz3VAoxzLIMyHirTMgfJhLxYULF5VnnWPQuA6uDY3upg\nWeXDTO8cN+NyNlWB7HhmZ2frWIVjONH2qkI4THlu+aGj9k/D5px/Ncb4vYj4oTg+Im/O+bVxw0fk\nOSdSB8uUdS0cW6+ocmqXQZkspocaQwwqYJwuLNuyfSivi7WyuZtXyUqRsg/ur5IA04PxcD4UUf80\n7PvG8SddY4zvjYh/EYcnf93KI/Kw1KpqkRVe7y6ToAzWmq13bOnyeOaneKkWgDmYOnBXJSvbbZlj\nNljjzNE6Ac/skPnhPKt6zIkdr8yP6cg6BqU380NFVWX5/oh47xjjoTgE1vvmnB8dYzwdEb85xvj3\nEfHliPjXR+GfGWP8ZkR8JiL+LiL+4xRaqfZItTBrncrAyimd87mKhe+Ov3IqN8cwssBhB8/sWFWa\nygZZtsOt7FHZhWGt8DobOEzuXslR/ngPlqoU3g8a6TF5W0p8JuVsuIfxRj4soxLMVoaS6/RkLYAj\n5Kd0cO2L4rs1UCrdEa/SRemA45XcjrOzPUbPEya7/wafRX5WnB3iul/zncBRwZjlqOzI+DFDM3xd\n/dkeF0zVvZLjEkMXs8JX2VhlfnVmqqvIVbuyn7Jd5oGyFO36LfoZHF6rTMKCAPltyaxbWiRmTIXb\nZXulN+raqYTKWZR9FW+21jkaq45IrqJXdnf6obO7BFBVYZTrguZi/ur4Sle6dLqIL6yI4NWAtUSd\nLKIynspcLrtVWUdVNJa5O58B8l6mg/t8023p1F7XYiLfTkZW3UAlI1Pnc0rVbajqmPcyeUgX8UxJ\nfFfOXrUf+XODOni2J9+zzynd9a7cK/3dvRt3sqqAd3g6mFF399kiy1RBx3TKvFxbjmfPeKuzU/6n\n6CK+N0wZgTkuM0qmfIDMGPl1DmYXsEwndSCdjMYytcLAsJwrw+FVejp7bCE8I3V+TpesO2JlFUUl\nyBP+5yh0Uxriz2NcZLPDWvd5Po+xvU6mc3KHQ2V553idNkAdqGsFHU7HP891cZ9jl8reSE5nhjuP\nuXN3Mo9zJxMX8b1hWzLmeldKIo+cUVS2wSyMbYXjxeaRtyrxmO0Ytsp2W+Zci6mqXVVhmB0yP5xH\nOVhBmA3YGbnzZy1epwI720VcwAd8lV2YwouYY7sMVWWYijfbW1U4dA4WYHlOVSdcp3Ss1qKTu+rk\n1lcZG3Fxj3IEAAAeq0lEQVQrGZ2OxrVyVXJl54XjXZs+x2PvNgwPM62R+5mhmPNWpV3JqdoItle1\nAEynLa0X4qkcXeFVrQqT67Ay/So7qHYNqXMunXOuHN9V0LTmhMHF/LkLzMeaz/eZOv0okXviePm6\nchAmtzoo5ays4qAsxKIc3gXyluCoAqzS09kIqap8eM32Im3xlypgWLDs/r1hi7IS3YqA/a6rJqyN\nyOOLv2ojXJCg4dVBVNeIg/FFPVj7gWOML8pTrR+TpfRUdlFB6qqxOi+liwqwcwJH0e5tWCZXYVwg\n4H7l0CqLu2xftTdCP4rNVQEnr5KhqlmFyzlYZfNKf9UaMv4MA+NTBSLDWHUNpkpdZmXptCaVkzF+\nlRzGt9NnV62YGmPEMqjK8h1+mSfTD/lXGRxp7XUtGKseeY+rYvm+c7ZVdVJtXJUUGV3EZxYk1Vq5\nLNPNMATLydo13sl+OM4OwGUzh0kFZaWPy6iu9XC4GJ9z7LK1inY7iqqb6FbLtPdkwa5/SNkxMus/\nVbbMe1RlwoyKa9WhYCZUY1XmU/jYPMvGyC9jcRVlzWfZymHYvNKraxelq5KZ8Sp8rIqpYFRVG/c6\nupi/OmbBsUgZLc+rA1IBhfzzWtaiMJkKG+JBLOgILtBYZmZBh2tZZakcnvFntmIVgQVK155V0CIW\nPOsqqN1ZbOmsdv/MglXEZaXKuIxHXs+Mr6pbJzDQuSqsqn1SrUquBEwGqzSMOvzdWqdTvnfnp3Ci\nvKr9w31VoCo+zu8U7f6HlBG8fOc1qpXoGjbPY+vCjI1jKI9VK9eWZIdHXVgguuBg9mM2w/V5TDma\navs6urGAy3NMT3cOKgll/sxfsjz0B+UvHbtG7PgBH1uE6ppRVWlU/6rWZp4Es5TdycaMF8OIzt7d\nz9outk/x7+7PeinsylaVHoqcfdkax6frc/PSPuC78r/V6dY7y+J5jt0zp8QsipWFlXXULWc4limd\ng6l2xjmY4qeuO/zyq1PNsXK51gzlujPKa1Wld0GUsamkUBWO3YIFnUc5n2p5lCFRBrtG/p0q1HHS\nKutVh+GC0OFn63Gdc2qHR+F2Om+1JSYutlbNbfEPlM34u8q06xdWLFIH6cCrksyCDLNdXofXTI5b\nl53RVSe2RmU4VVFV28TemTxmT9WOdPA7/Tt7nV0Qnwoo1xoynMgvV02F/bnxKrvcDxrkl5LsgKuy\nmvhRp3JOl+VX7wrrRp1pcLtDUodf6cUw3qb8Dim7bbG30kudt8LA9GV+BvIv6zMLAlYGY2V17cnr\nMs/OIWOLwioQK/OqhXSV0PGtSB16thVm32q/oi7OrCtrZVQblN+Z/StsLhGyYM84XOfCEglSK1jG\nGA+PMZ4eY3zweH8rT/5yB6McD51DOS1rSbJhXADKMgwlW7U1ec4dgGtFHX7c4+5ZVkecDI/SXVVX\nJquyYyZ2Jgq/ClI1p+RuTWDdyvLWOHx/8eL2ZER8eM756oj46PE+xhivjYificMTwB6PiHePw/ck\nnxCLZOfMLAOoDMEqCwZGPnyWAfMaNldRxs8qD76rqqmyNAuuvB5xKCdC+yqsKrlUNsj6KFvmM8Q1\nbB0LKOYXWR/nUxmj06/zMKOXR8RPRsSvRMTifuMnf6FCqkddxIJLtRzMWFVmzGOszLMsploNlJvn\nVTuiMi3qhGtVlnWJxNkrv3f0QbzKVuzenQGeV6dqMd2Uj+Q9LBEz6lSWd0XE2yLi22nsVp78lckd\nOq5jTuQqkcoWKpuzNSooKvwqu7IsyCoAa8sYFlVNVNtVyWVZvgpSZh8XGJ3kl/XJe/DMMSkwv+ni\nV1Q9n+WnIuLrc86n4ztVBRWZEfbpXnKumyHUnGtzmAyVeVQAOpysRWG6uIqx7isHVlVX7WXrHH/c\nqyoQ042dAa5hmNGxXedQnatLIoxcR+Koqiw/HBFvHmN8KSLeHxE/OsZ4Xxyf/HUUctaTv+7cuXPP\nu8vgrgSrUsuI7WNOpQ7QGVMFpNONZUmV4VnW7Di/amewIuM+hRvnOjbJvFUbttXeiIV1JMx/lG7o\nj1JQ5xURb4yIDx6v3xkRTxyvn4zTR3s/GhGvjIg/jTj8Lgd4zUz5PiLueeX5PMbGcV6tY7JwHt+3\n8MO11YvJY3MVLjXf0a+LU+mq8CpczO5b+SkbOl2VLIL1JAa2/gZ/heYvxQ2f/HUPU8g4ecx9Flhr\n1vpMOJ4zF5Zt1iYgJpYRGb9873popTuzAerj+LN51J/p0MGoeDCeKJfZlVV1pisbx/WskuRrx7Ph\nooe13YW3SSP9Br+5PtZ61deudZ3D7DhbvmYHmeVXJR91cUGe16jraq/Cxa47e906hmtRdTYdm7uz\n7J6NslWh20nmuJj/lGQ99XrHTMKyCmapyjHyWlapcJ5lQZXdWIZj2N06hl1lWnZf7WX7lI3ZunPs\nwnSrAhOxq6qiqhSeq3rv0O7Bgooi5UPBAFrz+X3NowxsJdQe1mIhnjzv9FHO7VoD9s4cQvFkWNB2\n+I5By3jiOiWP2TbvwXkVbHm9SwrMD5jtXDBWPrjoYp4pWTmDKs/dbKlKOwZS3uPksnVOt+7+ql1w\nrQdreypS1UdVMFUlcP+6RxurdWwNynMOrYKfJUmGu+IfcSH/Vrzuc4ntOo/iyVo3bJVYhlftG6s8\nShc2r5yo6wA3oQ4ftE0e36prfmdBsa5Z4kPbVGfaJeZXyK/iueu/Fad7ml0i9E+5MqnDZZWiwGX5\nunE15jKoskHmpzCpyuEysausDIfCv8UGbhznHLmKw/gy3hvP4oThro+cUH0mW5tJOQNTvspwSMx4\nyEc5lDowJ1sFFs6hjp29uG9LgFYZl1VaxY/Zw1VWV4kRd3VOFf5O0C3avQ1j5b9qdZjzocOyAFMV\nh8lDnvmeBQhrLxAH8kAd0C63XfU7cpSzMefN48z50G7KgVViY20Sk+cc3rWI2PLheqSL+mLwTK7F\ncI7E5rol3LWAnRLOKo6qbB2sVeavWqguP2Y7h7ere9eObI1KbGwNUuUnrnokbCeLLubbXdxYpspI\neI/O4jKh4+mCl/FxFa7CykjtOwe3k+mcE+Wjs6uWqsKtKjWrUgyT4+dkdsbukXcpleXcVsRlOVyz\nrrPMvEbRliqmZLoDVNla4WKZ290zPVwlUNi26MzmFFUtVHWeVbeh9mX9CKbLqSwqc61r5eD5vpO9\nmRHV5wrWIyt5zMmwWrkDyX2zciTEjviYXm5tR07VmrEqgHPV+SA+DBCmF3YJiNHJU90FW+sCbtfv\nDcuEh9XJErgejVW1ACqLrXvn0M652LtLDkzG1gSAfDpyGZ+qbawSlAs2FiCd6q7OkwV5t/2qzo/R\nxXxmcVkhOwAaSJVo1W6xdo8Fg3Ma59jsMLqJYTlT12kUdZIEJgP2juvVGlVhFK+KN6uoiv+aZ36h\nOoCMQ/kJo13bsMooOJadqZMRWKBl2c7JHW9XAdyhMAd1+yt7dPZW/BR/DNyunp21KCevw7bPOTzj\nnf2D+VaVRF3AXMyf6KMjI3hXMdQ6955lOlJBqfCpdU5fxl/hUFXKzVU8HaaOHuqMtrQ4DPOWc1TB\nUPmG0fcE7O5/7qKcLMJ/KO04QieIUK4q8YpUACqHyuQOma1l8hhVTqvkdXAyHV3mzzKUXVWb1UmY\nKAN1qzAwHY/XlxcsYv65a7Wu65SdzJL5MMdwGM5x2nNwdrJ3VfWqrKywMJ5b7eHsqqrBFpyIVWHI\ncgo9LidYIno/8eq0GTi3tZownt2s323rFF90/C2tVFUxKh5MdqV/Ry+Gpct3S5VReyp+jlwbdlGP\nydsyNob+XqsqG7qs3N2L+xEDm2d8mbz8rrIlzlUBzeQzOWt95lElJSWLzbmEkPejfLd3a4B0x5Au\n6p+/1BzbF8EDZBFzChc0LhDXGtxT6VMFAnOCTsZc48yhKz7Ir4NLBSM7I9YiYiAyTJ0qz7CwRKB8\nx9mZBR3Srs9nUZXBldUq8ztZrlrgnDOeOjBVLZwurr1QDqR02RqAqh1U8tEZnR06ttt6JkwHtUdV\n7yrpOey7/j9Lfo+oS6rjg+tdW6H2u3KvZLmWCnVUVdThUjKqrI57WLvlZLMKyYLBBdyWIKiqAatm\nHV2c/3QSRKaL+A0+a4PwmmW0dV1ljCoTIX/k4RyW6YMHj/gY3k7Qu3mVKbOubJ7tRxugLlt4YbXO\nNsiBWFUjpTf6APoIsy9rwZg+SLs/rZg5hcoi1dp1zw5LtTQJE93v5jOfKuuyezdW2SPjqlqZLfzV\nWMfOziYZU2ee8eraGce2+FCSdQJk1w/4Vb+oSjC2G8ivExyZHwuojrMw7ApvhUXNq+zLsrZzqK0y\n2R7mbCwrMzusNe6MVcArnFg9nB6M91b7XMTTiplBcJ61S26PagHyWhV0eQ3yrlooFqhKhmoHMlUJ\nwJHTn8ncgpvtY0Gh2h+2V1Wo9c78gOmkEozaU80v6j4m78tjjD8ah0flffw4diuPykNi0a4iPveq\n+Z4F4hpzmQgNi46msqzKiixrMgdkuCoH7ZAL3Eouw+30Y/KY/Zx9GS51juzcKz/J/Lfa8kSQekXE\nlyLixTD2zoj4+eP1E3H6TfrPi4jH4vD0r4dg78TXPEw8d61IrUVeea1ag9cVBoXZYWC8mUzk0ZHn\nqOLB7FThdHo6eQybs3tlR4ehaydn5+P4SRxsacOwPt3oUXkTsgqWTZUR1zyO49pOm8VwrHfGE+dd\nP6368krGOpi1Ll+7qqCqhOKF/JgOiFvZgdmD2UHJUPzy/nyenZZZyc++wfRROCL6n1lmRHxkjPHJ\nMcZ/OI7d6FF5yojMIXCeBRrLBBgwnQNih4IOowyaZWYeLHBYe8GcEnVgaxkGpk/mi2tZm5N5YPtT\nYVAymD64T52vO2fcp4Ik3zNS4xH9n4b90znnX4wx/n5EfHiM8TlQcg7/9UZyTh1eNlTlWHkODYx8\nq/15XjkO4nUGdhgdnixD7cF5hhf5sPHKHopwjbIHniueZyVbVToVcMxfMh+HxVGrssw5/+L4/pcR\n8TtxaKtu9Ki8/Fiyu3fvlmUwZ5KjTNpmsNZkEbtG53cGzfNsb16fsyDqkbExrKy64nrEqZIMq25K\nJuOPtmF2V/ZgiauypTsvVqGY3TP/ThK6e/du6zF55S8lxxjPj4iH55zfHGP8vYj4UES8IyJ+LCL+\nz5zzl8cYT0bEi+acT44xXhsRvx6HgHpZRHwkIv7hTIJG+qVkBs6cb41XmTWvw1Lv9uJBqtaMEcpy\nbR3iU/KZPZwtlHxVEZ2sCpvTD/czW221Da5FXJWOlS2UPY7rTxTptGEviYjfOTJ7JCJ+bc75oTHG\nJ+OWHpXHMpVzCtyLimdywbM1ODK/ap1rEdRhqqpUBUIluxs4ONZJUEounhViYpVLJQ519io4WVeQ\n51RVrmj3P3eJ0FmsCoS8dl1Xa7M8xZtlLpV5t+xX2Fxg4R7nUHmtCxAlT+FiNqgyf77est/p3sHm\n1laYYP7ESLv+Bj9nUxx3FWTddwzEskeWnY22XogDxzI/3M/wKuxILNsq3VC+wrGVP9vv9FJVCisw\nnivaO58Hk1dVATwrhnfdK59zbWTEzn917CI+j2/pN9d9tQfHlTzcw3g4A7PARBkdp1XBwfDnd+Xc\nSh+Gs3Ii5NuxX1Vh3fm5AFV7qrYP9zDa/U/0WSbP85mq9gizmgqs7AyuIuR9WIUqZ8f1qAdmWLaf\n2SiPKfuhXNQZqcKD2V9hRbwYeIxnlsl0ZokJq6hq/dRZor3QRop2/x/8RSp75cyc73G8k/1dJkIM\n3fZOHUrloJkH6qrwVJmPUU4Iruqwe4aDORVLWMr5lH6IoXNW7J4ljQ7uDl1EG6ayjqsaLOMiD9yH\nazHgFBaXoavqxfBV8pROTEd37/acg2nNubZHVcRKHjotOzdVhavqWvmLSh5Iuz/aW5Vtto7tcc7F\nDi7LUc69xjqlXemB2TzzzRgYLtXmuSrRWYO6sMyrHIfxda2Lc1xnN4UL9UB7qorm/KmjR6bdg2UR\nKssUcQGR+ahMyNazvcpxWPAg/u416sawd9q0TN0Wh8nqrK+uWXDk95wMVJVgulR2wvWIjQXklgq+\naPfnszgHrFqktZ8FlsqE+R33VHirKoG8EQselKoebLzKsIg1y2WyVNXJsvBMVNvlqlHXtiwAXaVm\nlVzZgWFRge3w7v7tLnhfZbtMKrN2naripzK7ai1UwKgWgfHG/a7tUZmT4XdZXpHD7ZIDs1Me33ou\nqJdLBq5iVdWT3WfavbJ07l22Xe/K0RhPth9fSnZ2BHcoDL/KoEo/lfWq1kGtV9XEBanSRcnN9lF7\nlL0dToZvrVH7mewtfoe0+5O/XCCoaoPXKmMop8aSnvmpg2XycV9e73riTtBWWVA5lksWaJOukyqM\nqDvTMe/Jc2xf57yUTiiTVVjWBaAOttKeUxJvSgO+GBwNoUr4ItWW5HWuNVGtDGJx+4ReNJuztkzh\nY7oqR2G6sXmV7ZlMt17ZypGyo7KV26dwsD1K18rX0viJMXf9+tYI3Up1nUmNq6y85aAVX2VglKMq\nGFuXsWGVUoGCeDrzVZA4J0O8OO7ss8XWK9OrIMK1TB/GN+NX/udseRFfhYTjDnBlnFxSndEVpg5G\nhhfLujoQposKusrZmK5sTdfRlW1dxa8cLPNSCUwR6u90VbZlOBTe6rx3/9swvK7KfTYcZuB1nUlV\ngCxXlWUmhzlWpwJWh+MCG/kqfRQOxgsd0CUvpYNreVCX/FLnqWQz587nzeS4yq3OsUym3fJ4mzTS\n/+srgytlmVOrVsNlETbu2qvOeqKndGwMNlVFlA4dGzmclUyGtaOrw8l4VeuVDl0/6NhInPcJiIv5\n0fEac8Hr2jbkyXpnxZu1EizjOz4q0+F9Xr9eKrsxHRj2SjfmmCgz48E1iNNVcsTEKhjq19HN6aAC\nzLVUSq7zv4tow1Rmc+3Euq8qIzrTlvZGZUEWOOrAMm88aJTPAg5luj0oDzEr3gqTC1KcZ3ZwFT/f\nZ/l4XSUDhd3xd12Mo11/g89Kq2oH8DBUpqmyEKseTDYr286RVKB0DsO1awy7cirVcjC+yg4KZwe7\nu1ctkDr/qh3uOj5Wd4Zd+czJ+iqa7gcN8wDWTjbL5AJOOalqi9Q6lMPkuX7YBUvHERiubsZXOlet\nGdvn9FI2qWR0uwqFX+mi9FFyiZyTqLmIR3t3KooKEiR3YFsMnWVU2CodFG6VHRlGt9cFWeVkTC7u\nZTp09HYVhtmkOh9XVZAXw7vl7FiwXMQ/f7F71W+yFoTdK0d3lemcxMGcMctdfBn/vFbNK32YnKxf\nFeiITdkGsTE5jHeHsAVitlH6Z9nsnvkL3jv/Y3RxlWVLVVHYq9ZBtUYsezGeCidbp8Yq3AwTyqsq\nCNP7tjCpMYUPeVaYlN4V7qolq6p4ur/MNuw4JnvIyjBsneqbnWN1Ds4FnGsLGfa8pnIO5OcwVUmm\nI7fCzPAwnp0E5fgonnm/8gHE3vWv75o2LJdfVSZV5WDrWJulWg9sL1yGV9hYK8B0whYI96CznJvU\n8l5s21A3XMtswnRjdlBByGyS79U5Odujbh3/QfmKb6aL+T2LG8uUDecyiTv0zGetVS0FysBr5nwu\nCBTWqtIqB2Dy1XpVqSpsiInZQ40zuSqA2DqWZBTO7BPOf5hejvei7mPyXjTG+K0xxmfHGJ8ZY/yT\nccPH5KmMxbIfywLIxwUeI2csFmisElXYEI8ay5mOOWSV8Spizokyt2Jm+NkYqwjKznmMkWuTK/9A\nuSpBW1vn8qtecXiy1787Xj8SES+M+/iYvHy/CMfyHK7BdYof8kD5ag9bo3RgWJye6t7JrnB2+Hfx\nqTPr2EjxYHZkuBgfJOcnzs8I7pM4KCvLGOOFEfEjc873xIHL3805/ypu+Ji8I6+T93W97lW041xV\n5l3LZnQ/2ZPv1WeKda1anvxi65lMtg+rMPs8hNicvGqf+uzC9GUyt1bIfG7M7vnateVsjtm/8o9O\nG/bKiPjLMcavjjH+cIzxX8fhOS03ekzeUiIrs64xEJQj5kBgymJrg3LzXuZ4WZYLNoY9U9YHg1/t\n7bYW7L27D+UxuzG93V6ld75nAe5aadUudn2BnaPyPUedYHkkIn4wIt495/zBiPi/EfEkgF7lS5Gc\nc4ZzVaaTLTHrsYND/pkHqxwue+GeLJfhYTiUDOeQzB5qXyWP2Y/Z3TkYq3JsD0ti7ryU/Zg9XDVR\nCbKiTrB8NSK+Ouf8xPH+t+IQPF8bN3hM3qKnnnqKjqvDcSWfGRvXsGzESJV9ZtyqRUI85zg2y5SK\nXCV28tgelVBUu8bsw+zHZDJ9nQ2Zbbb4TSblh5nKvzqec35tjPGVMcar55xfiMPj8T59fL0lIn75\n+P67xy0fiIhfH2P85zi0X6+KiI8Tvs+Bz+XZZZtO9DN+KFNVhiprMTyqNWDBifvzHnaIagwdi8l3\n7ZPao2SzCs/wqXNTfNg6de3OVZHrVpzfSd6YIdgrIv5xRHwiIv53RPyPOPw07MVxeF7kF+LwnMkX\npfW/EIcP9p+LiB8n/Ca+5mFCvq/rRTiGfNSe/M5kKNlKVgePkqXkVLydzm4NjjkcaKctOrI1lV3V\nmSjc5+Cp/Av4n8TBxTwm7zheR3fwEqwyD7t28wTryVyn1Du+al5lzYwb5Tm9b8pT2cFV4Y69HF+m\nVzWvdFDk/C3xPGFwMf+Dfxy/Zx0q3TkQHCeyJe9OK8baRIXXYakOmeHpJAnGz/FwCUvZTumLdnEB\nx/AoTBWWTiJjeNXe4/hJsOz6MCM0THW4bIwdvDJIlfGZMZ2DrP1rjDlsp69XTseyvEsu2JezOaan\nquYqO7sg72R3Zj8mo9NpuPNAuzHf6mKOuIAnf6GhXYbDA2FOz4zijKEyaSWb8ciylJ4YIK71YPsV\nPoYV16lKWlVvF0QKr8PqbIj3ChurkMo/mM7oJ50Oa/c2bFG3lOb1rm1SQdBpRZBf5WRVO9Np3Sqs\nlXM7vqxVczZhfLsZ2eHs2rmDFfcqPVAfhwHWnwzu+lVIqmVY8xH+s4O6du3QlirC2h90PLxGyvIR\nm2s1WHZEWSgvj6sAZTJYls14cR/KY7aobIh8GG+Gm1Vwdc34OH9z/hixc2WpWo+15rjHOldVoqv2\nompH8hjDo6phRzeUw2yjsu2WOWXrKsuiHkpHF6RsH/J1cjpnqvaoIEWZIONyKsuinM3YK4K3MSyb\n47qsPGYjpOoAMxZ2OLgmz7G1KDMi4u7duzbLuurK7tU+xIv71T6mH1ubbVSdUXUm+fzU2WY57HwQ\nC/OxTtHYtQ3DEssMh5nBOZzKrCwg2XqFb/FiGU8FoS3nYv2b3vQmyiPLccGKWHG9sk8Hn9NLyWHt\nUmXz9Z7P6c6dO+2KmHlU1Z35n8O3e2Vxmcb1oplyRsEsonpdVTnyOsyKmSfbw3Srgj1juXPnjk0c\nTG93z4g5Bgu+jIVl7MwPnbyyHdvD8DHbsQTSTUzqWp0f0u7PlFQOrVoHlqlUj5v3dByLlXmXjTvZ\nSmHvrEcdWTuj3tU6VtGVLmgTxOsquZtXlU6NveMd75CtXPYXFlzO5i6ZMrqYHx1f6UqXRPNS/tzl\nSlf6bqTdP7Nc6UrfLXQNlitdqUkPPFjGGI+Pw1ck/ckY44kHIO89Y4xnxxifSmM3+hqnM3G8Yoxx\nd4zx6THGH48xfm5HLN8zxvjYGOOZcfhqq1/cC0vi//AY4+kxxgf3xiJJ/aLmfrwi4uE4/FPYY3H4\nqqRnIuI191nmj0TED0TEp9LY2V/jdAMcL42I1x2vXxARn4+I1+yB5cj/+cf3RyLiDyLiDXthOcr4\nTxHxaxHxgb3OqHo96Mry+oj44pzzy3POb0XEb8Thq5PuG805fz8ivgHDN/4apzNwfG3O+czx+q8j\n4rNx+LfrB47liOFvjpePxiGJfWMvLGOMl0fET0bEr0TE+inULlgcPehgeVlEfCXdy69Jus90469x\nugmNMR6LQ7X72F5YxhgPjTGeOcq8O+f89F5YIuJdEfG2iPh2Gtv1jBg96GC5uJ9Tz0Ntd7huFfMY\n4wUR8dsR8dY55zf3wjLn/Pac83Vx+PadfzbGeBPMPxAsY4yfioivzzmfju9UFcT6QM9I0YMOFvya\npFfEvVniQdGz4xa+xmkrjTGeF4dAed+cc30bzi5YFs3Dt4v+XkT80E5Yfjgi3jzG+FJEvD8ifnSM\n8b6dsHh6EB+M0oe4RyLiT+PwwezReAAf8I9yH4vTD/hPHK+fjNMPj49GxCuPWMctYRgR8d8j4l0w\nvgeW74vjt/FExPdGxP+KiH++BxbA9caI+OBedinxPQghYJCfiMNPgr4YEW9/APLeHxF/HhF/G4fP\nSz8bN/gapxvgeEMcevJnIuLp4+vxnbD8o4j4wyOWP4qItx3HHzgWwPXG+M5Pw3bFwl7XP3e50pWa\ndP0N/pWu1KRrsFzpSk26BsuVrtSka7Bc6UpNugbLla7UpGuwXOlKTboGy5Wu1KRrsFzpSk36f+Il\n9De+5VIwAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x112881400>"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3x3 pixels\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def three_by_three(image):\n",
" answer = zeros(array(image.shape)*3)\n",
" for i in range(0, image.shape[0]):\n",
" for j in range(0, image.shape[1]):\n",
" if image[i,j] > 0:\n",
" answer[i*3+1, j*3+1] = 1\n",
" return answer\n",
"M_test = m_array(2,2)\n",
"plt.imshow(three_by_three(M_test), cmap='Greys', interpolation='nearest') \n",
"figure()\n",
"plt.imshow(three_by_three(cross_stitch(4, 6, m_array(2,2))), cmap='Greys', interpolation='nearest') "
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 57,
"text": [
"<matplotlib.image.AxesImage at 0x113a1f978>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nTRhsSWri/wFQQg3Uo/7ZyQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x114ed8cc0>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x111dde978>"
]
}
],
"prompt_number": 57
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"figure()\n",
"final_matrix_3x3 = three_by_three(final_matrix)\n",
"plt.imshow(final_matrix_3x3, cmap='Greys', interpolation='nearest') # B&W inverted when using imshow.\n",
"im = Image.fromarray(final_matrix_3x3*255)\n",
"im = im.convert('RGB')\n",
"im.save('M_641x481_2_3x3.bmp')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x11518ccc0>"
]
}
],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"im = Image.open(\"M_641x481.bmp\")\n",
"im = Image.fromarray(three_by_three(array(im)[:,:,0])*255)\n",
"plt.imshow(im, cmap='Greys', interpolation='nearest') # B&W inverted when using imshow.\n",
"im = im.convert('RGB')\n",
"im.save('M_641x481_3x3.bmp')\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\ngUhgQgTy/6stkbX3q2+AAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x114799518>"
]
}
],
"prompt_number": 58
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment