From 2e2fde992954acb729f82609b9f26967b194b0b5 Mon Sep 17 00:00:00 2001
From: Romain Vuillemot <romain.vuillemot@gmail.com>
Date: Thu, 16 Nov 2023 21:54:00 +0100
Subject: [PATCH] Update INF-TC1-td04.ipynb

---
 TD04/INF-TC1-td04.ipynb | 184 +++++++++++++++++++++++++++++++---------
 1 file changed, 146 insertions(+), 38 deletions(-)

diff --git a/TD04/INF-TC1-td04.ipynb b/TD04/INF-TC1-td04.ipynb
index 86e7112..9281dbc 100644
--- a/TD04/INF-TC1-td04.ipynb
+++ b/TD04/INF-TC1-td04.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "markdown",
-   "id": "71cf0eb4",
+   "id": "54466d2f",
    "metadata": {},
    "source": [
     "NAME:"
@@ -145,7 +145,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "f498d16eb464fc9d943f9c4a474fa9ef",
+     "checksum": "d09f9a854967a6df3590c0991f2ce955",
      "grade": false,
      "grade_id": "cell-04652e636c091bef",
      "locked": false,
@@ -158,6 +158,15 @@
    "outputs": [],
    "source": [
     "def getPixel(x: int, y: int, px) -> tuple:\n",
+    "    \"\"\"Get the color of a pixel.\n",
+    "    Args:\n",
+    "        x (int): pixel x coordinate\n",
+    "        y (int): pixel y coordinate\n",
+    "        px (PixelAccess): image pixel access\n",
+    "\n",
+    "    Returns:\n",
+    "        tuple: color of the pixel\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -242,7 +251,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "5bd8bb5e0f60872037ff81bb1b945865",
+     "checksum": "49daf4224763304159cd2c9a83444edc",
      "grade": false,
      "grade_id": "cell-efbe1bd53dfaf01f",
      "locked": false,
@@ -255,6 +264,13 @@
    "outputs": [],
    "source": [
     "def setPixel(x: int, y:int, color: tuple, px) -> None:\n",
+    "    \"\"\"Set the color of a pixel.\n",
+    "    Args:\n",
+    "        x (int): pixel x coordinate\n",
+    "        y (int): pixel y coordinate\n",
+    "        color (tuple): color to set\n",
+    "        px (PixelAccess): image pixel access\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -289,7 +305,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "48417c6001845feccd44c50c46c20bca",
+     "checksum": "d0e4f213559e0908072783a660e82b8f",
      "grade": false,
      "grade_id": "cell-f7def1afc171201e",
      "locked": false,
@@ -301,7 +317,17 @@
    },
    "outputs": [],
    "source": [
-    "def moyenne(corner_x, corner_y, region_w, region_h, px) -> tuple: \n",
+    "def moyenne(corner_x, corner_y, region_w, region_h, px) -> tuple:\n",
+    "    \"\"\"Compute the average color of a region.\n",
+    "    Args:\n",
+    "        corner_x (int): top left corner x coordinate\n",
+    "        corner_y (int): top left corner y coordinate\n",
+    "        region_w (int): region width\n",
+    "        region_h (int): region height\n",
+    "        px (PixelAccess): image pixel access\n",
+    "    Returns:\n",
+    "        tuple: average color of the region\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -322,7 +348,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "6eb254f46f4157537e2ccb9bd822bc50",
+     "checksum": "ca32834808187e8ea21aec1ad48c72ec",
      "grade": false,
      "grade_id": "cell-d04057cb7104c7e7",
      "locked": false,
@@ -335,6 +361,15 @@
    "outputs": [],
    "source": [
     "def setRegion(x, y, w, h, color, px) -> None:\n",
+    "    \"\"\"Set the color of a region.\n",
+    "    Args:\n",
+    "        x (int): top left corner x coordinate\n",
+    "        y (int): top left corner y coordinate\n",
+    "        w (int): region width\n",
+    "        h (int): region height\n",
+    "        color (tuple): color to set\n",
+    "        px (PixelAccess): image pixel access\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -403,7 +438,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "6496e3ce4dce17684ee4fd197b232c8c",
+     "checksum": "5126daebaac55c6c0b2b9fb037e951a1",
      "grade": false,
      "grade_id": "cell-ee98beb234607988",
      "locked": false,
@@ -415,7 +450,14 @@
    },
    "outputs": [],
    "source": [
-    "def distance(c1: tuple, c2: tuple) -> float: \n",
+    "def distance(c1: tuple, c2: tuple) -> float:\n",
+    "    \"\"\"Compute the distance between two colors.\n",
+    "    Args:\n",
+    "        c1 (tuple): first color\n",
+    "        c2 (tuple): second color\n",
+    "    Returns:\n",
+    "        float: distance between the two colors\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -463,7 +505,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "9310ca392be9f496e8e6178ffe540e5e",
+     "checksum": "bfc5092580da36c9805a9673cb4b2734",
      "grade": false,
      "grade_id": "cell-d91af81641547e03",
      "locked": false,
@@ -475,7 +517,19 @@
    },
    "outputs": [],
    "source": [
-    "def floodFill(w: int, h: int, start_x: int, start_y: int, c: tuple, s, px, px2) -> tuple:\n",
+    "def floodFill(w: int, h: int, start_x: int, start_y: int, seuil: int, px, px2) -> tuple:\n",
+    "    \"\"\"Flood fill algorithm.\n",
+    "    Args:\n",
+    "        w (int): image width\n",
+    "        h (int): image height\n",
+    "        start_x (int): starting x coordinate\n",
+    "        start_y (int): starting y coordinate\n",
+    "        seuil (int): color distance threshold\n",
+    "        px (PixelAccess): image pixel access\n",
+    "        px2 (PixelAccess): image pixel access\n",
+    "    Returns:\n",
+    "        tuple: visited pixels, not visited pixels, unique colors used\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -539,7 +593,7 @@
    "id": "057fa44d-2c9f-423c-af12-16731b401884",
    "metadata": {},
    "source": [
-    "**Question 2.1 -** Écrire une fonction de conversion d'image en niveaux de gris (soit la moyenne des triplets `(r,b,g)` ou en utilisant la formule suivante : \n",
+    "**Question 2.1 -** Écrire une fonction de conversion d'image en niveaux de gris (soit la moyenne des triplets `(r,g,b)` ou en utilisant la formule suivante : \n",
     "\n",
     "$ C_{gray} = (0.3 \\times R) + (0.59 \\times G) + (0.11 \\times B)$"
    ]
@@ -552,7 +606,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "d3e4d4870ab66142ecb8014b95f6a112",
+     "checksum": "dee19b4dd77f9e4229c7771439de22f7",
      "grade": false,
      "grade_id": "cell-c87026ba248b1c44",
      "locked": false,
@@ -565,6 +619,12 @@
    "outputs": [],
    "source": [
     "def conversion_gris(px, W: int, H: int) -> None:\n",
+    "    \"\"\"Convert an image to grayscale.\n",
+    "    Args:\n",
+    "        px (PixelAccess): image pixel access\n",
+    "        W (int): image width\n",
+    "        H (int): image height\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -636,7 +696,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "0e68fa31a225405b072b56d4c7d89ff2",
+     "checksum": "711505ca09053a32772e4b209ad60dd0",
      "grade": false,
      "grade_id": "cell-b981c9962ee28826",
      "locked": false,
@@ -648,7 +708,13 @@
    },
    "outputs": [],
    "source": [
-    "def somme_matrice(m: list = []) -> list:\n",
+    "def somme_matrice(m: list = []) -> float:\n",
+    "    \"\"\"Compute the sum of all the elements in a matrix.\n",
+    "    Args:\n",
+    "        m (list): matrix\n",
+    "    Returns:\n",
+    "        float: sum of all the elements in the matrix\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -683,7 +749,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "5d4784796f5d6b78482313918a6ae340",
+     "checksum": "f457eea34b361f50ade6a3af86b443dd",
      "grade": false,
      "grade_id": "cell-df57a2a4e3cc7c55",
      "locked": false,
@@ -696,6 +762,13 @@
    "outputs": [],
    "source": [
     "def convolution(px, W: int, H: int, m: list) -> None:\n",
+    "    \"\"\"Apply a convolution matrix on an image.\n",
+    "    Args:\n",
+    "        px (PixelAccess): image pixel access\n",
+    "        W (int): image width\n",
+    "        H (int): image height\n",
+    "        m (list): convolution matrix\n",
+    "    \"\"\"\n",
     "    # YOUR CODE HERE\n",
     "    raise NotImplementedError()"
    ]
@@ -752,7 +825,9 @@
    "cell_type": "code",
    "execution_count": null,
    "id": "f213b45e-768f-4d89-b456-f12050a3217c",
-   "metadata": {},
+   "metadata": {
+    "tags": []
+   },
    "outputs": [],
    "source": [
     "sobely3 = [[-1, 0, 1],\n",
@@ -772,7 +847,7 @@
     "deletable": false,
     "nbgrader": {
      "cell_type": "code",
-     "checksum": "fcf17710112f87fbf19504dc787bdf6c",
+     "checksum": "d35d391ebdfddb756d4191b3adc6a707",
      "grade": false,
      "grade_id": "cell-998bb8c6562b7351",
      "locked": false,
@@ -784,45 +859,78 @@
    },
    "outputs": [],
    "source": [
-    "def convolution_sobel(px, W: int, H: int, m: list, f=1) -> None:\n",
+    "def convolution_sobel(px, W: int, H: int, m: list, f = 1) -> None:\n",
+    "    \"\"\"Apply a sobel filter convolution on an image.\n",
+    "    Args:\n",
+    "        px (PixelAccess): image pixel access\n",
+    "        W (int): image width\n",
+    "        H (int): image height\n",
+    "        m (list): convolution matrix\n",
+    "        f (int): factor\n",
+    "\n",
+    "    \"\"\"\n",
     "# YOUR CODE HERE\n",
     "raise NotImplementedError()"
    ]
   },
   {
    "cell_type": "markdown",
-   "id": "42dfddf2-9bc0-4922-9747-527cf07af6e7",
+   "id": "00c62110-6e7b-42d6-8450-d8ed7c7e233a",
    "metadata": {},
    "source": [
-    "## Pour aller plus loin\n",
-    "\n",
-    "- Comparez vos méthodes avec les modules [OpenCV](https://docs.opencv.org/4.x/) ou [NumPy](https://numpy.org/).\n",
-    "- Implémentez une fonction de calcul de distance entre la couleur choisie et la couleur initiale."
+    "## Tests pour la fonction de floodfill"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "6ba4c207-a3a1-48d0-9031-9a247b4663c7",
+   "id": "d61c4763-f479-42fe-91bb-27311925f6c0",
    "metadata": {
-    "deletable": false,
-    "nbgrader": {
-     "cell_type": "code",
-     "checksum": "5bc1ac1225a7da71dbfe12f84d418fcd",
-     "grade": false,
-     "grade_id": "cell-54b9917c32dd200a",
-     "locked": false,
-     "schema_version": 3,
-     "solution": true,
-     "task": false
-    },
     "tags": []
    },
    "outputs": [],
    "source": [
-    "def difference(px, px2):\n",
-    "    # YOUR CODE HERE\n",
-    "    raise NotImplementedError()"
+    "W, H = 100, 100\n",
+    "im = Image.new('RGB', (W, H)) \n",
+    "px = im.load()\n",
+    "setRegion(W//3, H//3, W//3, H//3, (255, 255, 255), px)\n",
+    "display(im)\n",
+    "\n",
+    "im2 = Image.new('RGB', (W, H)) \n",
+    "px2 = im2.load()\n",
+    "display(im2)\n",
+    "\n",
+    "d = distance((0, 0, 0), (255, 255, 255)) # pour trouver le seuil\n",
+    "\n",
+    "print(\"on est en dessous du seuil on garde les 2 couleurs\")\n",
+    "print(\"on part du coin en haut à gauche -> noir\")\n",
+    "visited, not_visited, colors = floodFill(W, H, 0, 0, d - 1, px, px2)\n",
+    "print(\"nombre de noeuds coloriés\", len(visited))\n",
+    "print(\"nombre de noeuds non visités\", len(not_visited))\n",
+    "print(f\"nombre de couleurs utilisées {colors}\")\n",
+    "display(im2)\n",
+    "\n",
+    "print(\"on part du milieu -> blanc\")\n",
+    "visited, not_visited, colors = floodFill(W, H, W/2, H/2, d - 1, px, px2)\n",
+    "print(\"nombre de noeuds coloriés\", len(visited))\n",
+    "print(\"nombre de noeuds non visités\", len(not_visited))\n",
+    "print(f\"nombre de couleurs utilisées {colors}\")\n",
+    "display(im2)\n",
+    "\n",
+    "print(\"on est au dessus du seuil on ne garde qu'une couleur\")\n",
+    "print(\"on part du coin en haut à gauche -> noir\")\n",
+    "visited, not_visited, colors = floodFill(W, H, 0, 0, d + 1, px, px2)\n",
+    "print(\"nombre de noeuds coloriés\", len(visited))\n",
+    "print(\"nombre de noeuds non visités\", len(not_visited))\n",
+    "print(f\"nombre de couleurs utilisées {colors}\")\n",
+    "display(im2)\n",
+    "\n",
+    "print(\"on part du milieu -> blanc\")\n",
+    "visited, not_visited, colors = floodFill(W, H, W/2, H/2, d + 1, px, px2)\n",
+    "print(\"nombre de noeuds coloriés\", len(visited))\n",
+    "print(\"nombre de noeuds non visités\", len(not_visited))\n",
+    "print(f\"nombre de couleurs utilisées {colors}\")\n",
+    "display(im2)"
    ]
   }
  ],
-- 
GitLab