s470623-wko/wko-04.ipynb

628 lines
5.7 MiB
Plaintext
Raw Normal View History

2022-11-27 19:15:49 +01:00
{
"cells": [
{
"cell_type": "markdown",
"id": "d7796c8b",
"metadata": {},
"source": [
"![Logo 1](img/aitech-logotyp-1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Widzenie komputerowe </h1>\n",
"<h2> 04. <i>Zaawansowane przetwarzanie obrazów i fotografia obliczeniowa</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": "1454f22a",
"metadata": {},
"source": [
"W poniższych materiałach krótko omówimy zagadnienia związane z fotografią obliczeniową, a większą część czasu pozostawimy na realizację zadania dotyczącego wykrywania linii.\n",
"\n",
"Na początku załadujmy niezbędne biblioteki."
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 1,
2022-11-27 19:15:49 +01:00
"id": "245f995f",
"metadata": {},
"outputs": [],
"source": [
"import cv2 as cv\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"id": "58f244a1",
"metadata": {},
"source": [
"# Obrazy HDR\n",
"\n",
"Na poprzednich zajęciach widzieliśmy w jaki sposób można poprawić kontrast np. przy pomocy wyrównania histogramu. W niektórych przypadkach jest to wystarczająca operacja pozwalająca uzyskać zadowalający efekt. Niestety, jest też wiele przypadków gdy na potrzebę uchwycenia głównych elementów na zdjęciu obraz musi mieć mniejszą lub większą ekspozycję, co kończy się niedoświetleniem lub prześwietleniem obiektów znajdujących się np. na drugim planie. Zasadniczo w takiej sytuacji chcielibyśmy wyjść poza standardowy ograniczony zakres wartości 0-255 do jakiegoś szerszego zakresu, który z jednej strony pozwoliłby nam uchwycić więcej informacji znajdujących się na scenie, ale z drugiej strony musimy też pamiętać o ponownej konwersji do standardowego zakresu.\n",
"\n",
"Pokażemy tutaj w jaki sposób można wykorzystać technikę [*High dynamic range (HDR) imaging*](https://en.wikipedia.org/wiki/High-dynamic-range_imaging) w OpenCV do uzyskania obrazu o dużej rozpiętości tonalnej. Poniżej mamy kilka zdjęć tego samego obiektu (źródło: Wikipedia, [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/deed.en)), wykonanych z różnym czasem naświetlania, przez co możemy zauważyć, że część elementów jest niedoświetlona, a część prześwietlona:"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 2,
2022-11-27 19:15:49 +01:00
"id": "01f5a664",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABk4AAAE+CAYAAADLSuwrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9ebxtV1En/q3a576XgSQYQhIwDAFC8zEJhCGESQiNEGQSNUS0aQIBARtQQGRQFEEmtVVoY4MIHXDARialkUGQQWWOzEMAGX6AECBAJobknr3q90d9q9Y6551z7rnvveS9hFXwcu/dZ+811qq1z/e7qkrMzNClS5cuXbp06dKlS5cuXbp06dKlS5cuXbp06dIFuq8b0KVLly5dunTp0qVLly5dunTp0qVLly5dunTpsr9IJ066dOnSpUuXLl26dOnSpUuXLl26dOnSpUuXLl0onTjp0qVLly5dunTp0qVLly5dunTp0qVLly5dunShdOKkS5cuXbp06dKlS5cuXbp06dKlS5cuXbp06dKF0omTLl26dOnSpUuXLl26dOnSpUuXLl26dOnSpUsXSidOunTp0qVLly5dunTp0qVLly5dunTp0qVLly5dKJ046dKlS5cuXbp06dKlS5cuXbp06dKlS5cuXbp0oXTipEuXLl26dOnSpUuXLl26dOnSpUuXLl26dOnShdKJky5dunTp0qVLly5dunTp0qVLly5dunTp0qVLF0onTrp06dKlS5cuXbp06dKlS5cuXbp06dKlS5cuXSidOOlytZTLLrsMT37yk3Hd614XBx54IE455RS89a1vXfv5//zP/8QZZ5yBa17zmjj00EPxMz/zM/jCF74wc88PfvADPOxhD8MJJ5yAww47DNe4xjVwi1vcAi94wQuwubk5c++//Mu/4H73ux+ud73r4YADDsDRRx+Ne97znnj3u9+9V/rbpUuXLl2uXNmTfea1r30tfuEXfgE3utGNcNBBB+G//Jf/gl//9V/HhRdeuMu9N7zhDSEiu/x71KMetZd71KVLly5d9hf54Ac/iMc85jE4/vjjcfDBB+P6178+zjjjDHz2s59d6/mXvexlC/cOEcH5559/Bbe+S5cuXbrsC7n00kvx9Kc/Hfe85z1x+OGHQ0Twspe9bOG9D3nIQxbuETe72c3Wru/1r389bnWrW+GAAw7A9a9/fTz9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
"text/plain": [
"<Figure size 2000x500 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"exposure_times = np.array([ 1/30.0, 0.25, 2.5, 15.0 ], dtype=np.float32)\n",
" \n",
"f_names = [\"st-louis-arch-0.033.jpg\", \n",
" \"st-louis-arch-0.25.jpg\", \n",
" \"st-louis-arch-2.5.jpg\", \n",
" \"st-louis-arch-15.jpg\"]\n",
"\n",
"plt.figure(figsize=(20,5))\n",
"images = []\n",
"for i, f_name in enumerate(f_names):\n",
" image = cv.imread(f\"img/{f_name}\", cv.IMREAD_COLOR)\n",
" images.append(image)\n",
" \n",
" plt.subplot(141 + i)\n",
" plt.imshow(image[:,:,::-1])\n",
" plt.title(f\"{str(round(exposure_times[i], 3))} sec.\")"
]
},
{
"cell_type": "markdown",
"id": "9cb65411",
"metadata": {},
"source": [
"Szczegółowy opis dalszych kroków można znaleźć np. w rozdziale *10.1 Photometric calibration* i *10.2 High dynamic range imaging* książki R. Szeliski *Computer Vision* (2021) - tutaj ograniczymy się do technicznego rozwiązania kolejnych problemów.\n",
"\n",
"Pierwszym problemem, który musimy rozwiązać, jest wyrównanie/dopasowanie obrazów. Nawet jeśli zdjęcie jest robione ze statywu (lub gorzej - z ręki), to po nałożeniu zdjęć na siebie będą widoczne artefakty wynikające z wibracji i przesunięć. W OpenCV możemy to rozwiązać poprzez funkcję [`cv.createAlignMTB()`](https://docs.opencv.org/4.5.3/d7/db6/classcv_1_1AlignMTB.html), która tworzy tzw. bitmapy z progiem mediany (ang. *median threshold bitmaps*), w których zawartość obrazu jest obliczana przez przypisanie wartości 1 pikselom jaśniejszym niż mediana luminancji i 0 w przeciwnym wypadku."
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 3,
2022-11-27 19:15:49 +01:00
"id": "7dda882f",
"metadata": {},
"outputs": [],
"source": [
"align_mtb = cv.createAlignMTB()\n",
"align_mtb.process(images, images)"
]
},
{
"cell_type": "markdown",
"id": "8873862f",
"metadata": {},
"source": [
"W dalszych krokach musimy:\n",
"\n",
"* oszacować radiometryczną funkcję odpowiedzi na podstawie wyrównanych obrazów,\n",
"* oszacować mapę radiacyjną, wybierając lub mieszając piksele z różnych ekspozycji,\n",
"* wykonać mapowanie tonalne wynikowego obrazu HDR z powrotem do postaci umożliwiającej jego normalne wyświetlanie."
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 4,
2022-11-27 19:15:49 +01:00
"id": "bd00b46f",
"metadata": {},
"outputs": [],
"source": [
"calibrate_debevec = cv.createCalibrateDebevec()\n",
"response_debevec = calibrate_debevec.process(images, exposure_times)\n",
"merge_debevec = cv.createMergeDebevec()\n",
"hdr_debevec = merge_debevec.process(images, exposure_times, response_debevec)"
]
},
{
"cell_type": "markdown",
"id": "d6c1f8f3",
"metadata": {},
"source": [
"Teoretycznie moglibyśmy zapisać teraz wynikowy plik `.hdr` np. przy pomocy `cv.imwrite(\"hdr_debevec.hdr\", hdr_debevec)` i edytować dalej go w programie graficznym. W tym miejscu jednak wykonamy dalszą obróbkę przy pomocy OpenCV, tj. wykonamy mapowanie tonalne. Poniżej mamy zaprezentowane wyniki uzyskane metodą Reinharda i Mantiuka:"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 5,
2022-11-27 19:15:49 +01:00
"id": "4a16094f",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"tonemap_rReinhard = cv.createTonemapReinhard(1.5, 0,0,0)\n",
"ldr_reinhard = tonemap_rReinhard.process(hdr_debevec)\n",
"plt.imshow(ldr_reinhard[:,:,::-1]);"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 6,
2022-11-27 19:15:49 +01:00
"id": "92cdbefa",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"tonemap_mantiuk = cv.createTonemapMantiuk(2.2, 0.85, 1.2)\n",
"ldr_mantiuk = tonemap_mantiuk.process(hdr_debevec)\n",
"ldr_mantiuk = np.clip(3 * ldr_mantiuk, 0, 1)\n",
"plt.imshow(ldr_mantiuk[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "c4d83478",
"metadata": {},
"source": [
"# Gładkie klonowanie\n",
"\n",
"Na wcześniejszych zajęciach widzieliśmy, że możemy umieszczać elementy jednego obrazu w drugim obrazie np. poprzez wykorzystanie maski i kanału dotyczącego przezroczystości. Innym ciekawym podejściem jest praca na gradientach obrazu (zamiast na jego intensywności), co może dać równie interesujące, a czasem i bardziej realistyczne wyniki. W tzw. gładkim klonowaniu (ang. *seamless cloning*) intensywność obiektu docelowego będzie różna od intensywności obiektu źródłowego, natomiast gradienty będą podobne. Szczegóły omawianej metody znajdują się w artykule P. Perez et al. (2003) [*Poisson Image Editing*](https://www.irisa.fr/vista/Papers/2003_siggraph_perez.pdf).\n",
"\n",
"Poniżej mamy obraz basenu i kąpiących się w nim ludzi oraz niedźwiedzia, którego chcemy umieścić w basenie:"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 7,
2022-11-27 19:15:49 +01:00
"id": "e0d74bf3",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 2000x500 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"swimmingpool = cv.imread(\"img/swimmingpool.jpg\", cv.IMREAD_COLOR)\n",
"bear = cv.imread(\"img/bear.jpg\", cv.IMREAD_COLOR)\n",
"bear_mask = cv.imread(\"img/bear-mask.jpg\", cv.IMREAD_GRAYSCALE)\n",
"\n",
"plt.figure(figsize=(20,5))\n",
"plt.subplot(131)\n",
"plt.imshow(swimmingpool[:,:,::-1])\n",
"plt.title(\"Swimming pool\")\n",
"plt.subplot(132)\n",
"plt.imshow(bear[:,:,::-1])\n",
"plt.title(\"Bear\")\n",
"plt.subplot(133)\n",
"plt.imshow(bear_mask[:,:], cmap='gray')\n",
"plt.title(\"Bear mask\");"
]
},
{
"cell_type": "markdown",
"id": "7654ece6",
"metadata": {},
"source": [
"Przy pomocy metody [`cv.seamlessClone()`](https://docs.opencv.org/4.5.3/df/da0/group__photo__clone.html#ga2bf426e4c93a6b1f21705513dfeca49d) wykonujemy gładkie klonowanie:"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 8,
2022-11-27 19:15:49 +01:00
"id": "f6d3092b",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0cAAALiCAYAAAASHK1qAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9ebR9R1Un/tlV59z3Mpkgs4KJBgUCS4KBYCuTqAwGBEXAbm1IHOiByI8GuxVdKtitAVx24wQ2rNYIatttI7qWE4iC2g4tNrqWiii2gCORecr3++45Vfv3xx5qV937TUIEwa+3MH7fu+/cc+rs2rX3Z49FzMw4jMM4jMM4jMM4jMM4jMM4jMP4Jz7Sx3oCh3EYh3EYh3EYh3EYh3EYh3EYHw/jYBwdxmEcxmEcxmEcxmEcxmEcxmHgYBwdxmEcxmEcxmEcxmEcxmEcxmEAOBhHh3EYh3EYh3EYh3EYh3EYh3EYAA7G0WEcxmEcxmEcxmEcxmEcxmEcBoCDcXQYh3EYh3EYh3EYh3EYh3EYhwHgYBwdxmEcxmEcxmEcxmEcxmEcxmEAOBhHh3EYh3EYh3EYh3EYh3EYh3EYAA7G0WEcxmEcxmEcxmEcxmEcxmEcBoCDcXQYh3EY/0TGJZdcgkc/+tE3e93rXvc6EBFe97rXfdjPsO/+r//1v27FDM88HvrQh+Le9773zV731re+FUSE66+//iP6/FszPh7pCABEhGuvvfYjft9bO57znOeAiPDOd77zYz2VD2v8Y533hzuuvvpqXHLJJR/raRzGYRzGP+A4GEeHcRiH8XE/rr/+ehARfvd3f/cmr3vjG9+I5zznOXjrW9/6DzOxj+D4m7/5GzznOc/B7//+73+sp/KPavz4j/84XvjCF36sp/FxNV70ohd9XBjIh3EYh3EY/xjH9LGewGEcxmEcxkdqvPGNb8Rzn/tcPPShD73V3t4HP/jBOHXqFDabzUd2cjcz/uZv/gbPfe5zcckll+Dyyy+/Vfe4+OKLcerUKczz/JGd3K0Y/1B0/PEf/3H84R/+IZ7xjGd8VJ/zj2m86EUvwu1udztcffXVH+upHMZhHMZh/KMbB+PoMA7jMA4jjJQSjo+PP9bTuFWDiD5u5v6PmY6HcRiHcRiH8U93HNLqDuMwDuOsGNdffz2e8IQnAAA+7/M+D0S0t+blf//v/40rr7wSx8fH+LRP+zS87GUv6/6+r1bGan7e+MY34vM+7/Nw7rnn4pM/+ZPxghe84GbndXJygkc/+tG48MIL8Zu/+Zt7r3nd616H+9///gCAa665xuc+pkbd3PP31Ry9/e1vxzXXXIO73OUuODo6wp3vfGc89rGPvdnUw6uvvhrnn38+/uIv/gKPfvSjcf755+OTP/mT8QM/8AMAgD/4gz/Awx72MJx33nm4+OKL8eM//uM777SP/j/wAz+AT/u0T8M555yDK6+8Er/+67+Ohz70oXjoQx+6M4daK77jO74Dd7nLXXB8fIzP//zPx5/92Z/53x/60Ifi537u5/C2t73NaXZLI4Y/9mM/hrvf/e44Pj7GFVdcgV/7tV/bueav//qv8VVf9VW44x3viKOjI9zrXvfCD/3QD92i+1tt0y15DgC8973vxdVXX42LLroIF154Ia655hrceOON3TXruuI//sf/iEsvvRRHR0e45JJL8E3f9E04OTnxay655BL80R/9EX71V3/VaRJp++d//ud4whOegE/8xE/Eueeei8/+7M/Gz/3cz+3M5/u+7/twr3vdC+eeey5uc5vb4H73u9/OGn8k521zf/SjH41Xv/rVuPzyy3F8fIzLLrsMP/VTP9VdZ2m2v/Zrv4Z/9a/+FW5729viEz7hE/DkJz8Z73nPe3bm+Au/8At40IMehPPOOw8XXHABrrrqKvzRH/3RznU//dM/jXvf+944Pj7Gve99b7zyla/cueYwDuMwzv5xMI4O4zAO46wYD37wg/H0pz8dAPBN3/RNePnLX46Xv/zluOc97+nX/Nmf/Rm+7Mu+DF/4hV+I7/7u78ZtbnMbXH311XuB0jje85734JGPfCTuc5/74Lu/+7txj3vcA9/wDd+AX/iFXzjjd06dOoXHPOYx+M3f/E285jWvwed8zufsve6e97wnvv3bvx0A8NSnPtXn/uAHP/jv9XwAePzjH49XvvKVuOaaa/CiF70IT3/60/GBD3wAf/EXf3Gz71xKwaMe9Sjc9a53xQte8AJccskluPbaa3H99dfjkY98JO53v/vh+c9/Pi644AI8+clPxlve8pabvN+LX/xiXHvttbjLXe6CF7zgBXjQgx6Exz3ucfirv/qrvdc/73nPwytf+Up8/dd/PZ797Gfjt3/7t/EVX/EV/vdv/uZvxuWXX47b3e52TrNbUn/0q7/6q3jGM56Br/zKr8S3f/u3413vehce+chH4g//8A/9mhtuuAGf/dmfjde85jW49tpr8T3f8z24293uhq/+6q++xTVOt+Q5Np74xCfiAx/4AK677jo88YlPxPXXX4/nPve53TVf8zVfg2/91m/FZ33WZ+G//Jf/goc85CG47rrr8OVf/uV+zQtf+ELc5S53wT3ucQ+nyTd/8zf7O33O53wOXvWqV+Hf/tt/i+/4ju/A6dOn8cVf/MWdIfDSl74UT3/603HZZZfhhS98IZ773Ofi8ssvx//5P//nozZvG29+85vxpCc9CY961KNw3XXXYZomPOEJT8Av/dIv7Vx77bXX4o//+I/xnOc8B09+8pPxYz/2Y3jc4x4HZvZrXv7yl+Oqq67C+eefj+c///n4lm/5FrzxjW/EAx/4wM5B8OpXvxqPf/zjQUS47rrr8LjHPQ7XXHPNzdY5HsZhHMZZOPgwDuMwDuPjfPzwD/8wA+DXv/71N3ndT/7kTzIAfu1rX7vzt4svvpgB8K/92q/5Z3/3d3/HR0dH/KxnPcs/e+1rX7tzj4c85CEMgF/2spf5ZycnJ3ynO92JH//4x+989yd/8if5Ax/4AD/kIQ/h293udvx7v/d7N/uOr3/96xkA//AP//DO327p89/ylrd093jPe97DAPi7vuu7bvb543jKU57CAPg7v/M7/bP3vOc9fM455zAR8U/8xE/4529605sYAH/bt32bfzbS8eTkhG9729vy/e9/f16Wxa+7/vrrGQA/5CEP2fnuPe95Tz45OfHPv+d7vocB8B/8wR/4Z1dddRVffPHFt/i9ADAA/t3f/V3/7G1vexsfHx/zl3zJl/hnX/3VX813vvOd+Z3vfGf3/S//8i/nCy+8kG+88caPyHO+7du+jQHwV33VV3Xf/5Iv+RK+7W1v67///u//PgPgr/mar+mu+/qv/3oGwL/yK7/in93rXvfq6GnjGc94BgPgX//1X/fPPvCBD/Cnfuqn8iWXXMKlFGZmfuxjH8v3ute9bvL9Phrztj36ile8wj973/vex3e+8535vve9r39m8uCKK67g7Xbrn7/gBS9gAPwzP/Mz/m4XXXQRf+3Xfm337Le//e184YUXdp9ffvnlfOc735nf+973+mevfvWrGcCHxV+HcRiH8Y9/HCJHh3EYh/FPZlx22WV40IMe5L/f/va3x93vfnf8+Z//+c1+9/zzz8dXfuVX+u+bzQZXXnnl3u++733vw8Mf/nC86U1vwute97pb3WDh1j7fxjnnnIPNZoPXve51e9ONbsn4mq/5Gv/5oosuwt3vfnecd955eOITn+if3/3ud8dFF110k3P53d/9XbzrXe/C137t12KaWrnrV3zFV+A2t7nN3u9cc801XUMHW7tbsl43Nf7ZP/tnuOKKK/z3T/mUT8FjH/tYvOpVr0IpBcyMV7ziFXjMYx4DZsY73/lO/+8Rj3gE3ve+9+ENb3jD3/s5cfzrf/2vu98f9KAH4V3vehfe//73AwB+/ud/HgDwzGc+s7vuWc96FgDsTY0bx8///M/jyiuvxAMf+ED/7Pzzz8dTn/pUvPWtb8Ub3/hGALLOf/VXf4XXv/71N3vPj/S8P+mTPglf8iVf4r9butzv/d7v4e1vf3t37VOf+tSu+ci/+Tf/BtM0+TN/6Zd
"text/plain": [
"<Figure size 1000x1000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"center = (250,700)\n",
"\n",
"swimmingpool_with_bear = cv.seamlessClone(bear, swimmingpool, bear_mask, center, cv.NORMAL_CLONE)\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(swimmingpool_with_bear[:,:,::-1])\n",
"plt.title(\"I think this might be photoshopped\");"
]
},
{
"cell_type": "markdown",
"id": "2337a4c3",
"metadata": {},
"source": [
"Spróbujmy teraz umieścić tekst na teksturze:"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 9,
2022-11-27 19:15:49 +01:00
"id": "f61aaaaf",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABCYAAAGXCAYAAABvBVFIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9aaytaV7XD3+u8Z7WsMczVJ2qrh4RGgH/zRAhPoCiwAsTYwhGQgIdDKABgx1NwAdB7AReoAYTTAiS/BuUBG1fPAkkDsjggCBRBHkCSENP1XXqjHtYa93jNT0vrvvsBlufP2jTZdn3JzlJnX127b32Wvdae/1+13cQKaXEwsLCwsLCwsLCwsLCwsLCwmuAfK1vwMLCwsLCwsLCwsLCwsLCwicvy2JiYWFhYWFhYWFhYWFhYWHhNWNZTCwsLCwsLCwsLCwsLCwsLLxmLIuJhYWFhYWFhYWFhYWFhYWF14xlMbGwsLCwsLCwsLCwsLCwsPCasSwmFhYWFhYWFhYWFhYWFhYWXjOWxcTCwsLCwsLCwsLCwsLCwsJrxrKYWFhYWFhYWFhYWFhYWFhYeM1YFhMLCwsLCwsLCwsLCwsLCwuvGctiYmFhYWFhYWFhYWFhYWFh4TVjWUwsLPwfhBDi9/TnZ3/2Zz8u3+/+/fv8zb/5N/nlX/7lj8vXW1hYWFhYWFhYWFj45EO/1jdgYWHh48c//If/8Hf9/Ud+5Ef4yZ/8yY/5+Kd+6qd+XL7f/fv3+a7v+i5eeuklPuuzPuvj8jUXFhYWFhYWFhYWFj65WBYTCwv/B/HVX/3Vv+vvv/ALv8BP/uRPfszH/3dnGAastUi5iLoWFhYWFhYWFhYW/k9nede/sPBJRoyR7/u+7+Ptb387ZVly+/ZtvuEbvoHLy8ubz/nO7/xOpJT81E/91O/6f7/+678eay2/8iu/ws/+7M/yOZ/zOQC8853vvLGJvOc97wHgpZde4mu/9ms/5vt/0Rd9EV/0RV908/ef/dmfRQjBj/3Yj/Ht3/7tPP/889R1zW63A+A//If/wJd92Zex3W6p65ov/MIv5Od+7uc+vnfKwsLCwsLCwsLCwsJrxqKYWFj4JOMbvuEbeM973sM73/lO/vJf/st84AMf4Pu///v5z//5P/NzP/dzGGP49m//dn78x3+cr/u6r+NXf/VXWa/X/It/8S/4B//gH/Dud7+bz/zMz+Thw4f8rb/1t/iO7/gOvv7rv54/9sf+GACf//mf/z91u9797ndjreWv/tW/yjiOWGv56Z/+ab78y7+cd7zjHTfLkv/7//6/+eN//I/zb//tv+VzP/dzP553zcLCwsLCwsLCwsLCa8CymFhY+CTi3/27f8cP/dAP8aM/+qN81Vd91c3Hv/iLv5gv+7Iv473vfS9f9VVfhTGGH/mRH+Ed73gH73rXu/je7/1evu7rvo7P/uzP5lu/9VsBuH37Nl/+5V/Od3zHd/BH/+gf/V+2iwzDwH/8j/+RqqoASCnxjd/4jXzxF38x/+yf/TOEEEBerLz97W/n27/92/mX//Jf/i99z4WFhYWFhYWFhYWF157FyrGw8EnEe9/7XrbbLX/yT/5Jnjx5cvPnHe94B6vVip/5mZ+5+dxP//RP57u+67v4oR/6Ib70S7+UJ0+e8MM//MNo/Qezz/yar/mam6UEwC//8i/zvve9j6/6qq/i6dOnN7e1bVv+xJ/4E/ybf/NviDH+gdyWhYWFhYWFhYWFhYVPHItiYmHhk4j3ve99XF9fc+vWrf/uvz969Oh3/f2v/bW/xo/92I/xi7/4i3z3d383n/Zpn/YHdtve+MY3fsxthbyw+B9xfX3N8fHxH9htWlhYWFhYWFhYWFj4g2dZTCwsfBIRY+TWrVv86I/+6H/338/Pz3/X39///vffLAh+9Vd/9ff1vZ5ZL/5bQggopT7m479TLfHstgJ87/d+7/+winS1Wv2+btPCwsLCwsLCwsLCwv9+LIuJhYVPIt785jfzr/7Vv+ILvuALPmYR8N8SY+Rrv/Zr2Ww2fMu3fAvf/d3fzVd8xVfwZ//sn735nP/R8gHg+PiYq6urj/n4hz70Id70pjf9nm4rwGaz4Uu+5Ev+Hz9/YWFhYWFhYWFhYeH1yZIxsbDwScRXfuVXEkLg3e9+98f8m/f+dy0S/u7f/bv8+3//7/nBH/xB3v3ud/P5n//5/MW/+Bd58uTJzec0TQPw311AvPnNb+YXfuEXmKbp5mM/8RM/wcsvv/x7uq3veMc7ePOb38zf/tt/m8Ph8DH//vjx49/T11lYWFhYWFhYWFhY+N+bRTGxsPBJxBd+4RfyDd/wDXzP93wPv/zLv8yf+lN/CmMM73vf+3jve9/L3/t7f4+v+Iqv4Nd//df5G3/jb/C1X/u1/Ok//acBeM973sNnfdZn8Zf+0l/in/yTfwLk5cPR0RE/8AM/wHq9pmkaPu/zPo83vvGN/IW/8Bf4p//0n/JlX/ZlfOVXfiW//du/zT/6R//oRgnx/4SUkh/6oR/iy7/8y3n729/OO9/5Tp5//nleeeUVfuZnfobNZsOP//iP/4HdVwsLCwsLCwsLCwsLnxgWxcTCwicZP/ADP8AP/uAP8ujRI/76X//rfNu3fRs//dM/zVd/9VfzBV/wBYQQ+Jqv+RrOzs74vu/7vpv/761vfSvf8z3fw3vf+96bxYQxhh/+4R9GKcU3fuM38uf//J/nX//rfw3Al37pl/J3/s7f4Td/8zf5lm/5Fn7+53+en/iJn+DevXu/59v6RV/0Rfz8z/88n/3Zn833f//3883f/M285z3v4c6dO/yVv/JXPq73y8LCwsLCwsLCwsLCa4NIKaXX+kYsLCwsLCwsLCwsLCwsLCx8crIoJhYWFhYWFhYWFhYWFhYWFl4zlsXEwsLCwsLCwsLCwsLCwsLCa8aymFhYWFhYWFhYWFhYWFhYWHjNeE0XE3//7/99XnrpJcqy5PM+7/P4xV/8xdfy5iwsLCwsLCwsLCwsLCwsLHyCec0WE//4H/9j3vWud/Gd3/md/NIv/RKf+ZmfyZd+6Zfy6NGj1+omLSwsLCwsLCwsLCwsLCwsfIJ5zVo5Pu/zPo/P+ZzP4fu///sBiDHywgsv8M3f/M1867d+62txkxYWFhYWFhYWFhYWFhYWFj7B6Nfim07TxH/6T/+Jb/u2b7v5mJSSL/mSL+Hnf/7nP+bzx3FkHMebv8cYubi44PT0FCHEJ+Q2LywsLCws/O9OSon9fs9zzz2HlEuM1MLCwsLCwsLrg9dkMfHkyRNCCNy+fft3ffz27dv8xm/8xsd8/vd8z/fwXd/1XZ+om7ewsLCwsPC65uWXX+bevXuv9c1YWFhYWFhYWPg98ZosJn6/fNu3fRvvete7bv5+fX3Niy++yN/6f38b7W7P/qrj+PYdHlxdcbXbMUyO4CIperxzhJjQ2lKUhmHsePjgIcF7VusNymqIYJTBGosQgBZM4wQIjLaAJKWAsgohJGM/sD/sePz4IQLQ2rJqGo6OT1it1kzO4dxEIpJiYr/bcbTdIIVgnEb6ruPpxROOjk6QQmKLEltYEuCmwJMnD9FCc+vknBAjpjSYwjCMI2134Hp/YH99iR89t8/v8hmf+Rkc+pYIBB9xfsJ5R3COq6tLri8vWdUNq1XDOA1cX12zbw8E5xi6gdtnd/kTf+JL+LX/+l+QAqw1bJs1GsGb33APlwI//0v/mTt37vHcrTuEGHHBUW82XO6vuXh6ycl2w2e86QU+7Y3naKFoyoJhHBkiXO17CqsRQrAfRrwsePWq4zd+8wM8ePKIzfaYumyQQiKEICZPP/SM08hht+Pi6VPWzZrzW2dYY7l1ds7jp09ou55Hjx5gbcGn/qE/RF2tON4ecXZ+TFkVPL3ecXF5yW63J0TPNI5Mw4T3juAdIUSEFEz9AERiisSY8C7QNDVFVVLYGqkU17sr+r7lyeOHxJC4fec5jk9OQcDhcCB4T1XXSARX15e8/MEPs96uWK837A87Lh4/5mh7xPn5LWLw7PZXXF/u2B6dIrVhtVmhjUVKwcNHD2j3e8ah497zb2B7fJqvm76
"text/plain": [
"<Figure size 2000x500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"texture = cv.imread(\"img/texture.jpg\", cv.IMREAD_COLOR)\n",
"bologna = cv.imread(\"img/bologna-on-wall.jpg\", cv.IMREAD_COLOR)\n",
"\n",
"plt.figure(figsize=(20,5))\n",
"plt.subplot(131)\n",
"plt.imshow(texture[:,:,::-1])\n",
"plt.title(\"Texture\")\n",
"plt.subplot(132)\n",
"plt.imshow(bologna[:,:,::-1])\n",
"plt.title(\"Bologna to clone\");"
]
},
{
"cell_type": "markdown",
"id": "99a99732",
"metadata": {},
"source": [
"W tym wypadku stworzenie maski może być problematyczne, zatem możemy pójść na skróty i przyjąć, że cały obraz stanowi maskę. Przy takim podejściu zobaczymy jednak, że opcja [`cv.NORMAL_CLONE`](https://docs.opencv.org/4.5.3/df/da0/group__photo__clone.html#gabfc4ba1d1fb873f2b56d34032f86c1d4) spowoduje mocne rozmazanie wokół wklejanej części, stąd też lepszym rozwiązaniem będzie opcja `cv.MIXED_CLONE`, co wynika z kombinacji gradientów z jednego i drugiego obrazu:"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 10,
2022-11-27 19:15:49 +01:00
"id": "a64d730e",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "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5KabbuJv/I2/wR133EHXdfzqr/7qh3zNPffcwxd8wRfwlre8hW/7tm/jr/21v8Y4jvz3//1//0FzmR/8wR/kZ3/2Z3nJS17CS1/6Un71V3+Vv/AX/sKDnvPWt76VL/mSL+H4+JhXvvKV/PW//te5fv06X/qlX8rb3/72h/VZKpVK5ZOaUqlUKpWPCm94wxsKUH7t136tvOtd7yrW2vId3/EdZ7+//fbby5Oe9KSzn9/xjncUoHzLt3zLg97nJS95SQHKW9/61rPHbr755gKUn//5n3/Qc3/pl36pAOXJT35y8d6fPf71X//1RSlVvvIrv/JBz//8z//8cvPNNz/osd1u95DP8tznPrfceuutD3rs9ttvL7fffvuH/Q7uvPPOorUuf+bP/JmSUnrQ73LOH/K9XvOa1xSg/MRP/MTZY9778vmf//lltVqV4+PjUkopv//7v1+Acv78+XL16tWz5/6zf/bPClDe/OY3nz327Gc/u3zmZ35mGcfxQcfwBV/wBeUJT3jCh/0clUqlUqlUKpVK5WPHB+ZSP/IjP1LW6/VZnvLn/tyfK8961rNKKZIXfdVXfdWDXguUV77ylQ967KUvfWnRWpd/+2//bfnpn/7pApTXvOY1Z7//5V/+5QKUn/zJn3zQ637+53/+QY/fe++9pWma8lVf9VUPymde9rKXFaC84AUv+LCf661vfWsBHpQXnvKB73fzzTc/6L2+8zu/swDll3/5l88eOzk5KY9//OPLLbfccpZrneaDn/EZn1GmaTp77mtf+9oClN/8zd88+1tPeMITynOf+9wH/d3dblce//jHly/7si/7sJ+jUqlU/iRQK0YqlUrlY8Ctt97KN33TN/H617+e97///R/0OT/3cz8HwHd913c96PH/9X/9XwEeUib9+Mc/nuc+97kf9L3+4l/8izjnzn5+xjOeQSmFb/7mb37Q857xjGfw3ve+90GevX3fn/3/0dER999/P7fffju/93u/x9HR0R/3UR/E//l//p/knHnFK16B1g+ecpRSH/J1P/dzP8cNN9zA13/915895pzjO77jO9hsNvybf/NvHvT8P//n/zyHh4dnP3/xF38xIOXmIKXyb33rW/m6r/s6Tk5OuP/++7n//vu5cuUKz33uc7nzzju56667HtFnq1QqlUqlUqlUKh99vu7rvo5hGPgX/+JfcHJywr/4F//iQ9pofSi+93u/lyc96Um84AUv4Nu+7du4/fbb+Y7v+I6z3//0T/80+/v7fNmXfdlZrnD//ffztKc9jdVqxS/90i8B8K/+1b/Ce89f+St/5UH5zHd+53c+rOP4J//kn6CU4pWvfOVDfvfH5Uef93mfxxd90RedPbZarfjLf/kv8+53v5vf/u3fftDzX/SiF9E0zdnPfzQ/esc73sGdd97JN3zDN3DlypWzz7vdbnn2s5/Nv/23/5ac88P6TJVKpfLJSu1GValUKh8jXv7yl/PjP/7j/OAP/uAHtYN6z3veg9aaT/3UT33Q4zfccAMHBwe85z3vedDjj3/84z/k3/qUT/mUB/28v78PwE033fSQx3POHB0dcf78eQB+5Vd+hVe+8pW87W1vY7fbPej5R0dHZ+/1cHjXu96F1ponPvGJD/s1IN/FE57whIdspnzGZ3zG2e8/kD/6eU83SU79gN/5znd
"text/plain": [
"<Figure size 2000x1000 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"mask = 255 * np.ones(bologna.shape, bologna.dtype)\n",
"\n",
"width, height, channels = texture.shape\n",
"center = (height//2, width//2)\n",
"\n",
"normal_clone = cv.seamlessClone(bologna, texture, mask, center, cv.NORMAL_CLONE)\n",
"mixed_clone = cv.seamlessClone(bologna, texture, mask, center, cv.MIXED_CLONE)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(121)\n",
"plt.title(\"Normal clone\")\n",
"plt.imshow(normal_clone[:,:,::-1])\n",
"plt.subplot(122)\n",
"plt.title(\"Mixed clone\")\n",
"plt.imshow(mixed_clone[:,:,::-1])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "b3df663d",
"metadata": {},
"source": [
"# Usuwanie niechcianych obiektów\n",
"\n",
"Spróbujemy teraz usunąć ze zdjęcia defekty, które często są domeną starych fotografii. Poniżej mamy zdjęcie prezydenta Lincolna z rysą na poziomie włosów; dodatkowo ręcznie ustaliliśmy maskę wskazującą miejsce występowania tej rysy:"
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 11,
2022-11-27 19:15:49 +01:00
"id": "35d05105",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1500x1000 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"lincoln = cv.imread(\"img/lincoln.jpg\", cv.IMREAD_COLOR)\n",
"lincoln_mask = cv.imread(\"img/lincoln-mask.jpg\", cv.IMREAD_GRAYSCALE)\n",
"\n",
"plt.figure(figsize=(15,10))\n",
"plt.subplot(121)\n",
"plt.imshow(lincoln[:,:,::-1])\n",
"plt.title(\"Lincoln last photo\")\n",
"plt.subplot(122)\n",
"plt.imshow(lincoln_mask[:,:], cmap='gray')\n",
"plt.title(\"Mask\");"
]
},
{
"cell_type": "markdown",
"id": "ba912b4f",
"metadata": {},
"source": [
"Używając metody [`cv.inpaint()`](https://docs.opencv.org/4.5.3/d7/d8b/group__photo__inpaint.html#gaedd30dfa0214fec4c88138b51d678085) możemy przywrócić wybrany region w obrazie przy pomocy sąsiedztwa zadanego regionu. Metoda `cv.INPAINT_NS` implementuje podejście opisane w M. Bertalmio et al. (2001) [*Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting*](https://www.math.ucla.edu/~bertozzi/papers/cvpr01.pdf), która ogólnie mówiąc ma za zadanie zachować gradienty (np. krawędzie) i rozprowadzać informacje o kolorach na płaskich przestrzeniach. Z kolei `cv.INPAINT_TELEA` implementuje metodę opisaną w A. Telea (2004) [*An image inpainting technique based on the fast marching method*](https://core.ac.uk/download/pdf/148284148.pdf). W obu przypadkach możemy zauważyć oczekiwane wypełnienie na poziomie włosów, aczkolwiek po prawej stronie jest widoczne pewne rozmazanie - być może należałoby poprawić/zawęzić wejściową maskę."
]
},
{
"cell_type": "code",
2022-11-27 23:20:17 +01:00
"execution_count": 12,
2022-11-27 19:15:49 +01:00
"id": "52ff1513",
"metadata": {},
2022-11-27 23:20:17 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABMIAAAHmCAYAAACRciInAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9ebhlRXU3jn/2mefhTn37Nk3TzJNCQiIhAg2KD6JvEiJGMSYCGs2gMX6JMWIMgmMUB9TEmOR93ohmQo2a503iPMQ3zhqNUURBmqbp7jufe+b57N8f5/ep89l1z226oenuC7We5z73nH32rl21aq31qVprVZXn+74PR44cOXLkyJEjR44cOXLkyJEjR44e4xQ61hVw5MiRI0eOHDly5MiRI0eOHDly5OhokHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOXLkyJEjR44cOXLkyJEjR44cOXpckHOEOToqdP/998PzPHzgAx841lXBZZddhssuu+yIlfeBD3wAnufh/vvvP2JlHg267LLLcO655x7rajhy5MjRI6Lj1QZff/31OOmkk451NR423XLLLfA871hX44jTSSedhP/1v/7Xsa6GI0eOHD0icti3MR2vvHF0fJFzhDl6xERj8+1vf/tYV+UxSW9+85vxiU984lhX4yGp0WjglltuwZe+9KVjXRVHjhw9ivRYsvl33XUXbrnlluNysOx5HjzPwzve8Y51vz2W+gAAOp0O3v3ud+NnfuZnkMvlUCgUcM455+AlL3kJ7r77bnPfV7/6Vdxyyy1YW1s7dpV15MjR45IeS3b3eMS+66+/3uDewf6uv/76Y11VR48RihzrCjh6fNCOHTvQbDYRjUaPdVU2Hb35zW/Gs5/9bFx99dXHuioHpUajgVtvvRUAjmjGnSNHjhwdjH7zN38T1157LeLx+GE/e9ddd+HWW2/FZZdddswj2BvRbbfdht/93d9FKpU6qu997Wtfi1e/+tVH5V3XXHMNPvnJT+J5z3seXvziF6Pb7eLuu+/Gv/7rv+IXf/EXceaZZwIYOsJuvfVWXH/99SgUCkelbo4cOXJ0PNJjDft++7d/G1dccYX5vnv3btx88814yUtegksuucRcP+WUU45F9Rw9Bsk5whwdFfI8D4lE4lhXw5EjR44cPcYoHA4jHA4f62o8KnT++efje9/7Ht7//vfjxhtvPKrvjkQiiESO3DCx0WiMdeZ961vfwr/+67/iTW96E17zmtcEfvvzP/9zl/3lyJEjR2PosYZ9F110ES666CLz/dvf/jZuvvlmXHTRRfiN3/iNY1gzR49VcksjHR0VGrdH2PXXX49MJoN9+/bh6quvRiaTwfT0NF75ylei3+8Hnh8MBnj3u9+NJzzhCUgkEpiensbTn/70QHpyr9fDG97wBpxyyimIx+M46aST8JrXvAbtdvugdfvSl74Ez/Pw4Q9/GG9605twwgknIJFI4KlPfSruvffeh9Xef/mXf8Ezn/lMzM3NIR6P45RTTsEb3vCGde265557cM0112B2dhaJRAInnHACrr32WpTLZQBDB2K9Xscdd9xxSCnBbMudd96J17zmNZidnUU6ncYv//IvY+/evWOfueuuu3D55ZcjlUph27ZteNvb3rbunsXFRbzoRS/Cli1bkEgkcN555+GOO+4wv99///2Ynp4GANx6662mrrfccou55wtf+AIuueQSpNNpFAoF/Mqv/Ap+9KMfHSpLHTlydBzTodpzYsHb3/52vOtd78KOHTuQTCaxa9cu/OAHPwiU+f3vfx/XX389Tj75ZCQSCczOzuKFL3whVlZWAveN2wuE+0D953/+J570pCchkUjg5JNPxgc/+MHAc7/2a78GALj88suN3dLl3Z/85CeN3cpms3jmM5+JH/7wh+va/4lPfALnnnsuEokEzj33XHz84x8fy6cDBw7g7rvvRrfbPSS+PvnJT8ZTnvIUvO1tb0Oz2TzovYfCr49+9KPwPA//8R//se75v/qrv4LneaYfNtoj7O/+7u9wwQUXIJlMYmJiAtdee+06fOEelN/5zndw6aWXIpVKrXNykX7605+attoUDocxOTlp6vNHf/RHAICdO3ea/mK/P9wxAADccccdiEQipnwA+MY3voGnP/3pyOfzSKVS2LVrF77yla8EnqtWq3jFK16Bk046CfF4HDMzM3ja056G//qv/3rIdzpy5Gjzk8O+Rwf7DkaHYps3okNp16Hy39HmJ+cIc3RMqd/v48orr8Tk5CTe/va3Y9euXXjHO96Bv/7rvw7c96IXvQiveMUrsH37drz1rW/Fq1/9aiQSCXz961839/zWb/0Wbr75Zvzsz/4s3vWud2HXrl14y1vegmuvvfaQ6vJnf/Zn+PjHP45XvvKVuOmmm/D1r38dz3/+8x9Wuz7wgQ8gk8ngxhtvxLvf/W5ccMEFuPnmmwPLTDqdDq688kp8/etfx+///u/jL/7iL/CSl7wE9913n4mAf+hDH0I8Hscll1yCD33oQ/jQhz6E3/7t337I97/pTW/Cv/3bv+GP//iP8fKXvxyf/exnccUVV6ybSJVKJTz96U/Heeedh3e84x0488wz8cd//Mf45Cc/ae5pNpu47LLL8KEPfQjPf/7zcdtttyGfz+P666/Hu9/9bgDA9PQ0/vIv/xIA8Ku/+qumrs961rMAAJ/73Odw5ZVXYnFxEbfccgtuvPFGfPWrX8WTn/zk42p/AkeOHD18OlR7DgAf/OAH8Z73vAcvfelLcdNNN+EHP/gBnvKUp2BhYcHc89nPfhb33XcfbrjhBrz3ve/Ftddei3/6p3/CM57xDPi+/5D1uffee/HsZz8bT3va0/COd7wDxWIR119/vRn0XnrppXj5y18OAHjNa15j7NZZZ50FYGh/n/nMZyKTyeCtb30r/vRP/xR33XUXLr744oDd+sxnPoNrrrkGnufhLW95C66++mrccMMNY/eRuemmm3DWWWdh3759h8zXW265BQsLC8bGbkSHwi+258Mf/vC65++8806cc845Bz1E5U1vehNe8IIX4LTTTsM73/lOvOIVr8DnP/95XHrppesyt1ZWVnDVVVfh/PPPx+23347LL798bJk7duwAAPz93/89er3ehu9+1rOehec973kAgHe9612mvxiEebhjgL/+67/GDTfcgFe/+tW47bbbAAwDN5deeikqlQpe97rX4c1vfjPW1tbwlKc8Bd/85jfNs7/zO7+Dv/zLv8Q111yD973vfXjlK1+JZDLpgjyOHD2OyGHfo4N94+hQbfM4OtR2PVL+O9pE5Dty9Ajpb//2b30A/re+9a0N79m9e7cPwP/bv/1bc+26667zAfivf/3rA/f+zM/8jH/BBReY71/4whd8AP7LX/7ydeUOBgPf933/e9/7ng/A/63f+q3A76985St9AP4XvvAFc23Xrl3+rl27zPcvfvGLPgD/rLPO8tvttrn+7ne/2wfg/8///M8htX/37t3mWqPRWHffb//2b/upVMpvtVq+7/v+d7/7XR+A/5GPfOSg5afTaf+666476D12W7Zt2+ZXKhVz/cMf/rAPwH/3u99tru3atcsH4H/wgx8019rttj87O+tfc8015trtt9/uA/D/7u/+zlzrdDr+RRdd5GcyGfOepaUlH4D/ute9bl29zj//fH9mZsZfWVkx1/77v//bD4VC/gte8IJDapsjR46ODxpn8w/VnhMLksmk/+CDD5rr3/jGN3wA/v/3//1/5to4O/qP//iPPgD/y1/+8rr6qA3esWPHuvsWFxf9eDzu/+Ef/qG59pGPfMQH4H/xi18MvKdarfqFQsF/8YtfHLg+Pz/v5/P5wPXzzz/f37p1q7+2tmaufeYzn/EB+Dt27Ag
"text/plain": [
"<Figure size 1500x1000 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2022-11-27 19:15:49 +01:00
"source": [
"lincoln_inpainted_ns = cv.inpaint(src=lincoln, inpaintMask=lincoln_mask, inpaintRadius=5, flags=cv.INPAINT_NS)\n",
"lincoln_inpainted_t = cv.inpaint(src=lincoln, inpaintMask=lincoln_mask, inpaintRadius=5, flags=cv.INPAINT_TELEA)\n",
"\n",
"plt.figure(figsize=(15,10))\n",
"plt.subplot(131)\n",
"plt.imshow(lincoln[:,:,::-1])\n",
"plt.title(\"Lincoln last photo\")\n",
"plt.subplot(132)\n",
"plt.imshow(lincoln_inpainted_ns[:,:,::-1])\n",
"plt.title(\"Inpainted: Navier-Stokes\")\n",
"plt.subplot(133)\n",
"plt.imshow(lincoln_inpainted_t[:,:,::-1])\n",
"plt.title(\"Inpainted: Telea\");"
]
},
{
"cell_type": "markdown",
"id": "62854178",
"metadata": {},
"source": [
"# Transformata Hougha"
]
},
{
"cell_type": "markdown",
"id": "6cc98b55",
"metadata": {},
"source": [
"## Zadanie 1\n",
"\n",
"W poniższym zadaniu należy przygotować serię operacji, która pozwoli wykryć proste linie na obrazie `img/road-lanes.jpg` przy pomocy [transformaty Hougha](https://docs.opencv.org/4.5.3/d9/db0/tutorial_hough_lines.html) (wym. *hafa*), zaimplementowanej w funkcji [`cv.HoughLines()`](https://docs.opencv.org/4.5.3/dd/d1a/group__imgproc__feature.html#ga46b4e588934f6c8dfd509cc6e0e4545a) lub [`cv.HoughLinesP()`](https://docs.opencv.org/4.5.3/dd/d1a/group__imgproc__feature.html#ga8618180a5948286384e3b7ca02f6feeb). Możemy przyjąć, że przetwarzane zdjęcie jest pojedynczą klatką uzyskaną w kamery znajdującej się na jadącym samochodzie.\n",
"\n",
"Kolejne kroki mogą wyglądać następująco:\n",
"\n",
"1. progowanie obrazu w celu uzyskania pasów na drodze,\n",
"2. ograniczenie przetwarzanego obrazu do interesującego nas fragmentu (np. może to być traprez osadzony na dole ekranu zwężający się do środka - góra i boki nas za bardzo nie interesują),\n",
"3. wykrycie krawędzi,\n",
"4. wykrycie linii transformatą Hougha,\n",
"5. ekstrapolacja znalezionych wyżej linii,\n",
"6. naniesienie linii na obraz wejściowy."
]
},
2022-11-27 23:20:17 +01:00
{
"cell_type": "code",
"execution_count": 53,
"id": "a67aae09",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7efc47e90f10>"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"img = cv.imread(\"img/road-lanes.jpg\", cv.IMREAD_GRAYSCALE)\n",
"img_orig = cv.imread(\"img/road-lanes.jpg\", cv.IMREAD_COLOR)\n",
"_, img_bin = cv.threshold(img, 195, 255, cv.THRESH_BINARY)\n",
"\n",
"#kernel_size = 3\n",
"#blur_gray = cv.GaussianBlur(img,(kernel_size, kernel_size),0)\n",
"edges = cv.Canny(img_bin, 30, 250)\n",
"\n",
"blank_image = np.zeros((edges.shape[0],edges.shape[1]), np.uint8)\n",
"\n",
"imshape = blank_image.shape\n",
"\n",
"vertices = np.array([[(0,imshape[0]),(450, 320), (500, 320), (imshape[1],imshape[0])]], dtype=np.int32)\n",
"cv.fillPoly(blank_image, vertices, 255)\n",
"masked_edges = cv.bitwise_and(img_bin, blank_image)\n",
"\n",
"plt.imshow(masked_edges, cmap='gray')"
]
},
2022-11-27 19:15:49 +01:00
{
"cell_type": "markdown",
"id": "63a04ced",
"metadata": {},
"source": [
"![Pasy wykryte na drodze](img/road-lanes-detected.png)"
]
2022-11-27 23:20:17 +01:00
},
{
"cell_type": "code",
"execution_count": 61,
"id": "081403e6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7efc47b77a60>"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAFHCAYAAACLR7eXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxSElEQVR4nO3de3zU1Z3/8VdCLiSGSYCQBIQoWlZE0CpoHGlrW1MoTVtF2qKLLl5++kNCC8jSknbF/trasHXbrbYu9rIVu7WlYotdXaSliUKpEUiUFpFSrbBJMZNUaSaA5P75/XFkdCSXmdzmO8n7+Xich2S+ZyZn/E5m3nO+55JgZoaIiIiIhyTGugEiIiIi76aAIiIiIp6jgCIiIiKeo4AiIiIinqOAIiIiIp6jgCIiIiKeo4AiIiIinqOAIiIiIp6jgCIiIiKeo4AiIiIinhPTgPLAAw9w9tlnM3LkSAoKCti9e3csmyMiIiIeEbOA8vOf/5w777yTu+++m+eff56LLrqIuXPnUl9fH6smiYiIiEckxGqzwIKCAi699FK++93vAtDR0cGkSZP47Gc/y5o1a7q9b0dHB6+99hqjRo0iISFhMJorIiIifWRmHDt2jAkTJpCY2H0fSdIgtSlMS0sLVVVVlJSUhG5LTEyksLCQioqK0+o3NzfT3Nwc+vnIkSNMmzZtUNoqIiIi/aumpoaJEyd2Wycml3hef/112tvbyc3NDbs9NzeXQCBwWv3S0lIyMzNDReFEREQkfo0aNarHOnExi6ekpIRgMBgqNTU1sW6SiIiI9FIkwzNicoknOzubESNGUFdXF3Z7XV0deXl5p9VPTU0lNTV1sJonIiIiMRaTHpSUlBRmzpxJWVlZ6LaOjg7Kysrw+/2xaJKIiIh4SEx6UADuvPNOFi9ezKxZs7jsssv49re/zYkTJ7j55ptj1SQRERHxiJgFlIULF/K3v/2NtWvXEggEeO9738vWrVtPGzgrIiIiw0/M1kHpi8bGRjIzM2PdDBEREemFYDCIz+frtk5czOIRERGR4UUBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDxHAUVEREQ8RwFFREREPEcBRURERDwn6oCyY8cOPvGJTzBhwgQSEhJ4/PHHw46bGWvXrmX8+PGkpaVRWFjIyy+/HFbn6NGjLFq0CJ/PR1ZWFrfeeivHjx/v0xMRERGRoSPqgHLixAkuuugiHnjggU6Pf+Mb3+D+++/nwQcfZNeuXZxxxhnMnTuXpqamUJ1Fixaxf/9+tm3bxpNPPsmOHTu4/fbbe/8sREREZGixPgBs8+bNoZ87OjosLy/P7r333tBtDQ0Nlpqaaj/72c/MzOyll14ywPbs2ROq89RTT1lCQoIdOXKk09/T1NRkwWAwVGpqagxQUVFRUVFRicMSDAZ7zBj9Ogbl0KFDBAIBCgsLQ7dlZmZSUFBARUUFABUVFWRlZTFr1qxQncLCQhITE9m1a1enj1taWkpmZmaoTJo0qT+bLSIiIh7TrwElEAgAkJubG3Z7bm5u6FggECAnJyfseFJSEmPGjAnVebeSkhKCwWCo1NTU9GezRURExGOSYt2ASKSmppKamhrrZoiIiMgg6dcelLy8PADq6urCbq+rqwsdy8vLo76+Pux4W1sbR48eDdURERGR4a1fA8rkyZPJy8ujrKwsdFtjYyO7du3C7/cD4Pf7aWhooKqqKlSnvLycjo4OCgoK+rM5IiIiEqeivsRz/PhxXnnlldDPhw4dYu/evYwZM4b8/HxWrFjB1772NaZMmcLkyZO56667mDBhAtdccw0A559/Ph/96Ee57bbbePDBB2ltbWXZsmVcd911TJgwod+emIiIiMSxaKcWP/30051OGVq8eHFoqvFdd91lubm5lpqaaldddZUdPHgw7DHeeOMNu/766y0jI8N8Pp/dfPPNduzYsYjbEAwGYz5FSkVFRUVFRaV3JZJpxglmZsSZxsZGMjMzY90MERER6YVgMIjP5+u2jvbiEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc+JKqCUlpZy6aWXMmrUKHJycrjmmms4ePBgWJ2mpiaKi4sZO3YsGRkZLFiwgLq6urA61dXVFBUVkZ6eTk5ODqtXr6atra3vz0ZERESGhKgCyvbt2ykuLua5555j27ZttLa2MmfOHE6cOBGqs3LlSp544gk2bdrE9u3bee2117j22mtDx9vb2ykqKqKlpYVnn32Whx9+mA0bNrB27dr+e1YiIiIS36wP6uvrDbDt27ebmVlDQ4MlJyfbpk2bQnUOHDhggFVUVJiZ2ZYtWywxMdECgUCozvr1683n81lzc3NEvzcYDBqgoqKioqKiEoclGAz2+FnfpzEowWAQgDFjxgBQVVVFa2srhYWFoTpTp04lPz+fiooKACoqKpgxYwa5ubmhOnPnzqWxsZH9+/d3+nuam5tpbGwMKyIiIjJ09TqgdHR0sGLFCmbPns306dMBCAQCpKSkkJWVFVY3NzeXQCAQqvPOcHLq+KljnSktLSUzMzNUJk2a1Ntmi4iISBzodUApLi7mxRdfZOPGjf3Znk6VlJQQDAZDpaamZsB/p4iIiMROUm/utGzZMp588kl27NjBxIkTQ7fn5eXR0tJCQ0NDWC9KXV0deXl5oTq7d+8Oe7xTs3xO1Xm31NRUUlNTe9NUERERiUNR9aCYGcuWLWPz5s2Ul5czefLksOMzZ84kOTmZsrKy0G0HDx6kuroav98PgN/vZ9++fdTX14fqbNu2DZ/Px7Rp0/ryXERERGSoiGLSjt1xxx2WmZlpzzzzjNXW1obKm2++GaqzZMkSy8/Pt/LycqusrDS/329+vz90vK2tzaZPn25z5syxvXv32tatW23cuHFWUlIScTs0i0dFRUVFRSV+SySzeKIKKF39ooceeihU5+TJk7Z06VIbPXq0paen2/z58622tjbscQ4fPmzz5s2ztLQ0y87OtlWrVllra2vE7VBAUVFRUVFRid8SSUBJeCt4xJXGxkYyMzNj3QwRERHphWAwiM/n67aO9uIRERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc9RQBERERHPUUARERERz1FAEREREc+
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"rho = 2 # distance resolution in pixels of the Hough grid\n",
"theta = np.pi/180 # angular resolution in radians of the Hough grid\n",
"threshold = 15 # minimum number of votes (intersections in Hough grid cell)\n",
"min_line_length = 40 #minimum number of pixels making up a line\n",
"max_line_gap = 125 # maximum gap in pixels between connectable line segments\n",
"line_image = np.copy(img_orig)*0 # creating a blank to draw lines on\n",
"lines = cv.HoughLinesP(masked_edges, rho, theta, threshold, np.array([]),min_line_length, max_line_gap)\n",
"\n",
"for line in lines:\n",
" for x1,y1,x2,y2 in line:\n",
" cv.line(line_image,(x1,y1),(x2,y2),(255,0,0),10)\n",
"\n",
"plt.imshow(line_image, cmap='gray')"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "f98416cb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7efc479c0760>"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lines_edges = cv.addWeighted(img_orig, 0.8, line_image, 1, 0)\n",
"plt.imshow(lines_edges[:,:,::-1])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "615d8f1d",
"metadata": {},
"outputs": [],
"source": []
2022-11-27 19:15:49 +01:00
}
],
"metadata": {
"author": "Andrzej Wójtowicz",
"email": "andre@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.8.10"
},
"subtitle": "04. Zaawansowane przetwarzanie obrazów i fotografia obliczeniowa [laboratoria]",
"title": "Widzenie komputerowe",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 5
}