├── Feature_Extraction_Gray_Level_Co_occurrence_Matrix_(GLCM)_with_Python.ipynb ├── LICENSE └── README.md /Feature_Extraction_Gray_Level_Co_occurrence_Matrix_(GLCM)_with_Python.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Feature Extraction : Gray Level Co-occurrence Matrix (GLCM) with Python", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "mount_file_id": "1pnf5flN8E_ZnMcmQG-tz16T2SXzWsu0r", 10 | "authorship_tag": "ABX9TyOA0DTso9KaoLBtDoeQB2H7", 11 | "include_colab_link": true 12 | }, 13 | "kernelspec": { 14 | "name": "python3", 15 | "display_name": "Python 3" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "uo8LKkwZVvL5" 33 | }, 34 | "source": [ 35 | "**1) Kita akan menggunakan library 'os' untuk membaca nama file dari folder, dan library 'cv2' (OpenCV) untuk melakukan pemrosesan citra**" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "metadata": { 41 | "id": "lxO4GIUtCaBc", 42 | "colab": { 43 | "base_uri": "https://localhost:8080/" 44 | }, 45 | "outputId": "6050889b-4cc1-4ea2-b50b-e67825387afc" 46 | }, 47 | "source": [ 48 | "import numpy as np \n", 49 | "import cv2 \n", 50 | "import os\n", 51 | "import re\n", 52 | "\n", 53 | "# -------------------- Utility function ------------------------\n", 54 | "def normalize_label(str_):\n", 55 | " str_ = str_.replace(\" \", \"\")\n", 56 | " str_ = str_.translate(str_.maketrans(\"\",\"\", \"()\"))\n", 57 | " str_ = str_.split(\"_\")\n", 58 | " return ''.join(str_[:2])\n", 59 | "\n", 60 | "def normalize_desc(folder, sub_folder):\n", 61 | " text = folder + \" - \" + sub_folder \n", 62 | " text = re.sub(r'\\d+', '', text)\n", 63 | " text = text.replace(\".\", \"\")\n", 64 | " text = text.strip()\n", 65 | " return text\n", 66 | "\n", 67 | "def print_progress(val, val_len, folder, sub_folder, filename, bar_size=10):\n", 68 | " progr = \"#\"*round((val)*bar_size/val_len) + \" \"*round((val_len - (val))*bar_size/val_len)\n", 69 | " if val == 0:\n", 70 | " print(\"\", end = \"\\n\")\n", 71 | " else:\n", 72 | " print(\"[%s] folder : %s/%s/ ----> file : %s\" % (progr, folder, sub_folder, filename), end=\"\\r\")\n", 73 | " \n", 74 | "\n", 75 | "# -------------------- Load Dataset ------------------------\n", 76 | " \n", 77 | "dataset_dir = \"/content/drive/MyDrive/DATASET\" \n", 78 | "\n", 79 | "imgs = [] #list image matrix \n", 80 | "labels = []\n", 81 | "descs = []\n", 82 | "for folder in os.listdir(dataset_dir):\n", 83 | " for sub_folder in os.listdir(os.path.join(dataset_dir, folder)):\n", 84 | " sub_folder_files = os.listdir(os.path.join(dataset_dir, folder, sub_folder))\n", 85 | " len_sub_folder = len(sub_folder_files) - 1\n", 86 | " for i, filename in enumerate(sub_folder_files):\n", 87 | " img = cv2.imread(os.path.join(dataset_dir, folder, sub_folder, filename))\n", 88 | " \n", 89 | " gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n", 90 | " \n", 91 | " h, w = gray.shape\n", 92 | " ymin, ymax, xmin, xmax = h//3, h*2//3, w//3, w*2//3\n", 93 | " crop = gray[ymin:ymax, xmin:xmax]\n", 94 | " \n", 95 | " resize = cv2.resize(crop, (0,0), fx=0.5, fy=0.5)\n", 96 | " \n", 97 | " imgs.append(resize)\n", 98 | " labels.append(normalize_label(os.path.splitext(filename)[0]))\n", 99 | " descs.append(normalize_desc(folder, sub_folder))\n", 100 | " \n", 101 | " print_progress(i, len_sub_folder, folder, sub_folder, filename)" 102 | ], 103 | "execution_count": null, 104 | "outputs": [ 105 | { 106 | "output_type": "stream", 107 | "text": [ 108 | "\n", 109 | "\n", 110 | "\n" 111 | ], 112 | "name": "stdout" 113 | } 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": { 119 | "id": "IGruSE15WX1J" 120 | }, 121 | "source": [ 122 | "**2) Keseluruhan dataset citra daun akan tersimpan pada list 'imgs' dan nama daun disimpan pada list 'labels'. Kita dapat preview salah satu citra dengan cara berikut**" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "metadata": { 128 | "colab": { 129 | "base_uri": "https://localhost:8080/", 130 | "height": 83 131 | }, 132 | "id": "kPOvWvWHR2Yh", 133 | "outputId": "0fe1e01d-1e05-4eae-988c-7a9bd9b0a2ed" 134 | }, 135 | "source": [ 136 | "from google.colab.patches import cv2_imshow\n", 137 | "cv2_imshow(imgs[5])" 138 | ], 139 | "execution_count": null, 140 | "outputs": [ 141 | { 142 | "output_type": "display_data", 143 | "data": { 144 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEIAAABCCAAAAADGP180AAAPGklEQVR4nAXBZ3MbZ2IA4N133y3YXSwWvRIECJBgFVWoLls6+aSLrjl1MslMMpP8hvyF/Id8yOTLzcQ3vvEX+Ryf7TtZkiVKogqL2EACBIjeFsAC22ueB/0ZZjqaB6eiFEbQvrzJBNnRNRGpn+Y329dLY5c+SZcv1U4mjo1CCzgk6gIzoNs3nRqYPDgc/duPWYgD0i2UTdCzcMyX+ubGqRn3jFIs61PXkzlqy4a4BcyK7joOsBCIEpS1+oZX8LlXsV7yZToiuX7ozKDNCi/ZEj/BfXu5ylLqoDoVk9Fl9P1gqOGGhrIupVoAxU3CcF2LNU45oLg7UDAubSaRGU8Hfr7XYwfpdPtEtJwuW5L3Y7MFuVEZHeIAb9IGZSI20eE6CGJhJoCmOfjNF1d6d9pAJXD10fzXwHeA/vPkn74UnYgtTz0BSSYBpyPLtz0ec7OqGT6MBHRz/uzCk6mEcbJLGBhEEZIhMfMi+V7KrXiGfiYMr5x9CenF9JPPtgX/kLiy1wep4/o199Y/Wu7B8wET6kNatDHVISSbt3wKt9jNDlf6vXH8Vz8sTJ/8PRE+hf6wp575KF7um+Q5756qrGsSvT3hzUY25LvrHVdk3eU93ga0GcwhKMBU2ekFqR9VA5v0WTQ34d+ZMHSSEpZvXv49DA8gQg6XUK46h5zHj7+jZ2eF+QoDZcpyGZfXsZB/NDf9kLr9CoHdg8ui/0H71WXtu9gA+h/xdjFy7qHhv5axJ1gzwGbN0eIecP2+oXKEIZl3loJBxAABqkM3UD9VH2ybnx/ek41n9/zngRveFWhitTH9aCsywL4Q9WyHnWZu/HGOuFJDwuNYNeiwCLCgStIWNhzgtuFgtSpTvldPePaDM8LdZ23CeQFi+5V+wl6Zf8j6eCgrNCu2ZhK7PTl9I+y7v0EZis5gFB1mgeVMBZRyWAr9heb1VkMVsPL2waV9VYBPkNsE/tWtKsQKqKKt7bvqn7lRsEH2ZcdFDyMO6uiIC0yuo7gEgbIiySv922iiGWqm6oVXYalxAruPhvWVSOKH5BW3h/XRNEacKNnS2s5ueZrE13XMlqEGDK1nEhSnJiN2pHq7NQ4eLON0OzZN/lFFEDApJcwPej/nf8qnFv42Q5V1KvAnpYSxRn4a2VM0nMURxREtDzQtGzl3qVsGLknqs7J9stU3r3JnQUiVn9FOK7ZXGDRubVG3W0k7uH8p0S0PoEHWAoxDEiSFuAij+HEnOJYXWEF8EG1/chglQmbt7ejqnW9B3zFJerWYZh6UN0uClhB/JK/GSnvk3+FDa6SdQaCjjinjJC6r1hR9hDBXPle5GV1v9UYldpoIFk3QJae1q0/zs3vDLHudffq8v6ybqPMwXFl4YOliWzGAjlCurXlikYgXf+6Zi2xxZ8Q3unOyu9hYeVieLEFap6e/u/Ukhna0AtZZ974PWig7c07xYyMr9+Ja2JWA5kVpPNodeVgvrniIohvPg/4a2uisV8x/2QVKDHedj4nsz8ttUdJuMF6ipjP5e3eDmH2dnmMWZcCjOkQcikBWFAOtPd5fXs+e+EhY86Q++d4jP38DY18FHcOg5/4UfvCHa/aLt5md/MLwmN2NzOvy7FQfmbaFsH0MR84wi0Wn/sCd76M5nd7vrOnYdqJt+DYg9qgIKMt83dWN5e6CKyH5xHHkIqKVm41JkQI64eDWkCN1B8GmLkramc37+x/i9bCvmXv5zcMfEpICcB8XDa702gHqZRWpjIitQD0x6h6iQSOksAaJarQFBDSCIa4u3G+4BVdqx9DzvKN29d5vfFFSuQC57cXSrCe5h5rtdGnlOGbotHa2st7IRJpsqSh28xrEvJSBKjhv7WZdjY9ipcXXH5mY8l4FzY08lYKTxohqeLDFo1XA+XbT2xcm1NAyxwGllwq7o3F/VmZcUkmWEVsmOjOgh34w/cEU0ZkCfeo+JJZVA9TUoS9Xn0uEUkiELbRjH4r1Nhieo/1FiotmfD9TUQVaMKBqSgCydNCkP5m7IA7LTrmOfv7vYKnzrQtGbKzy/ewb19yO7Jgxh7uJkwb+UWqVJ6PyNOK253XHYUxBxxlpymIrSVso1Q4bvTMs+fls4dcOJN9DPiKgE6T130Kw5uO1X8RGPk449Yv70ceUqQxp0wUUXuU9JK7SFDmjECf2ZDtnRPlUnwv3NF1Yc2D4IIbfeLbcoNVgi8wU5JWjFsjblP/eU63VI2G6gdFY+0Jo18TRKSE0vWM9ADOh2TbGE0pdErC3OTicuVErEUesSzaYM+GAC031maQqzkhrdvYbmEnvQwniNf/Gpt23bVFF5tNpPSybHDIYCL2YSCWP4OLe42tKBF35yf/LakXQ0/8ZwbxOdkTVOUm+zBZOHIAyk9T0YKZKJy03G7eDDmsZI0YFZwd5PKPso3An5J2w60zoJ98z4uLtt19jw0SxkYgqt7swVY/b0SPCVKmjAhQWyghJhkkGlRm3f2Z3Iy2M8Jiz3SCkMxU91qquF7zVy5/utq7I1eksKG7HttMz8YVGl2dk3OuKX3OqlSJmEjwBzMGp2xkbiSHjPzcvtsQstDqkAkmGOvCuc78Lf1aNvbvyMY4p1qRzek5dtZwGQsqe4LwZQNFk7zRgnjuMibuL3Kl/eai0TgM3RXh/z7g4bsSLv4087sDehw44m9p+t2dnBnxVPI6tazhBoNdAtZTmy2ZTKUG/Z7L+Pjm6YB7Kwf/YXjq5CPOtolOlj3+d+685NzjyeTcXqjP+FGT7ZspC2STQGctB156+jW5pRGRcN26QdfwvfIMyuFuRna3A5lwYju6S6/ar2OsREH7bnkUxDcb8fU0W7EBh6fmoxRtmgIDaqVOksn1LYfV2gYxGkNRbzCG0/IImZA34ivADd/VwvnghTLYaVn59/VnjkhrC9s++S2Rc1Eo6qmnWj7zJkILFzUzjgaOlLxwn5ifkeL0MbP5/cvD0AdamSiYrknP90IqorpSSvAvH4eVeesefrbqhuqVrZQPNtYJxkmx85m3dprqDTZUY0pp/U+I22oB9S6uilQ9Tzf1DnjqNjcPXh83caoNP2ncqZX7QwCdWTKEw66LUda4ljZak7nWy6ZmQ/9YTdGlNPhiC9ciLpJpetjHc6xuOwzrAh+oaSF6O+EepDZ0hcZlGLZudqMeM/onfH8lddtklUjdNBZ+xCT0wugsEZzgSkdqH6wVx6QIzx5UGCj1qivxplCxWBJ8+Z6qscdNCkEGc3EEyEdYbzihHCOY4W+b2+5MXtf+FSKj0OjSBjEC7wjg0iN5E+jkFfcxYR/5qNmeMXJTCnB6ucRRU3EHW45SWJnWj6M7Fw/vbyvJfl7rQGfj7027hwdFHPa//GBk8eLPgkLFarrRQ1V4wk7+qdBTE6tueMjKUJ/4eIlRlyR+Xos55V/zlF5GPT3XQTca52RA4I1fow1YAX+jYjXeuZVLLa1HJr+ndJOpScsdVBEqb06LEJWQjeDFhhrcdbRp+dW/vp5EJui+KzhhGtC7cEFgkve/mqJR7atVxJforA1neJp2ezvlSsmkThRiR751xLGvWAEMbbvs6Kg7n1yCewk6NGx8I5c9sL6RJybYFPCU+OFLSLix8YAXRQxN68tRDZi73L/4UcJJjtw14es4Ad542ijW+W4aYnKvqNO0dyxbWK5EwO5kGCl4Gf7eOFVFdSHpdD0/YOi6bYTXdf56q7OSqem7fmYBnpR5cpV6a0KP0KW3zcsXQsmTKCu3lpSvTsZDreQWjhxC7ka7kAE2zYLT8+5nIpbh2B3/zieXwxLYDGv172o8BEwbiY82nvvRq1wS7NOeLE0jFiyh1Ddsrn7c+3brCekwHlT2jpBQ51+LimYNkD+aRYxK+THPNN1NgpmB96L0/7IPV8OLrWiDxl6UuZXb7/uvbMZy0+SNrkGGAARsu3uKG2fn2c9/tiZg5HHmSb0aYigDcF34IUU058vKROx92vPdflqSPCJcIpWaPBdqd2dFFB/dSDoVxXRyg+nlLIBJN22iASLEhAMn1GIv034gQc8ipPkW/4DlnZbEseUuGSLOnHPds5nBI6DTADMlv0qrpyBIs5I7LQVdr0mdckyAYzGvR5GYD6igerURRuZnEzjeaC6nstuR66qE3MRbSJKOfI4Kl4L6AoBmLdnOdLRmxDgPYYXDND3ylcBfb4CBwkK4+5Ab5oNXZV2cvcSnydc8ztYwdiq643ikgUHOirL/VgTJ0P2zMva45DEItZNKzKiNrN1aSeQhxZwrtytKdPgYuvnsf8F1Avdx2d+2ojgRbViLNBVTLOb9ERnnDCYa2x1LcnB8XLgX6g3dx5JOL7qkAHR2xfE4C5Q61f3hCUlT0q1UOv9WcsiVLDD7cXhENkpKDRtAaz+KNccFUlp11PSwducH0fUCC0uMCdBHUZoaS9Dj2mUhvDJTGpUZMHLudREA2D3P1MmNAhZAbYRt3Y9ZS7FaNDg7xCvbpcKF/EM+MxXULGJYKPGoPD4e/raalPDY5MPWzAZI2meHgapEZL4OBpQgTn+31+BccTjPPfyqOw4tQPZ5b0t3DXDYJUQBtk2aDB/17iCKKWOdGBeZPpvLgJhPYncgzFZcOuRQbqBkJhJXrfZ2ivetQWAL2TmjelrujCUBdgA5R7OEg7OYCWw31qo96N0LGZvyk2zV893MmaoqRCMUlAoY2pRbn0kTW6+lyJ9Ew3NIx7x/2bGhhOGVgSn1J/vhi5nYee3PPfwxMOKE9KTm9lenbdmfV0lrkUPclzhaFwarXniomuoWXyNy71dQ1rQKhifkNW/3mYn/2Lu82FomX6Ao5Bj536ugV4yzeQ6MUTeTMwgQeZZDu1Y9wgU7z/RCY3PGT7fFuToUoZWthouTsSVfguaBnF2pZpctRus4ixzlATgM6asLAcKFHdpF4MVO9MDhDwtwo/CSAW8rryaIyB1ETt1p+VkNDyqGLoF03qqISLwKsFe1I56TeN6HRtTyOLAwzUzLU6RSw4DMuvbqqfrkau/R/j50+dG0UIXrhCeaUZ/f9d1uUX5UIdRg60XbyNY3/8dMi9MJpytG1n8MWKEpSf0gvTORXvsG13neZBupBoIs5DrRFN2jQU28sRG0LOsYBv5HzNN/Otl5f9fkUGFT4MmG0QykK8gmLTZXSxYdcpOmnBp5zDf4/BY9dHH9wqOkAAAAASUVORK5CYII=\n", 145 | "text/plain": [ 146 | "" 147 | ] 148 | }, 149 | "metadata": { 150 | "tags": [] 151 | } 152 | } 153 | ] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": { 158 | "id": "WlBgWxQ_WmTR" 159 | }, 160 | "source": [ 161 | "**3) Selanjutnya kita dapat mencari matrix GLCM dan metric texture keseluruhan citra daun dengan menggunakan fungsi greycomatrix() dan greycoprops() pada library Scikit-Image**" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "metadata": { 167 | "id": "5FTp6wFpGrSs" 168 | }, 169 | "source": [ 170 | "from skimage.feature import greycomatrix, greycoprops\n", 171 | "\n", 172 | "# ----------------- calculate greycomatrix() & greycoprops() for angle 0, 45, 90, 135 ----------------------------------\n", 173 | "def calc_glcm_all_agls(img, label, props, dists=[5], agls=[0, np.pi/4, np.pi/2, 3*np.pi/4], lvl=256, sym=True, norm=True):\n", 174 | " \n", 175 | " glcm = greycomatrix(img, \n", 176 | " distances=dists, \n", 177 | " angles=agls, \n", 178 | " levels=lvl,\n", 179 | " symmetric=sym, \n", 180 | " normed=norm)\n", 181 | " feature = []\n", 182 | " glcm_props = [propery for name in props for propery in greycoprops(glcm, name)[0]]\n", 183 | " for item in glcm_props:\n", 184 | " feature.append(item)\n", 185 | " feature.append(label) \n", 186 | " \n", 187 | " return feature\n", 188 | "\n", 189 | "\n", 190 | "# ----------------- call calc_glcm_all_agls() for all properties ----------------------------------\n", 191 | "properties = ['dissimilarity', 'correlation', 'homogeneity', 'contrast', 'ASM', 'energy']\n", 192 | "\n", 193 | "glcm_all_agls = []\n", 194 | "for img, label in zip(imgs, labels): \n", 195 | " glcm_all_agls.append(\n", 196 | " calc_glcm_all_agls(img, \n", 197 | " label, \n", 198 | " props=properties)\n", 199 | " )\n", 200 | " \n", 201 | "columns = []\n", 202 | "angles = ['0', '45', '90','135']\n", 203 | "for name in properties :\n", 204 | " for ang in angles:\n", 205 | " columns.append(name + \"_\" + ang)\n", 206 | " \n", 207 | "columns.append(\"label\")" 208 | ], 209 | "execution_count": null, 210 | "outputs": [] 211 | }, 212 | { 213 | "cell_type": "markdown", 214 | "metadata": { 215 | "id": "VFYtEXJGW2B-" 216 | }, 217 | "source": [ 218 | "**4) Selanjutnya kita ubah format data glcm_features dari list menjadi Dataframe menggunakan library pandas**" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "metadata": { 224 | "colab": { 225 | "base_uri": "https://localhost:8080/", 226 | "height": 534 227 | }, 228 | "id": "g70Kv8FTGW1l", 229 | "outputId": "d72e1d73-35a3-455c-8793-1e3433609b3d" 230 | }, 231 | "source": [ 232 | "import pandas as pd \n", 233 | "\n", 234 | "# Create the pandas DataFrame for GLCM features data\n", 235 | "glcm_df = pd.DataFrame(glcm_all_agls, \n", 236 | " columns = columns)\n", 237 | "\n", 238 | "glcm_df.head(15)" 239 | ], 240 | "execution_count": null, 241 | "outputs": [ 242 | { 243 | "output_type": "execute_result", 244 | "data": { 245 | "text/html": [ 246 | "
\n", 247 | "\n", 260 | "\n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | "
dissimilarity_0dissimilarity_45dissimilarity_90dissimilarity_135correlation_0correlation_45correlation_90correlation_135homogeneity_0homogeneity_45homogeneity_90homogeneity_135contrast_0contrast_45contrast_90contrast_135ASM_0ASM_45ASM_90ASM_135energy_0energy_45energy_90energy_135label
06.9456046.6311134.8320916.8527580.4517200.4824340.7255840.4697340.1909780.2051420.2315990.192076104.88748198.91311151.415797101.4151930.0019490.0020040.0023710.0019610.0441440.0447610.0486960.044282jambu1GRAYC
18.5680587.3173786.7478898.9014050.3476780.5237470.5641540.3439380.1670200.1873660.1793660.139533157.265524114.526015101.611773158.6220080.0014860.0016420.0015940.0013330.0385490.0405160.0399260.036505jambu2GRAYC
25.1080485.0387623.2747145.0189910.6414100.6709600.8986620.6928010.2253830.2213360.2786200.21529660.46721356.28590019.54446152.0039020.0033520.0035200.0039290.0033010.0578990.0593300.0626830.057454jambu3GRAYC
37.6818186.3311654.5832096.6430800.1709330.3684380.7062360.3956510.2144560.2360720.2516310.218759143.130899108.30983449.489816103.4573360.0035160.0038830.0038610.0034670.0592930.0623150.0621400.058883jambu4GRAYC
46.7016896.0398024.3005466.4752860.3809180.4523720.7232130.4553380.2019160.2214740.2397590.179263121.137357106.91181154.076006106.3332470.0022660.0024010.0025330.0021570.0476020.0489990.0503260.046445jambu5GRAYC
539.56731242.03798136.54620040.5731010.3447890.2616610.4023190.3089870.0255140.0215130.0331000.0244302449.9364132731.5650362248.3554402559.0658170.0001690.0001750.0001750.0001760.0129970.0132340.0132170.013248mangga1GRAYC
621.24863420.37304915.59811221.6649320.3946720.4401110.7123370.3861330.0646790.0644110.0805840.061806877.216344815.080125447.425733900.2950050.0004200.0004250.0004680.0004370.0204920.0206130.0216410.020901mangga2GRAYC
723.68877323.13995819.96845523.3400100.6790930.7057380.7837830.6847370.0625720.0581340.0673190.0640121107.5352711017.881374754.0588671077.7036940.0003710.0003940.0004030.0004020.0192530.0198620.0200820.020057mangga3GRAYC
831.25434736.58272631.72876332.4503120.3852860.1813190.2857370.3332080.0586840.0584770.0696170.0578101933.3820172570.2330912204.1788382092.8571800.0003620.0003590.0004150.0003690.0190210.0189480.0203670.019217mangga4GRAYC
917.72478918.34859514.71584718.8670660.6943010.6736580.7932610.6602210.1023660.0909890.1059560.095279700.084451747.999480479.137109783.5377210.0007240.0007200.0008340.0007680.0269160.0268250.0288880.027705mangga5GRAYC
1018.46472918.11888713.83035318.3064520.1331900.1824430.5573510.1538010.0673600.0694690.0809250.062330664.033532626.806712332.087183650.9063480.0004290.0004210.0004600.0004210.0207050.0205070.0214530.020517kelengkeng1GRAYC
1115.17536015.12825212.01241914.8613420.5500930.5509450.7381400.5585310.0669510.0679820.0823980.070640407.742176403.701093234.292101397.8025490.0003670.0003770.0004100.0003820.0191480.0194170.0202420.019546kelengkeng2GRAYC
1215.25683114.26873010.43417815.1943290.3972360.4619940.7479550.4164250.0806640.0887580.1006930.081603494.942871440.878512202.347740476.6199270.0004450.0004770.0005140.0004440.0210890.0218350.0226810.021064kelengkeng3GRAYC
1320.96274220.73205016.10531519.7687300.6611430.6775990.8000790.6911570.0566930.0542450.0710280.062310767.216592731.799168449.474416699.9133710.0002580.0002570.0002820.0002760.0160640.0160230.0168070.016627kelengkeng4GRAYC
1434.72081532.73855426.05712935.1329340.2654110.3217370.5315530.2667870.0275680.0319130.0484750.0304731953.5524091835.3212801294.7521111978.7916230.0001910.0002000.0002110.0001950.0138310.0141470.0145270.013979kelengkeng5GRAYC
\n", 714 | "
" 715 | ], 716 | "text/plain": [ 717 | " dissimilarity_0 dissimilarity_45 ... energy_135 label\n", 718 | "0 6.945604 6.631113 ... 0.044282 jambu1GRAYC\n", 719 | "1 8.568058 7.317378 ... 0.036505 jambu2GRAYC\n", 720 | "2 5.108048 5.038762 ... 0.057454 jambu3GRAYC\n", 721 | "3 7.681818 6.331165 ... 0.058883 jambu4GRAYC\n", 722 | "4 6.701689 6.039802 ... 0.046445 jambu5GRAYC\n", 723 | "5 39.567312 42.037981 ... 0.013248 mangga1GRAYC\n", 724 | "6 21.248634 20.373049 ... 0.020901 mangga2GRAYC\n", 725 | "7 23.688773 23.139958 ... 0.020057 mangga3GRAYC\n", 726 | "8 31.254347 36.582726 ... 0.019217 mangga4GRAYC\n", 727 | "9 17.724789 18.348595 ... 0.027705 mangga5GRAYC\n", 728 | "10 18.464729 18.118887 ... 0.020517 kelengkeng1GRAYC\n", 729 | "11 15.175360 15.128252 ... 0.019546 kelengkeng2GRAYC\n", 730 | "12 15.256831 14.268730 ... 0.021064 kelengkeng3GRAYC\n", 731 | "13 20.962742 20.732050 ... 0.016627 kelengkeng4GRAYC\n", 732 | "14 34.720815 32.738554 ... 0.013979 kelengkeng5GRAYC\n", 733 | "\n", 734 | "[15 rows x 25 columns]" 735 | ] 736 | }, 737 | "metadata": { 738 | "tags": [] 739 | }, 740 | "execution_count": 17 741 | } 742 | ] 743 | } 744 | ] 745 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Alfian Hidayatulloh 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 | # Feature Extraction: Gray-Level Co-occurrence Matrix (GLCM) with Python 2 | 3 | Gray-Level Co-occurrence matrix (GLCM) is a texture analysis method in digital image processing. This method represents the relationship between two neighboring pixels that have gray intensity, distance, and angle. In general, we use GLCM to get texture features in images such as dissimilarity, correlation, homogeneity, contrast, and others. 4 | 5 | This repository contains scripts or source code on how to perform feature extraction on images that have been converted into grayscale images so that we can utilize the extraction results for various needs such as correlation analysis between features, features in classification, and others. 6 | --------------------------------------------------------------------------------