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