{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "7daa5a37-ea6b-2274-4bc1-fadb0a2fc41a"
      },
      "source": [
        "### Get dot coordinates using blob_log from skimage library"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "35cabbd8-8e7b-5be7-bd00-61b1addc2d75"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import os\n",
        "import cv2\n",
        "import matplotlib.pyplot as plt\n",
        "import skimage.feature\n",
        "import glob\n",
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "3a6329c7-aa3b-b576-b6e1-d675e6e8fbf2"
      },
      "outputs": [],
      "source": [
        "classes = [\"adult_males\", \"subadult_males\", \"adult_females\", \"juveniles\", \"pups\", \"error\"]\n",
        "\n",
        "file_names = os.listdir(\"../input/Train/\")\n",
        "file_names = sorted(file_names, key=lambda \n",
        "                    item: (int(item.partition('.')[0]) if item[0].isdigit() else float('inf'), item)) \n",
        "\n",
        "# select a subset of files to run on\n",
        "file_names = file_names[0:2]\n",
        "\n",
        "# dataframe to store results in\n",
        "count_df = pd.DataFrame(index=file_names, columns=classes).fillna(0)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "7755c681-04df-368a-aca2-f099dd9ce805"
      },
      "outputs": [],
      "source": [
        "for filename in file_names:\n",
        "    \n",
        "    # read the Train and Train Dotted images\n",
        "    image_1 = cv2.imread(\"../input/TrainDotted/\" + filename)\n",
        "    image_2 = cv2.imread(\"../input/Train/\" + filename)\n",
        "    \n",
        "    # absolute difference between Train and Train Dotted\n",
        "    image_3 = cv2.absdiff(image_1,image_2)\n",
        "    \n",
        "    # mask out blackened regions from Train Dotted\n",
        "    mask_1 = cv2.cvtColor(image_1, cv2.COLOR_BGR2GRAY)\n",
        "    mask_1[mask_1 < 20] = 0\n",
        "    mask_1[mask_1 > 0] = 255\n",
        "    \n",
        "    mask_2 = cv2.cvtColor(image_2, cv2.COLOR_BGR2GRAY)\n",
        "    mask_2[mask_2 < 20] = 0\n",
        "    mask_2[mask_2 > 0] = 255\n",
        "    \n",
        "    image_4 = cv2.bitwise_or(image_3, image_3, mask=mask_1)\n",
        "    image_5 = cv2.bitwise_or(image_4, image_4, mask=mask_2) \n",
        "    \n",
        "    # convert to grayscale to be accepted by skimage.feature.blob_log\n",
        "    image_6 = cv2.cvtColor(image_5, cv2.COLOR_BGR2GRAY)\n",
        "    \n",
        "    # detect blobs\n",
        "    blobs = skimage.feature.blob_log(image_6, min_sigma=3, max_sigma=4, num_sigma=1, threshold=0.02)\n",
        "    \n",
        "    # prepare the image to plot the results on\n",
        "    image_7 = cv2.cvtColor(image_6, cv2.COLOR_GRAY2BGR)\n",
        "    \n",
        "    for blob in blobs:\n",
        "        # get the coordinates for each blob\n",
        "        y, x, s = blob\n",
        "        # get the color of the pixel from Train Dotted in the center of the blob\n",
        "        g,b,r = image_1[int(y)][int(x)][:]\n",
        "        \n",
        "        # decision tree to pick the class of the blob by looking at the color in Train Dotted\n",
        "        if r > 200 and g < 50 and b < 50: # RED\n",
        "            count_df[\"adult_males\"][filename] += 1\n",
        "            cv2.circle(image_7, (int(x),int(y)), 8, (0,0,255), 2)            \n",
        "        elif r > 200 and g > 200 and b < 50: # MAGENTA\n",
        "            count_df[\"subadult_males\"][filename] += 1\n",
        "            cv2.circle(image_7, (int(x),int(y)), 8, (250,10,250), 2)            \n",
        "        elif r < 100 and g < 100 and 150 < b < 200: # GREEN\n",
        "            count_df[\"pups\"][filename] += 1\n",
        "            cv2.circle(image_7, (int(x),int(y)), 8, (20,180,35), 2) \n",
        "        elif r < 100 and  100 < g and b < 100: # BLUE\n",
        "            count_df[\"juveniles\"][filename] += 1 \n",
        "            cv2.circle(image_7, (int(x),int(y)), 8, (180,60,30), 2)\n",
        "        elif r < 150 and g < 50 and b < 100:  # BROWN\n",
        "            count_df[\"adult_females\"][filename] += 1\n",
        "            cv2.circle(image_7, (int(x),int(y)), 8, (0,42,84), 2)            \n",
        "        else:\n",
        "            count_df[\"error\"][filename] += 1\n",
        "            cv2.circle(image_7, (int(x),int(y)), 8, (255,255,155), 2)\n",
        "    \n",
        "    "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "d03424c1-b12b-ae53-2fed-1dff86398164"
      },
      "source": [
        "### Check count results"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "c9549615-3a64-2ef2-2be0-1946e07c2ee2"
      },
      "outputs": [],
      "source": [
        "count_df"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "36b150cc-ffbb-ebb5-049f-58c48e5bde00"
      },
      "source": [
        "### Reference counts"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "cf4ecf01-de99-b59e-d1d6-067e8f4478fe"
      },
      "outputs": [],
      "source": [
        "reference = pd.read_csv('../input/Train/train.csv')\n",
        "reference.ix[0:1]"
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": false,
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}