{ "cells": [ { "cell_type": "markdown", "source": [ "| Credentials | |\n", "|----|----------------------------------|\n", "|Host | Montanuniversitaet Leoben |\n", "|Web | https://cps.unileoben.ac.at |\n", "|Mail | cps@unileoben.ac.at |\n", "|Author | Fotios Lygerakis |\n", "|Corresponding Authors | fotios.lygerakis@unileoben.ac.at |\n", "|Last edited | 28.09.2023 |" ], "metadata": { "collapsed": false }, "id": "e94a99fbf273dd6e" }, { "cell_type": "markdown", "source": [ "This notebook contains code for visualizing the convolution operation." ], "metadata": { "collapsed": false }, "id": "ffa147d97adb2a8" }, { "cell_type": "code", "execution_count": 19, "outputs": [ { "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAH/CAYAAAC4vJRfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACc6UlEQVR4nOzde5yMdf/H8ffsadZhD9YuFoucrfMhEkIUQpG6ReVQud2i+xZS24F02g6IStFRflEKUSnnUw45poiccmbXae2ymD3M9ftj7dixO1h25rI7r+fjMQ8z3/leM+/ru+uanc9853tZDMMwBAAAAAAAAAAAsvExOwAAAAAAAAAAADcriugAAAAAAAAAALhAER0AAAAAAAAAABcoogMAAAAAAAAA4AJFdAAAAAAAAAAAXKCIDgAAAAAAAACACxTRAQAAAAAAAABwgSI6AAAAAAAAAAAuUEQHAAAAAAAAAMAFiuhAPjN58mRZLBbt27fvmvtu2LDB/cFuQhUqVFCfPn3MjnHDLBaLXn75ZbNjAAC8SKtWrdSqVSuzYwAAYLply5bJYrFo2bJlefq4ffr0UYUKFfL0MQG4D0X0AupmK56eO3dOL7/88jW/6GS+SM2YMcO9wQqIDz/8UJMnT87zx3355ZdlsVh04sQJp/aDBw+qUqVKCgsL06ZNm/L8ec2QnJysV199VXXq1FHhwoUVEhKiFi1aaMqUKTIMw+x4AIB8yNXfY4mJiWrcuLECAwM1b948k9IBAOBee/bsUf/+/VWxYkUFBgYqODhYzZo10/jx43X+/Hmz43nEkSNH9PLLL2vz5s1mR8nm5MmTeuaZZ1StWjUFBgYqLCxM7dq1008//XRDjztt2jSNGzcub0Jexc08vih4/MwOAO9w7tw5jRo1SpKY1XSDHn30UT300EOyWq2Otg8//FDh4eEemXV9+PBhtW7dWqdOndKiRYvUoEEDtz+nu8XHx6tNmzbavn27HnroIQ0aNEgXLlzQzJkz1bt3b/3888+aOnWqfH19zY4KAMjnkpKSdPfdd+vPP//U999/r/bt25sdCQCAPDd37lw9+OCDslqt6tWrl2rVqqWUlBStXLlSzzzzjP766y99/PHHZsd0uyNHjmjUqFGqUKGC6tWr53TfJ598IrvdbkquHTt2qE2bNjp+/Lj69u2rRo0a6fTp05o6dao6d+6sYcOG6Z133rmux542bZq2bt2qwYMH523oHFxpfIG8RhEdyGd8fX1NK+YeOXJErVu31smTJ7Vw4UI1bNjwhh8zOTlZRYoUyYN01693797avn27vv/+e917772O9v/+97965plnNHr0aNWvX1/PPvusxzLZ7XalpKQoMDDQY88JAHCvM2fOqF27dtq8ebNmzZqlDh063NDjXbhwQQEBAfLx4culAICbx969e/XQQw+pfPnyWrJkiSIjIx33DRw4ULt379bcuXNNTHhz8Pf3N+V5U1NT9cADDyghIUErVqxQkyZNHPc9/fTTevjhhzV69Gg1atRI3bt3NyUjcDPiL24v0qdPHxUtWlSHDx9Wly5dVLRoUUVERGjYsGFKT0939Nu3b58sFotGjx6td999V+XLl1ehQoXUsmVLbd261ekxXa2XmXVtr3379ikiIkKSNGrUKFksluta4zlzaZGdO3fqkUceUUhIiCIiIvTSSy/JMAwdPHhQ9913n4KDg1WqVCmNGTPGafuUlBSNGDFCDRs2VEhIiIoUKaIWLVpo6dKl2Z7r5MmTevTRRxUcHKzQ0FD17t1bf/zxhywWS7ZlU/7++2898MADCgsLU2BgoBo1aqQffvjhqvvToEED3X///U5ttWvXlsVi0Z9//ulomz59uiwWi7Zv3y4p+5roFSpU0F9//aXly5c7xvbyn4nNZtOQIUMUERGhIkWKqGvXrjp+/PhVM2Z19OhRtW7dWseOHdOCBQvUqFGjXI9DZvbly5frySefVIkSJVS2bFlJGb9LtWrV0rZt29S6dWsVLlxYZcqU0dtvv50ti81m08iRI1W5cmVZrVZFRUVp+PDhstlsudonSfrtt980f/589enTx6mAnik2NlZVqlTRW2+9pfPnzys1NVVhYWHq27dvtr5JSUkKDAzUsGHDcp3VYrFo0KBBmjp1qmrWrCmr1eryK/779+/Xk08+qWrVqqlQoUIqXry4HnzwQad18v/55x9ZLBa9++672bZfvXq1LBaLvv7662sdJgDADTp79qzat2+vTZs2aebMmerYsaPjvsOHD+uxxx5TyZIlZbVaVbNmTX3++edO22cudffNN9/oxRdfVJkyZVS4cGElJSVd8994UsaHtOPGjVPNmjUVGBiokiVLqn///kpISPDIOAAACr63335bZ8+e1WeffeZUQM9UuXJl/e9//3PcTktL06uvvqpKlSrJarWqQoUKev7557O9Z6pQoYI6deqklStXOpZFq1ixoqZMmeLos2HDBlksFn355ZfZnnf+/PmyWCxOy5X8/vvv6tChg4KDg1W0aFG1adNGv/3221X30dX5t7LWSJYtW6Zbb71VktS3b1/H+/XMmkJOa6InJydr6NChioqKktVqVbVq1TR69OhsS4xmvn+cPXu2atWq5fj74VqWiZs5c6a2bt2q5557zqmALmVM2ps0aZJCQ0Odajauzs12+XrxrVq10ty5c7V//37H/mbuY2bf6dOn6/nnn1epUqVUpEgR3XvvvTp48KDT4+bF+AJ5jZnoXiY9PV3t2rVTkyZNNHr0aC1atEhjxoxRpUqVNGDAAKe+U6ZM0ZkzZzRw4EBduHBB48eP15133qktW7aoZMmS1/ycERER+uijjzRgwAB17drVUTiuU6fOde1D9+7dVaNGDb355puaO3euXnvtNYWFhWnSpEm688479dZbb2nq1KkaNmyYbr31Vt1xxx2SMgqcn376qXr06KF+/frpzJkz+uyzz9SuXTutW7fO8dUfu92uzp07a926dRowYICqV6+uOXPmqHfv3tmy/PXXX2rWrJnKlCmj5557TkWKFNG3336rLl26aObMmeratavL/WjRooVTEfPUqVP666+/5OPjo19//dUxPr/++qsiIiJUo0aNHB9n3Lhxeuqpp1S0aFG98MILkpTt5/PUU0+pWLFiGjlypPbt26dx48Zp0KBBmj59+jWNeXx8vB544AHFxcVpwYIFjheq6x2HJ598UhERERoxYoSSk5Md7QkJCWrfvr3uv/9+/etf/9KMGTP07LPPqnbt2o7Zena7Xffee69Wrlypf//736pRo4a2bNmid999Vzt37tTs2bOvaZ8y/fjjj5KkXr165Xi/n5+fevbsqVGjRmnVqlVq27atunbtqlmzZmnSpEkKCAhw9J09e7ZsNpseeuih68q6ZMkSffvttxo0aJDCw8NdnmRm/fr1Wr16tR566CGVLVtW+/bt00cffaRWrVpp27ZtKly4sCpWrKhmzZpp6tSpevrpp522nzp1qoKCgnTfffflaqwAANcnOTlZHTp00Pr16zVjxgx16tTJcV98fLxuu+02x5vhiIgI/fLLL3r88ceVlJSU7avQr776qgICAjRs2DDZbDbH69C1/o3Xv39/TZ48WX379tV///tf7d27Vx988IF+//13rVq1yrRZcQCAguPHH39UxYoVdfvtt19T/yeeeEJffvmlHnjgAQ0dOlRr165VbGys49vCWe3evVsPPPCAHn/8cfXu3Vuff/65+vTpo4YNG6pmzZpq1KiRKlasqG+//Tbbe/jp06erWLFiateunaSM97EtWrRQcHCwhg8fLn9/f02aNEmtWrXS8uXLsxWYc6tGjRp65ZVXNGLECP373/9WixYtJMnluBiGoXvvvVdLly7V448/rnr16mn+/Pl65plndPjw4WwTpFauXKlZs2bpySefVFBQkN577z1169ZNBw4cUPHixV3mutp74JCQEN1333368ssvtXv3blWuXPma9/mFF15QYmKiDh065MhbtGhRpz6vv/66LBaLnn32WR07dkzjxo1T27ZttXnzZhUqVOianyu34wvcMAMF0hdffGFIMtavX+9o6927tyHJeOWVV5z61q9f32jYsKHj9t69ew1JRqFChYxDhw452teuXWtIMp5++mlHW8uWLY2WLVtme/7evXsb5cuXd9w+fvy4IckYOXLkNeVfunSpIcn47rvvHG0jR440JBn//ve/HW1paWlG2bJlDYvFYrz55puO9oSEBKNQoUJG7969nfrabDan50lISDBKlixpPPbYY462mTNnGpKMcePGOdrS09ONO++805BkfPHFF472Nm3aGLVr1zYuXLjgaLPb7cbtt99uVKlS5Yr7+N133xmSjG3bthmGYRg//PCDYbVajXvvvdfo3r27o1+dOnWMrl27Om5n/mz37t3raKtZs2aOP4fMvm3btjXsdruj/emnnzZ8fX2N06dPXzFj5piXL1/eCA4ONtasWZNjv2sdh8w8zZs3N9LS0pweo2XLloYkY8qUKY42m81mlCpVyujWrZuj7f/+7/8MHx8f49dff3XafuLEiYYkY9WqVY628uXLO/0O5KRLly6GJCMhIcFln1mzZhmSjPfee88wDMOYP3++Icn48ccfnfrdc889RsWKFa8rqyTDx8fH+Ouvv7I9/+X/d86dO5etz5o1a7KN36RJkwxJxvbt2x1tKSkpRnh4+FXHBQBw4zJf98qXL2/4+/sbs2fPztbn8ccfNyIjI40TJ044tT/00ENGSEiI45if+bdRxYoVs70OXOvfeL/++qshyZg6dapTv3nz5mVrd/U3HgAAV5KYmGhIMu67775r6r9582ZDkvHEE084tQ8bNsyQZCxZssTRVr58eUOSsWLFCkfbsWPHDKvVagwdOtTRFhMTY/j7+xunTp1ytNlsNiM0NNTpvX+XLl2MgIAAY8+ePY62I0eOGEFBQcYdd9zhaMt8DV66dKlTlpzeU13++rl+/fpsdYRMl9dNZs+ebUgyXnvtNad+DzzwgGGxWIzdu3c72iQZAQEBTm1//PGHIcl4//33sz1XVvXq1TNCQkKu2Gfs2LGGJOOHH34wDCPnOoRh5Dw2HTt2dNqvy/uWKVPGSEpKcrR/++23hiRj/Pjxjra8GF8gr7Gcixf6z3/+43S7RYsW+ueff7L169Kli8qUKeO43bhxYzVp0kQ///yz2zNeyRNPPOG47uvrq0aNGskwDD3++OOO9tDQUFWrVs1pv3x9fR2ztex2u06dOqW0tDQ1atRImzZtcvSbN2+e/P391a9fP0ebj4+PBg4c6JTj1KlTWrJkif71r3/pzJkzOnHihE6cOKGTJ0+qXbt22rVrlw4fPuxyPzI/JV2xYoWkjBnnt956q+666y79+uuvkqTTp09r69atjr7X69///rcsFovTc6enp2v//v3XtH18fLyKFi2a41fxrmcc+vXrl+O67kWLFtUjjzziuB0QEKDGjRs7/Ry/++471ahRQ9WrV3c814kTJ3TnnXdKUo7L81zJmTNnJElBQUEu+2Tel5SUJEm68847FR4e7jSTPyEhQQsXLnRaMy63WVu2bKno6OirZs766XxqaqpOnjypypUrKzQ01Ol3+V//+pcCAwM1depUR9v8+fN14sQJp3EGALhXfHy8AgMDFRUV5dRuGIZmzpypzp07yzAMp9eKdu3aKTEx0em4LmWcx8PVLK2r/Y333XffKSQkRHfddZfTczVs2FBFixbN9WsoAACXy3zPdKX3V1ll1heGDBni1D506FBJyrZ2enR0tNP744iIiGzv/bt3767U1FTNmjXL0bZgwQKdPn3a8X4tPT1dCxYsUJcuXVSxYkVHv8jISPXs2VMrV6507Iun/Pzzz/L19dV///tfp/ahQ4fKMAz98ssvTu1t27ZVpUqVHLfr1Kmj4ODgHOs7WZ05c+aqP5/L3wPnpV69ejk9/wMPPKDIyEjTa03A1VBE9zKBgYGO9ckzFStWLMd1MKtUqZKtrWrVqtnWwPK0cuXKOd0OCQlRYGCgwsPDs7Vfvl9ffvml6tSpo8DAQBUvXlwRERGaO3euEhMTHX3279+vyMhIFS5c2Gnby7/CtHv3bhmGoZdeekkRERFOl5EjR0qSjh075nI/SpYsqSpVqjgK5r/++qtatGihO+64Q0eOHNE///yjVatWyW6333AR/fIxK1asmCRd8/qnX331lU6dOqW77ror2z5dzzjccsstOT5P2bJlnYr9mVmz5ty1a5f++uuvbM9VtWrVHJ/rajJfvDOL6Tm5vNDu5+enbt26ac6cOY51+mbNmqXU1FSnInpus7oal8udP39eI0aMcKyTFx4eroiICJ0+fdrpdzk0NFSdO3fWtGnTHG1Tp05VmTJlHIV8AID7ZS7/1b59e+3YscPRfvz4cZ0+fVoff/xxtteKzHNvXOtrxbX8jbdr1y4lJiaqRIkS2Z7v7NmzuX4NBQDgcsHBwZKu/P4qq/3798vHxyfb++1SpUopNDQ028Svy9/bStlf7+rWravq1as7TXqaPn26wsPDHe+Djh8/rnPnzqlatWrZHq9GjRqy2+3Z1ul2t/3796t06dLZCtyZS7tez1jkJCgo6Ko/n2uZbHa9Lq81WSwWVa5c2fRaE3A1rInuZXKa/XsjLBZLthNcSMp2Equ8lNM+uNqvrNm++uor9enTR126dNEzzzyjEiVKyNfXV7GxsdqzZ0+uc9jtdknSsGHDHGuqXe5qa4c1b95cixcv1vnz57Vx40aNGDFCtWrVUmhoqH799Vdt375dRYsWVf369XOdL6trGZ8radmypb799lvdf//9ateunZYtW6aQkBBJ1zcOrmbQXUtOu92u2rVra+zYsTn2vXyW39XUqFFDs2fP1p9//ulYP/9ymSd6zTpL/KGHHtKkSZP0yy+/qEuXLvr2229VvXp11a1b97qzXuv6b0899ZS++OILDR48WE2bNlVISIgsFoseeughx88jU69evfTdd99p9erVql27tn744Qc9+eST8vHhM1QA8JTo6Gj9/PPPatOmje666y6tWrVKUVFRjmP2I488kuO5V6Ts55DJ7WtoVna7XSVKlHD6hlJWlxfhAQDIreDgYJUuXVpbt27N1XaXT6Zy5Vrf23bv3l2vv/66Tpw4oaCgIP3www/q0aOH/PzypgzmKm96enqe111cud73+TVq1NDmzZt14MCBHAvxUvb3wFfaX3e4GcYXuBxFdLi0a9eubG07d+50OtlhsWLFcvyq0OWfkF7rC6I7zZgxQxUrVtSsWbOc8mTOls5Uvnx5LV26VOfOnXOajb57926nfplf+fL391fbtm2vK1OLFi30xRdf6JtvvlF6erpuv/12+fj4qHnz5o4i+u23337VFwlPjG/nzp31+eefq3fv3urUqZMWLFigQoUK5ck45EalSpX0xx9/qE2bNnmy3506dVJsbKymTJmSYxE9PT1d06ZNU7FixdSsWTNH+x133KHIyEhNnz5dzZs315IlSxwndnVX1kwzZsxQ7969NWbMGEfbhQsXdPr06Wx927dvr4iICE2dOlVNmjTRuXPn9Oijj+ZZFgDAtWncuLFmz56tjh07OpZui4iIUFBQkNLT0z32Grpo0SI1a9YsVyfuAgAgNzp16qSPP/5Ya9asUdOmTa/Yt3z58rLb7dq1a5djxrWUsRTa6dOnVb58+evK0L17d40aNUozZ85UyZIllZSUpIceeshxf0REhAoXLuz0DbFMf//9t3x8fK44QatYsWI5vv/av3+/0/IwuXkfWL58eS1atCjbcit///234/680KlTJ3399deaMmWKXnzxxWz3JyUlac6cOapevbpjQlzmt9kv3+ecloi92j5fXmsyDEO7d+92mjjgjvEFbhRTEeHS7NmzndayXrdundauXasOHTo42ipVqqS///5bx48fd7T98ccfWrVqldNjZRajczoIekpmITrrp7Jr167VmjVrnPq1a9dOqamp+uSTTxxtdrtdEyZMcOpXokQJtWrVSpMmTdLRo0ezPV/WMXElc5mWt956S3Xq1HHM7m7RooUWL16sDRs2XNNSLkWKFPHI2D766KMaN26cVq5cqW7duik1NTVPxiE3/vWvf+nw4cNOP59M58+fV3Jycq4e7/bbb1fbtm31xRdf6Keffsp2/wsvvKCdO3dq+PDhTgUHHx8fPfDAA/rxxx/1f//3f0pLS3NaysUdWTP5+vpmm13w/vvv5zgLwM/PTz169NC3336ryZMnq3bt2tlmNQIAPKNNmzb6+uuvtXv3brVv317Jycnq1q2bZs6cmeOMPXe8hqanp+vVV1/Ndl9aWpqpf6cBAAqO4cOHq0iRInriiScUHx+f7f49e/Zo/PjxkqR77rlHkjRu3DinPpnf5u3YseN1ZahRo4Zq166t6dOna/r06YqMjHSaNOXr66u7775bc+bMcVpGJD4+XtOmTVPz5s0dS9PkpFKlSvrtt9+UkpLiaPvpp5+yLQFTpEgRSddWC7nnnnuUnp6uDz74wKn93XfflcVicarF3IgHHnhA0dHRevPNN7Vhwwan++x2uwYMGKCEhASnCYeZa69nntNNyphw9vHHH2d7/CJFijgtM3q5KVOmOC0nM2PGDB09ejRbrSmvxxe4UcxEh0uVK1dW8+bNNWDAANlsNo0bN07FixfX8OHDHX0ee+wxjR07Vu3atdPjjz+uY8eOaeLEiapZs6bTCSgKFSqk6OhoTZ8+XVWrVlVYWJhq1aqlWrVqeWx/OnXqpFmzZqlr167q2LGj9u7dq4kTJyo6Olpnz5519OvSpYsaN26soUOHavfu3apevbp++OEHnTp1SpLzJ50TJkxQ8+bNVbt2bfXr108VK1ZUfHy81qxZo0OHDumPP/64YqbKlSurVKlS2rFjh5566ilH+x133KFnn31Wkq6piN6wYUN99NFHeu2111S5cmWVKFHCbWte//e//9WpU6c0atQo9erVS1OnTr3hcciNRx99VN9++63+85//aOnSpWrWrJnS09P1999/69tvv9X8+fPVqFGjXD3mlClT1KZNG913333q2bOnWrRoIZvNplmzZmnZsmXq3r27nnnmmWzbde/eXe+//75Gjhyp2rVrO82ccFdWKeN3+f/+7/8UEhKi6OhorVmzRosWLVLx4sVz7N+rVy+99957Wrp0qd56661cPx8AIO907dpVn3zyiR577DHde++9+vLLL7V06VI1adJE/fr1U3R0tE6dOqVNmzZp0aJFjr8/8kLLli3Vv39/xcbGavPmzbr77rvl7++vXbt26bvvvtP48eP1wAMP5NnzAQC8U6VKlTRt2jR1795dNWrUUK9evVSrVi2lpKRo9erV+u6779SnTx9JGeuX9+7dWx9//LFOnz6tli1bat26dfryyy/VpUsXtW7d+rpzdO/eXSNGjFBgYKAef/zxbEtavvbaa1q4cKGaN2+uJ598Un5+fpo0aZJsNpvefvvtKz72E088oRkzZqh9+/b617/+pT179uirr75yOtFn5liEhoZq4sSJCgoKUpEiRdSkSZMcz3HSuXNntW7dWi+88IL27dununXrasGCBZozZ44GDx6c7bGvV0BAgGbMmKE2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" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patches\n", "from matplotlib.animation import FuncAnimation, PillowWriter\n", "\n", "# Sample image (5x5)\n", "image = np.array([\n", " [1, 2, 3, 4, 5],\n", " [5, 4, 3, 2, 1],\n", " [1, 2, 3, 4, 5],\n", " [5, 4, 3, 2, 1],\n", " [1, 2, 3, 4, 5]\n", "])\n", "\n", "# Kernel (3x3)\n", "kernel = np.array([\n", " [1, 0, -1],\n", " [1, 0, -1],\n", " [1, 0, -1]\n", "])\n", "# # kernel (2x2)\n", "# kernel = np.array([\n", "# [1, 0],\n", "# [1, 0]\n", "# ])\n", "\n", "# Stride and Padding\n", "stride = 1\n", "padding = 1\n", "\n", "# Create padded image\n", "padded_image = np.pad(image, ((padding, padding), (padding, padding)))\n", "\n", "# Calculate output dimensions\n", "output_dim = ((image.shape[0] - kernel.shape[0] + 2*padding) // stride) + 1\n", "\n", "# Initialize the convolution output\n", "conv_output = np.zeros((output_dim, output_dim))\n", "\n", "# Calculate all possible top-left positions for the kernel\n", "positions = [(y, x) for y in range(0, padded_image.shape[0] - kernel.shape[0] + 1, stride)\n", " for x in range(0, padded_image.shape[1] - kernel.shape[1] + 1, stride)]\n", "\n", "# Set up the plotting with three subplots for the image, kernel, and convolution output\n", "fig, (ax1, ax_kernel, ax2) = plt.subplots(1, 3, figsize=(15, 5))\n", "ax1.imshow(padded_image, cmap='viridis', aspect='equal') # Use equal aspect for square pixels\n", "ax_kernel.imshow(kernel, cmap='viridis', aspect='equal') # Display the kernel\n", "ax2.imshow(conv_output, cmap='viridis', aspect='equal', vmin=-15, vmax=15) # Use equal aspect and set vmin, vmax for consistent color scaling\n", "\n", "# Add subplot titles\n", "ax1.set_title(\"Input Image with Kernel Overlay\")\n", "ax_kernel.set_title(\"Kernel\")\n", "ax2.set_title(\"Convolution Output\")\n", "\n", "# Display numbers on the matrix for the padded image\n", "for i in range(padded_image.shape[0]):\n", " for j in range(padded_image.shape[1]):\n", " ax1.text(j, i, str(padded_image[i, j]), ha='center', va='center', color='red')\n", "\n", "# Display numbers on the kernel\n", "for i in range(kernel.shape[0]):\n", " for j in range(kernel.shape[1]):\n", " ax_kernel.text(j, i, str(kernel[i, j]), ha='center', va='center', color='red')\n", "\n", "# Kernel rectangle overlay on ax1\n", "rect = patches.Rectangle((-0.5, -0.5), kernel.shape[1], kernel.shape[0], \n", " linewidth=3, edgecolor='blue', facecolor='none')\n", "ax1.add_patch(rect)\n", "\n", "# Animation function\n", "def animate(i):\n", " y, x = positions[i]\n", " rect.set_xy((x-0.5, y-0.5))\n", "\n", " # Compute the convolution for the current position\n", " region = padded_image[y:y+kernel.shape[0], x:x+kernel.shape[1]]\n", " conv_value = np.sum(region * kernel)\n", " \n", " # Correctly compute the position in the output matrix\n", " out_y = y // stride\n", " out_x = x // stride\n", " conv_output[out_y, out_x] = conv_value\n", "\n", " # Update the convolution output display\n", " ax2.imshow(conv_output, cmap='viridis', aspect='equal', vmin=-15, vmax=15) # Adjusted colormap and vmin, vmax for better visualization\n", "\n", " # Display numbers on the matrix for the convolution output\n", " for i in range(conv_output.shape[0]):\n", " for j in range(conv_output.shape[1]):\n", " ax2.text(j, i, f\"{conv_output[i, j]:.1f}\", ha='center', va='center', color='red')\n", "\n", " return rect,\n", "\n", "\n", "# Create animation with increased interval for slower movement\n", "ani = FuncAnimation(fig, animate, frames=len(positions), interval=2000, blit=True, repeat_delay=10000) # interval set to 5000 for slower movement\n", "\n", "# Title and layout\n", "# title_text = f\"Kernel Size: {kernel.shape[0]}x{kernel.shape[1]}, Stride: {stride}, Padding: {padding}\"\n", "# fig.suptitle(title_text, fontsize=16)\n", "\n", "# Adjust subplot spacing and layout\n", "plt.subplots_adjust(wspace=0.5)\n", "plt.tight_layout()\n", "\n", "# Save and show\n", "writer = PillowWriter(fps=2)\n", "ani.save(f\"convolution_animation_with_output_k{kernel.shape[0]}_s{stride}_p{padding}.gif\", writer=writer)\n", "plt.show()\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2023-09-26T11:48:00.679662904Z", "start_time": "2023-09-26T11:47:47.667621921Z" } }, "id": "7e43a9eac318f3c3" }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [], "metadata": { "collapsed": false }, "id": "bce4c6c7bb659beb" } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 5 }