109 lines
28 KiB
Plaintext
109 lines
28 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"\n",
|
||
|
|
"# Demo mathematical morphology\n",
|
||
|
|
"\n",
|
||
|
|
"A basic demo of binary opening and closing.\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 1,
|
||
|
|
"metadata": {
|
||
|
|
"collapsed": false,
|
||
|
|
"jupyter": {
|
||
|
|
"outputs_hidden": false
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKwAAAFDCAYAAAAXjZa5AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAS4FJREFUeJzt3Xl0VeW9//FvSMhIAgmQkIQhIFOYQSQySBhEEVEpoi1WxbFebX9d1bqqreuW1roce1t7e6u9q44tzoqIqKA4IMgUZBYIY4AwhCEBQiAhIfv3h4tc4/N58EAVNvJ+rdU/+vHLyT5777Mbnx6eT1QQBIEBAAAAAAAAIdHgdB8AAAAAAAAA8FUsWAEAAAAAACBUWLACAAAAAABAqLBgBQAAAAAAgFBhwQoAAAAAAAChwoIVAAAAAAAAQoUFKwAAAAAAAIQKC1YAAAAAAAAIFRasAAAAAAAAECosWAEAcAI++eQTi4qKstdff/10HwqAs8SQIUNsyJAhp/swTtoNN9xgjRo1Ot2HAZwxjv2u8cknn5zuQ5F+97vfWVRU1Ok+jJP23HPPWVRUlC1atOh0Hwq+AQtWAAAAAAAACBUWrAAAAAAAABAqLFjhW7V+/Xq78cYbrUOHDpaYmGjZ2dl22WWX2YoVK073oQE4wx37+vny5cvtqquussaNG1taWprdddddVlNTY4WFhTZy5EhLTk62nJwce/TRR+v+bGVlpf3yl7+0Xr161f25/v3721tvveX8nNdee83y8vKscePGlpiYaO3atbObbrrpuMd24MABu/jiiy0jI8MWLlz4rb93AMc3Z84cGz58uCUnJ1tiYqINGDDA3nnnnbp/fuyvf3zwwQd24403WlpamiUlJdlll11mGzdudF5v5syZNnz4cEtJSbHExEQbOHCgffjhh/Vmjj2TvvjiCxs/frw1btzYMjIy7KabbrL9+/fXmw2CwJ544gnr1auXJSQkWGpqqo0bN8752UEQ2KOPPmpt2rSx+Ph469Onj7333nsndU5ycnJs9OjRNm3aNOvdu7clJCRYbm6uTZs2re6c5ObmWlJSkvXr18/5qzGLFi2yH/3oR5aTk2MJCQmWk5Nj48ePt82bN9ebO3TokN19993Wtm1bi4+Pt7S0NOvbt6+99NJLxz2+zz77zJo1a2ajR4+2ioqKk3qPwJlszZo1Nn78eMvIyLC4uDhr3bq1XX/99VZVVeX9M1OnTrX+/ftbYmKiJScn24gRI2zevHn1Znbv3m0/+clPrFWrVhYXF2fNmze3gQMH2syZM+vNRfKcMzN75513rFevXhYXF2dt27a1P/7xjyf1fo/91eA1a9bYxRdfbElJSZaZmWkPP/ywmZnNnz/fBg0aZElJSdaxY0d7/vnnnfd1xx13WJcuXaxRo0aWnp5uw4YNs9mzZzs/68knn7SePXtao0aNLDk52Tp37my/+c1vjnt8O3bssHPPPdc6dOhg69atO6n3iG8fC1b4Vm3fvt2aNm1qDz/8sE2fPt3+9re/WUxMjOXl5VlhYeHpPjwA3wNXX3219ezZ09544w279dZb7c9//rPdeeedNmbMGLv00kvtzTfftGHDhtk999xjkydPNjOzqqoqKy0ttbvvvtumTJliL730kg0aNMjGjh1r//znP+tee968efbDH/7Q2rVrZy+//LK988479tvf/tZqamq8x1NcXGyDBg2yzZs327x586xfv37f+TkA8H9mzZplw4YNs/3799vTTz9tL730kiUnJ9tll11mr7zySr3Zm2++2Ro0aGAvvviiPf7447Zw4UIbMmSI7du3r25m0qRJdtFFF1lKSoo9//zz9uqrr1paWppdfPHF8l/mrrzySuvYsaO98cYbdu+999qLL75od955Z72Z2267zX7xi1/YhRdeaFOmTLEnnnjCvvjiCxswYICVlJTUzf3+97+3e+65x0aMGGFTpkyx22+/3W699daT/h1q2bJl9utf/7ruedi4cWMbO3asTZw40Z566il78MEH7YUXXrD9+/fb6NGj7fDhw3V/tqioyDp16mSPP/64zZgxwx555BHbsWOHnXfeebZnz566ubvuusuefPJJ+/nPf27Tp0+3f/3rX3bVVVfZ3r17vcf16quv2vDhw+3qq6+2t956y5KSkk7q/QFnqmXLltl5551n8+fPt/vvv9/ee+89e+ihh6yqqsqOHDki/8yLL75oV1xxhaWkpNhLL71kTz/9tJWVldmQIUNszpw5dXPXXXedTZkyxX7729/a+++/b0899ZRdeOGF9T6TkT7nPvzwQ7viiissOTnZXn75ZXvsscfs1VdftWefffak3nd1dbWNHTvWLr30UnvrrbfskksusV//+tf2m9/8xiZMmGA33XSTvfnmm9apUye74YYb7PPPP6/7s6WlpWZmNnHiRHvnnXfs2WeftXbt2tmQIUPq7fX18ssv2x133GH5+fn25ptv2pQpU+zOO+887sL4ypUrLS8vz+Li4mzevHnWoUOHk3p/+A4EwHeopqYmOHLkSNChQ4fgzjvvPN2HA+AMNnHixMDMgv/6r/+ql/fq1Ssws2Dy5Ml1WXV1ddC8efNg7Nix8rVqamqC6urq4Oabbw569+5dl//xj38MzCzYt2+f9zg+/vjjwMyC1157LViyZEmQlZUVXHDBBcHevXv/zXcI4GScf/75QXp6elBeXl6X1dTUBN26dQtatmwZ1NbWBs8++2xgZsEPfvCDen/2s88+C8wseOCBB4IgCIKKioogLS0tuOyyy+rNHT16NOjZs2fQr1+/uuzYM+nRRx+tN3vHHXcE8fHxQW1tbRAEQTBv3jz57Nq6dWuQkJAQ/OpXvwqCIAjKysqC+Ph47zHm5+ef0Hlp06ZNkJCQEBQXF9dlS5cuDcwsyMzMDCoqKuryKVOmBGYWTJ061ft6NTU1wcGDB4OkpKTgL3/5S13erVu3YMyYMcc9lgkTJgRJSUlBEATBww8/HERHRwePPPLICb0f4Ptk2LBhQZMmTYJdu3bJf37sd42PP/44CIIvn0FZWVlB9+7dg6NHj9bNlZeXB+np6cGAAQPqskaNGgW/+MUvvD/7RJ5zeXl5QVZWVnD48OG67MCBA0FaWlpwoksJEyZMCMwseOONN+qyY7+vmVmwePHiunzv3r1BdHR0cNddd3lf79jvcsOHD6/33PzZz34WNGnS5LjHcux/EwoKCoIPPvggSElJCcaNG1fvfSIc+IYVvlU1NTX24IMPWpcuXSw2NtZiYmIsNjbW1q1bZ6tXrz7dhwfge2D06NH1/ntubq5FRUXZJZdcUpfFxMRY+/bt6/3Vlddee80GDhxojRo1spiYGGvYsKE9/fTT9Z5N5513npl9+S2uV1991bZt2+Y9jhkzZtgFF1xggwcPtg8++MDS0tK+rbcIIEIVFRW2YMECGzduXL0WuujoaLvuuuusuLi43reTfvzjH9f78wMGDLA2bdrYxx9/bGZmc+fOtdLSUpswYYLV1NTU/ae2ttZGjhxpBQUFzv9Lf/nll9f77z169LDKykrbtWuXmZlNmzbNoqKi7Nprr633mi1atLCePXvWfTNg3rx5VllZ6T3Gk9GrVy/Lzs6u+++5ublm9mXrYGJiopN/9Zl58OBBu+eee6x9+/YWExNjMTEx1qhRI6uoqKj33OzXr5+99957du+999onn3xS71taXxUEgd122202ceJEe/HFF+1Xv/rVSb0n4Ex36NAhmzVrll199dXWvHnziP5MYWGhbd++3a677jpr0OD//hW+UaNGduWVV9r8+fPt0KFDZvblZ/K5556zBx54wObPn2/V1dX1XivS51xFRYUVFBTY2LFjLT4+vu7PH/sG68mIioqyUaNG1f33Y7+vZWZmWu/evevytLQ0S09Pd/4K8t///nfr06ePxcfH1/0u9+GHHzrPpH379tn48ePtrbfeqveN0K97/vnnbdSoUXbLLbfYq6++Wu99IhxYsMK36q677rL//M//tDFjxtjbb79tCxYssIKCAuvZs6f3FxgAOBFfXxiKjY21xMRE55eM2NhYq6ysNDOzyZMn29V
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 1200x350 with 4 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# Generate some binary data\n",
|
||
|
|
"import numpy as np\n",
|
||
|
|
"\n",
|
||
|
|
"np.random.seed(0)\n",
|
||
|
|
"a = np.zeros((50, 50))\n",
|
||
|
|
"a[10:-10, 10:-10] = 1\n",
|
||
|
|
"a += 0.25 * np.random.standard_normal(a.shape)\n",
|
||
|
|
"mask = a >= 0.5\n",
|
||
|
|
"\n",
|
||
|
|
"# Apply mathematical morphology\n",
|
||
|
|
"import scipy as sp\n",
|
||
|
|
"\n",
|
||
|
|
"opened_mask = sp.ndimage.binary_opening(mask)\n",
|
||
|
|
"closed_mask = sp.ndimage.binary_closing(opened_mask)\n",
|
||
|
|
"\n",
|
||
|
|
"# Plot\n",
|
||
|
|
"import matplotlib.pyplot as plt\n",
|
||
|
|
"\n",
|
||
|
|
"plt.figure(figsize=(12, 3.5))\n",
|
||
|
|
"plt.subplot(141)\n",
|
||
|
|
"plt.imshow(a, cmap=\"gray\")\n",
|
||
|
|
"plt.axis(\"off\")\n",
|
||
|
|
"plt.title(\"a\")\n",
|
||
|
|
"\n",
|
||
|
|
"plt.subplot(142)\n",
|
||
|
|
"plt.imshow(mask, cmap=\"gray\")\n",
|
||
|
|
"plt.axis(\"off\")\n",
|
||
|
|
"plt.title(\"mask\")\n",
|
||
|
|
"\n",
|
||
|
|
"plt.subplot(143)\n",
|
||
|
|
"plt.imshow(opened_mask, cmap=\"gray\")\n",
|
||
|
|
"plt.axis(\"off\")\n",
|
||
|
|
"plt.title(\"opened_mask\")\n",
|
||
|
|
"\n",
|
||
|
|
"plt.subplot(144)\n",
|
||
|
|
"plt.imshow(closed_mask, cmap=\"gray\")\n",
|
||
|
|
"plt.title(\"closed_mask\")\n",
|
||
|
|
"plt.axis(\"off\")\n",
|
||
|
|
"\n",
|
||
|
|
"plt.subplots_adjust(wspace=0.05, left=0.01, bottom=0.01, right=0.99, top=0.99)\n",
|
||
|
|
"\n",
|
||
|
|
"plt.show()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": []
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "Python 3 (ipykernel)",
|
||
|
|
"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.12.11"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 4
|
||
|
|
}
|