s470623-wko/wko-02.ipynb

1 line
1.7 MiB
Plaintext
Raw Normal View History

2022-11-27 19:15:49 +01:00
{"cells":[{"cell_type":"markdown","id":"46f39503","metadata":{"id":"46f39503"},"source":["![Logo 1](img/aitech-logotyp-1.jpg)\n","<div class=\"alert alert-block alert-info\">\n","<h1> Widzenie komputerowe </h1>\n","<h2> 02. <i>Operacje binarne na obrazach</i> [laboratoria]</h2> \n","<h3>Andrzej Wójtowicz (2021)</h3>\n","</div>\n","\n","![Logo 2](img/aitech-logotyp-2.jpg)"]},{"cell_type":"markdown","id":"c8f8f691","metadata":{"id":"c8f8f691"},"source":["# Progowanie\n","\n","Podczas pracy z obrazami często potrzebne jest operowanie na obrazach, które przyjmują tylko dwie skrajne wartości. Po operacji tzw. progowania (ang. *thresholding*) na obrazie będziemy mieli piksele czarne o wartości 0 lub białe o wartości 255 (lub 1, w zależności od tego na jakim typie danych i w jakiej dziedzinie operujemy).\n","\n","Na początku załadujmy niezbędne biblioteki."]},{"cell_type":"code","execution_count":2,"id":"0ddcac8e","metadata":{"id":"0ddcac8e","executionInfo":{"status":"ok","timestamp":1668431434742,"user_tz":-60,"elapsed":656,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}}},"outputs":[],"source":["import cv2 as cv\n","import numpy as np\n","import matplotlib.pyplot as plt\n","%matplotlib inline"]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')\n","%cd /content/drive/My Drive/aitech-wko-pub"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"2vj-kIAEQ5ud","executionInfo":{"status":"ok","timestamp":1668431474720,"user_tz":-60,"elapsed":18463,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"4e6b17fc-6b41-43aa-de0c-32b8e65b65f0"},"id":"2vj-kIAEQ5ud","execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/drive\n","/content/drive/My Drive/aitech-wko-pub\n"]}]},{"cell_type":"markdown","id":"89072615","metadata":{"id":"89072615"},"source":["Podczas tych zajęć skupimy się na ręcznym progowaniu. Jeśli dla obrazu w skali odcieni szarości chcielibyśmy w naszym kodzie uzyskać obraz binarny, to moglibyśmy hipotetycznie wybrać jedną z trzech opcji:\n","\n","1. przejść w pętli po wszystkich pikselach, sprawdzić czy wartość danego piksela jest mniejsza od wybranej wartości progowej i na tej podstawie ustawić nowy piksel jako czarny lub biały,\n","2. użyć biblioteki *NumPy* (i przy pomocy wektoryzacji stworzyć macierz binarną),\n","3. użyć biblioteki *OpenCV*.\n","\n","W tym miejscu nie będziemy co prawda robili eksperymentu, jednak co do zasady mając do wyboru gotowe zoptymalizowane biblioteki, zdecydowanie *nie* powinniśmy implementować algorytmów od podstaw (no chyba że podczas zajęć uczymy się mechaniki danych algorytmów; na produkcji raczej będziemy preferowali gotowe rozwiązania). Różnica w wydajności między naiwną ręczną implementacją a użyciem gotowej biblioteki może być, lekko licząc, kilkudziesięciokrotna.\n","\n","Wykorzystajmy na początek funkcję [`cv2.threshold()`](https://docs.opencv.org/4.5.3/d7/d1b/group__imgproc__misc.html#gae8a4a146d1ca78c626a53577199e9c57) do zwykłego progowania z progiem ustalonym na 100:"]},{"cell_type":"code","execution_count":5,"id":"6bf564d2","metadata":{"id":"6bf564d2","colab":{"base_uri":"https://localhost:8080/","height":318},"executionInfo":{"status":"ok","timestamp":1668431641196,"user_tz":-60,"elapsed":2556,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"d0ca06fd-083a-4309-d38a-50a4871fc4a6"},"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 720x720 with 2 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAloAAAEtCAYAAADQlM4OAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9eZhdVZk9vHbduvO9NVclqVRSmQkQJqEFnMABgXYAtbV/gGBjd6PStnSrfGj/HEC/Hvw+tNvWVlt9VLD9oa1GFKWxv1bEAQVCwJAgCQmQkdQ83rnuPd8fVWtnnV2nEiBVqSKc9Tz11B3O2dPZ97zrrPfd7zae5yFEiBAhQoQIESLE7KNuvhsQIkSIECFChAhxvCIkWiFChAgRIkSIEHOEk