├── .gitignore ├── Active_contour_model.ipynb ├── Adapt_RGB_decorator.ipynb ├── Approximate_subdivide_polygon.ipynb ├── Block_view_mean_max_median_sampling.ipynb ├── Canny_edge_detector.ipynb ├── Circular_Elliptical_Hough_Transform.ipynb ├── Convex_Hull.ipynb ├── Denoise.ipynb ├── Edge_operators.ipynb ├── Entropy.ipynb ├── Filtering_regional_maxima.ipynb ├── Finding_contours.ipynb ├── Gamma_log_contrast_adjustment.ipynb ├── Histogram_matching.ipynb ├── Hough_transform_straight_line.ipynb ├── Hysteresis_thresholding.ipynb ├── Image_deconvolution.ipynb ├── Interpolation - Edge modes.ipynb ├── LICENSE ├── Local_Histogram_Equalization.ipynb ├── Marching_cubes.ipynb ├── README.md ├── RGB2Gray.ipynb ├── RGB_to_HSV.ipynb ├── Random_shapes.ipynb ├── Rescale_resize_downscale.ipynb ├── Ridge_operators.ipynb ├── Scipy_zooming.ipynb ├── Shapes_drawing.ipynb ├── Skeletonize.ipynb ├── Structural_similarity_index.ipynb ├── Swirl.ipynb ├── Tint_Grayscale.ipynb ├── Unsharp_mask.ipynb ├── Using_Numpy_image_manipulation.ipynb ├── _config.yml ├── images ├── Hysteresis_thresholding.PNG ├── Local_histogram_equalization.PNG ├── MRI1.jpg ├── Numpy_image_manipulation.png ├── Readme.md ├── Swirl.png ├── Tubes.jpg ├── block_view_pooling_sampling.PNG ├── convex_hull.PNG ├── edge_operators.png ├── filtering_regional_maxima.PNG ├── finding_contours.png ├── histogram_matching.PNG ├── interpolation_edge_mode.PNG ├── marching_cubes.PNG ├── rgb2gray.PNG ├── rgb2hsv.PNG ├── skeletonize.png ├── sobel_coins.PNG ├── tint_grayscale.PNG └── unsharp_mask.PNG └── skimage_getting_started.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /Convex_Hull.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Convex Hull\n", 8 | "### Dr. Tirthajyoti Sarkar, Fremont CA 94536\n", 9 | "The convex hull of a binary image is the set of pixels included in the smallest convex polygon that surround all white pixels in the input.\n", 10 | "\n", 11 | "A good overview of the algorithm is given on [this blog](http://blogs.mathworks.com/steve/2011/10/04/binary-image-convex-hull-algorithm-notes/)." 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import matplotlib.pyplot as plt\n", 21 | "\n", 22 | "from skimage.morphology import convex_hull_image\n", 23 | "from skimage import data, img_as_float\n", 24 | "from skimage.util import invert" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "### The original image is inverted as the object must be white" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 2, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "image = invert(data.horse())" 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "### Create a convex hull" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 8, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "chull = convex_hull_image(image)" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "### Show the result" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 10, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "data": { 73 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAADxCAYAAADGDc2jAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAFpJJREFUeJzt3XvwrVVdx/HPRw+hckBEKjlyc8S7Bk3h3WxGy0ugUzpggNehvJdkDonJiBGo4VikMpqmIyResNFAZRInNApRbCSkKOUiEAfkKHI54JVvf6y15fnts+/X9azn/Zo5M+e3f/vy7OdZ6/t8nrXW3j9HhAAAAGpyj3VvAAAAwKIRcAAAQHUIOAAAoDoEHAAAUB0CDgAAqA4BBwAAVIeAUznbx9n+wKLvO8Fzhe0DZnjcvrZvt33PRWwHUCvbT7H97dxfDln39jTZPsD2TN9BYvs3bV+26G3CaLbPsP2WGR97tO3z8/835fq//+K2bjYEnBax/RLbl9q+w/YNtk+zvfuox0TESRFx9CTPP819lyUiromIzRHxs1H3y0XwulVtFyBJOUz0/t1l+87Gz0eueHNOlPSu3F/OWfFrL01EnB8Rjxp3v+ZJFRiEgNMStl8v6e2S3iDpvpIeL2k/SV+w/QtDHrNpdVvYLuwbzCKHic0RsVnSNZIObdz2D/33X3I720/STCMdtH/2QRcQcFrA9m6STpD02og4NyJ+EhFXSzpMqcgdle/3Fttn5aHGWyW9JN92RuO5XmT7O7a/Z/vNtq+2/fTG48/I/98/DzO+2PY1trfZflPjeR5r+0LbP7C91fa7hwWtAe/nfNsn2/6q7Vtsf8b2Hn2vuyn/vIftD9m+3vbNtj9texdJn5e0pXH1vMX2h22f2HidDaM8+b0ea/s/JW3PQ6lbbH/K9k22r7L9R7McI0CSbJ9o++O2z7R9m6SjbD/B9lcafeVU2zvl+/eG81+ep5tutn1q4/keavvLuZ9ss/3RfPvVkvaV9PnelK7tvW2fY/v7tr9l+2VjtutE2x/Lt91u+xLbD7b957k/XNOrDfk5ds99cavt62y/1fY98u/uaftdua5cIemZY/bTdbkv/nd+zx+0vXP+3dPz++vdd7/c72/K++BvbD9G0rslPSVv+7Z83wtsv6Tx2EFTJ6+y/W1Jl+fbH2n7vLzfLrf9vGmPe+P1NjnV1Sts32r7Yttb8u+enH++Jde+xzUed4HtE2z/u+3bbJ/bqInn2X5F3+tcZvs5o7bf9s5OI/6vbGzbRbaPG/EW9rD9+bwNF9p+UH7sDlOO/fu6RAScdniipHtJ+sfmjRFxu9KJ/rcaNz9X0lmSdpe04YrS9iMlvVfSkZL2UhoJeuCY136ypIdJepqk420/It/+M0nHSNpT0hPy7181xXt6kaSXSdoi6aeSTh1yv9Ml3UfSoyT9ktKQ/HZJz5J0fePq+foJX/f3Jf2O0v65S9LZki5R2g9Pk/Q628+Y4n0A/X5X0keV+tfHldr3Hyv1lScpnfxf3veYZ0v6NUm/qhQ+esHiLyV9VtL9JO0t6T2SFBH7S7pe0rMaU7ofl3SVUp86XNI7bD91xHZJqV58UKk/XCbpvLy9e0k6WdJpjcefIelOSQ+W9OtK/eil+XevlPTbkg6U9Fili69xjlSqXQ9R6t9v7L+D04XOZyV9W9L+kvaR9ImIuFTSayT9a37/e07wej3PkXSwpMfY3lXSFyR9RKm+HCnp/bYfNsXzNb1B0vOVjvHuko6W9EPbe+b38U5J91eqd5+zfb/GY4+Q9GJJvyxpF0l/km//qFLdkiTZPlDp+Jw7avsj4kdKF78n2X6opDcpHdu3j9j+IyS9WdIeSiOUfzHbbigDAacd9pS0LSJ+OuB3W/Pvey6MiE9HxF0RcWfffZ8v6eyIuCAifizpeEnjFgKeEBF3RsQlSkHgQEmKiK9HxFci4qd5NOl9kp464nn6nR4R38xh5c2SDnPfwmLbeykFmVdExM155OpLU7zGIKdGxLV53xws6Rcj4q0R8eOIuFLS30l6wZyvgW67ICLO7vXBiPhaRFyU+8qVkt6vHfvKyRFxS+5L50s6KN/+E6UT+14R8cOI+LdBL5ivtB8r6c/y/f5D0ockvXDYduXbzo+I83Jt+aTSie0d+eePSTrA9mbbvQuAYyLijoi4QdJf6+6+cpjSxcd1EfE9SW+bYD+dmu+/TdJJapzEG56gVN+OjYjteX8O3AdTOCnXkzuVws7/RsRH8vH5uqRPK9XKWRwt6biI+Fbez9+IiO9LOlTSZRFxZn6dMyRdqRQSez6YH3eH0rHotYFPSTrY9t755yMknZVr+Mjtz3X7bZI+oxSyXzhmfeNZEXFxRPxE6QL5oBH3LR4Bpx22SdrTg+eM98q/77l2xPNsaf4+d6TvjXntGxr/v0PSZunnQ+fnOC12vlWpQE1zFdXczu9I2mnA4/eR9P2IuHmK553mdfdTmub6Qe+fpOOUrqCAWW3og7Yfbvuzjb7yVu3Y1gf2M0mvV+obF+fphhcPec0tShdB2xu3fUcbR2gH1YYbG/+/U9JNEXFX42flbdlP0s6Sbmz0lffo7r6yobbk1x6n//5bBtxnH0lXj/vQwZT6a8CT+mrA4Up1dQOnKe/elPglQ557H0lXDLh9i3bcJ/3HZ2AbiIhbJJ0r6XDbVgqVvdH5Sbb/w0qjbmfngD3KsHbYSgScdrhQ0o8k/V7zRqe1KM+S9MXGzaNGZLYqDXP3Hn9vpeHSWZymNIf9kIjYTSkYeIrH79P4/75KV6rb+u5zrdKc8KBPig16n9uVprN6HjDmcddKuioidm/82zUinj1+84Gh+tvm+yR9U9IBua8crwn7SkRsjYijI2IvSa9Wmn540IC7Xq90EbRL47Z9Jf3fiO2axrVKJ7w9Gn1lt4j4lfz7rdqxT4/Tf/9B08zXStqvf3Q3W1QN+GJfDdgcEa/Z4UHp0129KfEDBzxv7/kePOD265XCSFP/8RnlTKURricrnbe/PMX2n6Y0qnOI7cdP+Hr9tkuS7XH7tigEnBbICf4ESX9r+5m2d3L6joFPSrpOaZ3KJM6SdKjtJzotCD5B04WSpl0l3SrpdtsPV5qDn8ZReXHcfZSuaM/qv0qLiK1Ka4zea/t++X3/Rv71jZLub/u+jYd8Q9KznRYmP0DS68Zsw1cl3eq02PHeTgslH2374CnfCzDKrpJuUVrY/gjtuP5mKNuH5ekhSfqB0sl5h9GMiLhK0sVK6y12tn2Q0vqYHT7ZNYuIuFbSlySdYns32/fIC097/fETSuvXHmj7/pKOneBpX9O4/xt197qgpguVRplPsn2f3E+flH93o6S9nRdsZ9+Q9Lx8v4cqrfMb5Z8kPcr2Ebm+7OT0AYpZ1+B8QNKJTou1bfsgp8XC5+TXOTwv9j1C0gGSPjfh856ttFbpeEkfi4heSBu5/bZfKunRSm3hGEmn94XgSd2Q/x2V6+QfasfAVhwCTktExDuURklOUQoWFyml96flxWSTPMdlkl6rNLe+VdJtkr6rNDo0rT9Vmgu+TWndyqDiNMrpSkOnNygtoB726aUXKo3uXJ639XWSFBGXK13VXJmHZrfk57xE0tWS/nncNuVAdajSPPNVSiNIH1BahAksyuuVFo/epjSaM01feZykr9nervQhg1dHxDVD7nu40knwBqWLmeMi4l9m3uodHaW0+PW/JN2sdIHVu4o/TWkk+VJJX8uvP86ZSouar5D0P0rT3BvktUCHSHqEUr27Rnevj/mCpG8pTZv1plZOUQqB35X090oLo4fKF4/PyO9tq9K+O1lpOm4Wf6U0WvJFpTr9fkn3ioiblNbLHKsU2I6RdEhenzNWRPwwP+/TlRYdj93+fBH8TkkvyuuXPqJUH0+Z9k3lQPUHSuegbUrh7KJpn2fVfHcQRNfY3qx0VfiQfAW4qtc9X9IZEbGQb00G0C5OX99wVEScv+5tQb0YwekY24fmod5dlJL8pUojHgAAVIOA0z3PVVrwdr3ScPYLgmE8AEBlmKICAADVYQQHAABUh4ADAACqU8RfU3XfH/ECULaImPX7k9aKWgO0yzy1hhEcAABQHQIOAACoDgEHAABUh4ADAACqU8QiYwCziQjZHnsbAMxj2HfmlVxrCDgAAGAHbf8iYAIO0FL9xaftxQjAetVWQwg4QMs0i1DJw8MAyraIQFPylDgBB2iRYQWJ0ANglNpGZyZBwAFaoosFCsB8ulw3CDhAYaYpSF0uXgA2Wlc9KHWaioADrBihBMAilFRLSgw5BBxgBVZViEorMAAWr6RgUzICDrAkqy5ChBugTgSa2RBwgAVjHhzArNocZkqrQfwtKmCB1l2c1v36AGYTEfTfBWMEB1iAkgpTaVdRADYqqV7UjIADzKHUQkXIAcpRap1YhpJqDwEHmFGXihaA6VEj1ouAA0ypLUWrt52lXE0BtWtLbVi2UkZxCDjAFNpYwEopNkBN2lgLuoaAA0yAYgZ0GzVgOiVcWBFwgDEobEA30ffbjYADjFBLgSvhagooXS39HQkBBxiCYgfUjT6+XOu+sOKbjIEBaix8Nb4nYBZ8a3A3MIID9KHwAfWgP6/XOkdxCDhAA8UQaDf6MHoIOEBGYQTaib6LQQg4QIese9EfsAgEmnZZV90h4ACiYAIlo39iFgQcdB7FEygP/RLzIuCg07pYRJmmQom62Be7ZB11h4CDzupyQSXkYN263P+6atV1h4CDTqK4AqtDf8M68E3GQEdx0sGy8Y3BWCdGcNA5FFxgOehbGGeV01QEHHQKBXgj1uJgHvQnlIyAAwCYGKEGbUHAQSdQlIdjFAfD0G+wDKuqOQQcAIQcSCLQoC58igrVo2gDo/FpJ6zaKtobIzioWluKdv/oSVu2G+1E+0IXEHBQrTYX8WbgWdX7YJqqTm3uB8A8mKICCmd7ZcGDk2E9mHZC6ZbdPhnBQZXaVNgnDS9MY2EU2gOwEQEHVelSke8FnkW/Z6aqyteldg7MioCzBvMWJ04+O2prwV/EsVxG0CHklKWt7RsYZ5m1hoCzAsu4wu7hJETxR71o28DsCDgLtI5iNOw1uxB8KP4bLWvKCqvBcQMWi4Azh5ILUv+21RB4St7fJbHNvmoBjhGwXAScCdRQiNo8rVXD/h+kbccBi1FrewZK09mA0+UiU/K0VpePyyIxilMGjgGwPp0JOBSa8SbZR7OEIPb9eswTckoIu21Fewcmt8xa04mAQ8FZHPZluzCSs1rsa6Ac1QccCg5KVPIIScnbVirqDFCeav8WFX+HBUimCSyEm+lRZ4DZLLveVBlwKDgAVoFaA5SruoBDwUHpSh0lKXW7SkWtAcpW1RqcRRUcvhEWtWm2aYLM/KgNwHxWUYeqGcGh4ADjEW7mR60B5rOqOlTVCM68mjudIgYAQHtVEXAIIwCWjToDtEvrp6iWUXQoZFgWpogAdNkqa2DrA86icOIBAKAeBJw+jN4A6EddAOa36oGEVgecRRcdihgAAHVodcBZFKansAq0MwBdtY76R8ABVoBwAwCr1dqAw7cWA1gFagMwn3Vd4LU24AAAAAxDwAGWjOmp9mL0BmivVgYcig4AAOVb5wVeKwMOAADAKAQcAACwcOuenifgAACA6hBwgCVa9xUMZsdaP2B2JdQ+Ag4AAKhO6wLOIq+qSkiYAABg8VoXcAAAQLlKGTwg4AAAgIUoJdxIBBwAAFAhAg6wJCVdyQBA1xBwAADA3Eq7qCPgZKUdGAAAMDsCDgAAqA4BBwAAzKXEWRACDgAAmFmJ4UYi4AAAgAoRcBpKTaEAAJSo5PMmAQcAAFSHgNOn5DQKAAAmQ8ABAABTK31AgIADAACqQ8ABlqD0KxsAqB0BZwBOTgAADNeG8yQBBwAAVIeAAwAAJtaG0RtJ2rTuDSiVbUXEujdjrP6G1oZtBgBg2RjBabFBKdp2a9I1AKBd2nR+IeCMUPKBHLdtBJ31Yb8DwPoRcFpomhMoQQcA0EUEnI4g6KwG+xhArdpW3wg4LTNvAyPoLA/7FUCt2ljfCDhjtPGgToKgAwCoGR8Tb5FlBJLmc/IR89kRFgGgLIzg4OcY1ZkN+wxAzdpa4xjBaYlVNjC+PHBybe34AFA7Ag7GGnUS73L4IdwAqF2b6xwBpwVKbmDDtq3LwQcAsH4EHCzFskMZAQoAlqvki+tJEHDQSuueNmt7xweA2vEpqsJxIgUAYHoEHAAAsEENF9cEnDFY64F+NXR8AKgdAQcAAFSHgFMwRgoAAKtWy7mHgDPCOqenamlgAID2qOncQ8AZgrU3GKSmzg8ANSPgAACA6hBwBljE6A1/mRsA0Ca1nbM6G3CWeSDnfe7aGlktOC4A0B6dDTjDzDt60zwJso4HANAGNV7AEXAaFhlusD4cBwCYXK01s5MBZ9DBXHS4YfSmLrUWAACoVScDzqIt8uTHiXR+hEsAwKZ1b8C6MS0FAOiqms9hjODMoeaGgbtxnAGgfToXcEr+lBMnUgAAFqPzU1SzIIgAANqu9nNZ50ZwAABA/Qg4U6o98WIjjjeAGnWhthFwAABAdToVcPgbUZgGxxtAjbpS2zoVcOYxbYNY9v0BAMBwrQs4bQoCbdpWAABq0rqAM6t5wgZBBege+j1q1KV23ZmAsy5dakwAAJSitQFnVcGBgAIAqEHXzmetDDiLOEil/ZkGAACwOK0MOP3GBZ5ZA9Gi0m7XUjNQC/ouatHFtlxFwAEWrYvFAIPRFoB2IuAMQVEDANSgq+ez1gecthy4tmwnAAA1aHXAGRYamrfPEiwIIwCaqAlA+7Q64IxDUQIAdFmXz4PVBpwSD2qJ29Q1kxwDjhOAGnS9llUTcLp+IJHw/UZYFmoM0C6b1r0Bi0QBwii0DwDojmpGcBaFkyCAYagPaAvaKgEHHTFpZ6coAEAdCDgAMAVCMNAOBBwg48QFoAbUsoSAAwBAJQg3dyPgFIKPN8+PfYhV4SQClI+A07CKokVhXD32OZaBdgWUjYADAEAFCN0bEXAAAEB1OhlwSl2rUep2ARiMK2agXJ0MOCUj5AAApkXY3hEBBwCAFiPcDEbAAUSBwOxoO0CZCDhrMK4gMk21XJyQsGi0KawLbW+4zgUcwgMGoV0AQF06F3AAAED9CDhrwjTVYrG/sG5MFWDVaHOjEXAKxkkbAIDZEHAAAEB1OhVwxo2IrHrEZJLhRUZxgPZgygCrQlsbr1MBp0SEHADANAg3kyHg9FlHmKCxAgCwWAScAUoMORHBSM6MJt1v7F8sAhcsQBk6FXBsT1x8Sgw5EifhRRm2r9m/WARCDpaFtjW5TgWcnl7QKfG7aAg5synxWAIA1qeTAWcapZ4YS92uGrBvsQhcaQPrRcCZACe8dhg3KjfNceSYAygNoXk6BJwW4yQ8veY+Y1oLyzbNuj9gFNrR9Ag4E1rlyY6GvFyEHACoHwFnCqWFHILQ7JiuAoC6bVr3BmA4AsxyRcTPpxAm/TMeHBPMYpI2BgxD3ZlN50dwpm04FKlu4/hjVpykgNXqfMCRKDy1mfR4ctyxarQ5TIs2MzumqLJeIxp3hU5jaweOE0o1aa0BqGPzIeD0GVR8aGT1Y40EVo2gAywXAWcIQk33cMyxDrQ7YDlYgwMAAKpDwAEAANUh4AAAgOoQcAAAQHUIOAAAoDoEHAAAUB0CDgAAqA4BBwAAVMd8iyYAAKgNIzgAAKA6BBwAAFAdAg4AAKgOAQcAAFSHgAMAAKpDwAEAANUh4AAAgOoQcAAAQHUIOAAAoDoEHAAAUB0CDgAAqA4BBwAAVIeAAwAAqkPAAQAA1SHgAACA6hBwAABAdQg4AACgOgQcAABQHQIOAACoDgEHAABUh4ADAACqQ8ABAADVIeAAAIDq/D8FcI8K+8W2WAAAAABJRU5ErkJggg==\n", 74 | "text/plain": [ 75 | "
" 76 | ] 77 | }, 78 | "metadata": {}, 79 | "output_type": "display_data" 80 | } 81 | ], 82 | "source": [ 83 | "fig, axes = plt.subplots(1, 2, figsize=(8, 4))\n", 84 | "ax = axes.ravel()\n", 85 | "\n", 86 | "ax[0].set_title('Original picture')\n", 87 | "ax[0].imshow(image, cmap=plt.cm.gray, interpolation='nearest')\n", 88 | "ax[0].set_axis_off()\n", 89 | "\n", 90 | "ax[1].set_title('Transformed picture - convex hull')\n", 91 | "ax[1].imshow(chull, cmap=plt.cm.gray, interpolation='nearest')\n", 92 | "ax[1].set_axis_off()\n", 93 | "\n", 94 | "plt.tight_layout()\n", 95 | "plt.show()" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "### Showing the difference by fixing the pixel intensity on the convex hull" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 11, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [ 111 | "chull_diff = img_as_float(chull.copy())\n", 112 | "chull_diff[image] = 2" 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": 12, 118 | "metadata": {}, 119 | "outputs": [ 120 | { 121 | "data": { 122 | "image/png": "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\n", 123 | "text/plain": [ 124 | "
" 125 | ] 126 | }, 127 | "metadata": {}, 128 | "output_type": "display_data" 129 | } 130 | ], 131 | "source": [ 132 | "fig, ax = plt.subplots()\n", 133 | "ax.imshow(chull_diff, cmap=plt.cm.gray, interpolation='nearest')\n", 134 | "ax.set_title('Difference')\n", 135 | "plt.show()" 136 | ] 137 | } 138 | ], 139 | "metadata": { 140 | "kernelspec": { 141 | "display_name": "Python 3", 142 | "language": "python", 143 | "name": "python3" 144 | }, 145 | "language_info": { 146 | "codemirror_mode": { 147 | "name": "ipython", 148 | "version": 3 149 | }, 150 | "file_extension": ".py", 151 | "mimetype": "text/x-python", 152 | "name": "python", 153 | "nbconvert_exporter": "python", 154 | "pygments_lexer": "ipython3", 155 | "version": "3.6.2" 156 | }, 157 | "latex_envs": { 158 | "LaTeX_envs_menu_present": true, 159 | "autoclose": false, 160 | "autocomplete": true, 161 | "bibliofile": "biblio.bib", 162 | "cite_by": "apalike", 163 | "current_citInitial": 1, 164 | "eqLabelWithNumbers": true, 165 | "eqNumInitial": 1, 166 | "hotkeys": { 167 | "equation": "Ctrl-E", 168 | "itemize": "Ctrl-I" 169 | }, 170 | "labels_anchors": false, 171 | "latex_user_defs": false, 172 | "report_style_numbering": false, 173 | "user_envs_cfg": false 174 | } 175 | }, 176 | "nbformat": 4, 177 | "nbformat_minor": 2 178 | } 179 | -------------------------------------------------------------------------------- /Finding_contours.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Finding contours\n", 8 | "### Dr. Tirthajyoti Sarkar, Fremont CA 94536\n", 9 | "We use a marching squares method to find constant valued contours in an image. In skimage.measure.find_contours, array values are linearly interpolated to provide better precision of the output contours. Contours which intersect the image edge are open; all others are closed." 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import numpy as np\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "from skimage import measure" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "### Construct test data" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j]\n", 37 | "r = np.sin(np.exp((np.sin(x)**3 + np.cos(y)**2)))" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 4, 43 | "metadata": {}, 44 | "outputs": [ 45 | { 46 | "data": { 47 | "image/png": "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\n", 48 | "text/plain": [ 49 | "
" 50 | ] 51 | }, 52 | "metadata": {}, 53 | "output_type": "display_data" 54 | } 55 | ], 56 | "source": [ 57 | "fig, ax = plt.subplots()\n", 58 | "ax.imshow(r, interpolation='nearest', cmap=plt.cm.gray)\n", 59 | "plt.show()" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "### Find contours at a fixed threshold level" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": 5, 72 | "metadata": {}, 73 | "outputs": [], 74 | "source": [ 75 | "contours = measure.find_contours(r, 0.8)" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 6, 81 | "metadata": {}, 82 | "outputs": [ 83 | { 84 | "data": { 85 | "image/png": "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\n", 86 | "text/plain": [ 87 | "
" 88 | ] 89 | }, 90 | "metadata": {}, 91 | "output_type": "display_data" 92 | } 93 | ], 94 | "source": [ 95 | "fig, ax = plt.subplots()\n", 96 | "ax.imshow(r, interpolation='nearest', cmap=plt.cm.gray)\n", 97 | "for n, contour in enumerate(contours):\n", 98 | " ax.plot(contour[:, 1], contour[:, 0], linewidth=2)\n", 99 | "\n", 100 | "ax.axis('image')\n", 101 | "ax.set_xticks([])\n", 102 | "ax.set_yticks([])\n", 103 | "plt.show()" 104 | ] 105 | } 106 | ], 107 | "metadata": { 108 | "kernelspec": { 109 | "display_name": "Python 3", 110 | "language": "python", 111 | "name": "python3" 112 | }, 113 | "language_info": { 114 | "codemirror_mode": { 115 | "name": "ipython", 116 | "version": 3 117 | }, 118 | "file_extension": ".py", 119 | "mimetype": "text/x-python", 120 | "name": "python", 121 | "nbconvert_exporter": "python", 122 | "pygments_lexer": "ipython3", 123 | "version": "3.6.2" 124 | }, 125 | "latex_envs": { 126 | "LaTeX_envs_menu_present": true, 127 | "autoclose": false, 128 | "autocomplete": true, 129 | "bibliofile": "biblio.bib", 130 | "cite_by": "apalike", 131 | "current_citInitial": 1, 132 | "eqLabelWithNumbers": true, 133 | "eqNumInitial": 1, 134 | "hotkeys": { 135 | "equation": "Ctrl-E", 136 | "itemize": "Ctrl-I" 137 | }, 138 | "labels_anchors": false, 139 | "latex_user_defs": false, 140 | "report_style_numbering": false, 141 | "user_envs_cfg": false 142 | } 143 | }, 144 | "nbformat": 4, 145 | "nbformat_minor": 2 146 | } 147 | -------------------------------------------------------------------------------- /Interpolation - Edge modes.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Interpolation: Edge modes\n", 8 | "### Dr. Tirthajyoti Sarkar, Fremont, CA 94536\n", 9 | "\n", 10 | "This example illustrates the different edge modes available during interpolation in routines such as `skimage.transform.rescale()` and `skimage.transform.resize()`." 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 1, 16 | "metadata": {}, 17 | "outputs": [], 18 | "source": [ 19 | "import numpy as np\n", 20 | "import matplotlib.pyplot as plt\n", 21 | "\n", 22 | "from skimage.util import pad" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "### Prepare data" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "img = np.zeros((16, 16))\n", 39 | "img[:8, :8] += 1\n", 40 | "img[:4, :4] += 1\n", 41 | "img[:2, :2] += 1\n", 42 | "img[:1, :1] += 2\n", 43 | "img[8, 8] = 4" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": [ 50 | "### Show" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 4, 56 | "metadata": {}, 57 | "outputs": [ 58 | { 59 | "data": { 60 | "image/png": "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\n", 61 | "text/plain": [ 62 | "
" 63 | ] 64 | }, 65 | "metadata": {}, 66 | "output_type": "display_data" 67 | } 68 | ], 69 | "source": [ 70 | "modes = ['constant', 'edge', 'wrap', 'reflect', 'symmetric']\n", 71 | "fig, axes = plt.subplots(nrows=2, ncols=3,figsize=(10,6))\n", 72 | "ax = axes.flatten()\n", 73 | "\n", 74 | "for n, mode in enumerate(modes):\n", 75 | " img_padded = pad(img, pad_width=img.shape[0], mode=mode)\n", 76 | " ax[n].imshow(img_padded, cmap=plt.cm.gray, interpolation='nearest')\n", 77 | " ax[n].plot([15.5, 15.5, 31.5, 31.5, 15.5],\n", 78 | " [15.5, 31.5, 31.5, 15.5, 15.5], 'y--', linewidth=0.5)\n", 79 | " ax[n].set_title(mode)\n", 80 | "\n", 81 | "for a in ax:\n", 82 | " a.set_axis_off()\n", 83 | " a.set_aspect('equal')\n", 84 | "\n", 85 | "plt.tight_layout()\n", 86 | "plt.show()" 87 | ] 88 | } 89 | ], 90 | "metadata": { 91 | "kernelspec": { 92 | "display_name": "Python 3", 93 | "language": "python", 94 | "name": "python3" 95 | }, 96 | "language_info": { 97 | "codemirror_mode": { 98 | "name": "ipython", 99 | "version": 3 100 | }, 101 | "file_extension": ".py", 102 | "mimetype": "text/x-python", 103 | "name": "python", 104 | "nbconvert_exporter": "python", 105 | "pygments_lexer": "ipython3", 106 | "version": "3.6.2" 107 | }, 108 | "latex_envs": { 109 | "LaTeX_envs_menu_present": true, 110 | "autoclose": false, 111 | "autocomplete": true, 112 | "bibliofile": "biblio.bib", 113 | "cite_by": "apalike", 114 | "current_citInitial": 1, 115 | "eqLabelWithNumbers": true, 116 | "eqNumInitial": 1, 117 | "hotkeys": { 118 | "equation": "Ctrl-E", 119 | "itemize": "Ctrl-I" 120 | }, 121 | "labels_anchors": false, 122 | "latex_user_defs": false, 123 | "report_style_numbering": false, 124 | "user_envs_cfg": false 125 | } 126 | }, 127 | "nbformat": 4, 128 | "nbformat_minor": 2 129 | } 130 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Tirthajyoti Sarkar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Please feel free to [connect with me here on LinkedIn](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/) if you are interested in data science and machine learning. 2 | 3 | --- 4 | 5 | # Image processing examples with Numpy, Scipy, and Scikit-image 6 | 7 | ### Requirements 8 | 9 | * **Python 3.4+** 10 | * **NumPy (`$ pip install numpy`)** 11 | * **SciPy (`$ pip install scipy`)** 12 | * **MatplotLib (`$ pip install matplotlib`)** 13 | * **Scikit-image (`$ pip install scikit-image`)** 14 | 15 | --- 16 | 17 | ### Testing after install 18 | 19 | Open a Jupyter notebook and execute the following code, 20 | ``` 21 | import numpy as np 22 | import matplotlib.pyplot as plt 23 | from skimage import data, io, filters 24 | 25 | image = data.coins() # or any NumPy array! 26 | edges = filters.sobel(image) 27 | io.imshow(edges) 28 | ``` 29 | 30 | You should see the following output. If you see this, you are all set to go! 31 | 32 | ![sobel_coins](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/images/sobel_coins.PNG) 33 | 34 | --- 35 | 36 | ### Simple NumPy array based operations 37 | * [Demo of NumPy based image manipulation](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Using_Numpy_image_manipulation.ipynb)
38 | 39 | 40 | * [Block view function and pooling/sampling](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Block_view_mean_max_median_sampling.ipynb)
41 | 42 | 43 | * [Zooming (interpolation) based on SciPy](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Scipy_zooming.ipynb) 44 | 45 | --- 46 | 47 | ### Exposure and color channel manipulations 48 | * [RGB to gray conversion](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/RGB2Gray.ipynb)
49 | 50 | 51 | * [RGB to HSV (Hue-Saturation-Value) conversion](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/RGB_to_HSV.ipynb)
52 | 53 | 54 | * [Adapting gray-scale filters to RGB images using special decorator](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Adapt_RGB_decorator.ipynb) 55 | 56 | * [Adjusting contrast by filtering regional maxima](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Filtering_regional_maxima.ipynb)
57 | 58 | 59 | * [Local Histogram equalization](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Local_Histogram_Equalization.ipynb)
60 | 61 | 62 | * [Gamma and log contrast](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Gamma_log_contrast_adjustment.ipynb) 63 | 64 | * [Tinting grayscale images](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Tint_Grayscale.ipynb)
65 | 66 | 67 | --- 68 | 69 | ### Edges, lines, and contours 70 | 71 | * [Finding contours](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Finding_contours.ipynb)
72 | 73 | 74 | * [Convex Hull of an image](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Convex_Hull.ipynb)
75 | 76 | 77 | * [Skeletonize 2-D and 3-D images](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Skeletonize.ipynb)
78 | 79 | 80 | * [Marching cubes](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Marching_cubes.ipynb)
81 | 82 | 83 | * [Edge operators](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Edge_operators.ipynb)
84 | 85 | 86 | --- 87 | 88 | ### Geometrical transformations and registration 89 | 90 | * [Swirl](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Swirl.ipynb)
91 | 92 | 93 | * [Interpolation - edge modes](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Interpolation%20-%20Edge%20modes.ipynb)
94 | 95 | 96 | * [Rescale, resize, downscale](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Rescale_resize_downscale.ipynb) 97 | 98 | * [Histogram matching](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Histogram_matching.ipynb)
99 | 100 | 101 | * [Structural similarity index](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Structural_similarity_index.ipynb) 102 | 103 | ### Filtering and restoration 104 | 105 | [Hysteresis thresholding](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Hysteresis_thresholding.ipynb)
106 | 107 | 108 | [Image deconvolution](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Image_deconvolution.ipynb) 109 | 110 | [Unsharp mask](https://github.com/tirthajyoti/Scikit-image-processing/blob/master/Unsharp_mask.ipynb)
111 | 112 | -------------------------------------------------------------------------------- /Random_shapes.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Generating random shapes\n", 8 | "### Dr. Tirthajyoti Sarkar, Fremont, CA 94536\n", 9 | "\n", 10 | "This notebook demonstrates generation of random shapes with various properties.
\n", 11 | "It uses the `random_shapes()` function from `skimage.draw`." 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import matplotlib.pyplot as plt\n", 21 | "\n", 22 | "from skimage.draw import random_shapes" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "### Let's start simple and generate a 128x128 image with a single grayscale rectangle.\n", 30 | "We get back a tuple consisting of \n", 31 | "1. The image with the generated shapes and \n", 32 | "2. A list of label tuples with the kind of shape (e.g. circle, rectangle) and ((r0, r1), (c0, c1)) coordinates." 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": {}, 39 | "outputs": [], 40 | "source": [ 41 | "rect = random_shapes((128, 128), max_shapes=1, shape='rectangle',\n", 42 | " multichannel=False)" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 17, 48 | "metadata": {}, 49 | "outputs": [ 50 | { 51 | "name": "stdout", 52 | "output_type": "stream", 53 | "text": [ 54 | "Image shape: (128, 128)\n", 55 | "Labels: [('rectangle', ((45, 69), (20, 52)))]\n" 56 | ] 57 | } 58 | ], 59 | "source": [ 60 | "image, labels = rect\n", 61 | "print('Image shape: {}\\nLabels: {}'.format(image.shape, labels))" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 18, 67 | "metadata": {}, 68 | "outputs": [ 69 | { 70 | "data": { 71 | "image/png": "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\n", 72 | "text/plain": [ 73 | "
" 74 | ] 75 | }, 76 | "metadata": {}, 77 | "output_type": "display_data" 78 | } 79 | ], 80 | "source": [ 81 | "fig, ax = plt.subplots(nrows=1, ncols=1,figsize=(4,4))\n", 82 | "ax.imshow(image, cmap='gray')\n", 83 | "ax.set_title('Grayscale shape')\n", 84 | "plt.show()" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": {}, 90 | "source": [ 91 | "### The generated images can be much more complex \n", 92 | "For example, let's try many shapes of any color. If we want the colors to be particularly light, we can set the `intensity_range` to an upper subrange of (0,255)." 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 19, 98 | "metadata": {}, 99 | "outputs": [], 100 | "source": [ 101 | "image1, _ = random_shapes((128, 128), max_shapes=10,\n", 102 | " intensity_range=((100, 255),))\n", 103 | "image2, _ = random_shapes((128, 128), max_shapes=10,\n", 104 | " intensity_range=((200, 255),))\n", 105 | "image3, _ = random_shapes((128, 128), max_shapes=10,\n", 106 | " intensity_range=((50, 255),))\n", 107 | "image4, _ = random_shapes((128, 128), max_shapes=10,\n", 108 | " intensity_range=((0, 255),))" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 23, 114 | "metadata": {}, 115 | "outputs": [ 116 | { 117 | "data": { 118 | "image/png": "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\n", 119 | "text/plain": [ 120 | "
" 121 | ] 122 | }, 123 | "metadata": {}, 124 | "output_type": "display_data" 125 | } 126 | ], 127 | "source": [ 128 | "fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(8,8))\n", 129 | "ax = axes.ravel()\n", 130 | "for i, image in enumerate([image1, image2, image3, image4], 0):\n", 131 | " ax[i].imshow(image)\n", 132 | " ax[i].set_title('Colored shapes, #{}'.format(i-1))\n", 133 | "plt.show()" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "### Overlapping shapes\n", 141 | "These shapes are well suited to test segmentation algorithms. Often, we want shapes to overlap to test the algorithm." 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 32, 147 | "metadata": {}, 148 | "outputs": [], 149 | "source": [ 150 | "image, _ = random_shapes((128, 128), min_shapes=5, max_shapes=6,\n", 151 | " min_size=20, allow_overlap=True)" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 33, 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "data": { 161 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAAExCAYAAAA6ILT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAADu9JREFUeJzt3X2MHHd9x/HPJzg4JARHyIeondiWCEpaRKrCFqhCeXJALhQ1ciGVKrc85oigFUhpaHlo65QgKKEqqA9EV6oATRMIKFUpVdMEhwJNIGgNrXgqcigOrknIumAn1CGE9Ns/ZtZMtrvePd/Oznd23y9ppb2b2Z3frX0ff+Y7e2dHhAAgi5OaXgAAVBFKAFIhlACkQigBSIVQApAKoQQgFUJpztgO22fP4Dhftf2cuo8zcMyZfG1oFqFUM9svt/1l20dt3237fbbPaHpdaxURT4qIf2l6HZg/hFKNbF8q6Y8lXSZpg6RnSNoq6Wbbj5zysdZN8/mAphBKNbH9GEmXS/rtiLgxIh6MiP2SLlIRTLtsb7J9v+3HVh73c7YP2T65/PiVtr9u+/u2/9n21sq+Yft1tvdJ2jdkDS+y/SXb99o+YHt3Zdu28vHLtr9j+64yRPvbd9v+mO2P2L7P9hdt/2xl+37bF1T2vd72h8p9v2q7U9n3KeU67rP90fI5rxjxup1t+9O2j5Svw0cGdrnA9r7y9fgL2y4f9wTbt9j+7/Jxf1ttpOV632T7a+Vjr7Z9SmX7L9v+N9uHbd9m+7zKtt+1fbBc/zdsbx+2dkxJRHCr4SZph6QfS1o3ZNsHJV1X3r9F0sWVbVdKuqq8f6GkOyT9tKR1kt4q6bbKviHpZkmPlfSoyufOLu8/R9KTVfzjc56k70q6sNy2rdz3Okmnlfv1JF1Qbt8t6UFJL5F0sqTfkfQtSSeX2/cP7PtDSS+U9AhJ75D0+XLbIyXdKen15fPslPQjSVeMeN2uk/SWcs2nSHrmwNf7CUlnSNpSrndHue1sSc+XtF7SkqTPSHpP5bH7JX1F0lnl63Vrfw2SniLpHklPL9f/snL/9ZLOkXRA0qbK6/aEpv9+zfOt8QXM603SLkl3j9j2Tkk3l/dfLemW8r7Lb4BnlR//k6RXVR53kqSjkraWH4ek5w0897FQGnLc90j60/J+P5TOrWx/l6S/Lu/v7gdL5dh3SfrF8uPBUPpkZd+fkXR/ef9Zkg5KcmX7vx4nlD4kaUXSmUO2xUBIXS/p90Y8z4WSvlT5eL+kSyofv1DSN8v775P0toHHf0PSs8uwu0fSBSoDmVu9N07f6nNI0sYRs56fKrdL0sck/YLtTSq+gUPSZ8ttWyW9tzylOCzpeyqCa3PluQ6MWoDtp9v+lO2e7SOSLpG0cWC36uPvlLRp2LaI+F9J/zWwveruyv2jkk4pv/ZNkg5G+Z0+bs2S3qjia/xCeRr4yjHHebQk2X6c7Q+Xp1n3SrpGk3+tWyVd2n+dy9f6LBXt6A5Jb1ARvPeUxxj1GmAKCKX6fE7SAypOV46xfZqkX5K0R5Ii4rCkm1TMmn5dxWld/xv4gKTXRMQZldujIuK2ylMe79c8XCvp45LOiogNkq5S8Q1fdVbl/hZJ3xm2zfZJks4c2D6JuyRt7s9+hhzzYSLi7oi4OCI2SXqNpL+c8G0A71DxWpwXEY9R0VQn/VoPSHr7wOt8akRcV67p2oh4porwChUXL1ATQqkmEXFExaD7z2zvsH2y7W2SPqqicfxNZfdrJf2mpF8t7/ddJelNtp8kSbY32H7pKpZxuqTvRcQPbT9NRegN+n3bp5bHeIWk6mD5qbZ3lo3nDSpC9vOrOL5UhPNDkn7L9jrbvyLpaaN2tv1S22eWH35fRQg8NMFxTpf0A0mHbW9WccVz0Otsn1leWHizfvK1/pWkS8pmadunlRcJTrd9ju3n2V6vYm52/4TrwQkilGoUEe9S8Zf/3ZLulXS7in+Vt0fEA5VdPy7piZK+GxH/Xnn836n4V/nD5SnJV1S0rEm9VtIf2b5P0h+omMEM+rSKYfoeSe+OiJsq2/5e0q+pCIffkLQzIh5cxfEVET9S0RZfJemwigbzCRUBN8zPS7rd9g9UvC6vj4hvTXCoy1UMrI9I+kdJNwzZ51oVrfQ/y9sV5Rq7ki6W9OcqvtY7JL28fMx6FTPAQypOHR+n4s8UNfHDT/WxKMrW1r+a9uMh23erGJjvquHYt6u4wnj1tJ/7OMfcL+nVEfHJWR0TJ4amhNrZfrbtx5enby9T8faEG5teF3LiXcCYhXNUnDo+WtI3Jb0kIu5qdknIitM3AKlw+gYgFUIJQCqrmilt3Lgxtm3bVtNSAMyzvXv3HoqIpXH7jQ0l28uSliVpy5Yt6na7U1gegEVj+85J9ht7+hYRKxHRiYjO0tLYkAOANWGmBCAVQglAKoQSgFQIJQCpEEoAUiGUAKRCKAFIhVACkAqhBCAVQglAKoQSgFQIJQCpEEoAUiGUAKRCKAFIhVACkAqhBCAVQglAKoQSgFQIJQCpEEoAUiGUAKRCKAFIhVACkAqhBCAVQglAKoQSgFQIJQCpEEoAUiGUAKRCKAFIhVACkAqhBCAVQglAKoQSgFQIJQCpEEoAUiGUAKRCKAFIhVACkMrYULK9bLtru9vr9WaxJgALbGwoRcRKRHQiorO0tDSLNQFYYJy+AUiFUAKQCqEEIBVCCUAqhBKAVAglAKkQSgBSIZQApEIoAUiFUAKQCqEEIBVCCUAqhBKAVAglAKkQSgBSIZQApEIoAUiFUAKQCqEEIBVCCUAq65peAJDZC87/w6aXUJubbr286SUMRVMCkAqhBCAVQglAKoQSgFQIJQCpEEoAUiGUAKRCKAFIhVACkAqhBCAVQglAKoQSgFQIJQCpEEoAUiGUAKRCKAFIhVACkAqhBCAVQglAKmNDyfay7a7tbq/Xm8WaACywsaEUESsR0YmIztLS0izWBGCBcfoGIBVCCUAqhBKAVAglAKkQSgBSIZQApEIoAUiFUAKQCqEEIBVCCUAqhBKAVAglAKkQSgBSIZQApEIoAUiFUAKQCqEEIBVCCUAqhBKAVAglAKkQSgBSIZQApEIoAUiFUAKQCqEEIBVCCUAqhBKAVAglAKkQSgBSIZQApEIoAUiFUAKQCqEEIBVCCUAqhBKAVAglAKkQSgBSWdf0AgA069v7Hjh2f8sT1ze4kgJNCUAqNCVgQVUb0uDnmmxMNCUAqYwNJdvLtru2u71ebxZrArDAxp6+RcSKpBVJ6nQ6UfuKgCnZfsOta3+SS19wwg99xJ/ctPbjLyBO3wCkwqAbrTeVRlSDh0a0rKYb1Ps/8Oax+zQ58KYpAUiFpoRWyNqGTsSoBiU136IyoCkBSIWmhJTmqRmtxmCLmmZzmmSWNKiJ2RJNCUAqNCWksqgNaZR+c1qkWRNNCUAqNCU0imY0mbXMmk5kljRolrMlmhKAVGhKaAQNaW3medZEUwKQCk0piSuv2SxJumzXwYZXUh/a0fRVZ02DrWkas6RBs5gt0ZQApEIoAUjFEZP/3rZOpxPdbrfG5Sye/mnboHk6jeO0bbaufnJnZsdazWmc7b0RMXZxNCUAqTDoRm1oSM14xZeLs5lZNqZpoikBSIWZUkNGzZIGtXG2REPKZRaNaZLZEjMlAK3ETAlTQ0PKqW0zJpoSgFSYKc3YpLOkYbLOl2hI7VJ3Yxo1X2KmBKCVCKUWufKazWtqWkAbEEoAUuHq24zMY8NhltROdV+NW+uvN6EpAUiFplSjutpR078QjoY0H7K+f4mmBCAVQglAKoQSgFp8e98Dx4beq0EoAUiFHzOpwawv/89i4M1wezHs2Xl+bc/Nj5kAaCVCaQ7w4yeYJ4QSgFR48+QU0VaAtRvblGwv2+7a7vZ6vVmsCcACm8urb586sr3W53/uhj1DP5+lKU3zahxX3RZTHVfhuPoGoJXmYqZUdzMad7zuP/zHTI8PzDOaEoBUWt2UZt2QRum8+FxJeRpT07/aBFgLmhKAVFrVlLI0o1H6jakvS3M6EVx1W2z9P/86fxZuFJoSgFQIJQCptOL0Lftp2yjV07kmTuUYeKONaEoAUmlFU8LaVH/8hdaE7GhKAFJJ3ZTaOksaJtsbLIGsaEoAUknXlOapHQ3TdGPiihyyoykBSIVQApAKoQQglTQzpXmfJQ1itgQMR1MCkAqhtOD4jyyRDaEEIBVCCUAqhBKAVAglAKkQSpDEwBt5EEoAUiGUAKRCKAFIJc2PmSCHY3OlU69vdiFYWDQlAKkQSgBSIZQApEIoYagdRy/SjqMXNb0MLCBCCUAqhBKOi8aEWSOUAKTC+5QA/D97dp7f2LFpSgBSoSlhItW50o282xs1oikBSGVsKNlett213e31erNYE4AFNvb0LSJWJK1IUqfTiboW8twNeyQtzv//1tT/9wZkx+kbgFQYdGPV+kNvBt7zp8m3AvTRlACkkq4p9WdL0nzOl+ZplkRjQh1oSgBSSdeUqubpitw8NSSgTjQlAKmkbkpoB2ZL7ZbhilsVTQlAKq1oSm2dLTFHAlaPpgQglVY0pb7qe5ikfM1p0ZsRs6V2yTZL6qMpAUilVU1pUJZZ06I3JLRL1obUR1MCkAqhBCCVVp++9Q2ePnVefO5Mj4eHY+CNtaApAUil1U3pyms2D/08TSYHGlMu2QfcfTQlAKm0uikBGK8tDamPpgQglVY2pVGzJOTEbKkZbWtIfTQlAKm0qinRkIDx2tqQ+mhKAFJpVVNCu/VnSxLzpTq0vSH10ZQApNKKpsQsaf5wRW465qUdVdGUAKTSiqYE4OHmsSH10ZQApEIoAUgl9ekbA+751x94X7broCRp+w23NrmctOb5dG0QTQlAKqmbEhZPvxHQmAqL1JD6aEoAUnFETLxzp9OJbrdb43KYIy26/mxp0KI0p3luRrb3RkRn3H40JQCppGtKwGq1rUXNcxs6nqk1JdvLtru2u71ebzqrA4ARaEqYW003qEVtRKMwUwLQSrxPCXOLptJONCUAqRBKAFIhlACkQigBSIVQApAKoQQgFUIJQCqEEoBUCCUAqRBKAFIhlACkQigBSGVVv7rEdk/S/0g6VNuKpmej2rFOqT1rbcs6pfastS3rlNa+1q0RsTRup1WFkiTZ7k7yO1Ga1pZ1Su1Za1vWKbVnrW1ZpzS7tXL6BiAVQglAKicSSitTX0U92rJOqT1rbcs6pfastS3rlGa01lXPlACgTpy+AUiFUAKQCqEEIBVCCUAqhBKAVP4PTkriMhBInxEAAAAASUVORK5CYII=\n", 162 | "text/plain": [ 163 | "
" 164 | ] 165 | }, 166 | "metadata": {}, 167 | "output_type": "display_data" 168 | } 169 | ], 170 | "source": [ 171 | "fig, ax = plt.subplots(nrows=1, ncols=1,figsize=(5,5))\n", 172 | "ax.imshow(image)\n", 173 | "ax.set_title('Overlapping shapes')\n", 174 | "ax.set_xticklabels([])\n", 175 | "ax.set_yticklabels([])\n", 176 | "\n", 177 | "plt.show()" 178 | ] 179 | } 180 | ], 181 | "metadata": { 182 | "kernelspec": { 183 | "display_name": "Python 3", 184 | "language": "python", 185 | "name": "python3" 186 | }, 187 | "language_info": { 188 | "codemirror_mode": { 189 | "name": "ipython", 190 | "version": 3 191 | }, 192 | "file_extension": ".py", 193 | "mimetype": "text/x-python", 194 | "name": "python", 195 | "nbconvert_exporter": "python", 196 | "pygments_lexer": "ipython3", 197 | "version": "3.6.2" 198 | }, 199 | "latex_envs": { 200 | "LaTeX_envs_menu_present": true, 201 | "autoclose": false, 202 | "autocomplete": true, 203 | "bibliofile": "biblio.bib", 204 | "cite_by": "apalike", 205 | "current_citInitial": 1, 206 | "eqLabelWithNumbers": true, 207 | "eqNumInitial": 1, 208 | "hotkeys": { 209 | "equation": "Ctrl-E", 210 | "itemize": "Ctrl-I" 211 | }, 212 | "labels_anchors": false, 213 | "latex_user_defs": false, 214 | "report_style_numbering": false, 215 | "user_envs_cfg": false 216 | } 217 | }, 218 | "nbformat": 4, 219 | "nbformat_minor": 2 220 | } 221 | -------------------------------------------------------------------------------- /Shapes_drawing.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Drawing shapes\n", 8 | "### Dr. Tirthajyoti Sarkar, Fremont CA 94536\n", 9 | "This example shows how to draw several different shapes:\n", 10 | "\n", 11 | "* line\n", 12 | "* Bezier curve\n", 13 | "* polygon\n", 14 | "* circle\n", 15 | "* ellipse\n", 16 | "\n", 17 | "Anti-aliased drawing for:\n", 18 | "\n", 19 | "* line\n", 20 | "* circle" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 1, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "import math\n", 30 | "import numpy as np\n", 31 | "import matplotlib.pyplot as plt\n", 32 | "\n", 33 | "from skimage.draw import (line, polygon, circle,\n", 34 | " circle_perimeter,\n", 35 | " ellipse, ellipse_perimeter,\n", 36 | " bezier_curve)\n", 37 | "from skimage.draw import line_aa, circle_perimeter_aa" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": {}, 43 | "source": [ 44 | "### Blank canvas" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 2, 50 | "metadata": {}, 51 | "outputs": [], 52 | "source": [ 53 | "img = np.zeros((500, 500, 3), dtype=np.double)\n", 54 | "img = np.zeros((500, 500, 3))" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": {}, 60 | "source": [ 61 | "### Draw line" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 3, 67 | "metadata": {}, 68 | "outputs": [], 69 | "source": [ 70 | "rr, cc = line(120, 123, 20, 400)\n", 71 | "img[rr, cc, 0] = 255" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "### Fill polygon" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 4, 84 | "metadata": {}, 85 | "outputs": [], 86 | "source": [ 87 | "poly = np.array((\n", 88 | " (300, 300),\n", 89 | " (480, 320),\n", 90 | " (380, 430),\n", 91 | " (220, 590),\n", 92 | " (300, 300),\n", 93 | "))\n", 94 | "\n", 95 | "rr, cc = polygon(poly[:, 0], poly[:, 1], img.shape)\n", 96 | "img[rr, cc, 1] = 1" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": {}, 102 | "source": [ 103 | "### Fill circle" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 5, 109 | "metadata": {}, 110 | "outputs": [], 111 | "source": [ 112 | "rr, cc = circle(200, 200, 100, img.shape)\n", 113 | "img[rr, cc, :] = (1, 1, 0)" 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "### Fill ellipse" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": {}, 127 | "outputs": [], 128 | "source": [ 129 | "rr, cc = ellipse(300, 300, 100, 200, img.shape)\n", 130 | "img[rr, cc, 2] = 1" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "### Circle" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 7, 143 | "metadata": {}, 144 | "outputs": [], 145 | "source": [ 146 | "rr, cc = circle_perimeter(120, 400, 15)\n", 147 | "img[rr, cc, :] = (1, 0, 0)" 148 | ] 149 | }, 150 | { 151 | "cell_type": "markdown", 152 | "metadata": {}, 153 | "source": [ 154 | "### Bezier curve" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": 8, 160 | "metadata": {}, 161 | "outputs": [], 162 | "source": [ 163 | "rr, cc = bezier_curve(70, 100, 10, 10, 150, 100, 1)\n", 164 | "img[rr, cc, :] = (1, 0, 0)" 165 | ] 166 | }, 167 | { 168 | "cell_type": "markdown", 169 | "metadata": {}, 170 | "source": [ 171 | "### Ellipses" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 9, 177 | "metadata": {}, 178 | "outputs": [], 179 | "source": [ 180 | "rr, cc = ellipse_perimeter(120, 400, 60, 20, orientation=math.pi / 4.)\n", 181 | "img[rr, cc, :] = (1, 0, 1)\n", 182 | "rr, cc = ellipse_perimeter(120, 400, 60, 20, orientation=-math.pi / 4.)\n", 183 | "img[rr, cc, :] = (0, 0, 1)\n", 184 | "rr, cc = ellipse_perimeter(120, 400, 60, 20, orientation=math.pi / 2.)\n", 185 | "img[rr, cc, :] = (1, 1, 1)" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 10, 191 | "metadata": {}, 192 | "outputs": [ 193 | { 194 | "name": "stderr", 195 | "output_type": "stream", 196 | "text": [ 197 | "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" 198 | ] 199 | }, 200 | { 201 | "data": { 202 | "image/png": "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\n", 203 | "text/plain": [ 204 | "
" 205 | ] 206 | }, 207 | "metadata": {}, 208 | "output_type": "display_data" 209 | } 210 | ], 211 | "source": [ 212 | "fig, ax1 = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))\n", 213 | "ax1.imshow(img)\n", 214 | "ax1.set_title('Shapes',fontsize=16)\n", 215 | "ax1.axis('off')\n", 216 | "plt.show()" 217 | ] 218 | }, 219 | { 220 | "cell_type": "markdown", 221 | "metadata": {}, 222 | "source": [ 223 | "### Anti-aliasing drwaing" 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": 11, 229 | "metadata": {}, 230 | "outputs": [ 231 | { 232 | "data": { 233 | "image/png": "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ACOmswYYE8IaIAFhDZCAsAZIQFgDJCCsARIQ1gAJCGuABIQ1QALCGiABYQ2QgLAGSEBYAyQgrAESENYACQhrgASENUACwhogAWENkICwBkhAWAMkIKwBEhDWAAkIa4AEhDVAAsIaIAFhDZCAsAZIYMWoF8DytWHDhjZv2bKlzRs3buw9bv369W1eu3Ztm1evXt173KpVq9q8YsV7H72ZmZk2X7lypfecS5cutfn8+fNtPnv2bJtPnz7de87x48fbfObMmYBx4MgaIAFhDZBAqbUO781KGd6bMa+tW7e2eceOHb1927dvb/PFixfb3K0WTp061XvOuXPn2tytKroVRkS/4uhWH91KpFuVRPSrlG7Fsm7dujZv2rSp95xuZbNmzZo2HzlypM2HDx/uPefYsWMBo1JrLQs9xpE1QALCGiABYQ2QgM56jExNTfW2n3zyyTY/9thjbT558mSb53a33V6321ln1e2su3383K7+/vvvb/Mrr7zS5hdeeKH3uOnp6Zu9RNBZA4wLYQ2QgBokuX379rX5c5/7XG9f91v47rf241Bv3GzduqRbGXWrpIiIF198sc179+699QtjIqhBAMaEsAZIQA2SwM6dO3vbBw8ebPNTTz3V5v379w9rSRNrz549bX7++efbvGvXrjYfOnRomEtiDKhBAMaEsAZIQA2yTB09erTNFy5c6O3rfsvdvSESw9W9AVW3mrrnnnt6j9u2bdvQ1kROahCAMSGsARIQ1gAJ6KxHbPPmzW3u3uC/23O6MX4u3X/cIaL/84fuP4xw4sSJoa2J5U1nDTAmhDVAAmqQIXv44Yd7248//nibu98iM566VdfLL7/c5tdff30Uy2GZUIMAjAlhDZDAioUfwlJ1q47u2R8Rqo9J0/3v/dprr7X5jjvu6D2uW5FAhCNrgBSENUACwhogAafu3SLdnnrdunVtfuKJJ0axHJa5l156qbd97ty5Nuuvx59T9wDGhLAGSEANchN1r0588MEH2/zII4+MYjkk1j2t74033mizKx3HkxoEYEwIa4AE1CBLMPdqxAMHDrTZlYncLN2bP+3evbu3zz2xx4MaBGBMCGuABNQgSzD3766UBb+TgSXxmRtPahCAMSGsARIQ1gAJ+McHrtPRo0fbvG3bthGuhEk09zPn8zg5HFkDJCCsARJw6t4i7Ny5s80PPPBAmx999NERrAbe8+qrr7b5K1/5SpsPHTo0gtVwo5y6BzAmhDVAAmqQRbh27Vqbp6am2jwzMzOK5UCzYsV7J3RNT0+3eeXKlaNYDjdIDQIwJoQ1QAJqkHns27evzZcvX27z/v37R7EcWNCePXvafOedd7Z57969o1gO10ENAjAmhDVAAsIaIAGd9UD3lLyIiLfffrvNt99++7CXA0ty9erVNt911129fd1T/FgedNYAY0JYAySgBhl4+umne9u33XZbm5955plhLweW5Nlnn23zu+++29v33HPPDXs5LEANAjAmhDVAAmqQgbfeequ3fd9997X54sWLw14OLMmaNWva/Oabb/b23X333cNeDgtQgwCMCWENkMBE/+vmW7dubfPJkyd7+1QfZNb9/M79bHc/98eOHRvamlgaR9YACQhrgASENUACE91Z79ixo82HDx8e4Urg1pn72e5+7nXWeTiyBkhAWAMkMNFXMHavWuxesRjh1D3GR/dqxoj+FY2uZlweXMEIMCaENUACE3c2yIYNG9rcrTrUHoyruZ/t7nb36+HMmTNDWxPXz5E1QALCGiABYQ2QwMR11lu2bGnz8ePHR7gSGI3u57779aCzXt4cWQMkIKwBEpi4GmTjxo1tPnXq1AhXAqPR/dx3vx5Y3hxZAyQgrAESmLgaZP369W3+4he/OMKVwGicO3euzQ899NAIV8L1cGQNkICwBkhg4mqQtWvXtvn8+fMjXAmMRvdz3/16YHlzZA2QgLAGSEBYAyQwcZ316tWr23zp0qURrgRGo/u57349sLw5sgZIQFgDJFBqrcN7s1KG92bzuHbtWpunpqbaPDMzM4rlwNCtWPFe+zk9Pd3mlStXjmI5RESttSz0GEfWAAkIa4AEJq4G6f55S1nwOw8Ya74elgc1CMCYENYACUzcRTHdsz66PxV3NgiTwuc+J0fWAAkIa4AEhDVAAhPXWV+5cqXNq1atavPly5dHsRwYuu7nvvv1wPLmyBogAWENkMDE1SDz3ctXDcKkcE/3nBxZAyQgrAESmLga5Pz5821eu3Ztm7/xjW+MYjkwdN3PfffrgeXNkTVAAsIaIAFhDZDAxHXWZ8+ebfO6deva/OUvf3kUy4Gh637uu18PLG+OrAESENYACUxcDXL69Ok2b968eYQrgdHYtGlTm0+cODHClXA9HFkDJCCsARKYuBrk+PHjbd69e/cIVwKjsWXLljYfOHBghCvhejiyBkhAWAMkUGqtw3uzUob3Zovw1ltvtfm+++7r7bt48eKwlwO3xJo1a3rbb775ZpvvvvvuYS+Hn6DWWhZ6jCNrgASENUACwhoggYk7da/ryJEjbd6+fXtv36uvvjrs5cAtMfez3f3ck4cja4AEhDVAAhNdgxw+fLjNc69mVIMwLnbs2NHbdtViTo6sARIQ1gAJTPQVjF3dqxkj+lc0upqRbLpXLXavWIxw1eJy5ApGgDEhrAESUIMMPP30073t2267rc3PPPPMsJcDS/Lss8+2+d133+3te+6554a9HBagBgEYE8IaIAFhDZCAznpgamqqt/3222+3+fbbbx/2cmBJrl692ua77rqrt296enrYy2EBOmuAMSGsARJQg8xj3759bb58+XKb9+/fP4rlwIL27NnT5jvvvLPNe/fuHcVyuA5qEIAxIawBElCDLMK1a9fa3D1rZGZmZhTLgWbFivduSd89y2PlypWjWA43SA0CMCaENUACwhoggYn+NxgXa9euXW0+ePBgmx999NFRLAea7uex+zll/DiyBkhAWAMk4NS963T06NE2HzhwoLfv2LFjw14OE2br1q297d27d7d527Ztw14ON4lT9wDGhLAGSEANsgRz/+5KWfA7GVgSn7nxpAYBGBPCGiABF8UswZYtW3rbx48fn3cf3CifKyIcWQOkIKwBEhDWAAk4de8mevjhh9v84IMPtvmRRx4ZxXJI7LXXXmvzG2+80ebXX399FMvhFnPqHsCYENYACahBbpHHH3+8zevWrWvzE088MYrlsMy99NJLve1z5861+eWXXx72chgyNQjAmBDWAAmoQYagW4ls3ry5t8+ZIpOre8bHiRMnevtUH5NFDQIwJoQ1QAJu5DQE3W9p33nnnd4+N+mZLN3/3t3PhYtdWIgja4AEhDVAAsIaIAGn7o1Y91S+bp+5bdu2Nh87dmyoa2Jptm7d2ts+evRom7s/l5h7uh6Ty6l7AGNCWAMkoAZZprrfOl+4cKG3b9euXW2emZkZ2proW7HivTNfDx482OZ77rmn97hupQU/iRoEYEwIa4AEXMG4THW/dd65c2dv3/T0dJufeuqpNu/fv/+Wr2vS7dmzp83PP/98m7vV1KFDh4a5JCaEI2uABIQ1QAJqkATmflvd3d63b1+br1692nvcCy+80OZXXnmlzRcvXry5CxwDa9asafNjjz3W5ieffLL3uBdffLHNK1euvPULgwFH1gAJCGuABIQ1QAKuYBwjU1NTve1u39rtYU+ePNnmw4cP955z5MiRNo9Dt93tordv397mHTt29B53//33t7nb73d7/4j+aZNws7iCEWBMCGuABNQgE6h7v+W5dUC3KujWIN17bZ86dar3nHPnzrX5/Pnzbb506VLvcVeuXGlz9wZU3RsirVq1qvec1atXt3nt2rVtXrduXZs3bdrUe073ntHdGqRb8cytf9wznFFSgwCMCWENkIAahHlt2LChzd1qYePGjb3HrV+/vs3dqqJbYUT0K45u9dGtRLpVSUS/SulWLGfPnm3z6dOne8/pVjZnzpwJWO7UIABjQlgDJCCsARLQWQOMmM4aYEwIa4AEhDVAAsIaIAFhDZCAsAZIQFgDJCCsARIQ1gAJCGuABIQ1QALCGiABYQ2QgLAGSEBYAyQgrAESENYACQhrgASENUACwhogAWENkICwBkhAWAMkIKwBEhDWAAkIa4AEhDVAAsIaIIFSax31GgBYgCNrgASENUACwhogAWENkICwBkhAWAMkIKwBEhDWAAkIa4AEhDVAAsIaIAFhDZCAsAZIQFgDJCCsARIQ1gAJCGuABIQ1QALCGiABYQ2QgLAGSEBYAyQgrAES+P9G5IeVXVAe2wAAAABJRU5ErkJggg==\n", 234 | "text/plain": [ 235 | "
" 236 | ] 237 | }, 238 | "metadata": {}, 239 | "output_type": "display_data" 240 | } 241 | ], 242 | "source": [ 243 | "img = np.zeros((100, 100), dtype=np.double)\n", 244 | "\n", 245 | "# anti-aliased line\n", 246 | "rr, cc, val = line_aa(12, 12, 20, 50)\n", 247 | "img[rr, cc] = val\n", 248 | "\n", 249 | "# anti-aliased circle\n", 250 | "rr, cc, val = circle_perimeter_aa(60, 40, 30)\n", 251 | "img[rr, cc] = val\n", 252 | "\n", 253 | "fig, ax2 = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))\n", 254 | "ax2.imshow(img, cmap=plt.cm.gray, interpolation='nearest')\n", 255 | "ax2.set_title('Anti-aliasing')\n", 256 | "ax2.axis('off')\n", 257 | "\n", 258 | "plt.show()" 259 | ] 260 | } 261 | ], 262 | "metadata": { 263 | "kernelspec": { 264 | "display_name": "Python 3", 265 | "language": "python", 266 | "name": "python3" 267 | }, 268 | "language_info": { 269 | "codemirror_mode": { 270 | "name": "ipython", 271 | "version": 3 272 | }, 273 | "file_extension": ".py", 274 | "mimetype": "text/x-python", 275 | "name": "python", 276 | "nbconvert_exporter": "python", 277 | "pygments_lexer": "ipython3", 278 | "version": "3.6.2" 279 | }, 280 | "latex_envs": { 281 | "LaTeX_envs_menu_present": true, 282 | "autoclose": false, 283 | "autocomplete": true, 284 | "bibliofile": "biblio.bib", 285 | "cite_by": "apalike", 286 | "current_citInitial": 1, 287 | "eqLabelWithNumbers": true, 288 | "eqNumInitial": 1, 289 | "hotkeys": { 290 | "equation": "Ctrl-E", 291 | "itemize": "Ctrl-I" 292 | }, 293 | "labels_anchors": false, 294 | "latex_user_defs": false, 295 | "report_style_numbering": false, 296 | "user_envs_cfg": false 297 | } 298 | }, 299 | "nbformat": 4, 300 | "nbformat_minor": 2 301 | } 302 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate -------------------------------------------------------------------------------- /images/Hysteresis_thresholding.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/Hysteresis_thresholding.PNG -------------------------------------------------------------------------------- /images/Local_histogram_equalization.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/Local_histogram_equalization.PNG -------------------------------------------------------------------------------- /images/MRI1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/MRI1.jpg -------------------------------------------------------------------------------- /images/Numpy_image_manipulation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/Numpy_image_manipulation.png -------------------------------------------------------------------------------- /images/Readme.md: -------------------------------------------------------------------------------- 1 | ## Image files 2 | -------------------------------------------------------------------------------- /images/Swirl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/Swirl.png -------------------------------------------------------------------------------- /images/Tubes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/Tubes.jpg -------------------------------------------------------------------------------- /images/block_view_pooling_sampling.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/block_view_pooling_sampling.PNG -------------------------------------------------------------------------------- /images/convex_hull.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/convex_hull.PNG -------------------------------------------------------------------------------- /images/edge_operators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/edge_operators.png -------------------------------------------------------------------------------- /images/filtering_regional_maxima.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/filtering_regional_maxima.PNG -------------------------------------------------------------------------------- /images/finding_contours.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/finding_contours.png -------------------------------------------------------------------------------- /images/histogram_matching.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/histogram_matching.PNG -------------------------------------------------------------------------------- /images/interpolation_edge_mode.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/interpolation_edge_mode.PNG -------------------------------------------------------------------------------- /images/marching_cubes.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/marching_cubes.PNG -------------------------------------------------------------------------------- /images/rgb2gray.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/rgb2gray.PNG -------------------------------------------------------------------------------- /images/rgb2hsv.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/rgb2hsv.PNG -------------------------------------------------------------------------------- /images/skeletonize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/skeletonize.png -------------------------------------------------------------------------------- /images/sobel_coins.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/sobel_coins.PNG -------------------------------------------------------------------------------- /images/tint_grayscale.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/tint_grayscale.PNG -------------------------------------------------------------------------------- /images/unsharp_mask.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tirthajyoti/Scikit-image-processing/a99319166925d365e8c17e989ac1ffb7bab7bca1/images/unsharp_mask.PNG --------------------------------------------------------------------------------