Last active
January 6, 2021 13:15
-
-
Save Feyn-Man/e3c99456da4aee890b81c474dbc3a061 to your computer and use it in GitHub Desktop.
Convex hull application to single-channel binary numpy array using the OpenCV library.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "Convex-Hull.ipynb", | |
"provenance": [], | |
"authorship_tag": "ABX9TyMg+X8cGjFafrCUK1yz4SA6", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/Feyn-Man/e3c99456da4aee890b81c474dbc3a061/convex-hull.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "-QwX6nChqGOE" | |
}, | |
"source": [ | |
"import cv2 as cv\r\n", | |
"\r\n", | |
"import numpy as np\r\n", | |
"\r\n", | |
"import matplotlib.pyplot as plt" | |
], | |
"execution_count": 1, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "wBVXUVfeqYFA" | |
}, | |
"source": [ | |
"def ConvexHull_arr(img_arr):\r\n", | |
"\r\n", | |
" \"\"\"\r\n", | |
" Calculate the convex-hull of an 8-bit single chanel binary image and return \r\n", | |
" an 8-bit single channel binary array with the contours of the hull.\r\n", | |
" Requires the openCv library.\r\n", | |
"\r\n", | |
" ## Parameters\r\n", | |
"\r\n", | |
" img_arr: array-like\r\n", | |
" 8-bit single channel binary image array\r\n", | |
"\r\n", | |
" ## Returns\r\n", | |
" out_arr: array-like\r\n", | |
" single-channel 8-bit binary image array\r\n", | |
"\r\n", | |
" \"\"\"\r\n", | |
"\r\n", | |
" contours, _ = cv.findContours(arr, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)\r\n", | |
"\r\n", | |
" hull_list = []\r\n", | |
" for i in range(len(contours)):\r\n", | |
" hull = cv.convexHull(contours[i])\r\n", | |
" hull_list.append(hull)\r\n", | |
" \r\n", | |
"\r\n", | |
" out_arr = np.zeros((img_arr.shape[0], img_arr.shape[1]), dtype=np.uint8) \r\n", | |
" cv.drawContours(out_arr, hull_list, -1, 1) #binary output\r\n", | |
"\r\n", | |
" return out_arr" | |
], | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 265 | |
}, | |
"id": "CpR4oIp4qr3r", | |
"outputId": "f252bbcd-ba1d-4b2b-9c46-56ecc17bef4d" | |
}, | |
"source": [ | |
"arr = np.array([[1,0,0,0],\r\n", | |
" [1,1,1,0],\r\n", | |
" [1,1,1,0],\r\n", | |
" [1,1,1,1],\r\n", | |
" [1,0,0,0],\r\n", | |
" [1,0,0,0],\r\n", | |
" [1,0,0,1]],\r\n", | |
" dtype=np.uint8)\r\n", | |
"\r\n", | |
"plt.imshow(arr)\r\n", | |
"plt.show()" | |
], | |
"execution_count": 3, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"tags": [], | |
"needs_background": "light" | |
} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 265 | |
}, | |
"id": "7AYfOYzaq_mq", | |
"outputId": "c682c458-b406-4ab1-c47d-5cde75a914e8" | |
}, | |
"source": [ | |
"hull = ConvexHull_arr(arr)\r\n", | |
"plt.imshow(hull)\r\n", | |
"plt.show()" | |
], | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"tags": [], | |
"needs_background": "light" | |
} | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment