widzenie-komputerowe-MP/wko-03.ipynb

1217 lines
9.7 MiB
Plaintext
Raw Permalink Normal View History

2022-10-24 14:26:23 +02:00
{
"cells": [
{
"cell_type": "markdown",
"id": "65dc9ba6",
"metadata": {},
"source": [
"![Logo 1](img/aitech-logotyp-1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Widzenie komputerowe </h1>\n",
"<h2> 03. <i>Wzmacnianie i filtrowanie obrazów</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": "5d8907b6",
"metadata": {},
"source": [
"# Przestrzenie kolorów\n",
"\n",
"Na początku załadujmy niezbędne biblioteki."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1752496d",
"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": "469da027",
"metadata": {},
"source": [
"W zagadnieniach związanych z przetwarzaniem obrazów najpopularniejszą przestrzenią kolorów jest addytywna przestrzeń [RGB](https://en.wikipedia.org/wiki/RGB_color_model) (ang. *red*, *green*, *blue*), w której poszczególne komponenty czerwonej, zielonej i niebieskiej barwy są dodawane w różnych proporcjach tak, aby uzyskać dany kolor. Poniżej znajduje się wizualizacja tej przestrzeni w postaci sześcianu:"
]
},
{
"cell_type": "markdown",
"id": "120644f9",
"metadata": {},
"source": [
"![Przestrzeń RGB](img/rgb-cube.png)\n",
"\n",
"Źródło: Wikipedia, [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0).\n",
"\n",
"Podczas pracy z OpenCV widzieliśmy, że standardowo biblioteka ta wczytuje obrazy z odwrotnym porządkiem kanałów, tj. BGR, więc aby wyświetlić obraz poprawnie np. przy pomocy biblioteki Matplotlib, musimy zmienić porządek kanałów na RGB.\n",
"\n",
"Poniżej znajduje się zdjęcie żetonów do pokera:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "6c5c516d",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"poker_chips_bgr = cv.imread(\"img/poker-chips.jpg\", cv.IMREAD_COLOR)\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(poker_chips_bgr[:,:,::-1])\n",
"plt.title(\"Image\");"
]
},
{
"cell_type": "markdown",
"id": "0bdb05ec",
"metadata": {},
"source": [
"Jak widać, żetony są w kolorach kolejno zielonym, czerwonym i niebieskiem. Wyświetlmy osobno każdy kanał obrazu (B, G i R):"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "c7f46bb4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x288 with 6 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(20,4))\n",
"plt.subplot(131)\n",
"plt.imshow(poker_chips_bgr[:,:,0], cmap='gray', vmin=0, vmax=255)\n",
"plt.title(\"Blue channel\")\n",
"plt.colorbar()\n",
"plt.subplot(132)\n",
"plt.imshow(poker_chips_bgr[:,:,1], cmap='gray', vmin=0, vmax=255)\n",
"plt.title(\"Green channel\")\n",
"plt.colorbar()\n",
"plt.subplot(133)\n",
"plt.imshow(poker_chips_bgr[:,:,2], cmap='gray', vmin=0, vmax=255)\n",
"plt.title(\"Red channel\")\n",
"plt.colorbar();"
]
},
{
"cell_type": "markdown",
"id": "3eede16c",
"metadata": {},
"source": [
"Możemy zauważyć, że w tym konkretnym przypadku faktycznie intensywność danego piksela najczęściej jest powiązana z danym kolorem (widać to po jasnoszarym wypełnieniu żetonów). Z drugiej strony, możemy zauważyć, że oryginalnie białe przerywane krawędzie żetonów mają wszędzie intensywność w okolicach maksymalnej wartości, tj. 255."
]
},
{
"cell_type": "markdown",
"id": "e5e9e78d",
"metadata": {},
"source": [
"W przestrzeni kolorów RGB, wszystkie trzy kanały zawierają informacje zarówno o kolorze, jak i o jasności. W niektórych zastosowaniach lepiej jest oddzielić składową koloru (chrominancja), od składowej jasności (luminancja). Bardziej intuicyjną przestrzenią kolorów jest [HSV](https://en.wikipedia.org/wiki/HSL_and_HSV) (ang. *hue*, *saturation*, *value*), która ma postać walca:\n",
"\n",
"![Przestrzeń HSV](img/hsv-cylinder.png)\n",
"\n",
"Źródło: Wikipedia, [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0).\n",
"\n",
"Współrzędna:\n",
"\n",
"* *hue* odpowiada za barwę; w OpenCV zakres wynosi od 0 do 180 stopni i tam też się zawija z powrotem,\n",
"* *saturation* odpowiada za nasycenie barwy; różne odcienie danego koloru są tożsame z różnymi wartościami tej współrzędnej,\n",
"* *value* odpowiada za jasność danej barwy, tj. czy kolor jest jasny czy ciemny, ile światła pada na dany obiekt.\n",
"\n",
"Poniżej możemy zobaczyć zdjęcie z żetonami rozbite na trzy kanały H, S i V:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "91555deb",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x360 with 6 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"poker_chips_hsv = cv.cvtColor(poker_chips_bgr, cv.COLOR_BGR2HSV)\n",
"\n",
"plt.figure(figsize=(20,5))\n",
"plt.subplot(131)\n",
"plt.imshow(poker_chips_hsv[:,:,0], cmap='gray', vmin=0, vmax=180)\n",
"plt.title(\"Hue\")\n",
"plt.colorbar()\n",
"plt.subplot(132)\n",
"plt.imshow(poker_chips_hsv[:,:,1], cmap='gray', vmin=0, vmax=255)\n",
"plt.title(\"Saturation\")\n",
"plt.colorbar()\n",
"plt.subplot(133)\n",
"plt.imshow(poker_chips_hsv[:,:,2], cmap='gray', vmin=0, vmax=255)\n",
"plt.title(\"Value\")\n",
"plt.colorbar();"
]
},
{
"cell_type": "markdown",
"id": "03381048",
"metadata": {},
"source": [
"W przypadku kanału H znacznie lepiej jest zastosować mapę kolorów `hsv` zamiast skali odcieni szarości:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "424aab27",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABF8AAAEoCAYAAACOxV66AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOz9ebwtx1nfC3+fqh7WsKcza5ZsybJlbGwsD2EKmEzOQOACn9wwBMgF/CYBLuYmTEnAhMAbQsKUF3jBcAmQMISEhJiEACHAJYFgWzKeZdmyJUs60pnP2XuvsburnvtHVfXqvc4+kjwIS3H/7K2zdq8eqqure/fzq9/ze0RV6dGjR48ePXr06NGjR48ePXr06PH0wHy8G9CjR48ePXr06NGjR48ePXr06PG/MnrypUePHj169OjRo0ePHj169OjR42lET7706NGjR48ePXr06NGjR48ePXo8jejJlx49evTo0aNHjx49evTo0aNHj6cRPfnSo0ePHj169OjRo0ePHj169OjxNKInX3r06NGjR48ePXr06NGjR48ePZ5G9ORLjx49evTo0aNHjx49evTo0eMTGiLy0yJyTkTe1Vn2UhH5IxF5m4jcIyKvjMtFRP6FiDwgIu8QkZc92f578qVHjx49evTo0aNHjx49evTo8YmOnwFes7bs+4B/pKovBb4j/g7wF4HnxZ/XAv//J9t5T7706NGjR48ePXr06NGjR48ePT6hoaq/D1xaXwxsxc/bwGPx8+cBP6cBfwTsiMj1T7T/7GPZ2B49evTo0aNHjx49evTo0aNHj/9F8DrgN0XknxPEK58Wl98IPNJZ79G47PFr7agnX3r06NGjR48ePXr06NGjR48ezwq8Rkq9gP+wt7uX5t3AorPoDar6hifZ7G8D36iqvyIifw34v4E/+2EfnJ586dGjR48ePXr06NGjR48ePXo8S3ABuIcbPuzthIcXqvryD3OzrwC+IX7+t8BPxc+ngZs7690Ul10TvedLjx49evTo0aNHjx49evTo0eNZAgGKj+DnI8JjwGfFz58DvD9+fiPw5bHq0Z8CdlX1milH0CtfevTo0aNHjx49evTo0aNHjx7PGiTy5WO8V5FfBD4bOC4ijwKvB74G+GERyQgpS6+Nq/868JeAB4AZ8DefbP89+dKjR48ePXr06NGjR48ePXr0eJbg6SFfVPWL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
"text/plain": [
"<Figure size 1440x360 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(20,5))\n",
"plt.subplot(121)\n",
"plt.imshow(poker_chips_bgr[:,:,::-1])\n",
"plt.title(\"Image\")\n",
"plt.subplot(122)\n",
"plt.imshow(poker_chips_hsv[:,:,0], cmap='hsv', vmin=0, vmax=180)\n",
"plt.title(\"Hue\")\n",
"plt.colorbar();"
]
},
{
"cell_type": "markdown",
"id": "80b1c370",
"metadata": {},
"source": [
"Patrząc teraz na kanał H możemy zauważyć które zakresy wartości są odpowiedzialne za dany kolor. Widzimy również, że np. stół, na którym stoją żetony, jest równie czerwony jak środkowe żetony, jednak patrząc na składową V możemy zauważyć, że stół jest znacznie ciemniejszy."
]
},
{
"cell_type": "markdown",
"id": "87e9ab66",
"metadata": {},
"source": [
"# Histogramy\n",
"\n",
"Do przeanalizowania częstości występowania jakiegoś koloru możemy stworzyć histogram dla wartości pikseli kanału H:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "e108c4e7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x360 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"H, S, V = cv.split(poker_chips_hsv)\n",
"\n",
"H_array = H.flatten()\n",
"\n",
"plt.figure(figsize=[20,5])\n",
"plt.subplot(121)\n",
"plt.imshow(poker_chips_bgr[...,::-1])\n",
"plt.title(\"Image\")\n",
"plt.subplot(122)\n",
"plt.hist(H_array, bins=180, color='black')\n",
"plt.title(\"Histogram for H channel\");"
]
},
{
"cell_type": "markdown",
"id": "b9d54aff",
"metadata": {},
"source": [
"Okolice 0 i 180 odpowiadają za barwę czerwoną, 70 za zieloną a 110 za niebieską. W okolicach tych wartości możemy zauważyć charakterystyczne piki na histogramie, które świadczą o tym które kolory dominują na zdjęciu. Przy analizie obrazu można rozważyć uwzględnienie składowej V jako wagi podczas wyliczania dominacji poszczególnych kolorów.\n",
"\n",
"Histogramy mogą być również obliczane pionowo i poziomo. Poniżej możemy zobaczyć jak histogramy mogą być użyte do wskazania gdzie znajdują wiersze/kolumny z tekstem (jest to dość klasyczne podejście):\n",
"\n",
"![Przykład histogramu pionowego i poziomego](img/hv-histograms.jpg)\n",
"\n",
"Źródło: L. Kumari et al. (2010) \"Text Orientation Detection from Document Image of Indian Scripts\"."
]
},
{
"cell_type": "markdown",
"id": "3d3fbd99",
"metadata": {},
"source": [
"## Zadanie 1\n",
"\n",
"[Wyrównanie histogramu](https://pl.wikipedia.org/wiki/Wyr%C3%B3wnanie_histogramu) jest operacją, która ma na celu poprawienie kontrastu obrazu. Przy pomocy funkcji [`cv.equalizeHist()`](https://docs.opencv.org/4.5.3/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e) spróbuj wyrównać obraz `img/park-to-eq.jpg`.\n",
"\n",
"1. Najpierw spróbuj wyrównać każdy kanał R, G i B osobno. Czy wynik spowoduje poprawne odwzorowanie barw?\n",
"2. Następnie spróbuj użyć obrazu w przestrzeni HSV. Czy każdy kanał musi zostać wyrównany?\n",
"\n",
"![Wyniki](img/park-results.png)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "b38be472",
"metadata": {},
"outputs": [],
"source": [
"import cv2 as cv\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"import numpy as np\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 113,
2022-10-24 14:26:23 +02:00
"id": "2410d740",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Merged')"
]
},
2023-01-04 14:09:18 +01:00
"execution_count": 113,
2022-10-24 14:26:23 +02:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2023-01-04 14:09:18 +01:00
"image/png": "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
2022-10-24 14:26:23 +02:00
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
2023-01-04 14:09:18 +01:00
"image = cv.imread(\"img/park-to-eq.jpg\")\n",
"image = cv.cvtColor(image, cv.COLOR_BGR2HSV)\n",
2022-10-24 14:26:23 +02:00
"\n",
2023-01-04 14:09:18 +01:00
"# image[:,:,0] = cv.equalizeHist(image[:,:,0])\n",
"# image[:,:,1] = cv.equalizeHist(image[:,:,1])\n",
2022-10-24 14:26:23 +02:00
"image[:,:,2] = cv.equalizeHist(image[:,:,2])\n",
"\n",
2023-01-04 14:09:18 +01:00
"image = cv.cvtColor(image, cv.COLOR_HSV2RGB)\n",
2022-10-24 14:26:23 +02:00
"plt.imshow(image)\n",
"plt.title(\"Merged\")\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 98,
2022-10-24 14:26:23 +02:00
"id": "5043b7c7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Merged')"
]
},
2023-01-04 14:09:18 +01:00
"execution_count": 98,
2022-10-24 14:26:23 +02:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"\n",
2023-01-04 14:09:18 +01:00
"image = cv.imread(\"img/park-to-eq.jpg\")\n",
"\n",
"image = cv.cvtColor(image, cv.COLOR_BGRA2RGBA)\n",
2022-10-24 14:26:23 +02:00
"\n",
"image[:,:,0] = cv.equalizeHist(image[:,:,0])\n",
"image[:,:,1] = cv.equalizeHist(image[:,:,1])\n",
"image[:,:,2] = cv.equalizeHist(image[:,:,2])\n",
"plt.imshow(image)\n",
"plt.title(\"Merged\")"
]
},
{
"cell_type": "markdown",
"id": "561bf3dd",
"metadata": {},
"source": [
"## Zadanie 2\n",
"\n",
"Klasyczny algorytm wyrównania histogramu używa wszystkich pikseli znajdujących się na obrazie. W niektórych przypadkach lepiej jest użyć wyrównania adaptacyjnego [CLAHE](https://en.wikipedia.org/wiki/Adaptive_histogram_equalization) (ang. *Contrast Limited Adaptive Histogram Equalization*), które poprawia kontrast lokalnie.\n",
"\n",
"1. Na początku spróbuj wyrównać obraz `img/man-at-desk.jpg` w przestrzeni HSV przy pomocy [`cv.equalizeHist()`](https://docs.opencv.org/4.5.3/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e), podobnie jak w poprzednim zadaniu.\n",
"2. Następnie dla porównania użyj [`cv.createCLAHE()`](https://docs.opencv.org/4.5.3/d6/dc7/group__imgproc__hist.html#gad689d2607b7b3889453804f414ab1018) z parametrami `clipLimit=2.0` i `tileGridSize=(5,5)`, tak aby uzyskać obiekt, na którym użyjesz metody `apply()` na wybranym kanale obrazu.\n",
"\n",
"![Wyniki](img/man-at-desk-results.jpg)"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 116,
2022-10-24 14:26:23 +02:00
"id": "ee98c0f3",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Merged')"
]
},
"execution_count": 116,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAMIAAAEICAYAAAAN5StXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOz9abBtW5bfhf3GmHOttZtzzm1eny8zK7NKKamqBEbCQnRhJDphLIccmKBxGDDGoQgH2MZBhBEOhwn7g+GDA9uEAwO2aYRtbMLYQgqkoDNYRliAUFO4SpaUVZmV3cv37rvdOWc3a805x/CHMfc5574m82W+TNcl9Wbmefec3ay99lpzzDnGf/zHf4i789n4bPyFPvTX+gQ+G5+Nl2F8Zgifjc8GnxnCZ+OzAXxmCJ+NzwbwmSF8Nj4bwGeG8Nn4bACfGcJfcENEfruIfOvX+jxetvGZIfyIh4h8XUQWEXn1A4//SRFxEfnSr9GpfTa+x/jMEH4842vA33n6Q0T+ImDzwxxIRPKP6qQ+Gx8/PjOEH8/4l4C/+87ffw/w+05/iMgkIv9zEfmGiLwrIv+0iKz7c79dRL4lIv+wiHwX+OdFZC0i/6KIPBWRPyMi/4O77o2IfE5E/lUReSQiXxOR/+6d59Yi8i/09/4S8Ft/7N/+P4PjM0P48Yw/BlyIyM+KSAL+DuD/cOf5fxz49cBfAvw64G3gf3zn+TeBh8BPAb8H+EeBLwE/DfwNwH/99EIRUeAPAn+6H+evA/5BEfmd/SX/KPAz/ed3Ekb52fjgcPfPfn6EP8DXgb8e+B8B/xjwNwH/FpABB74M7ICfufOevwL4Wv/9twMLsLrz/K8Av/PO3/8t4Fv9998GfOMD5/CPAP/8nff+TXee+z2n9372c/vzmf/54xv/EvBHiIn/++48/hoRL/wnInJ6TIB05zWP3P145+/PAd+88/fd338K+JyIPLvzWAL+Xx/z3l/9gb7FXyDjM0P4MQ13/1UR+RrwNwN/352n3gcOwM+7+7c/7u0f+Psd4PPAL/W/v3DnuW8Su8lXPuZY7/TX/2L/+4uf7Bv8hTU+ixF+vOPvA/5ad9/decyA/y3wvxCR1wFE5O07Pv1HjX8F+EdE5IGIvA38A3ee+4+Aqx5cr0UkichvEpHf+hHv/Tzw3/lRfbmfpPGZIfwYh7v/srv/8Y946h8Gvgr8MRG5BP5t4Dd8j0P9T4FvEbDsvw38X4G5f0YDfhcReH+N2HH+d8C9/t7/CeEOfQ34NwmX7bPxgSE9gPps/GdoiMh/G/g73P2v+bU+l5+U8dmO8J+BISJvichfJSIqIr8B+IeA//uv9Xn9JI0fiyGIyN8kIn9WRL4qIr/3x/EZf4GNEfhngCvg/wH8a8A/9Wt6Rj9h40fuGvUE0p8jEj/fAv5j4O9091/6nm/8bHw2fg3Hj2NH+MuAr7r7r7j7Avyfgd/9Y/icz8Zn40c2fhx5hLd5MYHzLSL7+bEjbbaeHzwgibG4ITIgLpgA7oiCIjTA3EmimEZWXBxcQYT+CsAVb4A6oo6IYCYggmMIhgBKotH6MQUQRDhlYFFRmjsuipzO4AM7qPf/CsJd+N9wVIyVKvdUWdEYzRlQxIxAUR1cbo7ppyO48IFH4h8BQUFOr4ujGEpToarQ+oNGwkxRKit3VmrkRFwoHBVBPM7THMwcw/upaBw/Lmr/QhLn7CAiiAgq8R1V4tvL6UTj/9TWyEO+OcSHht/8B8z7b/0e9JeISNyP03UXThfi9rgu/OqjK96/OnzsR32/8WuWUBOR30Ok+0n3HvDg7/274Pox9WxieP3zlGeCpIxkoVYjecPywFyObNOGeYLRnWTOPEJJsKSnnK0Ma5lytcXTBGnhwTTwtF0i7YJSjsj6kq3OVNuwa4UhJc7ycPfcAPA2UZcN1ZXmDfR91pOiNxnhSm1OWc5YTwlJB2rrhpWUoxeqVmZ/wHXe8zAVfkYu+csn+M+nzJcOlZVAWnYkAy/SJzDQjJIX3BWnETa+xtKES4NyiHO0kZoSRxLPtol3poH9cWAuibPsfHk68AYVscbXyhm/8N13yRvlLI18ebzkt967YN0grdc4iWKwzIV9K+wrLCbUZjRbIyqgIKq41TB+cbIU1q2xRlivE+MgPH72nGPbsNWZ1x9OpHEgLLfhrWEqWKt4c2LVSigJq47TqN5wgaxhuOKCkhBNSEqQDBEDGvjIX/l7Px128OMwhG/zYubz8/2xF4a7/7PAPwuQXn3Dd48Lm/Eh6XIHq4y4oW2mHAuya8zLFcNbrzHvn+IrGMiYZ3b1SDoKacgMumbfdqRF0bmRU6M1uM4FJ2HHK3SAgYmNTmhaIfkaRDiWhZwypVUcmHzL+XHL3IyjHdjmzD47y7zg6bQiQtbEesw4BTMjqVJqQdrISjOtJK6XAbMt7+TEO+01/ki65MIv+cJU+Yvuwe96cMbPXWaGcsSSQ24IiaFlaA6ywgeF0vD5OebQRLEVYI3UINPIFS7KNZ/L93nFYFVm8Mx/+nzDn71+n3fXG4a8Jl1WHj98lVU74+l+ZleesW6NLJBTZePK2TTAdqCZUGbloIVdSxyPM7WtaCnh3nCFWScWVa5aQucCTWF6lXtJWQ5HDiUxqSNtwZcZd/BxRKzvXg7eKs1rrP46YmQ0VZAGGvu3eA7jcxBPIN0VAJBPF+v+OAzhPwa+IiJfJgzg7wD+a9/rDSKCVNipsdL7tMPCzg+Mrizf+i4cK/bWfVqraJogO0s9YqI4Rl2gXl2S12eM5Zz27IrFDxzEyOs1Zgop3CZfjLWcUTXzak6c1RVP08yVLdTBqa2iPnFRV9Ri7K3SrLC3S9pQWaySXBlzRiQx14rKM8ycao1BE8dayMlQi5uW5wuWWVFR0mBoVt7JmXeXNf/JOxN/KBX+mvM9/+WLkd/ksFkWdFfjHqshbuCGJcHTioMof+a99/j5izeY5hnzhhZn0A2v5TX7xfiV3XOeHI/8ul//Jf7s+9fsfAu7PfspseyOlOtvsrY9/KbXEXGkNbxUWA0sFaQIokeSwpQzaxUe5gWboPiRuTYOi7PzgWqZWqAlo46K5AFX4YkY6g+5rkouM2MbWFXj4jxDPcBcbn2gpKDhrok6ssyIGJIFLONJMG0oID4ACuaxS8mtY/bDjh+5Ibh7FZF/APg3CPLXP+fuv/g93ySCZcHnhWWdsGdPqStB8kjanpEGYykGx8pUFKmNQmX//BnpYosfCwCtXaJNmB89It27wFeJ5dlzVqstVYy6LAgwz05bT7w3CPbsPfzeGToorIVz39J8C/uRo+5xWxiLYNOBVdsyt4R5ZUkO0no84WCG5kxpDXGlKbQeO+hSGFjhVmgHY5wmthl28wHRmUcF/vAj5d/XAz87DvyO7Sv85k3ly+05yY+IhcE7TjXhF3Z7/pn/4E/zT/ytfwsJYV4L+7XyrsEvv3/Nk0PiyVTY+jlfKsKye5fnfsG777zHsHlAQllNE6+9NpKkMqTKkEfUnCGPNBa87SL4sgTNcQunXBOskjMNmYtR8SY0N0qGY2vsfObQGktRXCa8GU0bLY8Uq9RaWDUn1wVpCiiSDcmKiIJFDJeyo1kRMvsycnV9RHLj4t4FW3VoDcR76PTpMZ8fS4zg7n8I+EOf9PXmDrsZHVa0Z5fU60vyFz+HUQEYhsQahcuF9vyaNmVsldH7Z+QZdBFmKsOYoSnD9j622zMcFHcjL5lpmjgeDa+VTGMZdhzeuMB3MK0n7PKa1b01y37B5JJLew5iEbhVZ9hNnNWHZColHYO+y03sCUBSBXe8WrhP/QUucJYGjs2oyUm2YnXcUA8KOGkYKOY8b6/wH03KH3/6nM+/8+f4p3/bF3llWfAmEdTiFFW+dWXsrkYoIwuVx1Pm3/vld9i1NeiKeSt84/IdPp+UMifefWcHr6y4uH/BikTOI2wTV+U9qpyRPaPVYmemkRxMEogg4qg3sAo6gCrQwq1p4ddorSQa2zRynhK4sSQ42swsMB+N2QsuCfcFLRk1QZKAaHyuCiQQSQiCVyCN7PbG5eWMjQOmzuPHTxgevMoqVwI1+HQ
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"\n",
"image = cv.imread(\"img/man-at-desk.jpg\")\n",
"\n",
"image = cv.cvtColor(image, cv.COLOR_BGR2HSV)\n",
"\n",
"# image[:,:,0] = cv.equalizeHist(image[:,:,0])\n",
"# image[:,:,1] = cv.equalizeHist(image[:,:,1])\n",
"image[:,:,2] = cv.equalizeHist(image[:,:,2])\n",
"\n",
"image = cv.cvtColor(image, cv.COLOR_HSV2RGB)\n",
"plt.imshow(image)\n",
"plt.title(\"Merged\")"
]
},
{
"cell_type": "code",
"execution_count": 131,
"id": "53b9e4f0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Merged')"
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
2023-01-04 14:09:18 +01:00
"\n",
"image = cv.imread(\"img/man-at-desk.jpg\")\n",
"image = cv.cvtColor(image, cv.COLOR_BGR2HSV)\n",
"\n",
"clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(5,5))\n",
"image[:,:,2] = clahe.apply(image[:,:,2])\n",
"\n",
"image = cv.cvtColor(image, cv.COLOR_HSV2RGB)\n",
"plt.imshow(image)\n",
"plt.title(\"Merged\")\n"
2022-10-24 14:26:23 +02:00
]
},
{
"cell_type": "markdown",
"id": "30ee7ddd",
"metadata": {},
"source": [
"## Regulacja tonacji kolorów za pomocą krzywych\n",
"\n",
"Podbijając lub wyciszając wartości poszczególnych kanałów możemy uzyskać ciekawe efekty artystyczne, które często możemy zauważyć na fotografiach lub na filmach.\n",
"\n",
"![Meksyk w amerykańskich filmach](img/mexico-meme.jpg)\n",
"\n",
"Źrodło: [Know Your Meme](https://knowyourmeme.com/photos/1505425-mexico-in-american-movies).\n",
"\n",
"Spróbujemy stworzyć filtr *ocieplający*. Na początku utworzymy tablice dla kanałów B i R, w której kluczami będą stare wartości pikseli, a wartościami poszczególnych kluczy będą nowe wartości pikseli (jest to tzw. [tablicowanie](https://pl.wikipedia.org/wiki/Tablicowanie), z ang. *lookup table*). Wyznaczymy kilka punktów między 0 a 255, a pozostałe wartości będą interpolowane:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 132,
2022-10-24 14:26:23 +02:00
"id": "c2477cb4",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"vals_1 = np.array([0, 100, 155, 200, 255])\n",
"vals_2 = np.array([0, 50, 95, 150, 255])\n",
"\n",
"points_full = np.arange(0, 256)\n",
"lut_b = np.interp(points_full, vals_1, vals_2)\n",
"lut_r = np.interp(points_full, vals_2, vals_1)\n",
"\n",
"fig, ax = plt.subplots(figsize=[5,5])\n",
"ax.plot(points_full, points_full, color='black', linestyle=\"--\")\n",
"ax.plot(points_full, lut_b, color='blue')\n",
"ax.plot(points_full, lut_r, color='red')\n",
"\n",
"ax.set(title='LookUp Tables for blue and red channels', xlabel='old value', ylabel='new value')\n",
"ax.grid();"
]
},
{
"cell_type": "markdown",
"id": "d14b4298",
"metadata": {},
"source": [
"Jak widać powyżej, np. dla kanału czerwonego piksel o wartości 50 będzie miał teraz wartość 100, a np. dla kanału niebieskiego piksel o wartości 200 będzie miał teraz wartość 150.\n",
"\n",
"Przy pomocy funkcji [`cv.LUT()`](https://docs.opencv.org/4.5.3/d2/de8/group__core__array.html#gab55b8d062b7f5587720ede032d34156f) możemy dokonać konwersji obrazu:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 133,
2022-10-24 14:26:23 +02:00
"id": "8ece671e",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x360 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"runners = cv.imread(\"img/runners.jpg\", cv.IMREAD_COLOR)\n",
"runners_warm = runners.copy()\n",
"\n",
"runners_b = runners[:,:,0]\n",
"runners_b_new = cv.LUT(runners_b, lut_b)\n",
"runners_warm[:,:,0] = runners_b_new\n",
"\n",
"runners_r = runners[:,:,2]\n",
"runners_r_new = cv.LUT(runners_r, lut_r)\n",
"runners_warm[:,:,2] = runners_r_new\n",
"\n",
"plt.figure(figsize=[10,5])\n",
"plt.subplot(121)\n",
"plt.imshow(runners[...,::-1])\n",
"plt.title(\"Image\")\n",
"plt.subplot(122)\n",
"plt.imshow(runners_warm[...,::-1])\n",
"plt.title(\"Warm filter\");"
]
},
{
"cell_type": "markdown",
"id": "1a745946",
"metadata": {},
"source": [
"# Splot\n",
"\n",
"Jeśli chcemy wygładzić, znaleźć krawędzie lub wyostrzyć obraz, to klasycznym rozwiązaniem tych problemów jest operacja [splotu](https://en.wikipedia.org/wiki/Kernel_(image_processing)), w której potrzebujemy obrazu wejściowego oraz tzw. maski (ang. *kernel*), czyli małej macierzy o specjalnych wartościach. Interaktywną wizualizację operacji splotu możemy znaleźć np. na stronie [Image Kernels](https://setosa.io/ev/image-kernels/), natomiast by poniższe materiały były zwięzłe, to w tym miejscu dodajmy tylko, że wartości poszczególnych masek są związane z uwzględnieniem wartości sąsiadów w celu uśrednienia wynikowej wartości lub z obliczaniem pochodnych na wartościach pikseli, tak aby uwzględnić dynamikę zmiany pikseli. Szczegółowy opis można znaleźć np. w rozdziale *3.2 Linear filtering* książki R. Szeliski *Computer Vision* (2021).\n",
"\n",
"## Rozmycie/wygładzenie\n",
"\n",
"### Filtr jednorodny\n",
"\n",
"Operację splotu wykonamy najpierw przy pomocy ogólnej funkcji [`cv.filter2D()`](https://docs.opencv.org/4.5.3/d4/d86/group__imgproc__filter.html#ga27c049795ce870216ddfb366086b5a04). Na początku spróbujemy usunąć szumy z obrazu poprzez wygładzenie z użyciem jednorodnej maski (ang. *box kernel*):"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 134,
2022-10-24 14:26:23 +02:00
"id": "790b0cdd",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0.04 0.04 0.04 0.04 0.04]\n",
" [0.04 0.04 0.04 0.04 0.04]\n",
" [0.04 0.04 0.04 0.04 0.04]\n",
" [0.04 0.04 0.04 0.04 0.04]\n",
" [0.04 0.04 0.04 0.04 0.04]]\n"
]
}
],
2022-10-24 14:26:23 +02:00
"source": [
"kernel_size = 5\n",
"kernel = np.ones((kernel_size, kernel_size), dtype=np.float32) / kernel_size**2\n",
"\n",
"print(kernel)"
]
},
{
"cell_type": "markdown",
"id": "accf85aa",
"metadata": {},
"source": [
"Następnie stosujemy operację splotu:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 135,
2022-10-24 14:26:23 +02:00
"id": "21a7eb12",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"lena = cv.imread(\"img/lena.png\", cv.IMREAD_COLOR)\n",
"lena_filtered = cv.filter2D(lena, -1, kernel, borderType=cv.BORDER_DEFAULT)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(121)\n",
"plt.imshow(lena[...,::-1])\n",
"plt.title(\"Image\")\n",
"plt.subplot(122)\n",
"plt.imshow(lena_filtered[...,::-1])\n",
"plt.title(\"Convolution result (box blur, 5x5)\");"
]
},
{
"cell_type": "markdown",
"id": "7b2fbc8d",
"metadata": {},
"source": [
"Niektóre maski są na tyle często używane, że ich wykorzystanie w splocie zostało zaimplementowane jako osobne funkcje. Np. powyższe rozmycie jest zaimplementowane w funkcji [`cv.blur()`](https://docs.opencv.org/4.5.3/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37):"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 136,
2022-10-24 14:26:23 +02:00
"id": "7a2668a4",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"lena_blurred_1 = cv.blur(lena, (3,3))\n",
"lena_blurred_2 = cv.blur(lena, (7,7))\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(131)\n",
"plt.imshow(lena[...,::-1])\n",
"plt.title(\"Original\")\n",
"plt.subplot(132)\n",
"plt.imshow(lena_blurred_1[...,::-1])\n",
"plt.title(\"Box blur (3x3)\")\n",
"plt.subplot(133)\n",
"plt.imshow(lena_blurred_2[...,::-1])\n",
"plt.title(\"Box blur (7x7)\");"
]
},
{
"cell_type": "markdown",
"id": "4d14482d",
"metadata": {},
"source": [
"### Filtr Gaussa\n",
"\n",
"Rozmycie jednorodne nadaje takie same wagi wszystkim sąsiadom danego piksela, jednak zwykle lepiej jest nadać większą wagę pikselom bliżej aktualnie rozważanego piksela. Można to uzyskać przy pomocy funkcji [`cv.GaussianBlur()`](https://docs.opencv.org/4.5.3/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1), gdzie wartości maski uzyskujemy z krzywej Gaussa:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 137,
2022-10-24 14:26:23 +02:00
"id": "7a718c52",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"lena_blurred_3 = cv.GaussianBlur(lena, (5, 5), 0, 0)\n",
"lena_blurred_4 = cv.GaussianBlur(lena, (25, 25), 20, 20)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(131)\n",
"plt.imshow(lena[...,::-1])\n",
"plt.title(\"Original\")\n",
"plt.subplot(132)\n",
"plt.imshow(lena_blurred_3[...,::-1])\n",
"plt.title(\"Gaussian blur (3x3, $\\sigma_x$ and $\\sigma_y$ calculated from kernel size)\")\n",
"plt.subplot(133)\n",
"plt.imshow(lena_blurred_4[...,::-1])\n",
"plt.title(r\"Gaussian blur (7x7, $\\sigma_x = 20$, $\\sigma_y = 20$)\");"
]
},
{
"cell_type": "markdown",
"id": "d62d1788",
"metadata": {},
"source": [
"### Filtr medianowy\n",
"\n",
"Niektóre rodzaje zakłoceń lepiej będzie nam usunąć przy pomocy tzw. filtrów nieliniowych. Poniżej mamy zdjęcie, które zawiera szum typu *sól i pieprz*:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 138,
2022-10-24 14:26:23 +02:00
"id": "a87374f6",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"noisy_lena = cv.imread(\"img/noisy-lena.png\", cv.IMREAD_COLOR)\n",
"\n",
"plt.figure(figsize=[10,10])\n",
"plt.imshow(noisy_lena[...,::-1])\n",
"plt.title(\"Original (salt & pepper)\");"
]
},
{
"cell_type": "markdown",
"id": "d69d6e14",
"metadata": {},
"source": [
"Funkcja [`cv.medianBlur()`](https://docs.opencv.org/4.5.3/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9) odpowiada za filtr medianowy, tj. dla każdego piksela wybieramy okno o zadanej szerokości, zawierające wartości pikseli sąsiadów, i wybieramy z nich medianę. Poniżej znajduje się przykładowy wynik:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 139,
2022-10-24 14:26:23 +02:00
"id": "65bc45bc",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"noisy_lena_median_blurred = cv.medianBlur(noisy_lena, 5)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(121)\n",
"plt.imshow(noisy_lena[...,::-1])\n",
"plt.title(\"Original (salt & pepper)\")\n",
"plt.subplot(122)\n",
"plt.imshow(noisy_lena_median_blurred[...,::-1])\n",
"plt.title(\"Median blurred (5x5, $r = 5$)\");"
]
},
{
"cell_type": "markdown",
"id": "b22ce707",
"metadata": {},
"source": [
"### Filtr bilateralny\n",
"\n",
"Próbując wygładzić/rozmyć obraz, często chcielibyśmy zachować również ostrość krawędzi. Rozwiązaniem tego problemu jest filtr bilateralny (dwustronny), który bierze pod uwagę nie tylko bliskość pikseli na współrzędnych obrazu (tak jak w wyżej opisanych metodach rozmycia liniowego), ale również bliskość wyrażoną w postaci zbliżonych wartości pikseli. Poniżej znajduje się przykład użycia funkcji [`cv.bilateralFilter()`](https://docs.opencv.org/4.5.3/d4/d86/group__imgproc__filter.html#ga9d7064d478c95d60003cf839430737ed):"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 140,
2022-10-24 14:26:23 +02:00
"id": "698299dc",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"kitty = cv.imread(\"img/kitty.png\", cv.IMREAD_COLOR)\n",
"\n",
"kitty_bilateral = cv.bilateralFilter(kitty, 15, 40, 80)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(121)\n",
"plt.imshow(kitty[...,::-1])\n",
"plt.title(\"Original\")\n",
"plt.subplot(122)\n",
"plt.imshow(kitty_bilateral[...,::-1])\n",
"plt.title(r\"Bilateral blur ($d = 15$, $\\sigma_\\mathrm{color} = 40$, $\\sigma_\\mathrm{space} = 80$)\");"
]
},
{
"cell_type": "markdown",
"id": "9f596edc",
"metadata": {},
"source": [
"## Wykrywanie krawędzi\n",
"\n",
"### Filtr Sobela\n",
"\n",
"Do klasycznego wykrywania krawędzi najczęj wykorzystuje się filtr Sobela, który opiera się na pierwszej pochodnej, a w OpenCV jest zaimplementowany w funkcji [`cv.Sobel()`](https://docs.opencv.org/4.5.3/d4/d86/group__imgproc__filter.html#gacea54f142e81b6758cb6f375ce782c8d). Możemy sprecyzować w których kierunkach (x/y) chcemy wykryć krawędzie:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 141,
2022-10-24 14:26:23 +02:00
"id": "e46fb6d3",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"lena_gray = cv.cvtColor(lena, cv.COLOR_BGR2GRAY)\n",
"\n",
"lena_sobel_x = cv.Sobel(lena_gray, cv.CV_32F, 1, 0)\n",
"lena_sobel_y = cv.Sobel(lena_gray, cv.CV_32F, 0, 1)\n",
"lena_sobel_xy = cv.Sobel(lena_gray, cv.CV_32F, 1, 1)\n",
"\n",
"cv.normalize(lena_sobel_x, lena_sobel_x, 0, 1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)\n",
"cv.normalize(lena_sobel_y, lena_sobel_y, 0, 1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)\n",
"cv.normalize(lena_sobel_xy, lena_sobel_xy, 0, 1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(141)\n",
"plt.imshow(lena_gray, cmap='gray')\n",
"plt.title(\"Image\")\n",
"plt.subplot(142)\n",
"plt.imshow(lena_sobel_x, cmap='gray')\n",
"plt.title(\"Sobel X gradients\")\n",
"plt.subplot(143)\n",
"plt.imshow(lena_sobel_y, cmap='gray')\n",
"plt.title(\"Sobel Y gradients\")\n",
"plt.subplot(144)\n",
"plt.imshow(lena_sobel_xy, cmap='gray')\n",
"plt.title(\"Sobel X and Y gradients\");"
]
},
{
"cell_type": "markdown",
"id": "3d5fc811",
"metadata": {},
"source": [
"### Filtr Laplace'a\n",
"\n",
"Innym podejściem jest filtr Laplace'a zaimplementowany w funkcji [`cv.Laplacian()`](https://docs.opencv.org/4.5.3/d4/d86/group__imgproc__filter.html#gad78703e4c8fe703d479c1860d76429e6), który wykorzystuje drugą pochodną. Jest on dość podatny na szumy, także zwykle wejściowy obraz na wstępie poddaje się wygładzeniu:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 142,
2022-10-24 14:26:23 +02:00
"id": "9e98f9f6",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIQAAAIqCAYAAABVFJGSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOz9eaxt65qfhb1jrnbOtdbe++y9zz11q27dqhJxUiEBYVCwhBQspUE24JhEyHQVgxNkEkiIpSQSIiJuFAKKEpM4kACiCzZgE0gUbOzEURI7nWwTucqFSUGEXdf3nnPuOWc3q5vdauYc+WPtZ8xn/tZY+5xbdW/dhWp80tKac8wxvuZtf+/7NaNp27aGMpShDGUoQxnKUIYylKEMZShDGcpQhvKrp4x+2B0YylCGMpShDGUoQxnKUIYylKEMZShDGcqvbBkSQkMZylCGMpShDGUoQxnKUIYylKEMZSi/ysqQEBrKUIYylKEMZShDGcpQhjKUoQxlKEP5VVaGhNBQhjKUoQxlKEMZylCGMpShDGUoQxnKr7IyJISGMpShDGUoQxnKUIYylKEMZShDGcpQfpWVISE0lKEMZShDGcpQhjKUoQxlKEMZylCG8qusDAmhoQxlKEMZylCGMpShDGUoQ3kEpWman2yapm2aZveXWc8fa5rm7/5+9Svq/rBpmn+/aZrxD6J+tfObmqb5Qz/INoYylF/tZUgIDWUoQ/meStM032qa5r/ww+7HUIYylKEMZShDGcoPszxmTNS27W9s2/Z/8wOq/h+qqn+pbdtFVVXTNP+Tpmm+0zTNRdM0f6lpmn/4q1bUNM3/rWmaV++e/XNN0/xmfmvb9g9X1X+qaZq/8vs/hKEMZShVQ0JoKEMZylCGMpShDGUoQxnKUIbyFUrTNAdV9XdX1R/Q5X++qn66bdsnVfXXVdXf1TTNf+UrVvnfqaqvv3v2t1fVH2ia5uv6/V97d30oQxnKD6AMCaGhDGUov6TSNM3f0zTN/6tpmn+iaZqzpmn+YtM0f927699pmuYLL1VumuZvaprmZ9/NAH2naZrfFfX91nezSm+apvlHPOvWNM2oaZp/qGmav/Du93+9aZrnv8JDHspQhjKUoQxlKEP50tI0zQdN0/yRdytfTt99/oZ+/xNN0/xjTdP8mXe46P/wEK5pmua3NU3zC03TXL7DWn9f/P6bm6b5uXf1/IWmaX6D2vh7333+y5qm+b++w1Cvm6b5V5qmeaY6vtU0zX+vaZqfb5rmvGmaP9Q0zeEDw/t1VXXWtu3HXGjb9j9o23ame9ZV9R97V/ff1jTNLzZN8+Td99/YNM1nTdN8+O7Zn2/b9paqqmqvqn5cdf2JqvqbHujLUIYylF9mGRJCQxnKUH455ddV1c9X1Yuq+ler6g9W1X+m7kDAz1TVP9k0zfG7e2dV9Vur6lndOfb/ZtM0f0tVVdM0f3lV/a+q6u+qqq9X1dOq+jG189+uqr+lqn59Vf1oVZ1W1T/1AxvVUIYylKEMZShDGcovvYyq6l+sqp+oqm9W1aKq/sm457dW1X+t7nDPbVX9vgfq+qKq/uaqelJVv62q/ommaf7qqqqmaf7aqvqXq+q/X3f46q+vqm/11NFU1T9WdxjqP1l3CZffFff8lqr6DVX1U1X1V1bV3/NAf/6KqvoP7jVwN3E3raqPq+qo7nBhtW37h6rq/11Vv69pmhd1t5ro723b9pWe/SNN0yyr6k/XXQLo/6Oqf6GqfpKE0lCGMpTvbxkSQkMZylB+OeUX27b9F9u2XVXVH6o7gPF72ra9atv2j1fVdb2bIWrb9k+0bfvvtm27btv25+tuCfCvf1fP31pVf7ht2/9n27bXVfU/rLtZIsp/o6r+B23bfty27VXdgZi/9Zd74OJQhjKUoQxlKEMZyve7tG37pm3bf7Nt23nbtpdV9Y/WBvNQfn/btn/+3cqaf6SqfkvTNDs9df3bbdv+hfau/Mmq+uNV9Z999/N/var+hbZt/8/v8NUnbdv++z11/Ifv7rl6l4j5vT39+X1t237atu3bqvrDVfVXPTC8Z1V12dPGP15VJ1X1V1fV76+qc/38D1TVf67ukj1/uG3bPxLP/s3vnv0bq+qPt2271s+09eyB/gxlKEP5ZZQhITSUoQzll1M+1+dFVVXbtnntuKqqaZpfp4MDz+suyfPy3X0/WlXf4aG2bedV9Ub1/ERV/e/fbU07q7vZolVVffT9Hc5QhjKUoQxlKEMZyi+vNE0zaZrmn3m3Ff6iqv7vVfUsEj7f0ee/VHdbpV5WlHdbrP5U0zRv32Ggv1H3/XhV/YWv0J+Pmqb5g03TfPKuP3+gp63P9Hle7/BbTzmtu+TNvfIuafWzdYf/freun1XV/7aq/tNV9T974Nmbtm3/WFX9DU3T/Jf0E22dPdCfoQxlKL+MMiSEhjKUofxKlX+1qv6tqvrxtm2fVtU/XXdLmKuqvltV3ls/rrttaJTvVNVvbNv2mf4O27b95Feo70MZylCGMpShDGUoX7X8d6vqP1FVv+7dYcl//bvrje7xOTnfrKqbqnrtSt4d4PxvVtX/tKo+atv2WVX9UdXznar6y75Cf/7Hdbfy+q9415+fib58L+Xnq+o//iX37LpfTdP8VXW3Pe5fq4e3xvU+W3db3L7Vtu3F99zToQxlKF9ahoTQUIYylF+pclJVb9u2Xb7b8/536rd/o6p+07tDqffrbkuYgco/XVX/aNM0P1FV1TTNh34t6VCGMpShDGUoQxnKD6nsNU1zqL/dusM8i6o6e3dY9O/see5nmqb5y5ummVTV76mqf+PdFnyX/ao6qKpXVXXbNM1vrKq/Qb//81X125qm+c+/ewHHjzVN89M9bZ1U1bSqzpum+bG6O3Pol1r+TN2tdvqxqu7FH3/fu4O0m3cY7x+oqv/Lu98P625F0j9cd2cg/VjTNH//u99++t0KqHHTNHtN0/xM3SXP/qTa+/VV9cd+Gf0dylCG8p4yJISGMpSh/EqVv7+qfk/TNJd1d0bQv84Pbdv+e3V3cPQfrLvVQtO6O0Tx6t0t/4u6W130x989/6fq7kDroQxlKEMZylCGMpQfZvmjdZf84e93VdX/vKrGdbfi509V1f+x57nfX1X/Ut1t1Tqsqn8wb3h3/tA/WHeY6bTuJtP+Lf3+Z+rdQdN1d2bPn6y7bfZZfnfdne1zXlX/dlX97763IW716fpdv39Gl//Ldbd17bLukj//y3d/VXeHWX+nbdv/9btzIH+mqv5HTdP8mrqb/PtddYf5XtXdK+j/trZt/6zq/juq6p/5pfZ3KEMZyvtL07btl981lKEMZSi/guXdm8nOqurXtG37iz/k7gxlKEMZylCGMpShfN9K0zR/oqr+QNu2/9wPuy+/lPLulfH/j6r6tW3bLn6A7fymqvqvtm37W35QbQxlKL/ay7BCaChDGcqjKE3T/KZ3hzAe1d1e+X+3+l+dOpShDGUoQxnKUIYylB9Sadv2Vdu2P/2DTAa9a+cPD8mgoQzlB1uGhNBQhjKUx1J+c1V9+u7v11TV394OSxiHMpShDGUoQxnKUIYylKEM5QdSfiBbxpqm+Q11d+bHTlX9c23b/uPf90aGMpShDGUoQxnKUIayVQYMNpShDGUoQxnKUL5q+b4nhJqm2amq/19V/Rer6uOq+neq6u9o2/b/+31taChDGcpQhjKUoQxlKF0ZMNhQhjKUoQxlKEP5XsoPYsvYX1tV/2Hbtn/x3Sn0f7DutoIMZShDGcpQhjKUoQzlB1cGDDaUoQxlKEMZylC+ctn9AdT5Y1X1HX3/uHpeD900zW+vqt9eVXVwcPDXfP3rX6+qqrZtq2maWq/XNRqNuu/+37Zt95tXODVN09XxUKGenv5s/TYajbo+5H2+/6E2/Lder7vnVqtVrVarWq/X1bZtrVarrh7X91C777vG8333ftXSR5+mabbGy/equkejvM//1+t19/0h3mZfRqPR1m95D7LCPdSb9zxEm+zD96u4vq8il9nXr/JMnz74mb5x99X3EE3ye+ra+3TgIX76WT4jF9m/7HPfGOib5cD39fHdbfbJS9L
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"lena_blurred = cv.GaussianBlur(lena_gray, (3, 3), 0, 0)\n",
"lena_laplacian = cv.Laplacian(lena_blurred, cv.CV_32F, ksize=3)\n",
"\n",
"cv.normalize(lena_laplacian, lena_laplacian, 0, 1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(121)\n",
"plt.imshow(lena_gray, cmap='gray')\n",
"plt.title(\"Image\")\n",
"plt.subplot(122)\n",
"plt.imshow(lena_laplacian, cmap='gray')\n",
"plt.title(r\"Laplacian (3x3)\");"
]
},
{
"cell_type": "markdown",
"id": "3f957805",
"metadata": {},
"source": [
"## Wyostrzanie\n",
"\n",
"Do wyostrzenia obrazu można wykorzystać 1) rozmycie obrazu posiadające informacje o niskich częstotliwościach, 2) uzyskanie informacji o wysokich częstotliwościach poprzez odjęcie wejściowego obrazu od jego rozmycia z pkt. 1), a następnie 3) dodanie do wejściowego obrazu wyniku z pkt. 2) przemnożonego przez pewien współczynnik. Wszystkie te trzy operacje można przybliżyć poprzez splot z poniższą maską:"
]
},
{
"cell_type": "code",
2023-01-04 14:09:18 +01:00
"execution_count": 143,
2022-10-24 14:26:23 +02:00
"id": "c402c3e0",
"metadata": {},
2023-01-04 14:09:18 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2022-10-24 14:26:23 +02:00
"source": [
"kernel = np.array((\n",
" [ 0, -1, 0],\n",
" [-1, 5, -1],\n",
" [ 0, -1, 0]))\n",
"\n",
"lena_sharp = cv.filter2D(lena, -1, kernel)\n",
"\n",
"plt.figure(figsize=[20,10])\n",
"plt.subplot(121)\n",
"plt.imshow(lena[...,::-1])\n",
"plt.title(\"Original\")\n",
"plt.subplot(122)\n",
"plt.imshow(lena_sharp[...,::-1])\n",
"plt.title(\"Sharpened\");"
]
},
{
"cell_type": "markdown",
"id": "9ddc074b",
"metadata": {},
"source": [
"## Wykrywanie krawędzi metodą Canny'ego"
]
},
{
"cell_type": "markdown",
"id": "a46abc4f",
"metadata": {},
"source": [
"## Zadanie 3\n",
"\n",
"Najczęściej wykorzystywaną metodą wykrywania krawędzi opiera się na metodzie Canny'ego, która zwraca cienkie krawędzie o szerokości 1 piksela. W metodzie tej mamy kolejno rozmycie, obliczanie gradientu, tłumienie niemaksymalne oraz progowanie z histerezą (szczegóły poszczególnych operacji znajdują się np. na stronie [AI Shack](https://aishack.in/tutorials/canny-edge-detector/)).\n",
"\n",
"OpenCV implementuje tę metodę poprzez funkcję [`cv.Canny()`](https://docs.opencv.org/4.5.3/dd/d1a/group__imgproc__feature.html#ga04723e007ed888ddf11d9ba04e2232de):\n",
"\n",
"* `threshold1` - zmiana tego parametru wpływa na łączenie przerwanych krawędzi,\n",
"* `threshold2` - zmiana tego parametru wpływa na liczbę wykrytych krawędzi,\n",
"* `apertureSize` - zmiana tego parametru wpływa na liczbę wykrytych krawędzi (jest to związane z użyciem filtru Sobela).\n",
"\n",
"Dodatkowo, przed użyciem metody Canny'ego zaleca się rozmyć w niewielkim stopniu obraz wejściowy.\n",
"\n",
"Przy pomocy interfejsu HughGUI stwórz niewielką aplikację, która pozwala na interaktywne eksperymenty z tymi parametrami (przykładowy zrzut ekranu poniżej):\n",
"\n",
"![HighGUI Canny](img/highgui-canny.png)"
]
2023-01-23 12:24:42 +01:00
},
{
"cell_type": "code",
"execution_count": 2,
"id": "b68fdade",
"metadata": {},
"outputs": [],
"source": [
"import cv2 as cv\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "305441e2",
"metadata": {},
"outputs": [
{
"ename": "error",
"evalue": "OpenCV(4.5.5) /io/opencv/modules/imgproc/src/smooth.dispatch.cpp:293: error: (-215:Assertion failed) ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1 in function 'createGaussianKernels'\n",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31merror\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_17561/1543211412.py\u001b[0m in \u001b[0;36mfuncCan\u001b[0;34m(thresh1, thresh2, apertureSize, blur)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0maperture_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetTrackbarPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Aperture size'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Canny'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mblur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetTrackbarPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Blur'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Canny'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mimage\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGaussianBlur\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mimage2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGaussianBlur\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0medge\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCanny\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mapertureSize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maperture_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31merror\u001b[0m: OpenCV(4.5.5) /io/opencv/modules/imgproc/src/smooth.dispatch.cpp:293: error: (-215:Assertion failed) ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1 in function 'createGaussianKernels'\n"
]
},
{
"ename": "error",
"evalue": "OpenCV(4.5.5) /io/opencv/modules/imgproc/src/smooth.dispatch.cpp:293: error: (-215:Assertion failed) ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1 in function 'createGaussianKernels'\n",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31merror\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_17561/1543211412.py\u001b[0m in \u001b[0;36mfuncCan\u001b[0;34m(thresh1, thresh2, apertureSize, blur)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0maperture_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetTrackbarPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Aperture size'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Canny'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mblur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetTrackbarPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Blur'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Canny'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mimage\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGaussianBlur\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mimage2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGaussianBlur\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0medge\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCanny\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mapertureSize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maperture_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31merror\u001b[0m: OpenCV(4.5.5) /io/opencv/modules/imgproc/src/smooth.dispatch.cpp:293: error: (-215:Assertion failed) ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1 in function 'createGaussianKernels'\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_17561/1543211412.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0m__name__\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"__main__\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/tmp/ipykernel_17561/1543211412.py\u001b[0m in \u001b[0;36mmain\u001b[0;34m()\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0;32mwhile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 30\u001b[0;31m \u001b[0mfuncCan\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 31\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0mk\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwaitKey\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;36m0xFF\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/tmp/ipykernel_17561/1543211412.py\u001b[0m in \u001b[0;36mfuncCan\u001b[0;34m(thresh1, thresh2, apertureSize, blur)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0maperture_size\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetTrackbarPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Aperture size'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Canny'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mblur\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetTrackbarPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Blur'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Canny'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mimage\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGaussianBlur\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0mimage2\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGaussianBlur\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mblur\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0medge\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCanny\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthresh2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mapertureSize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maperture_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"def funcCan(thresh1=0, thresh2=0, apertureSize=0, blur=0):\n",
" original=cv.imread(\"img/lena.png\",1)\n",
" img=original.copy()\n",
" thresh1 = cv.getTrackbarPos('Threshold 1', 'Canny')\n",
" thresh2 = cv.getTrackbarPos('Threshold 2', 'Canny')\n",
" aperture_size = 2 * cv.getTrackbarPos('Aperture size', 'Canny') + 3\n",
" blur = 2 * cv.getTrackbarPos('Blur', 'Canny') + 1\n",
" image=cv.GaussianBlur(img,(blur,blur),0)\n",
" image2=cv.GaussianBlur(img,(blur,blur),0)\n",
" edge = cv.Canny(image, thresh1, thresh2, apertureSize=aperture_size)\n",
" cv.imshow('Canny', edge)\n",
" cv.imshow('Original with blur',image2)\n",
" \n",
"def main():\n",
" original=cv.imread(\"img/lena.png\",1)\n",
" cv.namedWindow('Canny')\n",
" cv.imshow('Original',original)\n",
"\n",
" thresh1=100\n",
" thresh2=1\n",
" aperture_size = 0\n",
" blur = 2\n",
"\n",
" cv.createTrackbar('Threshold 1','Canny',thresh1,255,funcCan)\n",
" cv.createTrackbar('Threshold 2','Canny',thresh2,255,funcCan)\n",
" cv.createTrackbar('Aperture size','Canny',aperture_size,2,funcCan)\n",
" cv.createTrackbar('Blur','Canny',blur,20,funcCan)\n",
"\n",
" while(True):\n",
" funcCan(0,0,0,0)\n",
"\n",
" k = cv.waitKey(1) & 0xFF\n",
" if k == 27:\n",
" break\n",
"\n",
" # Close the window\n",
" cv.destroyAllWindows()\n",
" cv.waitKey(1)\n",
" \n",
"if __name__ == \"__main__\":\n",
" main()"
]
2022-10-24 14:26:23 +02:00
}
],
"metadata": {
"author": "Andrzej Wójtowicz",
"email": "andre@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3.8.12 64-bit",
"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.12"
},
"subtitle": "03. Wzmacnianie i filtrowanie obrazów [laboratoria]",
"title": "Widzenie komputerowe",
"vscode": {
"interpreter": {
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
}
},
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 5
}