Skip to content

Instantly share code, notes, and snippets.

@MrinalTyagi
Created July 4, 2021 13:43
Show Gist options
  • Select an option

  • Save MrinalTyagi/7f39818967067e82e3e9d01ed31b817d to your computer and use it in GitHub Desktop.

Select an option

Save MrinalTyagi/7f39818967067e82e3e9d01ed31b817d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "HOG.ipynb",
"provenance": [],
"collapsed_sections": [
"tLI3DOD5nxmD",
"aqVOckXEn6K_"
]
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "tO9hCYyxoyfY"
},
"source": [
"#Importing libraries and required image"
]
},
{
"cell_type": "code",
"metadata": {
"id": "tnFccPJZXeRS"
},
"source": [
"import matplotlib.pyplot as plt\n",
"from skimage import io\n",
"from skimage import color\n",
"from skimage.transform import resize\n",
"import math\n",
"from skimage.feature import hog\n",
"import numpy as np"
],
"execution_count": 1,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "zOD-r9IJYX65"
},
"source": [
"img = resize(color.rgb2gray(io.imread(\"B.jpg\")), (128, 64))"
],
"execution_count": 2,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "nO1uGAdbo9U6"
},
"source": [
"#Visualization of image to be used"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 466
},
"id": "L2C8l_AKYNr0",
"outputId": "c201fc39-b885-4262-8692-c2d83f700139"
},
"source": [
"plt.figure(figsize=(15, 8))\n",
"plt.imshow(img, cmap=\"gray\")\n",
"plt.axis(\"off\")\n",
"plt.show()"
],
"execution_count": 3,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x576 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "SpHwDEFQYPYE"
},
"source": [
"img = np.array(img)"
],
"execution_count": 4,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "OsOUC-alpBQ5"
},
"source": [
"#Calculating gradient and angle of the image"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HDYUR40BZbbZ"
},
"source": [
"mag = []\n",
"theta = []\n",
"for i in range(128):\n",
" magnitudeArray = []\n",
" angleArray = []\n",
" for j in range(64):\n",
" # Condition for axis 0\n",
" if j-1 <= 0 or j+1 >= 64:\n",
" if j-1 <= 0:\n",
" # Condition if first element\n",
" Gx = img[i][j+1] - 0\n",
" elif j + 1 >= len(img[0]):\n",
" Gx = 0 - img[i][j-1]\n",
" # Condition for first element\n",
" else:\n",
" Gx = img[i][j+1] - img[i][j-1]\n",
" \n",
" # Condition for axis 1\n",
" if i-1 <= 0 or i+1 >= 128:\n",
" if i-1 <= 0:\n",
" Gy = 0 - img[i+1][j]\n",
" elif i +1 >= 128:\n",
" Gy = img[i-1][j] - 0\n",
" else:\n",
" Gy = img[i-1][j] - img[i+1][j]\n",
"\n",
" # Calculating magnitude\n",
" magnitude = math.sqrt(pow(Gx, 2) + pow(Gy, 2))\n",
" magnitudeArray.append(round(magnitude, 9))\n",
"\n",
" # Calculating angle\n",
" if Gx == 0:\n",
" angle = math.degrees(0.0)\n",
" else:\n",
" angle = math.degrees(abs(math.atan(Gy / Gx)))\n",
" angleArray.append(round(angle, 9))\n",
" mag.append(magnitudeArray)\n",
" theta.append(angleArray)"
],
"execution_count": 5,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ZtQ0C7TqcSem"
},
"source": [
"mag = np.array(mag)"
],
"execution_count": 6,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "7UPqa4dze7vZ"
},
"source": [
"theta = np.array(theta)"
],
"execution_count": 7,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "79dGJCaSpIr3"
},
"source": [
"#Visualization of magnitude of the image"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 466
},
"id": "V47q7HG0g3oL",
"outputId": "0c5eca3d-9dcc-4873-ba59-5349e99317cd"
},
"source": [
"plt.figure(figsize=(15, 8))\n",
"plt.imshow(mag, cmap=\"gray\")\n",
"plt.axis(\"off\")\n",
"plt.show()"
],
"execution_count": 8,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x576 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hFGniXoIpNXG"
},
"source": [
"#Visualization of angle of the image"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 466
},
"id": "hfGe3gizg6kc",
"outputId": "77c3aa6b-59e7-4ca8-bbc9-32136717e61e"
},
"source": [
"plt.figure(figsize=(15, 8))\n",
"plt.imshow(theta, cmap=\"gray\")\n",
"plt.axis(\"off\")\n",
"plt.show()"
],
"execution_count": 9,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x576 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "H5WVDpwVg9j_"
},
"source": [
"number_of_bins = 9\n",
"step_size = 180 / number_of_bins"
],
"execution_count": 10,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "1oeeKuuSnPKa"
},
"source": [
"##Function to calculate the $j^{th}$ bin"
]
},
{
"cell_type": "code",
"metadata": {
"id": "oedYx3ppiYa2"
},
"source": [
"def calculate_j(angle):\n",
" temp = (angle / step_size) - 0.5\n",
" j = math.floor(temp)\n",
" return j"
],
"execution_count": 11,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "tLI3DOD5nxmD"
},
"source": [
"##Function to calculate the value of centre of $j^{th}$ bin"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dJv5NyHIjEf0"
},
"source": [
"def calculate_Cj(j):\n",
" Cj = step_size * (j + 0.5)\n",
" return round(Cj, 9)"
],
"execution_count": 12,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "aqVOckXEn6K_"
},
"source": [
"##Function to calculate the value of $j^{th}$ bin"
]
},
{
"cell_type": "code",
"metadata": {
"id": "b5fhYlxTi6n7"
},
"source": [
"def calculate_value_j(magnitude, angle, j):\n",
" Cj = calculate_Cj(j+1)\n",
" Vj = magnitude * ((Cj - angle) / step_size)\n",
" return round(Vj, 9)"
],
"execution_count": 13,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "5N7Q_IC7n8ZM"
},
"source": [
"#Provides a 9 point histogram for 8x8 cells"
]
},
{
"cell_type": "code",
"metadata": {
"id": "pXe1gdxllSdm"
},
"source": [
"histogram_points_nine = []\n",
"for i in range(0, 128, 8):\n",
" temp = []\n",
" for j in range(0, 64, 8):\n",
" magnitude_values = [[mag[i][x] for x in range(j, j+8)] for i in range(i,i+8)]\n",
" angle_values = [[theta[i][x] for x in range(j, j+8)] for i in range(i, i+8)]\n",
" for k in range(len(magnitude_values)):\n",
" for l in range(len(magnitude_values[0])):\n",
" bins = [0.0 for _ in range(number_of_bins)]\n",
" value_j = calculate_j(angle_values[k][l])\n",
" Vj = calculate_value_j(magnitude_values[k][l], angle_values[k][l], value_j)\n",
" Vj_1 = magnitude_values[k][l] - Vj\n",
" bins[value_j]+=Vj\n",
" bins[value_j+1]+=Vj_1\n",
" bins = [round(x, 9) for x in bins]\n",
" temp.append(bins)\n",
" histogram_points_nine.append(temp)"
],
"execution_count": 14,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "PIW3xilsdNdM",
"outputId": "f5837dfa-22d6-4ee6-8fcd-f9bacd588fb8"
},
"source": [
"print(len(histogram_points_nine))\n",
"print(len(histogram_points_nine[0]))\n",
"print(len(histogram_points_nine[0][0]))"
],
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"text": [
"16\n",
"8\n",
"9\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6pEpXSCwoJ5L"
},
"source": [
"#Provides a HOG feature vector for the 9 point histogram provided by making block from 2x2 blocks\n",
"##(1 block is made up of 8x8 cells)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "FIQqE4_ouNs7"
},
"source": [
"epsilon = 1e-05"
],
"execution_count": 16,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Rc6ye4FndnJd"
},
"source": [
"feature_vectors = []\n",
"for i in range(0, len(histogram_points_nine) - 1, 1):\n",
" temp = []\n",
" for j in range(0, len(histogram_points_nine[0]) - 1, 1):\n",
" values = [[histogram_points_nine[i][x] for x in range(j, j+2)] for i in range(i, i+2)]\n",
" final_vector = []\n",
" for k in values:\n",
" for l in k:\n",
" for m in l:\n",
" final_vector.append(m)\n",
" k = round(math.sqrt(sum([pow(x, 2) for x in final_vector])), 9)\n",
" final_vector = [round(x/(k + epsilon), 9) for x in final_vector]\n",
" temp.append(final_vector)\n",
" feature_vectors.append(temp)"
],
"execution_count": 17,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MMRGiZRMf6AF",
"outputId": "c147702d-c724-49d3-e338-5206f648cc76"
},
"source": [
"print(len(feature_vectors))\n",
"print(len(feature_vectors[0]))\n",
"print(len(feature_vectors[0][0]))"
],
"execution_count": 18,
"outputs": [
{
"output_type": "stream",
"text": [
"15\n",
"7\n",
"36\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TZLRUhHsohAJ"
},
"source": [
"#Number of HOG features obtained"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZHAXy67pgeoK",
"outputId": "729f0699-2f43-4d2b-d128-6f3ae4eb9efd"
},
"source": [
"print(f'Number of HOG features = {len(feature_vectors) * len(feature_vectors[0]) * len(feature_vectors[0][0])}')"
],
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"text": [
"Number of HOG features = 3780\n"
],
"name": "stdout"
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment