{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "70737cde",
   "metadata": {
    "vscode": {
     "languageId": "plaintext"
    }
   },
   "source": [
    "# Skrypt do laboratorium z biometrii tęczówki"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87df3026",
   "metadata": {},
   "source": [
    "W celu wykonania ćwiczenia należy wykonać zdjęcia tęczówki za pomocą kamery przystosowanej do zdjęć w bliskiej podczerwieni.\n",
    "Wykonaj zdjęcia co najmniej 4 różnych tęczówek, po dwa zdjęcia każda. \n",
    "Pliki nazwij tak aby dało się rozpoznać do kogo należy dana tęczówka. Jeżeli zdjęcie jest lewego oka, umieść `left` w nazwie.\n",
    "Oko powinno być wyśrodkowane, wyostrzone i szeroko otwarte jak na zdjęciu poniżej:\n",
    "\n",
    "<div>\n",
    "<img src=\"./img/sample.jpg\" width=\"500\"/>\n",
    "</div>\n",
    "\n",
    "Zdjęcia należy wykonać za pomocą programu guvcview i umieszczone w `input` do których skrót znajdziesz na pulpicie.\n",
    "Program guvcview powinien zostać skonfigurowany jak na poniższym zrzucie ekranu. Powinien być włączony tryb `mono` oraz\n",
    "ustawiona największa dostępna rozdzielczość.\n",
    "\n",
    "![](./img/guvcview.png)\n",
    "\n",
    "Po wykonaniu wszystkich zdjęć uruchom program zawarty w komórce poniżej. \n",
    "Zasada działania programu opisana jest poniżej.\n",
    "Jeżeli w trakcie procesowania jednego ze zdjęć wystąpi błąd,\n",
    "najprawdopodobniej zostało ono wykonane źle i należy je powtórzyć.\n",
    "\n",
    "Gdy program skończy procesować zdjęcia, zawołaj prowadzącego aby wylosował jedno zdjęcie znormalizowanej tęczówki oraz jeden `wzór` tęczówki.\n",
    "Z pomocą programu graficznego GIMP, rozpoznaj do kogo należą dane zdjęcia."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dc47a2e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Uruchom aby przeprocesować wszystkie zdjęcia\n",
    "from process_eye import process\n",
    "output = process(\"data\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1459dd9e",
   "metadata": {},
   "source": [
    "## Rozpoznawanie geometrii oka\n",
    "Program używa sieci neuronowej aby przydzielić każdy z pikseli obrazu do następujących kategorii: `źrenica`, `tęczówka`, `oko`, `zakłócenia` (włosy, rzęsy itd.).\n",
    "Przykładowy przydział został przedstawiony na zdjęciu poniżej. (Przydziały wszystkich zdjęć znajdują się w folderze `./data/segmentation`)\n",
    "\n",
    "![](./img/segmentation.png)\n",
    "\n",
    "Dane te użyte są następnie do rozpoznania geometrii oka na zdjęciu. Program znajduje najlepiej dopasowany okrąg bądź elipsę do kształtu pikseli z kategorii `źrenica` i `tęczówka`.\n",
    "Za pomocą pikseli z kategorii `oko` program rozpoznaje orientację oka (poziomo/pionowo i wszystko pomiędzy) poprzez znalezienie w którym kierunku \"wydłużony\" jest kształt oka.\n",
    "Przykładowa znaleziona geometria przedstawiona jest poniżej (a wszyskie pozostałe zdjęcia znajdują się w folderze `./data/geometry`):\n",
    "\n",
    "![](./img/geometry.png)\n",
    "\n",
    "Program potrafii również ocenić czy oko patrzy w kierunku kamery poprzez ocenę eliptyczności tęczówki.\n",
    "Im tęczówka jest bliższa okręgu tym bardziej osoba bezpośrednio patrzy w kamerę, a im bardziej eliptyczna, tym bardziej na bok."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "505d2288",
   "metadata": {},
   "source": [
    "## Normalizacja tęczówki\n",
    "Na każdym zdjęciu tęczówka znajduje się w trochę innym miejscu, wzrok skierowany jest w innym kierunku, oraz oko jest przystosowane do innej ilości światła.\n",
    "W celu porównania różnych zdjęć geometria tęczówki musi zostać znormalizowana.\n",
    "Jest to wykonywane na podstawie geometrii znalezionej w poprzednim kroku. Tęczówka jest \"rozwijana\" z okręgu na linię prostą oraz skalowana do standardowych wymiarów.\n",
    "Schemat działania tej operacji przedstawiono na rysunku:\n",
    "\n",
    "![](./img/norm_explanation.png)\n",
    "\n",
    "Przykładowe zdjęcie tak rozwiniętej tęczówki przedstawiono poniżej:\n",
    "\n",
    "![](./img/norm.png)\n",
    "\n",
    "W tym momencie zdjęcie ma już standardowe wymiary w pikselach, w naszym przypadku: 512x128 px."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a69fd482",
   "metadata": {},
   "source": [
    "## Filtr Gabora\n",
    "Ostatnim krokiem w przetwarzaniu obrazu tęczówki jest użycie tzw filtru Gabora.\n",
    "Jest to specjalistyczny filtr to przetwarzania obrazów 2D, wykorzystywany do analizy tekstur.\n",
    "W dużym uproszczeniu znajduje on wybraną częstotliwość na obrazie w postaci zmieniających się pasów oraz znajduje kierunek tych zmian.\n",
    "\n",
    "![](./img/gabor.png)\n",
    "\n",
    "Filtr ten jest użyty aby znaleźć punkty szczególne na obrazie a następnie jego wynik jest progowany i zamieniany na wartość 0 albo 1.\n",
    "W ten sposób dla każdego filtru i oka uzyskuje się 512X128 bitów (x2 ze względu na część rzeczywistą i urojonę) które służą jako skompresowany opis danej tęczówki.\n",
    "W tym przypadku używane są dwie różne częstotliwości. Cały obraz został w ten sposób skompresowany do 32KB danych które są łatwo porównywalne z innymi zdjęciami.\n",
    "\n",
    "Przykładowy wynik filtru i progowania został przedstawiony poniżej. Czerwone fragmenty to takie które zostały odrzucone ze względu na zakłócenia takie jak np. powieka czy rzęsy:\n",
    "\n",
    "![](./img/filtered.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08d5d94d",
   "metadata": {},
   "source": [
    "## Dopasowanie tęczówki\n",
    "Program w celu dopasowania tęczówki porównuje wynik przetwarzania zdjęcia nowej tęczówki z uprzednio przetworzonymi zdjęciami zapisanymi w bazie.\n",
    "Do tego celu wykorzystuje tzw. odległość Hamminga czyli proporcję ilości bitów nie zgodnych do ilości wszystkich bitów.\n",
    "Ze względu na wybrany sposób przetwarzania obrazu, średnia proporcja dla dwóch różnych tęczówek będzie równa 0.5 ponieważ szansa na wartość piksela równą 0 albo 1 jest taka sama.\n",
    "Natomiast dla zdjęć tej samej tęczówki odległość Hamminga będzie znacząco mniejsza.\n",
    "Na poniższym rysunku przedstawiono rozkłady dla pasujących oraz niepasujących zdjęć dla 2.5 miliona par zdjęć.\n",
    "\n",
    "![](./img/hamming.png)"
   ]
  }
 ],
 "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.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
