From aa76f1b4373ffc3ea235aef5e915e2fdec30568a Mon Sep 17 00:00:00 2001 From: "B.A.Kabakov" Date: Tue, 9 Oct 2018 20:31:59 +0300 Subject: [PATCH] initial commit --- README.md | 1 + another_daugman.ipynb | 398 ++++++++++++++++++++++++++++++++++++++++++ eye.jpg | Bin 0 -> 6930 bytes 3 files changed, 399 insertions(+) create mode 100644 README.md create mode 100644 another_daugman.ipynb create mode 100644 eye.jpg diff --git a/README.md b/README.md new file mode 100644 index 0000000..f7ced4b --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +All in jupyter-notebook. diff --git a/another_daugman.ipynb b/another_daugman.ipynb new file mode 100644 index 0000000..c8dc9cc --- /dev/null +++ b/another_daugman.ipynb @@ -0,0 +1,398 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import cv2\n", + "import cProfile\n", + "import numpy as np\n", + "import math\n", + "from scipy.ndimage.interpolation import shift\n", + "import itertools" + ] + }, + { + "cell_type": "code", + "execution_count": 315, + "metadata": {}, + "outputs": [], + "source": [ + "def daugman_4(center, start_r, gray_img):\n", + " \"\"\"return maximal intense radius for given center\n", + " center -- tuple(x, y)\n", + " start_r -- int\n", + " gray_img -- grayscale picture as np.array(), it should be square\n", + " \"\"\"\n", + " # get separate coordinates\n", + " x, y = center\n", + " # get img dimensions\n", + " h, w = gray_img.shape\n", + " # for calculation convinience\n", + " img_shape = np.array([h, w])\n", + " c = np.array(center)\n", + " # define some other vars\n", + " tmp = []\n", + " mask = np.zeros_like(gray)\n", + "\n", + " # for every radius in range\n", + " for r in range(start_r, int(h/3)):\n", + " # draw circle on mask\n", + " cv2.circle(mask, center, r, 255, 1)\n", + " # get pixel from original image\n", + " radii = np.bitwise_and(gray_img, mask)\n", + " # normalize\n", + " tmp.append(radii[radii > 0].sum()/(2*3.1415*r))\n", + " # refresh mask\n", + " mask.fill(0)\n", + " \n", + " # calculate delta of radius intensitiveness\n", + " tmp = np.array(tmp)\n", + " tmp = tmp[1:] - tmp[:-1]\n", + " # aply gaussian filter\n", + " tmp = abs(cv2.GaussianBlur(tmp[:-1], (1, 5), 0))\n", + " # get maximum value\n", + " idx = np.argmax(tmp)\n", + " # return value, center coords, radius\n", + " return tmp[idx], [center, idx + start_r]" + ] + }, + { + "cell_type": "code", + "execution_count": 316, + "metadata": {}, + "outputs": [], + "source": [ + "def find_iris(gray, start_r):\n", + " \"\"\"Apply daugman() on every pixel in given range\n", + " all_point should be generated as below:\n", + " _, s = gray.shape\n", + " a = range(0 + int(s/4), s - int(s/4), 3)\n", + " all_points = list(itertools.product(a, a))\n", + " \"\"\"\n", + " _, s = gray.shape\n", + " a = range(0 + int(s/4), s - int(s/4), 3)\n", + " all_points = list(itertools.product(a, a))\n", + " \n", + " values = []\n", + " coords = []\n", + " \n", + " for p in all_points:\n", + " tmp = daugman_4(p, start_r, gray)\n", + " if tmp is not None:\n", + " val, circle = tmp\n", + " values.append(val)\n", + " coords.append(circle)\n", + " \n", + " # return the radius with biggest intensiveness delta on image\n", + " # [(xc, yc), radius]\n", + " return coords[np.argmax(values)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tests" + ] + }, + { + "cell_type": "code", + "execution_count": 318, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 318, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# read, square crop and grayscale image of an eye\n", + "img = cv2.imread('eye.jpg')\n", + "img = img[20:130, 20:130]\n", + "gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n", + "start_r = 10\n", + "plt.imshow(gray, cmap='gray')\n", + "cv2.imwrite('sq_eye.jpg', img)" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "538 ms ± 6.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "find_iris(gray, 10, all_points)\n", + "# ON SERVER: 136 ms ± 572 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", + "# ON NOTEBOOK: 538 ms ± 6.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", + "# it is 73085 timex faster than https://github.com/Fejcvk/Iris-Comparator/blob/master/daugman.py" + ] + }, + { + "cell_type": "code", + "execution_count": 317, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(57, 54), 20]" + ] + }, + "execution_count": 317, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# get result\n", + "find_iris(gray, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 311, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 311, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot result\n", + "out = img.copy()\n", + "cv2.circle(out, (57, 54), 20, (0, 0, 255), 1)\n", + "plt.imshow(out[::,::,::-1])" + ] + }, + { + "cell_type": "code", + "execution_count": 297, + "metadata": {}, + "outputs": [], + "source": [ + "# function profiling\n", + "# cProfile.run('find_iris(gray, 15, all_points)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## DEPRECATED" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# def daugman_3(center, start_r, gray_img):\n", + "# \"\"\"return maximal intense radius for given center\n", + "# center -- tuple(x, y)\n", + "# start_r -- int\n", + "# gray_img -- grayscale picture as np.array(), it should be square\n", + "# \"\"\"\n", + "# # get separate coordinates\n", + "# x, y = center\n", + "# # get img dimensions\n", + "# h, w = gray_img.shape\n", + "# # for calculation convinience\n", + "# img_shape = np.array([h, w])\n", + "# c = np.array(center)\n", + "# # define some other vars\n", + "# tmp = []\n", + "# mask = np.zeros_like(gray)\n", + "\n", + "# # for every radius in range\n", + "# for r in range(start_r, int(h/3)):\n", + "# # draw circle on mask\n", + "# cv2.circle(mask, center, r, 255, 1)\n", + "# # get pixel from original image\n", + "# radii = np.bitwise_and(gray_img, mask)\n", + "# # normalize\n", + "# tmp.append(radii[radii > 0].sum()/(2*3.1415*r))\n", + "# # refresh mask\n", + "# mask.fill(0)\n", + " \n", + "# # if we got some values (not started in corner)\n", + "# if len(tmp) > 0:\n", + "# # calculate delta of radius intensitiveness\n", + "# tmp = np.array(tmp)\n", + "# tmp = tmp[1:] - tmp[:-1]\n", + "# # aply gaussian filter\n", + "# tmp = abs(cv2.GaussianBlur(tmp[:-1], (1, 5), 0))\n", + "# # get maximum value\n", + "# idx = np.argmax(tmp)\n", + "# # return value, center coords, radius\n", + "# return tmp[idx], [center, idx + start_r]" + ] + }, + { + "cell_type": "code", + "execution_count": 277, + "metadata": {}, + "outputs": [], + "source": [ + "# def daugman_2(center, start_r, gray_img):\n", + "# \"\"\"return maximal intense radius for given center\n", + "# center should be tuple\n", + "# \"\"\"\n", + "# x, y = center\n", + "# h, w = gray_img.shape\n", + "# img_shape = np.array([h, w])\n", + "# c = np.array(center)\n", + "# tmp = []\n", + "# mask = np.zeros_like(gray)\n", + "\n", + " \n", + "# # for every radius\n", + "# for r in range(start_r, int(h/4)):\n", + " \n", + "# # check if we getting out of image borders\n", + "# # if any(c + r > img_shape) or any(c - r < 0):\n", + "# # break\n", + "# cv2.circle(mask, center, r, 255, 1)\n", + "# # get pixel from original image\n", + "# radii = cv2.bitwise_and(gray_img, mask)\n", + "# # normalize\n", + "# # tmp.append(radii.sum()/(2*math.pi*r))\n", + "# tmp.append(radii.sum()/(2*3.1415*r))\n", + "# mask.fill(0)\n", + " \n", + " \n", + "# # if we not started in some angle\n", + "# if len(tmp) > 0:\n", + "# # calculate delta of intensitive\n", + "# tmp = np.array(tmp)\n", + "# tmp = tmp - shift(tmp, -1, cval=np.NaN)\n", + "# # aply gaussian filter\n", + "# tmp = abs(cv2.GaussianBlur(tmp[:-1], (1, 5), 0))\n", + "# # get maximum value\n", + "# idx = np.argmax(tmp)\n", + "# # return value, center coords, radius\n", + "# return tmp[idx], [center, idx + start_r]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 276, + "metadata": {}, + "outputs": [], + "source": [ + "# def daugman(center, start_r, gray_img):\n", + "# \"\"\"return maximal intense radius for given center\n", + "# center should be tuple\n", + "# \"\"\"\n", + "# x, y = center\n", + "# h, w = gray_img.shape\n", + "# img_shape = np.array([h, w])\n", + "# c = np.array(center)\n", + "# tmp = []\n", + "# mask = np.zeros_like(gray)\n", + " \n", + "# # for every radius\n", + "# for r in range(start_r, int(h/4)):\n", + "# # check if we getting out of image borders\n", + "# if any(c + r > img_shape) or any(c - r < 0):\n", + "# break\n", + "# # create mask \n", + "# cv2.circle(mask, center, r, 255, 1)\n", + "# # get pixel from original image\n", + "# radii = cv2.bitwise_and(gray_img, mask)\n", + "# # normalize\n", + "# tmp.append(radii.sum()/(2*math.pi*r))\n", + "# mask.fill(0)\n", + " \n", + "# # if we not started in some angle\n", + "# if len(tmp) > 0:\n", + "# # calculate delta of intensitive\n", + "# tmp = np.array(tmp)\n", + "# tmp = tmp - shift(tmp, -1, cval=np.NaN)\n", + "# # aply gaussian filter\n", + "# try:\n", + "# tmp = abs(cv2.GaussianBlur(tmp[:-1], (1, 5), 0))\n", + "# # get maximum value\n", + "# idx = np.argmax(tmp)\n", + "# # return value, center coords, radius\n", + "# return tmp[idx], [center, idx + start_r]\n", + "# except Exception:\n", + "# pass" + ] + } + ], + "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 +} diff --git a/eye.jpg b/eye.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf8aef7928a13a8a0ba623484073a982d5a0ee27 GIT binary patch literal 6930 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 literal 0 HcmV?d00001