Files
jupyter-collection/scientific-computing-2/auto_examples_jupyter_3/plot_mathematical_morpho.ipynb
2025-10-21 11:20:44 +08:00

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/8xiZMmGA33XSTvfnmm9apUye7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",
"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
}