{ "cells": [ { "cell_type": "markdown", "id": "bbd93ac1-f79b-491c-88b4-50807b541b6e", "metadata": {}, "source": [ "# Generating notebooks\n", "When working on complex tasks, it may make sense to generate an entire notebook for the task. \n", "Hence, we can ask bob to generate a notebook for a series of tasks." ] }, { "cell_type": "code", "execution_count": 1, "id": "51256f2d-e4cb-4c8b-975d-75afad68c837", "metadata": { "tags": [] }, "outputs": [], "source": [ "from skimage.io import imread\n", "import stackview\n", "from bia_bob import bob" ] }, { "cell_type": "code", "execution_count": 2, "id": "8a1e8db6-a144-4773-a2ab-6e0eac17f94b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " This notebook may contain text, code and images generated by artificial intelligence.\n", " Used model: claude-3-opus-20240229,\n", " vision model: claude-3-opus-20240229,\n", " endpoint: None,\n", " bia-bob version: 0.18.0.\n", " It is good scientific practice to check the code and results it produces carefully.\n", " Read more about code generation using bia-bob.\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "A notebook has been saved as [Blob_Segmentation_Analysis.ipynb](Blob_Segmentation_Analysis.ipynb)." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%bob \n", "Please write a new notebook \"Blob_Segmentation_Analysis.ipynb\" that does the following:\n", "* open blobs.tif, \n", "* segment the bright objects\n", "* measure their area and perimeter\n", "* plot the area against perimeter" ] }, { "cell_type": "markdown", "id": "3b2f0638-756b-4a7d-aaba-dc6661eaf9ac", "metadata": { "tags": [] }, "source": [ "## Generating a notebook using vision capabilities\n", "The model we're using per default has vision capabilities. Thus, we can pass an image to `bob` and ask it to create a notebook for segmenting it:" ] }, { "cell_type": "code", "execution_count": 3, "id": "5ac2b7ff-b6e6-49d7-9120-394ce189c9db", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
shape(512, 672, 3)
dtypeuint8
size1008.0 kB
min0
max255
\n", "\n", "
" ], "text/plain": [ "StackViewNDArray([[[ 3, 6, 1],\n", " [ 3, 7, 0],\n", " [ 3, 6, 1],\n", " ...,\n", " [11, 8, 2],\n", " [11, 7, 2],\n", " [11, 11, 2]],\n", "\n", " [[ 3, 6, 1],\n", " [ 3, 8, 1],\n", " [ 3, 7, 1],\n", " ...,\n", " [11, 10, 2],\n", " [10, 10, 2],\n", " [11, 11, 2]],\n", "\n", " [[ 4, 6, 1],\n", " [ 3, 6, 1],\n", " [ 4, 6, 1],\n", " ...,\n", " [10, 10, 2],\n", " [11, 10, 2],\n", " [11, 10, 2]],\n", "\n", " ...,\n", "\n", " [[15, 14, 8],\n", " [14, 14, 8],\n", " [15, 14, 7],\n", " ...,\n", " [10, 11, 5],\n", " [10, 12, 4],\n", " [11, 14, 5]],\n", "\n", " [[14, 16, 7],\n", " [16, 15, 7],\n", " [15, 16, 8],\n", " ...,\n", " [10, 11, 4],\n", " [11, 13, 4],\n", " [11, 16, 5]],\n", "\n", " [[15, 18, 7],\n", " [14, 17, 8],\n", " [14, 17, 8],\n", " ...,\n", " [ 9, 12, 5],\n", " [10, 13, 5],\n", " [11, 15, 5]]], dtype=uint8)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hela_cells = imread(\"hela-cells-8bit.tif\")\n", "stackview.insight(hela_cells)" ] }, { "cell_type": "code", "execution_count": 4, "id": "bfe7236f-b0fd-4572-bae3-2df4321d76e7", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/markdown": [ "A notebook has been saved as [hela_cell_segmentation.ipynb](hela_cell_segmentation.ipynb)." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%bob hela_cells\n", "Please write a new Jupyter notebook for processing this image. \n", "Its filename is `hela-cells-8bit.tif`.\n", "At the beginning of the notebook describe the image it is made for.\n", "I would like to segment the objects in the blue channel.\n", "Write Python-code for doing this and please add explanatory notebook \n", "cellls in between explaining what you're doing in detail as I'm a \n", "Python-beginner. \n", "\n", "Thanks :-)" ] }, { "cell_type": "markdown", "id": "9a13dd39-7c0a-42b9-94c0-a916e21addd9", "metadata": {}, "source": [ "## Generating no notebook\n", "Note, if we don't ask for the notebook explicitly, Bob will write a huge code block, which might be less readable." ] }, { "cell_type": "code", "execution_count": 5, "id": "8b152eb3-326b-4651-9033-0458116be0d7", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "To solve this task, I will open the \"blobs.tif\" image, segment the bright objects using Otsu thresholding, measure their area and perimeter using scikit-image's regionprops, and finally plot the area against the perimeter using matplotlib.\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%bob \n", "Please do the following:\n", "* open blobs.tif, \n", "* segment the bright objects\n", "* measure their area and perimeter\n", "* plot the area against perimeter" ] }, { "cell_type": "code", "execution_count": 6, "id": "d6e99ed7-1f4c-4545-8157-76d7dce37e9d", "metadata": {}, "outputs": [ { "data": { "image/png": "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Dg5Gy5Yt8fbbb1d6PiwsrMr3W/PegoKC8PPPP0MIofOe3NxclJWVSf+GLEWlUiE4OBgnTpzQO2dMnbXB5erVq6hXr550vKys7L6CmSm6deuGV155BZs3bzY4LX7z5s1S2bvl5OToldUeMxTWTPk7rlu3rsEWImNERERIkyJ+//13bNy4EXPmzEFJSQmWLl1q9nXJfhh2yGFpNBp88cUXaNiwIT7//HO981u3bsV7772HH374AX369DF4nSZNmqBRo0Y4ceIEkpOTq/xMmUymN0395MmTOHz4sN5/nRrywgsvYNy4cTh48CC2bNmCqVOn6oSxu8nlcsTHx6N27drYsWMHfvnll2rDTlV8fX3RuXNn/PLLL2jZsiW8vLzMvpal9enTB9u2bUPDhg1Rp04dg+UMtThY8966dOmCjRs3YvPmzXjqqaek49rFGrt06WKxzwIq1ke6du2a2WvIdOzYEQCwYcMGnVl+X3/9tTSzzRxyudzolp7WrVsjISEBy5Ytw/PPP4/27dvrnD948CCWL1+OHj16oFWrVjrndu/ejatXr0otUxqNBhs2bEDDhg0NtsiY8nfcs2dPrFq1CmfOnJECUGX3ClTfstW4cWO89tpr+Oabb5Cenl5lWXJcDDvksH744QdcuXIF8+fPr3RxuZiYGHz00UdYtmxZlWEHqJjm2rNnT3Tv3h0jR45EvXr1cOPGDZw+fRrp6en46quvAFR8Ib/11ltISkpCfHw8zpw5gzfffBORkZFGf4kMGTIEU6dOxZAhQ1BcXKw3DfiNN97ApUuX0KVLF9SvXx83b97EBx98AE9PT8THxxv1GVX54IMP0KFDBzz++OMYN24cGjRogIKCApw9exZbtmzBnj177vszzPHmm28iNTUV7dq1w+TJk9GkSRMUFRXhr7/+wrZt27B06VLUr18f/v7+iIiIwHfffYcuXbogMDAQwcHBaNCggdXubfjw4fj4448xYsQI/PXXX2jRogUOHjyI5ORk9OrVC127djX7vu/cuSONJdJoNMjKypIW30tMTDTrms2bN8eQIUPw3nvvwd3dHU888QROnTqF9957DwqFAm5u5o1QaNGiBdavX48NGzYgKioK3t7eaNGihcHyX375Jbp27YqEhARMnjxZCoV79uzBBx98gKZNm1a6InNwcDCeeOIJvP766/Dz88PixYvx22+/6U0/v5exf8dvvvkmfvjhB3Ts2BGvvPIKWrRogZs3b2L79u2YOnUqmjZtioYNG8LHxwdr1qxBs2bNUKtWLYSFheHatWuYOHEinnnmGTRq1AheXl7Ys2cPTp48iVmzZpn1eyUHYN/x0USG9e/fX3h5eYnc3FyDZQYPHiw8PDxETk6ONBvr3//+d6VlT5w4IQYNGiRCQkKEp6enUCqV4oknnpBmeQkhRHFxsZg+fbqoV6+e8Pb2FnFxcWLz5s1ixIgRIiIiwui6Dx06VAAQ7du31zu3detW0bNnT1GvXj3h5eUlQkJCRK9evcSBAweqvW5lU88rk5WVJUaNGiXq1asnPD09Rd26dUW7du3EvHnzpDLa2S53T/e999y9s7H8/Pz0yhqanVRZXf/++28xefJkERkZKTw9PUVgYKBo1aqVePXVV8WtW7ekcrt27RKxsbFCLpfrzS6633sz5Pr162Ls2LFCpVIJDw8PERERIWbPnq0zPbyq+63MvbOx3NzcRFhYmOjZs6fYu3evTlntjKu///5b7zqVTT0vKioSU6dOFSEhIcLb21s8+uij4vDhw0KhUIiXXnpJKqedjXXkyBGd91f2jP/66y+RkJAg/P39pWnw1bl165ZITk4WDz/8sPD19RW+vr6iZcuWYt68eTrPVAuAmDBhgli8eLFo2LCh8PT0FE2bNhVr1qyptH73/p6M+TsWQoiLFy+KUaNGCaVSKTw9PUVYWJgYNGiQuHr1qlRm3bp1omnTpsLT01OaAXj16lUxcuRI0bRpU+Hn5ydq1aolWrZsKd5//31RVlZW7e+DHJNMiP8bLk9ERE7t0KFDaN++PdasWYOhQ4fauzr35bvvvkP//v3x66+/1uj98MgyGHaIiJxQamoqDh8+jFatWsHHxwcnTpzAO++8A4VCgZMnT+rNmnMWxcXFOHDgAObPn48TJ07gwoULTnsv5Dg4ZoeIyAkFBARg586dWLRoEQoKChAcHIyePXsiJSXFqcNBdnY2evXqhSZNmmDNmjVOfS/kONiyQ0RERC6NiwoSERGRS2PYISIiIpfGsENEREQujQOUAZSXl+PKlSvw9/e32dL5REREdH+EECgoKEBYWFiVi2ky7AC4cuWK0VsBEBERkWO5ePFilZu/MuwA8Pf3B1DxywoICLBzbYiIiMgY+fn5CA8Pl77HDWHYwT+7DAcEBDDsEBEROZnqhqBwgDIRERG5NIYdIiIicmkMO0REROTSGHaIiIjIpTHsEBERkUtj2CEiIiKXxrBDRERELo1hh4iIiFwaww4RERG5NK6gTERERFahKRdIy7qB3IIihPh7o01kINzdbL/hNsMOERERWdz2jGzM3ZKJbHWRdEyl8EZS32j0iFHZtC7sxiIiIiKL2p6RjXGr03WCDgDkqIswbnU6tmdk27Q+DDtERERkMZpygblbMiEqOac9NndLJjTllZWwDoYdIiIispi0rBt6LTp3EwCy1UVIy7phszox7BAREZHF5BYYDjrmlLMEhh0iIiKymBB/b4uWswSGHSIiIrKYNpGBUCm8YWiCuQwVs7LaRAbarE4MO0RERGQx7m4yJPWNBgC9wKP9OalvtE3X22HYISIiIovqEaPCkmFxUCp0u6qUCm8sGRZn83V2uKggERERWVyPGBW6RSu5gjIRERG5Lnc3GR5rGGTvarAbi4iIiFwbww4RERG5NIYdIiIicmkMO0REROTSGHaIiIjIpTHsEBERkUtj2CEiIiKXxrBDRERELo1hh4iIiFwaww4RERG5NIYdIiIicmkMO0REROTSGHaIiIjIpTHsEBERkUtj2CEiIiKXxrBDRERELs2uYWf//v3o27cvwsLCIJPJsHnzZulcaWkpZs6ciRYtWsDPzw9hYWEYPnw4rly5onON4uJiTJo0CcHBwfDz80O/fv1w6dIlG98JEREROSq7hp3bt2/joYcewkcffaR3rrCwEOnp6Xj99deRnp6OTZs24ffff0e/fv10yiUmJuLbb7/F+vXrcfDgQdy6dQt9+vSBRqOx1W0QERGRA5MJIYS9KwEAMpkM3377Lfr372+wzJEjR9CmTRucP38eDzzwANRqNerWrYtVq1bh2WefBQBcuXIF4eHh2LZtG7p3727UZ+fn50OhUECtViMgIMASt0NERERWZuz3t1ON2VGr1ZDJZKhduzYA4NixYygtLUVCQoJUJiwsDDExMTh06JDB6xQXFyM/P1/nRURERK7JacJOUVERZs2ahaFDh0rpLScnB15eXqhTp45O2dDQUOTk5Bi8VkpKChQKhfQKDw+3at2JiIjIfpwi7JSWlmLw4MEoLy/H4sWLqy0vhIBMJjN4fvbs2VCr1dLr4sWLlqwuERERORCHDzulpaUYNGgQsrKykJqaqtMnp1QqUVJS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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from skimage import io, filters\n", "from skimage.measure import label, regionprops\n", "import matplotlib.pyplot as plt\n", "\n", "# Open blobs.tif\n", "image = io.imread('blobs.tif')\n", "\n", "# Segment the bright objects using Otsu thresholding\n", "threshold = filters.threshold_otsu(image)\n", "segmented = image > threshold\n", "\n", "# Label the segmented objects \n", "labeled_image = label(segmented)\n", "\n", "# Measure area and perimeter of each labeled object\n", "properties = regionprops(labeled_image)\n", "areas = [prop.area for prop in properties]\n", "perimeters = [prop.perimeter for prop in properties]\n", "\n", "# Create a scatter plot of area vs perimeter\n", "plt.scatter(areas, perimeters)\n", "plt.xlabel('Area')\n", "plt.ylabel('Perimeter')\n", "plt.title('Area vs Perimeter of Bright Objects')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "98c57693-e3f1-4f5f-9a06-45eaf21b6417", "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.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }