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