{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# SIFT jellemzőpontok detektálása OpenCV-ben\n", "\n", "A SIFT (*Scale Invariant Feature Transform*) az egyik leggyakrabban használt és hivatkozott jellemzőpont detektor. Ebben a leckében röviden áttekintjük a SIFT működését. A teljes algoritmus megértéséhez javasoljuk a [Lowe eredeti cikkének](https://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf) tanulmányozását. \n", "\n", "## A SIFT detektor fontosabb lépései\n", "\n", "1. Konvolváljuk a szürkeárnyalatos képet egy $\\sigma$ paraméterű Gauss-függvénnyel különböző skálafaktor mellett. Képezzük ezeknek a simított képeknek a különbségét (Difference of Gaussians - DoG). A jellemzőpontok a skálatérben a DoG képeken egy $3\\times3\\times3$ környezet maximumaiban lesznek. \n", "2. Küszöböljük az értékeket.\n", "3. Elimináljuk az élválaszokat (csak a sarokpontok érdekesek számunkra). \n", "4. A lokális orientációhoz határozzuk meg a domimáns gradiens irányt. Az így kapott skála és orientáció minden pont esetében meghatároz egy lokális koordináta-rendszert, tehát minden pont rendelkezik egy (x,y,$\\sigma$,$\\phi$) koordinátával (ahol $\\sigma$ az skálaértéket, $\\phi$ az orientációt jelöli).\n", "5. A jellemzőpont leírásához tekintsünk egy $16\\times 16$-os környezetet, amelyet tovább $4\\times 4$-es blokkokra osztunk. \n", "6. Számítsunk a blokkokban 8-irányú irányhisztogramot. \n", "7. Alkalmazzunk Gauss súlyozást a középpont körül, amelynek szórása $0.5\\sigma$ (ahol $\\sigma$ a pont skálaértéke)\n", "8. Előáll egy 128 elemű jellemzővektor. \n", "\n", "\n", "## A SIFT jellemző használata OpenCV-ben\n", "\n", "A SIFT jellemződetektor az OpenCV-ben az *xfeatures2d* csomagba került, mivel ipari és kereskedelmi felhasználása szabadalmi költséget von magaután. Oktatási és kutatási célra a használata ingyenes. \n", "\n", "A jellemződetektor alábbi paramétereit állíthatjuk be:\n", "* **nfeatures**: hány jellemzőpontot szeretnénk megtartani (ha 0-t írunk, akkor nem korlátozzuk ezt a számot)\n", "* **nOctaveLayers**: a rétegek száma minden oktávhoz (Lowe algoritmusában 3)\n", "* **constantThreshold**: egy küszöbérték az alacsony kontraszttal rendelkező területek elnyomásához\n", "* **sigma**: a Gauss-függvény paramétere a 0. oktávnál az input képen.\n", "\n", "\n", "# Példaprogram a SIFT detektor használatához\n", "\n", "Az alábbi példa a következő lépésekből áll:\n", "1. A kép megnyitása.\n", "2. A kép szürkeárnyalatossá konvertálása.\n", "3. A jellemződetektor létrehozása.\n", "4. Jellemzőpontok detektálása.\n", "5. Leírók számítása a jellemzőpontokhoz.\n", "6. Jellemzőpontok kirajzolása.\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "ename": "error", "evalue": "OpenCV(3.4.1) /opt/conda/conda-bld/opencv-suite_1527005194613/work/modules/core/src/matrix.cpp:362: error: (-215) u != 0 in function create\n", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31merror\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;31m## jellemzőpontok detektálása\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0msift\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcv2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxfeatures2d\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSIFT_create\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0mkeypoints\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msift\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdetect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgray_img\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;31m## kulcspont leírók számítása\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31merror\u001b[0m: OpenCV(3.4.1) /opt/conda/conda-bld/opencv-suite_1527005194613/work/modules/core/src/matrix.cpp:362: error: (-215) u != 0 in function create\n" ] } ], "source": [ "import cv2\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "\n", "SOURCE_IMAGE='lisbon1.jpg'\n", "OUTPUT_IMAGE='sift_lisbon1.jpg'\n", "\n", "## kép beolvasása\n", "img = cv2.imread(SOURCE_IMAGE);\n", "\n", "## a képet szürkeárnyalatossá konvertáljuk\n", "gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n", "\n", "## jellemzőpontok detektálása \n", "sift = cv2.xfeatures2d.SIFT_create()\n", "keypoints = sift.detect(gray_img, None)\n", "\n", "## kulcspont leírók számítása\n", "keypoints, descriptors = sift.compute(gray_img, keypoints)\n", "\n", "## kulcspontok kirajzolása\n", "out_img = cv2.drawKeypoints(gray_img, keypoints, descriptors, color=(255, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)\n", "\n", "cv2.imwrite(OUTPUT_IMAGE, out_img)\n", "\n", "plt.imshow(out_img);\n", "plt.title(OUTPUT_IMAGE)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }