diff --git a/python/.gitignore b/python/.gitignore index bb3bee0..6f24b0d 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -1,2 +1,3 @@ # Ignore all PyCharm related files -.idea/ \ No newline at end of file +.idea/ +.ipynb_checkpoints/ diff --git a/python/dct.ipynb b/python/dct.ipynb new file mode 100644 index 0000000..28b7b2b --- /dev/null +++ b/python/dct.ipynb @@ -0,0 +1,211 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discrete Cosine Transform\n", + "This is a little jupyter notebook that does a discrete cosine transform (DCT). DCT is a thing like the Fourier transform that's used in JPGs." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "# Imports and the like\n", + "%pylab inline\n", + "\n", + "import numpy as np\n", + "from scipy.fftpack import dct\n", + "from PIL import Image\n", + "import matplotlib.pyplot as plt\n", + "from scipy.fftpack import dct, idct\n", + "\n", + "img_path = '/Users/jeremy/Documents/Websites/fourier/assets/a.png'\n", + "img = np.asarray(Image.open(img_path))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPcAAAD7CAYAAAC2TgIoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnV2sdVtZ3/9j77X3AaSQRhtqOAWlDWm4aJGkcIGmr0EN\n1Qavmmo1Ri7aGw2kNgZzkuZwLtr0zmLjjRYptqgEUlrTIIFEjwaTwjkIinIQWyqeo3CCiYESynv2\nXmv0Yq9nv89+1vM15sdac689/snMHHOM+THmGOM3nmeMOdeapdaKrq6u49PJoTPQ1dU1jzrcXV1H\nqg53V9eRqsPd1XWk6nB3dR2pOtxdXUeq1VQnKqX0Z2pdXQdSrbXIuEktd621eXn00UcHHbf0a/Xr\n9evt63qWulve1XWk6nB3dR2pDg73vXv3jvJa/Xr9eoe+XvF89qYTlVKnOldXV1depRTUuSfUurq6\nlqMOd1fXkarD3dV1pErBXUp5Yynls6WUz5VS3jZ3prq6usYrnFArpZwA+ByANwD4CwBPAPihWutn\nxX59Qq2r6wAaM6H2WgB/Umv9Qq31AsCvAfjBqTPY1dU1rTJwvxTA02z7mW1cV1fXgjXZD0dui5Yy\ndIjyMTZdUyk7ntsk+w7Zf6j2dZ1jUAbuPwfwMrb98DZuR29/+9uvw/fu3dv7Gz4Zbccne7seXYtf\nUwtn4zLpJA6ChMJKG7pfFD9Vehfw+OOP4/HHHw/3y0yonQL4Y1xNqH0RwMcB/HCt9Smx362YUBub\nx9bjOYiZcMu+WphEkOxrLa/bGjf0uC57Qi203LXWdSnlJwF8GFdj9HdKsI9ZLTBr+0oAsz/hG/vT\nv1LKDQC17SnSKMyvK/NBecuCSfu1Htd1U3fu3fJMHqfeZ7PZqDBq8WPjNDCjpXX/LODZuKHHdF1p\nsOW+SxoziWWlWUBuNpud7cw62gcATk5OXDCnTgd8KMl68zWXle4d0xWrw72VB2dLvEzTgJThaFum\neenATbjnCBNsFuByP2vtqcM8Xh1u+GPloftqY2cJqLes1+um/TW4T05OboStdWvaZrO5sQ3oLrrm\nwmuWmUuO0bvVHq4Ot6JWgKN9NLA5vBJkKy1zDIBrKCWkmW0rjoCute6srbG7TPNAlVDL/Tvk7brz\ncGcBHbqtTXoRiN56aBqAHTCnWvh9cMA1sDWoOZyR1abtruG683B7aoVYS9PG2xqkfNHisvHAA7hP\nT093ANXiWuNPT0+vwSZ5E3Aa1J4F18q0g96uOw33EFiHpHnj7fV6jcvLSxVaa/H2B7ADJYW9OHK7\n5X4EMQGtzSVEYFugR+pAj9OdhptrCLzZsDfutsDlAGthKx14ALcE2IqTaZvN5jpca70Gm9byHiOY\nuYXPqEM9jTrcgVpg9tKlax5BfXl5eb1o8VqY4JbAatu0rNdrnJ6eXudLhqlj4oDL8rGeixPU9HJN\nBDsfo8u4rnZ1uDEdwFqcZrkl1BrIFxcXarq3cLjHLvKZugY2v0/5LFybZOOwS8CtyTQ5g96V152F\n23sJRaZ7YGcBt8bbmgW/uLi4AW20zeNLKTcgXa1W7jbFSZD5wu9DG7IQ1NKKAzChloBLsPujr/G6\ns3BrGgpxlCZfHbXccg6uXMs4K57DvVqtcHl5eQ30arXCer2+ATiBTWuZX60TlC+raI/E+CQdueU8\njpeR9eIKB7zD3q47D7dnwVvAtvbxJtTkbLlmiTnI1jYPE9wcbBpXE9i05mBrUGfhzqwl7DRZx8tL\nA7tDPVx3Hm6SBmm0TwvgGXdcg7p1AXANLoHMJ80IbMpLZLE1uMjt5m/EkfWmdIr3gPbKsYM9Xh1u\nQ1mQM2vLercA/txzz6lhuQ3chJsvHGa+kOWmtVyiN9AoTQtLsK2w54Z3yIepw+1oSrCjCTXNNZfw\n8rUWR3CfnZ2pb7FZS+SCe3DziTR+DBcBTmFvok52KB3s4epww3evo32yFtuz2trEmASZb9+/f99M\nA3A91j47O7ter9frnTWHWxtvS0nIT05OsF6vb0yQSdBJ3FrLOA60BXlXu+403K2TaVZaNI60LLbm\nmlsTaBJmawGggnx2dqbCzKGW0mCmNYFNQFpQS0mgtSFAh3oa3Wm4NWVg1uKiCSLPelvPrDWo79+/\nj/v37+/ESbg50NSRyOtbUEvJl1P4j0i45Zbi4A9duoYrhLuU8k4A/xjAs7XWvzd/luaXB7AVFwGe\ndctp7U2mccA195wDLdcAds5NkFvutwWRZbHlb78teb/8ysLcQR+ujOV+F4D/AOCXZ87LYqQBzMPa\nBFCUnnlDLZop18CWSynFnETzYLIed3lw07NzTfxRGW3zstAAl2XXNU6Zvzb+aCnl5fvIzCEUgdwa\n1hqq5pYTfNZ74tF4W0L9jW984wbcGtgyTzzv8lGW5oZfXl7ugO1ZZ1rTffPtCGwN8j4Wb1MfczvK\nQp0BW1psuY7eUIugprAHtwUUsDt5xi326enpNdg0xuYvxkiR1ebWm0PO0z0PSIa72jQp3Lfhc0Kk\nCFAL0mgfua254tZbahJy71dj1nvnAG6AKd1qaY01d1vGEdjcclMYgPo7bw9K/oabBN3rgLqulP2c\n0Gxw3wZp7qk30eOlW/tkXiahTkDLD8lzmyW42ltk0p31hgzWnABZbA47nUv7Ywd5H9I74GHNkssy\n6LqSNJyPPfaYul8W7rJdjlIRtGMWyzq3THaRIqA1Cy1fE5X3Le9fPjKTcF9eXt64Bh1PMEuwNfF8\nEdTcbZdvsXUNU+ZR2K8AuAfgm0spfwbg0Vrru+bO2D4UgWlB15JOrnT29c8IcC7NpaZ4DXJ+37IM\npBchLTh3yTnkshw9sK1XWXketHF4B32YMrPl/2wfGdmntMYSgTt0m783rlltCZbnmpMs95vgtp5B\nS8Aj15ysNc2ME9CywxjSMXGLrYHeYR6vOz9bzhuSBqoWjtIl3BJs7Y0xrYPQZEGtWe7INc+ATWE5\nCafBreXVyruE23sttWuY7jTclvtnwZxdW3BzsD23XMsf4E+qcUudGXNbHZrmkkdjecvTkC44dRIc\nbu3nnxnvpSvWnYNbAtMCtmdtrTjNJfdc9FbLLR9fAdixsHScVhYR2BJqeS7L0lqWnM4pH4PJ331n\nztfl687BzSWtgwe4B7e37c2UWx1LBLnnmlvp8r69xYI8mn3n+ZP54Ofg3gAB7YHdNUx3Eu4Iaquh\naw0/SpvqTxMA/8//OdyW+xxZ7wzUEdhefum80nJbLnmHfJzuJNyA/eaZZ1E9MK2lZcztuebe5JR0\nyyNXmpeBLAsJtgQ8I68T4qBLoGV5dI3TnYVbaijEkTW2xtye1c5YbwrLyS4gP6GmdV78r4j5Wv76\ny4PP8iyisuwz5tPqzsPtuYLRODQDuTaR5o3hZUPWrLc1U976KEy7XwKarDa/rjxGShsGUL745Fw0\nJInKoSunOwu3bEAtbrgFthafGW+3TqbR2htze3+kYN2r1SlYv9mWHY8GtQSbPz+XHVy32tPqTsKd\nmVCTY2EPcmtNbrl0zbPvl1vSoM68fhrNmkvAtXLj+2qvmmoehQSb1vwZtyxzXk9y3ZXTnYSbpDUe\ny3pLyK3fZGtxWaitxk2KJqkIlqEvsfBxtlVetNC1vHxpPx/tlnt/urNwR0Bnrbc3rrbAls+6vTGn\n1bgtt7zW3S9u0v5aGWiWe7PZ/QOGWh/8nJOHZV74dTVL3cfc+9OdhRvIu+cR1NabZxHYHuAyfyTL\nQmp/zhC549q9W2BrnaE3gSeh9soxmnfoYA/TnYYbiKHWrHkEOl+8X4RZjZvyxcUBtSCO3lDLjLmj\ncvLG+JYLLhf6eyarE+1AT6M7CXdkJTJj7gzYmfF2ZLm4vBlp7pZrv9zy3HKCmk9wyXIq5ebvrq0J\nPP5nDhxuAprKi29bk4kd8nG6c3B7jaXFNdeAzYBtvV9uWS3LNae1NqGmWXXtXglY2iao+fkl3AQ2\nn3jjYPM/czg9Pd2x4hLqMfMOXb7uHNxSGaD5dhZo/meGmbG3Z7V52BtzcxAt11zeuwwTtLyToDCl\naZN12gw5h52stWa1O+Dz6M7CbU0SyUYWTagNccutt9QybjmtOUzSmnquON2vFD+WL1pnIa/DrTWH\nmRaC2nPHLdfcym9XrDsLN8kCnDe4COwM6JrVj8acPH+kCHAJo9zXun++HR0vt+UkmrZo1jo7W941\nTJk/SHwYV58SegmADYBfrLX+3NwZm1PS1fMaVsaKTzlTnplMslxz7pbTfnytlYGM49ZaO4fmGWgz\n4jS+bn2Rp0M9nTKW+xLAT9VaP1VKeSGAT5RSPlxr/ezMeduLLPfcglqOv8e459b5W6DW4Ob7a2F+\n79qkmXesFs4AHXVs2v130Mcp8++nXwLwpW34a6WUpwC8FMCthttyf61JtZZxN7fYl5eXoUvuuaWW\nNLDlLLZ377RPZggQiYNNs+SZIYkG9WZz8zGclbeuWE1j7lLKtwF4NYCPzZGZQ8hzyVvG35pLzv+z\n3Fp7E2qUPyB+/MXX3r1qYWufqNwoPxJsDfCoY4vuv6tdabi3Lvn7Aby11vo1bZ8h3wo7ZOV5ILeM\nrb2FLHeLxeayQJbis9sWxBowY8PaJFrGU9HA9kA/lIue9V72qey3wkqmsEopKwD/A8Bv1FrfYexT\nhxa8HCdyq5BNy2qz2dz4gJ78kN7UaZqFzjb4IftqY1Zextp6aBoArFYrnJ+f46GHHrpeU/h5z3ve\nThrfh++rpcnzPfTQQ+GniqTGwrlEuKW2LOxkNGu5fwnAZyywx4hP5Mg1D9O+/Liprh9ZcA027bm1\nNe7WLJM1eaY9W7be4c5YPHmP2j3LONlxWvUQnWeqRd5XJA6kt/9tAHeMMo/CXg/gRwB8upTySQAV\nwCO11g9NkQHZaLSGNaUiqyQbVGZCzXoExl1yr7FKb4SPr603xDabm/85FrmyrYtVbnx7Cqhb8k33\n70FpeXTe48BjhTwzW/67ANp8oQZpjWaf8hqcZ7Uti60tFjw0M8zFG5r8w0Du0Xh/JmiBo4Fkxcky\nypTbmMXKqwW/BqQHtozXrPuxQX7wN9SGjp3HSFobHtYanWWxPcBp3E2N07qeDJPk8+TsOTw4tE6L\nzs3jyDOQeeHX4mU5J+RaPF03glHmOwI6c87bpIPDzS3SPkGPGqh0pzUr3vKyinVdKQ/q6BxW/inM\nn4Pz8iaQ+T58TK/VSwRpZp+hS0bRZCy/j2MCmuvgcAO6RdjXdTOWpAVmOWOuud6RojfLonvKzr7T\nOF4eD9z8IYlVL3PB6z0i42PuLJjWUxbtPMcE+8HhPoRbzhUBnVkiy83vVQt7aa1hK//rtf5pIDlB\nxQHSFm3mWluPgXis5dZgjkA+JqhJB4fbcvvmvqZsKLLBWY0wCza33Bwg+aYZj/PSveOkNeNzAdJK\nS8j5/csyimam57LcGfBbLbaM86A+FtAPDvdSLDcPSwuugS3fwPKecXuWUnMTPcvpWV4+hqYxM88D\ngU1rr0zkz0e1fbQy28eiyZu3kWkScH5PxwA16eBw7xtsaa1p3WqtNcg1680BKUX/U0MJu7WvjNPS\nOdwEMe9g1mv9E0G8HKxOyCo3qwznsObeu/NcHtAZ0I9BB4f7UJY70yg9wL3HYNx6U4MkGOmeKcyt\ntmW5+V8Xa2se5q43/wMFeW6CnJeHXDTIvf2j8swCrJU/j2sF8i6CDSwAbsuV2te1tUYpG1MEtgc4\nnYfDTGHu+pIkhNYfIVhp1JlwqDmgHGoLLmsIYZXfVFZZC1udiCfNRb9rLjmwALiBwz0Ck9uysWlj\nbmucrT0Ko335lzq49bYarAUu/zdRbZs6C8oH7wh4p8HvW5YB/3tjC/KxlroFZM16y7r0oPQAl3GZ\n890mHRzuQ1ltoO2RTevzbm656Vr8nrl7qaVLy00gR2sCVJts4/ct1/LlFfmWmlV2Wjm2lG0L9JQv\nC0ANWiuswXxMYAMLgPtQYMs8eDCPec7twZsBWwLOFy0ua3H5tubWy/Nkym0oyK3QDwFQAk759+7t\ntoN+cLgPPd6Wjb3lOXfmTTULXILWundvzC2BPj09xWq12oE7e//cKmpg8/NZAFpp3jFDO4CseJ69\nbYq77TBLHRzuQ4HNw17j8sC2QOfPuWWjkWDLBmvNlFsw8/BqtUpZbg1oOVmnHZ+dNZ/Dimtjbg1I\nzVhEUFv3dtt1cLgPPeamddZaZybVOOR0j7Tmbq/13Dbrlq9Wqxtgr1ar6wZvjbGte9Qet3lueasF\nbwHdGntnn3NbbSoL9bFY8YPDvW+weQOU6xbAJdiW9QYewMqP1X6PTdIsNwecQNYWrTwpToJCbrz1\nmM0bj/Iys8pvroWuF82Sy/xa6fLejgFsYAFwH1IZ6xG9uEJh/u8rPEySwGpuppzd9sbZHOizs7Pr\nNc1waxaX0rR75Z2OZrnluYZaZWs7m5adU+CyrHN239uqg8N9CLdcQjUEcmm9NctNn7PloEq3k64v\ny0Sz3NoYm4PN4dbuS7uX9Xq9Y7Ujl1wryzkWC/ApdEwQWzo43PsGW14728i8WXJv7A3sWmENcJIG\nlwU4t9y0yPNF90GuuXxlNWu1qXPmHdUUMFvp2XfLpe4CzFKZP0h8CMDvADjf7v/+WutjU2XgkBNq\nXB4EY55zA7iGkh8jG65U5JZbgEvQuLXmM+q0LS23Neaea6Z8CPAZaR1Sdt9jUeYPEu+XUr671vr1\nUsopgN8tpfxGrfXjU2TgUGBrDcZqTK1Q81dQCRSCiF5FtVzzjNX2xtyeWyuhpnNxwMfOlo+FV+v8\n5LYn+djLSpf3YqXdZqXc8lrr17fBh7bHTEbkocbcPOw1PAsQ7zm3Zrm5C8ytqdZgJWDWbDkPS8ut\n3QcH2rLaGZdcbvMOytqesjOgMpFqeQQm4yntmABPwV1KOQHwCQB/G8DP11qfmCoDh7Lc/NqeRbEs\ntgW1/AhgKeXG2Fy65pq8x2DSevPxtma5vXzLV1m9STUOehZiL22IRdc8Ha0+ZVlaQGsW+5gAz1ru\nDYDvKKW8CMB/K6W8qtb6GbnfkG+FDdXQTiGCWMZZgMvHYnJNC8GtWXsNdss1lXnX5DVkr+w0KLV4\nD2DLvfa8n8xchtymTqbWuuPdaFZdTsJp5SOBXjrg2W+FNc2W11q/Wkr5LQBvBODCPYWsRuyBHaVl\nQcssVkfA13Rdz9KTi8x/pknWlDdeGeb3RdfabDZ47rnn3OXi4uLGIv+xlT+rl9ZelgF/GWdoOUZv\n+fEvhgK4vn+CkIe1X8YBuNEBEOw8LK34kgGXhvOxx/T57cxs+bcAuKi1fqWU8nwA3wvg302TzV1l\n3K0x+0wJcwb0It5M0xo1h1rCzV1lktfoNpurDx0OgdqDjMDWPB/N05Bp2UeHFuBUDlSPFtC0pnKS\nv3STgMtzLRnqVmUs97cCePd23H0C4L211g/OkRkP0Ew4s99YmDWIrTjrmplGLMe+AHa26b7kwmH2\nwM5A7nk5crjQYqmHWnLqLAlk7qJzsCXkAG6ALfN+jIBnHoV9GsBr5s5IBOWQdAvuIS65Z629jkA2\nfJrIkhaMwLYAB/zHOBJuAltba5DL12YjwOmePLfcA77FcvMyAm5+Q42/RKOBLcuNHyvL7ZjABhbw\nhppUBlZrndknA6/VKD2ALWuuueUccA40fy7OXXHZ2LRZa35dDWQNcOu74pZLHsFrueoZS551yznM\nEm4JOUn+SGez2ajxxwQ2sEC4ubJQy17Y22cKi201bA1263hquNRo5XvoY14ikdZZAp6ZTNMm1DSP\nhOelxWLzMJ8ws8CWE2p8aZUG9TFqEXBHkGYhzqRbs79ZV91rxFoagBvX4I2SA515pizvS4OG4OZj\nam2R6a0Ta7TId+UtL0ULc2h52BuqWGXC/4TSA1az9F4532YtAm4u6WJn4G3ZrxXmDMTWtgWi5pp7\nk2hWOUkrSttyssyC2XLJNcC9ctE6tYz1ltBbFpvWNOaWIGttR5YdQU0drga5PP62u+mLgduCmm9H\nQGf2mQJoa1uD3AKbGqx0w4Hd32JbZSHzQZabQNXgllBbk2n8r5l5Zyivq41ntXLiAHOoeVlollxa\nb4KSAy7LiKQ9PrSg9s5zW7UYuIHcm1NRxURprVY7A7RnyQHsNHLemDVXPDvO1joNDjdfLKDHWm7P\nemcWCb0FPAEOPLDcp6enqXZFk5raWgP7WABfFNzAMHijhR87BmYN3ozllvtrFluzMtG9a64uABPc\naALNGnNb9zoUbA4wH5p4UMsnCNKbkdLeDZBAy7K1znVbtTi4LQ0FWy6tVttqrBHklAbYM/QEuTWZ\npt2/lycNbrLEnpVueVNNXpMm1LTOzbLSMs6CnEPNJx+l1ZZAWi/+8HG3ZrWPCWxggXC3gKpZyGj/\nIYt3Du86ntWOQJZlQcfTnyBKK7her6/TJLhaOJOetd7yHr1OSE4kytlzDrcMk+XW3HGrTK3OU/Pu\nZBu87VoM3F4hZ8H2YPNc2TEz51FnIEEspdwA3CsHfj3+Dyo87/xHJwS3BFSDVoatNCobuaaF8qmV\nsWapZbyEVwItHxdSGWUkgdaeb2vLsWgRcEc9ZwRxyzZvYFNZcs8zqPXBd7j4uI8At8pCuwY/L8FB\ncK9Wq+sJNWl1NUss47LuuOaZeF6NVYYa1Ja1tn5Ao8my1LwOLNiPTYuAm0uDmocjqxyFWy11iyX3\n8kgNisbFgP5PIPJ+LVA41Hy2Wd6jBXA2TYaj+8zCbI29LVfcm3jk21S+FtiW9ZblfwxaFNwSbFpb\ngGsAZ+KmXiLLbVkTDrosBw0a7U8SCWpaaH/NrW6Nkx6O1ikCu255ppw168yvL6GOLLcc7vAOdbN5\n8DxeC2vt7Bi0KLhJspCjMZKE2FuPBdizWBnLnXl+zRsfQa3BoX3xE4A5VrbGz9m0qDwsj6YFcoKU\nwtYv5EhyVlyb16BrcStuvV9+TIAvBm6rcMeAPQTuIS6ndzw1KlpH987h5tfllk1+vpfCZIUsa+tZ\n45Zj5L1a2xJgC2gZp8HNLThgQy1fVOHXzYJ9LDo43FqBtrrkGuhe2ANzrDW3zgn474nX+uCVSuk2\n0prPjsvHSfyHFRaMQ+K1NH6fPP8tllpuW1ZaC/OylC+p0DmlxZYuubZ4bfI26uBwc8kCjqx3BLC2\nHTXizGRb1JhlHqN75BaMTzZpE0zy75fkAuy+NEP5oNn0lg7MOpc1LPE6SboPfj8cWmvtDWms+QwN\ndN6peKAfixYFN9D2oxHZ0CIrzBv50IZtndey3hrg2n3I409PT3esWfYx0ZBOz9qO9uUvhLSWp4Sd\nry1oM4t0xeXw5lhhlloE3JZrHoGtWY5sQ7MAt45tiZf5oMbm3R/tR5DKbS2sbWteTXbdekzm+Fag\nPbfcsuYSan4urxP2lmNQGu5y9QeJTwJ4ptb6pqkzohWqZcEjyFssR9Zie/BGcRLwWncnzbhbHrmq\nXprl1VhQjg1raVq58bG2B7b2GExzzTWwrfG81gFFQB8D4C2W+624+q/yF82UFwCxGz4H5K1ge/to\n+eANkoNN23JMGFksLwxgJx9a+WTKMJPOJ6ssyKMOlsOZsc4e2BJwq640sI/JagP5zwk9DOD7Afwb\nAD81a46YhgI8FPAIZMuCa41aNhyClgPNoeaPcDIN2kqPym1ox2ntb3VoWZCt7YzFtrwaC3CeX6vz\nku3vNitruX8WwE8DePGMeQGwa7llXBZ4q7GNmUyzzh1ZrqihWvtk3FFtH8saeZZqTFprWWruc8u4\n2oJaO7fVCWttTAvfZmW+OPIDAJ6ttX6qlHIPgPnm/phvhWWBzlpn77VJ6/XKbGPg+fSg4+53FlSr\nbPi1ZLy1v5dnfk7KoxRP085V64PHeNrMfXRPVseszZbzPFnAZyC36liWV1TGc8kqL67st8JKlPlS\nyr8F8KMALgE8H8BfA/Bfa60/JvarQwpCAiih9N6c8t6kstL4Vzju379/43M79+/fV+Pkvi3HaVZ5\nW17NS+Y4wH7Lb444evbOPyk855p/0VR+5fT8/Fz98qm3rFYrnJ+fm+ekeYw5JTvbgcfvHJj54sgj\nAB7ZnuQfAvhXEuyxshqP7Nkta+29F61Zau99aanIUvDP6VqufAbcaFzd0gEMgXYo6KWUnc8Kaz9w\n0T4VLOcKtGtR+a3X+n+Wy87em0yzhluam75Pce9oSi3iOTcwHnDL5dag1uCWbjiXB/Vms9mBW+Z7\nCNAtk2ia+9oK79B9ZXnwsPUOvPyCqTbc4J2iVheWO56FOFr2rTmu2foJ398G8NuT5+LB+a/XGtQe\n2JqbLkFer2/+ZS+tNbClm2QBvl6vr8Gmf0Lh5+GNNHohI/PCRrQPL8sp4I3ClAdpleUPWmQ8t9y8\nnGW9y3vidSDf1pOv6bZCLtvioSz5VFqM5SZZBW9NhFiQZ5ase6ZZCfkf3BrYwINvQGswzhGW5Uhh\nWbZD47XOTysfb6JN67SsNrDZ3PxxShZmXjfehJp1f8egg8Pd6i5pFdUCtfb/YLLCuTTXl7vjUefA\nrY0F5ZRpNHbzLO4UFpvCXp6sfGr51toDB5s/eZBwy/8716CW3pllxel6PD+8LdwmHRxuSxbUnttt\npVn/FyZdc89yW9bbs2YE2pDGnwVDA2UM3K1p8n69+QBtsQAnl5zKj3tA8isk/O00+ZPYoe65ZsG1\ndrFkLQpuqxHJymhxyaM/AvRmy3mjk4BzsD2rz11JD+BMOLMvLzcrPCXssnwyYS2NtwG5TfuRJZdA\n81nyCGjPemv3GbVXuo8lajFwS1dIWyyXnFtgb3Y8+1lazzJZ1ptLa8TauHPItpaHqeFuAZzfsyyD\nlrDWFjR4Sik3gKZwZKmjepb3E4Gt5XdpkC8GbpIGtGeth4AtAZcdhxQHm9xDDjVvGNLtBOCCG8W3\nplF+ZFmO3fb2ydZraxvQxOGWXwb1JtSkgfCsdktetXtcCuSLgDuyMhroHuAW2NrncqIJMW2MSPvQ\nHxJqYHPYPDizS/YcWnmOhTcL+NB1y74cbgmwFd8y1p5CtS7j07+LgBvIueUW2Frlyu2WT+RokmBn\nOgGCbQjLRK+sAAAXzElEQVTM0d8peXBrZSjjMvu0xHnxmXTZFrx9eBl59dkKt5VfXsdZLQHwxcAN\nxGNty72KQLfG3JrlpnyQpMWmNU/X9iX3HYALqwfxkDQ+Wz4ExiFx1oRnJo3L25fvn313QQM6gly2\nR7l9mwBfFNxSEegexN6XLTV3vhVwmcYf19D5yG3XQORx0VtcLdsa3FNZ4KhOrDDfpvwRqLTm5e2d\nk8qT6lla74wV1zoOeX9em6R6z7bhQwG+GLgzblLG7eIVm+3dvR5cc7e1eIJbNkj5+EyGLcijsJXe\nYrmHgKxZ7UxdUFnwR1okvh3VOQAVanlNz4prgPNrUzhqr0sHfBFwy17bAluGNQvuQU2WW6tgbczN\nX6KQcPMenLvi8pylFBfOaN2671RwR2mUrgFFayoTHi9fVuGPC2Ub0IAFdt1yWf+tFlu752y7PfS4\n2tMi4CZZDSpy+TLWmo+3tQ7Ds9xUiXy8TXG1PviKp5xwozgLyBbQs/tKuLXybEmP9pFlzrdPTh78\nfRKBSTBQuUlArDqncwLYsdreUMsC23PLZV48gHknH7XtfXcEB4dbFmqmMbW65PxRWKbnlpKVwt9O\no0WCTffALbf3k0gN4iFhXnZeObYCbu2rdaLci5DP/Ol4Drb2lpoGtmW5PdClUch26jK8RHgjHRxu\nLq+hycqxwM5Ybu1aMo6Lu46Z43gawZ35vfOQ7SngHgO57DzJWl9eXqpg03EEN42jPbdcWm5rCBa5\n494cS9TJZy20p313AIuCG9htmBHUWgPwAKfGJCvQ2rZeq8web1nsCNhsukyT5di6tB67Xl+9MMIt\ntgTbA1dL1/aj+q316uWh1WqVcsczULfIA3Rp1nsRcEcNzOuJM0DzheAG2nph/vjLkzynZ2npL4ki\nuFsWq0zHwM47RLnwsr24uNiZ3NPqmc9FWJZd1i9dg8bbFJagW266ZRxaLTjlbyjg++wAFgG3VFTg\nYyy4dAO1HzJ4ca37e+BG/zc25DjrOfdcy2q1wsXFxTWoHFgOB683b0yu1TMHl67pPR3xXPKhQGtt\ndOkWfHFwzwU19fZUebxBadZDS9f2t9JouxVSC9zsvvuGm7vj0lpTWWt1R7Ppmkek1Td/0hFNpFnu\nOT+vB7bslJYOsaXsF0f+FMBXAGwAXNRaXzt1RmThamB7kGvjL21CjY/ztBdULMiHLlk4ZXo2TW4f\nCm7Zwcl61MCOxuTSepMrfnl5ecN6cwseTap57Yquz9cUbgV8CeBnLfcGwL1a61/NkQlZkLS2wPbc\nNs1d47O5VOi8cZH1IJeRpFljeZwVR+GTkxMTVPmf3FFcJn3fcF9cXJiQcrgof9xiZwCX9QrYL7Fk\nJtUs0GXb09poK6yHBj8LdwEw+7+ze5bbsthZ15y/nUYAcLApLAueA85hlmErLYLSAtcD2lrPAXc0\nRo0mxTSrTZNuHtgW4LXWHautgc3DnoHQFtke+fZSrbSmLNwVwEdKKWsAv1Br/cWpMyLB5mHLYltu\nufV8myw3QcyttHwJRQIurXF2iaCcOm0s3JkJJ77QNWVdah0udUDWGJ0fL8HmE2pDx9zRhJq8vtVO\nbwvgWbhfX2v9Yinlb+AK8qdqrR+VO435VhgwzD1vseZ0DBeHQZMHNm+ostF6VjuCtCVdrj24W8HN\ndAIA1LKWj6s0qLXZcipzre5pvsSCNILXAtqCnLdDbaJQ69S0uOy+WWW/FZaCu9b6xe36y6WUDwB4\nLQAX7qHy3CKK06y8laalR9cA7BlxbbydgV6urUUbu3sAyLWnMZaFl1NUNkO9HK0MtDSrk7Aer8k8\nW/dF23KhDlOWpSwTrZz4eaey7NJwPvbYY+p+4Ti6lPKCUsoLt+FvAvB9AP5wklwayrpIch8LbKu3\nthQ1XDmRpoHNrVUEtDZe1xqptr0vyWtbcEXWObO0dgDWeXi+I3ntJbL22jbFyWt421MrY7lfAuAD\npZS63f89tdYPz5or2D2q3G7ZzwJcK2QLcA9syy2XYQ68BrW8htd4eV5bNLZjIEs0FOYMuF6nEQFu\n3aO0pnwt47T2xS22tNZ8O5OmbU+pzFc+/w+AV89y9QHygM70vtY5SJYrZwHeCnXW1cw22GzDkPtl\nPJfseYeA3AJ81MFGljt7T16byZQDBzkCfi6guRb3hhqXV7jRJEhkrb3zW65d1BAlxN4km9eAs65m\npoFIC2Kly/Kz0ryyssqoFfjsECbqBDOWXOvwrbUHsAXvIaAmLRpuUqY3zfS2Q3vkFsukvTpqzRhn\nLZXWULN594YcVCZaPE/TrskbdMuSAT5rzTOdYEYtbrksV14OGdj5deYG/VbArcmyzpFbHsGdATi7\nDAFbuukZYFokgddAb2mIXjll46L9o07QKiuZP09e24nK0oNdAr5P0BcB95ixTsv55HnltizgrLX2\nXG85ieZBzs/dArRnWeU+2lhQnqOlscky0copist6MtZxU3V8dO9ae9FA1spCQuyV5dzWe/ZXSiN5\nEGesb+vCz+tJ6/llI7PA1gCPXnixGqvc5vmT29G9aNveeT0rmFkiGDP361nx1vxY0I9pR2PWc2sR\nlntuZSuFxBszrTWwZWPTXliJoNbAzriZMq9Zccsjw1QWWtg7n2WhI2izAHvWfIzFjjr5Vrc8s96n\nDm65W9U6rrbccM+1kmvPcmsNVHPHI9dTO6fXcLMNxeoItLDViQyx3pE7HVnyyKvxQNfyqbUjue15\neZpBaDUaUdrUuhVwW6B6+2Vdcu08mYZsWRVrjG29rWZ1FhmwLdC1xpyBWYtrBdkD2+rEvLF1xiX3\nys0rE60NZCC3QJdx8vwe7HNosXBnezgNfC3Ns+KaNKC88aAEPHoNNTPujmCnfHn3YMVZsMt7n8pi\nZ8PRMKV16JItK2oTvG1kDIQXJ9Nl3Nxa5JjbAjsDa0uPm1UG6Ahyy7pbY8nIGknLRHFW/rUxoJfG\n156GwhyB3DqMkeVllZGU51JHBkArYytM+ciU6VRaHNxWYXrxHuTafl7FZS2U1hCjl1a8CTXP7fTc\nzTEaCnRLeUUdVtY6jxnGUD4tZcbTWrlpYTo+A/Pc0C8Obk2eBZdx3n7RmEezhB7UkTUf8vJKBuYh\nwLda6Cz0HtCexbaGHxHg2U7Dst4eaLTWwhxiuc0Bldv8evu02sDC4I7g8wDmYS+OKiUaA8nGYTWq\nCGr6p5IWdzMCvkWyUfI4Ce0Q6x0Blk3zLLNlwa1z83xpdUrKtiWrLLVtfl5rm5f1nFoU3FwegBbA\nMi3qjS1XnzcQWkeNMmu1vWNawfDkQc3DHtieRefn9PIbWeVMWVqAR2WTKS/PC9SMSQS0FiehlnFz\nabFwc3lWNtMBWBWoKQu0bGTR66ZeA7WsUgR11pJrUFthDWzPymStdQbsDPBR2WQ7P01Rm9HKk8fR\nOWQcP7+Wr7ms+GLgzoBngZ210prF9lxyCluN12qAlltuHeeFPYuk5deSBzWVQyvYXvl4wE4NfEuH\n6CkLtyzzCGgrbW4tBm5LFpAyfoibblUcEEOdccV5WAM4A4AVR3n0JC2MBbXczjbCLMRW+WXBtY6J\nykjrpDVpbSHTRvi5eVlqadZ1o33GaHFwR1ZVS2+BemhBtsCuPQ7LgBBBQvnQ1l6+LcD58db40Nv2\nysW6p6xlz1j9aMzN8yfvl98TD1uGI6OoLixXfi4tDm5SC8SZtAh8UtRYM9ZFQq5Zl6yr6jVer9HK\ne8pOAvH4TOPLwGxZ50xaZLkz5ZSR1Ta0Dm6o5oZZKvX6aSnlxaWU95VSniql/FEp5XVzZ4zk9aJR\nWhZoqzF7lihjuVvd9ezYMbJGmrR9ImtnXTdTLpm4DNhRp6Bdh9+vB3rWQLS46EtS1nK/A8AHa63/\npJSyAvCCGfOUKsSoYrzt6BpWg5YNStvWoI4afNYKaY20xRpEFsgDwLpOlNcIxlawAajnzJSXV1ZR\nOxqqlvqZWiHcpZQXAfiuWuuPA0Ct9RLAV+fIjGVRW9aRW15KSQEOxC+yRO64BnfrMpXbad2bVOu4\nsGVyy+ocvXjNq7GOtax3VkOtdabTyO4/pTKW+9sB/GUp5V0A/j6AJwG8tdb6/2bNmVAWbL5/BDuP\nI1lAZwD3XO+xy77Ueq0hUHvlGEHe2vFFFtzy9GTYK6tWgLWJyTmUgXsF4DUAfqLW+mQp5d8D+BkA\nj8odx34rTPa4HmiW2xZZ1VJK6htfVrr3qSDvmtkGOGQfrQz3Kat+Mp6N5unwZbVaXX+DjL6FJr+C\nqv1Qx3uvfx8daATwGMCn/FbYMwCerrU+ud1+P4C3aTuO+VaYbMSRqysrnn+M7vz83LTOpRScnZ3h\n/PwcZ2dnO+GzszOsVqvrNV+0hhT9B3kGxqiB7dt6t8i7n6j+eB1mvsRJ5+d1ZS1R3UX/StviTbV2\nFmPrUxpO61thmS+OPFtKebqU8spa6+cAvAHAZwbnzFGm97d6dK1hbPMfwm0Bri1ew9Dcy6wV1spA\nKx+r3A6prMWWkGtg11rVr7HSdQDsdMIZsKfuoLMd8twegqfsbPlbALynlHIG4PMA3jxVBjyXrmxd\n6Mht03p5rcenJerxtYaS6e2HuOCyHLSyieKWIOueJdT0nW4CmwNO9bXZbK7PKztmADv15IVl/fGw\nB/bYuZIlKPsJ398H8A/mzIjXMDSrzS027+21WU4Jlwdz1PNnQY/A1vKmbVPckqXdn2e1N5vNDuDe\nBKg8P9WDHEJ5Q6rMGF2bxxkD+KFBX8QbarzyrAkx3ih4g/DGZ9r5qXFovfz5+Xl6vG2BzRu3B7a1\nzfMst7V7Wook2B7gWj16cyTyGrxeeF3JevPqUZvYG2O5s2WzT+gXATfgNw5y54Y2DrloDUJa7Uzv\nL2dlrUbB8yHDmTQtrJXfoWXVIdUVX6LhlHduaz6kZa5kzBMOzwMbAv1cWiTcnuWOJl2s89E5AZgN\nIePWaRYgahw8PxSWcTx+SPiQ0u7Ts9rajLh1TnkuDrccLnlDqaiT9jwwmR/LA9Ng3aellloE3FpB\nRXBb4zR5Xnk+r+fPLJEFaLHaXlw2fGh5jdxyxy1LrbnjVucsO1qvE46GVtFTD+3+rDgZL8tKq7u5\n6vPgcGsNXfac0hWXY23rvFpDA5Du4aOG0eLW8TzJ+x0Cuxe3b2lW2+qg+Yx4Fmqt/vjMd+s6mjPJ\nTohG2zxOK6+5dXC4gbzljmbFtXNpPbGscK/3t2bKrQkZeV0LXp5HLc2KW6oiqy3rbIxbLh+FRmEL\ncD5LLuswM7Sy0qxteX9zaxFwA7lHYVpD0c6jnY8qFIDaCLxevtV6a/ci85ZZW/dl7XNotdZhdKx2\nvITbAj2bJsEeOrzyINfCUdoUWiTcEdTR8QB2jr28vDQbh9fje+mWS5e12i3rJcuDcrPZqFBr7yLI\nc52cnFzXGx0PwAR0tVrteFSZZeiwKvLEvH33oUXAbVlb2Shk4+DHa8fSmj9GA3YbR2bxrMIQq63F\n3Wbged4k1LzuqA6sF1S0+ifA1+s1ANwod2uYlInzoJbbWl61sBWnlZWVPpUWATdwc4xMDaPWeqNx\naMfIY2mh1xwvLy+vw7JxWA2gJT7j1vG8yny3pFn3vxRJMCXMsg41kHl4vV7fqDtef9p4WVu37NNq\nua11plPeR90dHG6rx6ZJFwoPeaYtG8l6vb5O83r+1nSr5+cVTfnk67FxMu0Q0spe66S1ztk6hzYk\n0+CW5a+FM/tawysPbrm9RK/r4HBLyUrO7GuN0TnU9AsywG8cQxtLxmpbPXcWbHnvS5LWOVP9RTPi\nm81GrUteh9Lzsup8qjitDQ4F+RBgAwuC27LegP13SLJx8Mohq0GNguC2LEMUl2lQ0r2UkFOepwgv\nSdKy8frjkMtjqD54/dH8CNVhpv6kN5ZNo/Sok+b3KO+3Jc3aZy4tAm7ZOLSeX+4vGwdvGNQgTk9P\nd/7MAYBakVMtmovK79ELZ/dbIuSWa56pO4Kb6pGv+ctLvP4sj03GZ/fT6o+2Kd/8Hqy4KH2fXtgi\n4AZ0y62ly335u8pWg+BwW6780DhrHw/uaDvaN5t2CHn1qJWJBrOsP74Au/9+anlOY9NbO+chsM+p\nRcCt9foW5AB2GoL8QYn2C6SWxjFFnGwcdJ/yvrWyyKYvRdmOmcpfdsxaffK65GFA/2tjrw6stMy+\nGTDHgD+nFgE3SWsc8p9UqCHwMH+dUfvlGF8DUCszquxM2EqX96jddxS3VNBLefB1UGmJSVq6VX9R\nHdI1NQ/JcquHbltwy+2orlo7+Kl0cLh546BtANeNg9KoQdA2jedko4jCdI1MpVrxrcdo92yVRTZ+\nCWBLeXUo65F3Atb75lod0vkzddS6eHXXAvCYY6ZU5qMErwTwXgAVQAHwCgD/utb6c1NlwipEXvEE\nNk20UWXzfaIfJ1hwty4t55D3ZN33VGmHkMwP73hl/ch6tOrOqsuo/L20Icdq92fd99i4qVW8l0N2\ndi7lBFd/dfy6WuvTIq22nIukwedVspeeOZbl16zU1m0ZJ8O0HSnaZ4pzTK1M+U8ZT8rUzZRhTftO\n846pte4c2OqWfw+A/y3BnkJW7yYrnNZWOJMue2SrYqfaN7pPT0uz0pooj9KyTlF3Mk5ec1/rzP1P\ntd9UaoX7nwL41akzQQ1Bs3SyosfGyetmw7Jion1aKvI2ABzJ65xJXh1F6RbcQ8JD98tqKfWZdsvL\n1X+W/wWAV9Vav6ykD3bLW+KHHJOBe6q0TPoc0jrIfWjKesqm7WOIcyhAD+WW/yMAn9DAJr19wLfC\nrJtZSu93m3SoTmVIWtdwZb8V1mK5fxXAh2qt7zbSB1nurq6ucbIsdwruUsoLAHwBwCtqrf/X2KfD\n3dV1AI2CO3mBDndX1wFkwe3/YLqrq+vWqsPd1XWk6nB3dR2pOtxdXUeqDndX15Gqw93VdaQ6ONyZ\nN21u47X69fr1Dn29Dne/Xr/ekV7v4HB3dXXNow53V9eRatLXTyc5UVdXV7Nmfbe8q6trWepueVfX\nkarD3dV1pDoY3KWUN5ZSPltK+Vwp5W0zX+udpZRnSyl/MOd12PUeLqX8Zinlj0opny6lvGXm6z1U\nSvlYKeWT2+s9Ouf1ttc8KaX8Xinl1+e+1vZ6f1pK+f3tPX585mu9uJTyvlLKU9s6fN2M13rl9p5+\nb7v+ymTtxfsr4LkWXHUq/wvAywGcAfgUgL874/W+E8CrAfzBnu7vbwJ49Tb8QgB/POf9ba/zgu36\nFMD/BPDama/3LwH8FwC/vqcy/TyAv76na/0nAG/ehlcAXrSn657g6n8K/9YU5zuU5X4tgD+ptX6h\n1noB4NcA/OBcF6u1fhTAX811fuV6X6q1fmob/hqApwC8dOZrfn0bfAhXDXK2mdJSysMAvh/Af5zr\nGtplsQdPs5TyIgDfVWt9FwDUWi9rrV+d+7pbTfrX4YeC+6UA+A08g5kb/6FUSvk2XHkNH5v5Oiel\nlE8C+BKAj9Ran5jxcj8L4KcxYweiqAL4SCnliVLKP5/xOt8O4C9LKe/ausq/UEp5/ozX45r0r8P7\nhNqMKqW8EMD7Abx1a8FnU611U2v9DgAPA3hdKeVVc1ynlPIDAJ7deiZlu+xDr6+1vgZXHsNPlFK+\nc6brrAC8BsDPb6/3dQA/M9O1rrX96/A3AXjfVOc8FNx/DuBlbPvhbdzRqJSywhXY/7nW+t/3dd2t\nC/lbAN440yVeD+BNpZTP48rKfHcp5Zdnuta1aq1f3K6/DOADuBrazaFnADxda31yu/1+XME+t8K/\nDm/VoeB+AsDfKaW8vJRyDuCHAMw967pPKwMAvwTgM7XWd8x9oVLKt5RSXrwNPx/A9wL47BzXqrU+\nUmt9Wa31Fbiqt9+stf7YHNcilVJesPWCUEr5JgDfB+AP57hWrfVZAE+Xqw9gAsAbAHxmjmsJ/TAm\n/prPQT7hW2tdl1J+EsCHcdXBvLPW+tRc1yul/AqAewC+uZTyZwAepQmTma73egA/AuDT23FwBfBI\nrfVDM13yWwG8u1x9qPEEwHtrrR+c6VqH0EsAfGD7ivMKwHtqrR+e8XpvAfCerav8eQBvnvFa9Nfh\n3wPgX0x63u0UfFdX15GpT6h1dR2pOtxdXUeqDndX15Gqw93VdaTqcHd1Hak63F1dR6oOd1fXkarD\n3dV1pPr/fJkN9WBGZMYAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(img)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Inverse Discrete Fourier Transform\n", + "Let's start with seeing if we can render each of the 'frequencies' that the DCT gives us." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1., 0., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 0., 0.]])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "freq = np.zeros((8, 8))\n", + "freq[0,0] = 1\n", + "freq" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "freq_img = idct(idct(freq, axis=0), axis=1)\n", + "plt.imshow(freq_img, cmap='gray')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nnz+P8+fPh+Va4L4PzpIcAN74RvUVYkNDQzNqd3cXu7u7B/s/+MElL9wFAKTW0aWUq7H/MO2DczRu\naDOVub/chGsO5ZR9ndBZANct3JahNavnvjxzzQH4etT/ipChoaGN1oB7aGhLNeAeOtC4594uDbiH\nDrTUPffQejTgHhraUg24hw40luXbpbXDffr06SOr62tf+9qR1QUc/ZL0u9/97qTzW9v78MMPz35N\nT5/4xCdmu1ZGX/rSl460vnPnzs16vbXD/clPfvLI6nrqqaeOrK51aCrcrXrkkUeOtL5thzvzldIW\nrR3uoaGhZTTgHjrQuOfeLpW57olKKeNvHkNDa1Kt9ZJZdDa4h4aGNktjWT40tKUacA8NbanWBncp\n5WWllCdKKV8upSz6Kw+llHeVUp4upfzlkvWw+m4spfxJKeWxUsqjpZTXLlzfs0opny6lPLKq7y1L\n1reqc6eU8nAp5cNL17Wq769LKX+x6uOfL1zXc0spf1RKeXxlw59csK6XrPr08Gr7ndn8Zamf8Al+\n3mcHwP8G8CIAuwA+D+DmBeu7B8BtAP7yiPr39wHctko/G8CXluzfqp6rV9sTAP4XgDsXru/1AP4b\ngA8f0Zh+BcDfO6K6/iuAV6/SVwC45ojq3QHwFIB/MMf11hW57wTwV7XWv6m1ngfwhwB+YanKaq0P\nAfi7pa6v1PeNWuvnV+nvAXgcwA0L13l2lXwW9h1ysSelpZQbAbwCwDuXqkOrFkew0iylXAPgp2qt\n7waAWuuFWutRfTvI/enwVq0L7hsA8A58FQs7/7pUSnkx9lcNn164np1SyiMAvgHg47XWzyxY3W8A\n+DUsOIEoqgA+Xkr5TCnl3y5Yz48C+FYp5d2rpfJvl1KuWrA+Lvenw1s1HqgtqFLKswE8COB1qwi+\nmGqtF2uttwO4EcBPllJ+Yol6Sik/D+Dp1cqkrD5HoVO11juwv2L4lVJK/NO6fboCwB0AfmtV31k4\nP+c9l8ozPx3+R3Ndc11wfw3AC9n+jau8rVEp5Qrsg/37tdY/Pqp6V0vIPwXwsoWqOAXglaWUr2A/\nyvx0KeWBheo6UK3166vtGey/zurOhar6KoAna62fXe0/iH3Yl1b40+GtWhfcnwHw46WUF5VSTgL4\nRQBLP3U9yigDAL8L4Iu11ncsXVEp5UdKKc9dpa8C8LMAnliirlrrm2qtL6y1/hj27fYntdZfXqIu\nUinl6tUqCKWUHwLwcwC+sERdtdanATxZ9l+ACQA/A+CLS9QlFP50eKtmfYVvVrXWvVLKrwL4GPYn\nmHfVWh9fqr5Syh8AuBfAD5dS/hbAW+iByUL1nQLwSwAeXd0HVwBvqrV+dKEqrwfwe2X/RY07AN5X\na/3IQnWtQ88H8KHVV5yvAPCeWuvHFqzvtQDes1oqfwXAqxesi/90+L+b9bqrR/BDQ0NbpvFAbWho\nSzXgHhraUg24h4a2VAPuoaEt1YB7aGhLNeAeGtpSDbiHhrZUA+6hoS3V/wcULHKubS+h0gAAAABJ\nRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Ok, lets try for a more interesting frequency\n", + "freq = np.zeros((8, 8))\n", + "freq[2,3] = 1\n", + "freq_img = idct(idct(freq, axis=0), axis=1)\n", + "plt.imshow(freq_img, cmap='gray') # Side point: this image looks wiggly haha" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/python/jpeg.ipynb b/python/jpeg.ipynb deleted file mode 100644 index 1105c7b..0000000 --- a/python/jpeg.ipynb +++ /dev/null @@ -1,51 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "This is a thing to do a fourier-*like* transform (techinically, a discrete cosine transform) on an image to get out the different layers that jpegs use." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2.0 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file