s470623-wko/wko-03.ipynb

1602 lines
11 MiB
Plaintext
Raw Normal View History

2022-11-27 19:15:49 +01:00
{
"cells": [
{
"cell_type": "markdown",
"id": "65dc9ba6",
"metadata": {
"id": "65dc9ba6"
},
"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": {
"id": "5d8907b6"
},
"source": [
"# Przestrzenie kolorów\n",
"\n",
"Na początku załadujmy niezbędne biblioteki."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "1752496d",
"metadata": {
"executionInfo": {
"elapsed": 247,
"status": "ok",
"timestamp": 1669568762282,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "1752496d"
},
"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": "M1zDd051OMQF",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 2474,
"status": "ok",
"timestamp": 1669568008193,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "M1zDd051OMQF",
"outputId": "6f2b8a3a-696a-40f6-bb96-53efbe19913b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n",
"/content/drive/My Drive/aitech-wko-pub\n"
]
}
],
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')\n",
"%cd /content/drive/My Drive/aitech-wko-pub"
]
},
{
"cell_type": "markdown",
"id": "469da027",
"metadata": {
"id": "469da027"
},
"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": {
"id": "120644f9"
},
"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": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 315
},
"executionInfo": {
"elapsed": 1889,
"status": "ok",
"timestamp": 1669557396132,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "6c5c516d",
"outputId": "54d0f9d0-fa50-484b-9c96-f02bc3d065a8"
},
"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": {
"id": "0bdb05ec"
},
"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": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 194
},
"executionInfo": {
"elapsed": 1283,
"status": "ok",
"timestamp": 1669557402552,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "c7f46bb4",
"outputId": "da3eb6c2-40aa-4998-f19d-dd433abfd447"
},
"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": {
"id": "3eede16c"
},
"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": {
"id": "e5e9e78d"
},
"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": 5,
"id": "91555deb",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 238
},
"executionInfo": {
"elapsed": 1851,
"status": "ok",
"timestamp": 1669557429528,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "91555deb",
"outputId": "f56cc18e-64ef-41e7-be01-cd1108ba9e39"
},
"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": {
"id": "03381048"
},
"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": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 243
},
"executionInfo": {
"elapsed": 1783,
"status": "ok",
"timestamp": 1669557438891,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "424aab27",
"outputId": "9d94fc23-2ba3-4796-c2d9-cd53b9cb8547"
},
"outputs": [
{
"data": {
"image/png": "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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": {
"id": "80b1c370"
},
"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": {
"id": "87e9ab66"
},
"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": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 253
},
"executionInfo": {
"elapsed": 1962,
"status": "ok",
"timestamp": 1669557484527,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "e108c4e7",
"outputId": "c57cd602-f548-4d16-a221-24accbf53e0c"
},
"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": {
"id": "b9d54aff"
},
"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": {
"id": "3d3fbd99"
},
"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": 8,
"id": "2410d740",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 809
},
"executionInfo": {
"elapsed": 3057,
"status": "ok",
"timestamp": 1669557542834,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "2410d740",
"outputId": "0049f093-e00b-4ac1-823f-4b02099e2a02"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAGMCAYAAAAY6OzLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9aYwlWXbf97tLRLwt18qsvaq7qqt632Y4i2YhaY5EmiJNkx8sm6QMkbANSRRkwJQgQIZhWRYsQB8EyAJsQYtBQwZECxQJ2RJF0kMOZzgczgw50z3TPb1UL9XVtVdmZWXl9raIuPf6Q8SNF+/le5mvtu6aZvyB7soXy3034kXc+7/n/M85wjlHhQoVKlSoUKFChXuH/LA7UKFChQoVKlSo8FFBRawqVKhQoUKFChXuEypiVaFChQoVKlSocJ9QEasKFSpUqFChQoX7hIpYVahQoUKFChUq3CdUxKpChQoVKlSoUOE+oSJWFSpUqFChQoUK9wkVsapQocJDByHE+0KIP/dh96NChQoV7hQVsapQoUKFChUqVLhPqIhVhQoVHloIIX5RCPFHQoh/JITYEEK8J4T4bL79shBiVQjxC6Xjf1II8R0hxFa+/++OtPeXhBAXhRC3hBD/Y9kyJoSQQoi/LYQ4n+//NSHE4gd8yRUqVPg+R0WsKlSo8LDj08CrwAHgV4F/DXwSOAP8l8D/JoRo5ce2gb8EzAM/CfySEOJnAIQQTwP/BPiLwBFgDjhW+p7/FvgZ4IeBo8Bt4H9/kBdWoUKFjx5EVSuwQoUKDxuEEO8D/w1wHPgfnHNn8+3PkZGsw865lXzbLeDPOue+O6ad/xVwzrlfFkL8HeAp59zP5fsawAbwE8653xNCvAn8defcl/L9R4BLQN05lz7YK65QocJHBfrD7kCFChUq7IOV0t9dAE+qSttaAEKITwP/AHgWCIEI+Df5cUeBy/4k51wnJ2UejwD/VghhS9sMcAi4el+upEKFCh95VK7AChUqfJTwq8C/A0445+aAfwqIfN91MgsYAEKIOpl70eMy8Oedc/Ol/2rOuYpUVahQYWpUxKpChQofJcwA6865nhDiU8DPl/b9OvBTufg9BP4uA9IFGQn7+0KIRwCEEMtCiJ/+gPpdoUKFjwgqYlWhQoWPEv4a8PeEENvA3wF+ze9wzr1OJlD/12TWqx1gFejnh/xjMmvXF/Pzv0kmnK9QoUKFqVGJ1ytUqPCnEnkk4QZw1jl34cPuT4UKFT4aqCxWFSpU+FMDIcRPCSEaQogm8A+B7wHvf7i9qlChwkcJFbGqUKHCnyb8NHAt/+8s8LOuMttXqFDhPuKBuQKFED9OpllQwP/hnPsHD+SLKlSoUKFChQoVHhI8EGIlhFDA28CPAleAbwE/55x7475/WYUKFSpUqFChwkOCB+UK/BTwrnPuPedcTBaFU4UtV6hQoUKFChU+0nhQmdePUcpwTGa1GgpbFkL8ZeAvA4go/IHoeJanzxoJwoGRYAEHaJdlmxGOA/U27TSin2qcAykdQjhqOiWxitRIIj2oPiHILHJuKF1NBusEUjisG78PQApXfBYia8+46fioc4J7MQi6Mf0a7Lv7drMGxrTt2xSlvycds9/55c8VKnyYEOV/3fhnd9c51cN73zDudrvSzqFxY4r7PsXP90DPv+PvmzAwOjH0nIl8tx/bxf3upxg3C44cks9xex0ocMW8WIZ1AiWy+Xh0/tzdBgjh8vlZFPP0NFBDhRF27xt3lVtxjdQoamFCnCrqQYJzgtgoajrJuIOVtIKYSKakTtJOQ/pxQKvWo5cGGCsH824qiS9fWXPOLY/rx4dW0sY598+Bfw4QnTjhTvziLwNgA0gWU5oXAnrLFo70cEagrtbQbUH/8S4R8MzJ62z06tzaadDdiXjk6C3WdprM1Xs8tbBC6iSbcQ2A1CkkDjnhB2knEXafRy61EimyB6qfahK7P7lKjcK6jCCZKY4fRZzoXQTKGonN2yoTS3sX7VuTD2qlicY5wAqQDiHA+WNs6f5YkZFekf+X31bZlw8FmXIKhPmwe1HhYYELHE49BA/mw4iHdRHkhzM5pmOjPGXCbyvK26XLxi3hEMrh7PjxXuTj3gcFkRMRqbJB1Np8AX+fib2UDq3NrlnOGxcAtDIo6VByMnGBjCw1gmT3dhyBMkPGiFCmaGnpmQBdGpRrKkVLQ88EOaHpo8ZccyjTvC1J6iRNFaPloJ0gbzNxCoWlpfskVhUGk7d3DrLameHyxSVkR6F6GYWTKSQn+5w9tgrAXNTlkcY6UjjW4yaX2/O8t3oAe6XBIy9e4713DrP0J4p4XpB+fhP9h3O89o/+xsVJ9+hBEaurwInS5+PsVWtLO2QscBrqK6B3AvqLLrsJwlGf6bM1F5A2RDaPbwfc6jZIjMJaiQ4NvVRzYn6DR1vrXOvM0U0Djjc3uB3XqansIUgnkI9Ip3TTYM8L0qWHLdIpTEGutMp+dOcE1lmSVI21jk08XxuSRA1tk8pmqxwnsFYilR1eIUiLs3JPa9egLYezOXnKIQTZQCVdPoAJhM6OA8AICCwku6/daYdIxK5t5bdZGFEQsQeFytjw/QdhREZ+JPedBFWkimHRh2M6w5AR2e8h3G7RiG9Dcnfv837rwHyMy8ahEauWHu68GEe+8jaEzEiUkC5rU+RWmYfgmZDSFoRqsC0nJUbeF7IVBCa3DO2NKEj3JVTTQApXEKiUwdwlRx64SKW005DUSkJlxpIqj7pKaKdRTtKGV8yJy74jkikqfxADaQqv0kzQ56VLp5g5uINzgvaVGWRfkNQhrCU8v3CVvtX8zjtP863OKR49eZPYKEJlePrICq2Tfd7fWuTIVyROOsQ6xN+bQ3f2/i0eFLH6FnBWCHGKjFD9LMOlJYYwX+/QO9MnvBSSzGSPQHRmi/Z6neXZDqEyNB6N6SeauXqP8KhhK464uToLVvC5p97l0vYCT83e4Ourp3h6YQVdN0QyZTuN6JmAlu5Ty1n2ThIN3wRhaGpH6iR9k92SbhJQH8PKPaYlV5C9EEo4ZDBg8v1k/1svhSMIBuRKa4sxMn/5XL66ytpUqrRPmoJYmVRNaj7rmwRyS55LS9fiLVn5i+4HLye8JSt/sGw2+OIoJkYsBcESRmTWfgEusLsGeBELnAK0Q8Ti/qycHzBxqzAZ/re8s5NA9Et/50TfhtUPed/gpvgbskWVyxc/nlSpEdeQLb2nnlz5idFMmMJHiczoYZ4cldtyGSEaDbCaaFGSbohkZYQqa0946/o9wKalBah0WdtTQEqLkA5jshOUspnFbA8yUYy3TuT34c7ehWkJlRTuvpCquk52eYUKgmXl0PaGTrjZaxXWKL2Hay+2mjS3QNXV+Pk4kik1ObxPCYsScLK+zp97/g1eWjnOQqPLc599my/+P5/i2H90mePNDc7vLNHQCZ965CKvrh7h8uoiszMdDsx1+MTCRf7PVz5D8zt1ei86GtcEaQPShiPc+RCIlXMuFUL8deD/I0u38Ct5OYmx2NxqcuBchIzB1MBE0L84w5nnr9LUMZtxDZNqXjh4jeudWd66eBi5GUDTIOspX//2E6ilPv3FgLXbM3wn0TTChO1exJHZLRo6LhhyU8c0dEJnxEIlhSXMf+C+0dSD7EHZy5rlXYMe+1mjChI0xcojNRKl7BC5StPhN7m8ghEiM/WO7tNBSroPifMDlQhygmXB5YPA6CBWHBvaYgWIFbhEQppZGEX5PuQrWyE9VytduwByjuuEw0XZuaL/QYsgKtwtXOhwkywG00KAqX/4FoSPNMq3VzLexTZ0sBi8q+PIkidb2kEsB1KBURLmIQA9xtItBuMOgEsFwg9X+ffv5ZpziczOlw45Qt68Vep+ufaC2kC766wYyC9Gxt5JGBqf97GYieLa3R1Z15SyaHVnJGmSDmoUNZ0OeW486joZcvPthYZOCKRhPuySOjmRLMHAyiWFo6n7u/YHwhSuwEnnWgTtNOT26gz/xadfZklv85tPPcvpmTXqKmFG97jUXuSNa4dR2vJXXvgqt5MmJrcAOCN
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image1 = cv.imread(\"img/park-to-eq.jpg\", cv.IMREAD_COLOR)\n",
"image = cv.cvtColor(image1,cv.COLOR_BGR2GRAY)\n",
"cv.equalizeHist(image, image)\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image)\n",
"plt.title(\"Image\");\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image1)\n",
"plt.title(\"Source image\");"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "YjGpJu3HPddT",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 413
},
"executionInfo": {
"elapsed": 1957,
"status": "ok",
"timestamp": 1669559403463,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "YjGpJu3HPddT",
"outputId": "e2d203a0-3e94-4856-ffcf-fbc72f4aac7e"
},
"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": [
"image_hsv = cv.cvtColor(image1, cv.COLOR_BGR2HSV)\n",
"#copy = image_hsv[:,:,0].copy()\n",
"copy1 = image_hsv[:,:,2].copy()\n",
"\n",
"#cv.equalizeHist(image_hsv[:,:,0], copy)\n",
"#cv.equalizeHist(image_hsv[:,:,1], copy)\n",
"cv.equalizeHist(image_hsv[:,:,2], copy1)\n",
"\n",
"#image_hsv[:,:,0] = copy\n",
"image_hsv[:,:,2] = copy1\n",
"\n",
"\n",
"image_conv = cv.cvtColor(image_hsv, cv.COLOR_HSV2RGB)\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image_conv)\n",
"plt.title(\"Image\");"
]
},
{
"cell_type": "markdown",
"id": "561bf3dd",
"metadata": {
"id": "561bf3dd"
},
"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",
"execution_count": 8,
"id": "ee98c0f3",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"executionInfo": {
"elapsed": 2108,
"status": "ok",
"timestamp": 1669564634721,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "ee98c0f3",
"outputId": "523e1bf9-ca5d-44be-cdbd-e5a5ea57239c"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image_orig = cv.imread(\"img/man-at-desk.jpg\", cv.IMREAD_COLOR)\n",
"image_hsv = cv.cvtColor(image_orig,cv.COLOR_BGR2HSV)\n",
"image_orig = cv.cvtColor(image_orig,cv.COLOR_BGR2RGB)\n",
"#cv.equalizeHist(image, image)\n",
"\n",
"copy = image_hsv[:,:,2].copy()\n",
"cv.equalizeHist(image_hsv[:,:,2], copy)\n",
"image_hsv[:,:,2] = copy\n",
"image_conv = cv.cvtColor(image_hsv, cv.COLOR_HSV2RGB)\n",
"\n",
"image = cv.cvtColor(image,cv.COLOR_HSV2RGB)\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image_orig)\n",
"plt.title(\"Image orig\");\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image_conv)\n",
"plt.title(\"Image\");"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "guRdeQ290Vt0",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 607
},
"executionInfo": {
"elapsed": 1393,
"status": "ok",
"timestamp": 1669565076267,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "guRdeQ290Vt0",
"outputId": "5f107ed5-8f4a-40e8-ab73-045b7b61d7a6"
},
"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": [
"image_gray = cv.cvtColor(image_orig,cv.COLOR_RGB2GRAY)\n",
"\n",
"clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(5,5))\n",
"clahe.apply(image_gray, image_gray)\n",
"\n",
"image_result = cv.cvtColor(image_gray,cv.COLOR_GRAY2RGB)\n",
"\n",
"plt.figure(figsize=(10,10))\n",
"plt.imshow(image_result)\n",
"plt.title(\"Image\");"
]
},
{
"cell_type": "markdown",
"id": "30ee7ddd",
"metadata": {
"id": "30ee7ddd"
},
"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",
"execution_count": 13,
"id": "c2477cb4",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 350
},
"executionInfo": {
"elapsed": 297,
"status": "ok",
"timestamp": 1669565171319,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "c2477cb4",
"outputId": "c0d14387-fb17-4f54-b2eb-6e9294f6b849"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "d14b4298"
},
"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",
"execution_count": 14,
"id": "8ece671e",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 326
},
"executionInfo": {
"elapsed": 1081,
"status": "ok",
"timestamp": 1669565181286,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "8ece671e",
"outputId": "8545ebf5-20de-4020-c223-d6bb4c79e656"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 720x360 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "1a745946"
},
"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",
"execution_count": 15,
"id": "790b0cdd",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 258,
"status": "ok",
"timestamp": 1669565211677,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "790b0cdd",
"outputId": "d30e518e-6a90-4f22-99c9-7c9ba56eb65c"
},
"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"
]
}
],
"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": {
"id": "accf85aa"
},
"source": [
"Następnie stosujemy operację splotu:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "21a7eb12",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 427
},
"executionInfo": {
"elapsed": 2876,
"status": "ok",
"timestamp": 1669565218550,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "21a7eb12",
"outputId": "a6983f5a-5f95-4549-c2f1-0218aaf217d6"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "7b2fbc8d"
},
"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",
"execution_count": 17,
"id": "7a2668a4",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 294
},
"executionInfo": {
"elapsed": 2250,
"status": "ok",
"timestamp": 1669565226241,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "7a2668a4",
"outputId": "fc20531e-a1f6-41ca-98cb-f5e85f404ba1"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIYAAAF3CAYAAADQGUAbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9e7BvW1bX9xljrvXb+5z76m67u7qlQRAwkTJYpSkSCZZ/EKOmCrGSlEE0jURClIJUNElVNMFoEk2MoawKRgNGg4Dk1UUZMORVMSRS4KNSUQkECQGaftyGvvfc89x7/9aac4z8McZca/322ef07Utfuu+969u97/n91m+t+Z5zvMcSd2fHjh07duzYsWPHjh07duzYsWPHWw/66W7Ajh07duzYsWPHjh07duzYsWPHjk8PdsXQjh07duzYsWPHjh07duzYsWPHWxS7YmjHjh07duzYsWPHjh07duzYseMtil0xtGPHjh07duzYsWPHjh07duzY8RbFrhjasWPHjh07duzYsWPHjh07dux4i2JXDO3YsWPHjh07duzYsWPHjh07drxFsSuGdrylICJ/RET+80/1va+iLBeRL/hUlLVjx44dO35xEJEfFJGve8Jvn5tn9vAprO9MRH5cRN77qSrzCfV8sYj88OtZx44dO3a8FbDTiR1vNeyKoR1vaIjI7xWRHxWRCxH5mIj8eRF525Pud/c/6e43HvK/mHt37NixY8cvHiLysyJyKSIPReQVEfnvReSzP93t+hTg64H/w91fBBCRPygiPy0i90XkoyLyZ16tgCEi3y0iL+azP7kVXNz97wN3ReQrXp9u7NixY8enF28hOvE/ZB/73yQiP/pqCrr23EMRaSLyrbDTiR1Pxq4Y2vGGhYj8a8CfAv4N4AXgHwd+BfC/iMjhhvs/ZVr9HTt27NjxuuEr3P1Z4L3AzwPf+mluz6vGU+jM7we+a/P9+4Bf5+7PA78G+LXAv/Iqq/kPgM/NZ3878O+LyK/f/P5XgH/5k2r4jh07dryx8KanE+7+29z92f4H/DDw376aOq499x7g8tqzO53Y8Rh2xdCONyRE5HngjwPf5O7/o7vP7v6zwO8EPhf4PSLyx0TkA2ldvQ/83rz23Zty3i8iHxSRl0Xkm9MK8U/mb8u9G5fRrxGRnxORl0Tk39qU8yUi8iMicjctuX/2JuXUjh07dux4dXD3K+ADwBf1ayLygoh8p4h8PM/uf1tEVETeISIf7hZQEXlWRH5KRN7/lCo+X0T+dnre/Hci8o6bbtrShfx+E234fSLyc8Bfv+H5zwF+JfC3Nn37/9z9br8FMOAL8v4vTRrz2fn916ZV/B/OZ3/M3Y+9qPz7/E2VPwh8uYicPaXvO3bs2PGGx5uZTlz7/XOB3wh8Z35/Kp24hn8W+AXgb2yu/SA7ndhxDbtiaMcbFV8KnAPfu73o7g+BHwB+c176SoJgvI3Qji8QkS8C/hzwuwmLwwvAZ32Cer8M+IeALwf+qIj86rzegD8IvBP4Dfn7N7yGfu3YsWPHDkBEbgP/PPA3N5e/lTirfyXwm4D3A1/r7neAfxH4CyLybuDPAH/X3b/zKVW8P595L1CB/+QX0dzfBPxq4Lfc8Ns/Avy0u9ftRRH56jRavER4DH0bgLv/cH7+yyJyC/hu4Jvd/Sc2z/45EbkAfgJ4kaB75PMfAWaCVu3YsWPHmxZvdjpxrR1/I43gr4pObPA1wHe6u/cLO53YcRN2xdCONyreCbz0hAP0xfwd4Efc/a+6u7n75bX7/jng+939h9x9Av4oYXl9Gv64u1+6+98D/h7BzOPu/6e7/013r3lofxtBAHbs2LFjxyeHvyoid4F7hJL/TwOISAG+CvjD7v4gz9pvAf4FAHf/nwlX+f8V+Kf5xG7y3+Xu/7e7PwK+GfidWcdrwR9z90c30BkIw8SD6xfd/XsyHOxXAf8ZEQ6xlEcINn8b+Ajwn1579huA5wgL8vcCR07xIOvdsWPHjjcj3hJ0YoP3A99xvTyeQicARORXEPLIX76hzJ1O7DjBrhja8UbFS8A7nxCn+978HeBDTynjl29/d/cL4OVPUO/HNp8vgGcBRORXichfk0iAfR/4k6zKqR07duzY8erxO9z9bYRX6DcC/7uIvIc4U0fgg5t7P8ipp+e3Ezl7vsPdP9F5vqUPH8yyX+u5/TRa8wqhxLkR7v7/Aj9GeLD2azMhBPwa4Fu2lt7NPc3dfwh4H/AHrv38HHD3+jM7duzY8SbBW4ZOiMiXEXmCPrC9/mroBKEQ+yF3/5kbftvpxI4T7IqhHW9U/AhhIf1nthdF5FngtxGWAHi6B9CLBEPdn70F/LLX2J4/T7j0f2FagP8IkTdix44dO3a8BqTi43uJUN0vIxT+M/GSgY7PISyl3VL87UQOhm8QkS/4BFVs32LzOVn2Szfc9wi4vfn+npua+5R6/j7weU8wZHQMbPIEichnAf8O8F8A3/IJ8kDc9OwB+AdPeWbHjh073vB4i9CJrwG+N9NlLHiVdOL93OAttNOJHTdhVwzteEPC3e8Ryae/VUR+q4iMmZjtvwE+zOnbX56EDwBfkQncDoRL5mtV5jwH3AceZuK369bbHTt27NjxSUACXwm8Hfh/3L0RZ/yfEJHn0kX+DxG5FSAU8k7kg/jTwHd+Apf/3yMiX5Q5Kv5d4ANZx3X8XeCrks78o0QY8quGu38Y+CngSzZ9+7rMcdHz3f1h0qAhIkJYgf8i8PsII8a/l7+9W0S+KpOmFhH5LcDvYjWGQIQN/PVNguodO3bseFPizUwnsn+3iBfrfMf1fvMEOrG550sJT6mb3mS204kdj2FXDO14w8Ld/yPigP+PCaXM3yLcNL/81Rx07v5jwDcB/xVxoD4ksva/lkPyXwe+mojX/QvAf/0aytixY8eOHfD9IvKQONf/BPA1eV5DnNmPgJ8Gfgj4HuAvSbyu/Q8B70+m/U8RzP+/+ZR6votgrD9GhCM86XXx30x45LxCGCS+5zX06dvIHBeJfwL4URF5RCSO/gGCnpHteDeRSNSBrwW+VkR+I9GnP0AYQF4h6N+/6u7ftyn7dxM5i3bs2LHjzYq3Ap0A+B1EuNf/du360+hER/c0uil30U4ndjwGuTkccceOtx4yDO0uEQ52Uyzujh07duzY8UkjXfz/L8Jw8eLrWM8XA9/m7r/h9apjx44dO3Z86rHTiR2fbuyKoR1vaYjIVxAu+EK8teAfA37dExK47dixY8eOHTt27NixY8eOHW8q7KFkO97q+Ergo/n3hcBX7UqhHTt27NixY8eOHTt27NjxVsHrohjKZMD/QER+SkSeFre5Y8enFe7+de7+Nnd/wd2/3N337Pw7dvwSYKcTO3bs2LHjadjpxI4dO3b80uFTHkqWmd1/EvjNRHLEvwP8Lnf/8U9pRTt27Nix4w2JnU7s2LFjx46nYacTO3bs2PFLi9fDY+hLgJ9y959294l449NXvg717NixY8eONyZ2OrFjx44dO56GnU7s2LFjxy8hhtehzM8iXhne8WEioe8JROTrga8HuH0Yf/3nv+tdgIMbiBC5gB3cQeIf8PwNxA1wPHVb4oZLyVssa1EQEBxEgShbsgwHZOMx5R63uDWcAWsNq0Y1sGYY4C4goBLtAhCkf0QkWhWF91+dXku/z3v/kOhzjEk2WxBzRONZPK71J8n6RAT3KGn9PW/pdUgOWR+/3i7PNknWkfeLZyfyGenjv/R0U47KWm6WctpXwbfN7pVn/b1dLr0cQcRxBxdd+y7kGEXpsnYQRKPGLEyWxSIxmQjijvd5d1+b05/xXEee5YjEPJoDnmOsiHgvMa9v5txlWbb9ufhRs3yW+te5305Y9MP7OGzG0djMl4NbtELFUVVEQEtf1xJLvY9f30qymSsHrO+za5CSe3AdX8Hy0eyXxFj12distpjL5V7WOuR0reTN+d3wHN9yVpChIKrrfpDc48Q8YoaZ0eZGvWxMVw0z2xQtqG6rl5MmiDl+si9k0+74j7Kuk20PJdfu6djlWvO+9GSzrzZzvTzncY5sxqn
"text/plain": [
"<Figure size 1440x720 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "4d14482d"
},
"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",
"execution_count": 18,
"id": "7a718c52",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"executionInfo": {
"elapsed": 1858,
"status": "ok",
"timestamp": 1669565251944,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "7a718c52",
"outputId": "a04d47ef-50b3-4a4c-ccbf-05fa015b99eb"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "d62d1788"
},
"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",
"execution_count": 19,
"id": "a87374f6",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 607
},
"executionInfo": {
"elapsed": 2192,
"status": "ok",
"timestamp": 1669565262126,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "a87374f6",
"outputId": "ef4c8802-30d6-42d8-aec1-88413922262b"
},
"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": [
"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": {
"id": "d69d6e14"
},
"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",
"execution_count": 20,
"id": "65bc45bc",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 428
},
"executionInfo": {
"elapsed": 2574,
"status": "ok",
"timestamp": 1669565288028,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "65bc45bc",
"outputId": "1171e133-873a-435e-c828-c255c1427eb5"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "b22ce707"
},
"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",
"execution_count": 21,
"id": "698299dc",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 428
},
"executionInfo": {
"elapsed": 2013,
"status": "ok",
"timestamp": 1669565311643,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "698299dc",
"outputId": "15e8eda3-e2c4-447b-dbbf-e73264070a52"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "9f596edc"
},
"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",
"execution_count": 22,
"id": "e46fb6d3",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 231
},
"executionInfo": {
"elapsed": 2036,
"status": "ok",
"timestamp": 1669565333535,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "e46fb6d3",
"outputId": "8098047d-8117-4e15-9027-c98c15ae120d"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "3d5fc811"
},
"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",
"execution_count": 23,
"id": "9e98f9f6",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 427
},
"executionInfo": {
"elapsed": 1738,
"status": "ok",
"timestamp": 1669565351774,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "9e98f9f6",
"outputId": "296c90bf-ea70-4a54-db72-c402dc7c18a6"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "3f957805"
},
"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",
"execution_count": 24,
"id": "c402c3e0",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 427
},
"executionInfo": {
"elapsed": 3077,
"status": "ok",
"timestamp": 1669565369836,
"user": {
"displayName": "Cezary Gałązkiewicz",
"userId": "01409497901784152256"
},
"user_tz": -60
},
"id": "c402c3e0",
"outputId": "0eacaeee-d612-4821-9598-63f212d8e7dd"
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1440x720 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"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": {
"id": "9ddc074b"
},
"source": [
"## Wykrywanie krawędzi metodą Canny'ego"
]
},
{
"cell_type": "markdown",
"id": "a46abc4f",
"metadata": {
"id": "a46abc4f"
},
"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)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "gHRTr4yF32lA",
"metadata": {
"id": "gHRTr4yF32lA"
},
"outputs": [],
"source": [
"lena = cv.imread(\"img/lena.png\", cv.IMREAD_COLOR)\n",
"title_window = 'Canny'\n",
"cv.namedWindow(title_window)\n",
"\n",
"def canny_and_show():\n",
" thresh1 = cv.getTrackbarPos('low_threshold', title_window)\n",
" thresh2 = cv.getTrackbarPos('high_threshold', title_window)\n",
" aperture = cv.getTrackbarPos('aperture_size', title_window)*2 + 3\n",
" blur = cv.getTrackbarPos('blur', title_window)\n",
" \n",
" lena_blurred = cv.GaussianBlur(lena,(5,5),blur)\n",
" edges = cv.Canny(lena_blurred, thresh1, thresh2, apertureSize=aperture)\n",
"\n",
" cv.imshow(title_window, edges)\n",
" \n",
"\n",
"trackbar_name = 'low_threshold'\n",
"trackbar_name2 = 'high_threshold'\n",
"trackbar_name3 = 'aperture_size'\n",
"trackbar_name4 = 'blur'\n",
"trackbar_val = 0\n",
"trackbar2_val = 0\n",
"trackbar3_val = 0\n",
"trackbar4_val = 0\n",
"cv.createTrackbar(trackbar_name, title_window , 0, 255, on_trackbar)\n",
"cv.createTrackbar(trackbar_name2, title_window , 0, 255, on_trackbar2)\n",
"cv.createTrackbar(trackbar_name3, title_window , 0, 2, on_trackbar3)\n",
"cv.createTrackbar(trackbar_name4, title_window , 0, 100, on_trackbar4)\n",
"\n",
"# Show some stuff\n",
"on_trackbar(0)\n",
"# Wait until user press some key\n",
"cv.waitKey()\n",
"cv.destroyAllWindows()"
]
}
],
"metadata": {
"author": "Andrzej Wójtowicz",
"colab": {
"provenance": []
},
"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": "03. Wzmacnianie i filtrowanie obrazów [laboratoria]",
"title": "Widzenie komputerowe",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 5
}