Skip to content

Instantly share code, notes, and snippets.

@Feyn-Man
Last active January 6, 2021 13:15
Show Gist options
  • Save Feyn-Man/e3c99456da4aee890b81c474dbc3a061 to your computer and use it in GitHub Desktop.
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.
Display the source blob
Display the rendered blob
Raw
{
"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