{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Morphological Image Processing\n",
    "\n",
    "Bu bölümde, ilk önce ikili görüntülerde ve ardından gri tonlamalı görüntülerde birkaç morfolojik işlem gerçekleştirmek için, scikit-image'ın morfoloji modülündeki işlevlerin nasıl kullanılacağını göstereceğiz.\n",
    "\n",
    "## İkili işlemler (Binary operations)\n",
    "\n",
    "İkili görüntülerde morfolojik işlemlerle başlayalım. İşlevleri çağırmadan önce ikili giriş görüntüsü (örneğin, sabit eşikli basit eşikli) oluşturmamız gerekir.\n",
    "Erozyon\n",
    "\n",
    "**Erozyon**, ön plandaki nesnelerin boyutunu küçülten, nesne sınırlarını düzelten ve yarımadaları, parmakları ve küçük nesneleri kaldıran temel bir morfolojik işlemdir. Aşağıdaki kod bloğu, ikili bir görüntünün hızlı ikili morfolojik aşınmasını hesaplayan `binary_erosion ()` işlevinin nasıl kullanılacağını gösterir:\n",
    "\n",
    "![alt text](assets/6-1.png)\n",
    "\n",
    "![alt text](assets/6-2.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from skimage.io import imread\n",
    "from skimage.color import rgb2gray\n",
    "import matplotlib.pyplot as plt\n",
    "from skimage.morphology import binary_erosion, binary_dilation, rectangle, binary_opening, binary_closing, disk\n",
    "import numpy as np\n",
    "\n",
    "def plot_image(image, title=''):\n",
    "    plt.title(title, size=20), plt.imshow(image)\n",
    "    plt.axis('off') # comment this line if you want axis ticks\n",
    "\n",
    "def plot_images_horizontally(original, filtered, filter_name, sz=(18,7)):\n",
    "    plt.gray()\n",
    "    plt.figure(figsize = sz)\n",
    "    plt.subplot(1,2,1), plot_image(original, 'original')\n",
    "    plt.subplot(1,2,2), plot_image(filtered, filter_name)\n",
    "    plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "im = rgb2gray(imread('images/clock.png'))\n",
    "im[im <= 0.5] = 0 # create binary image with fixed threshold 0.5\n",
    "im[im > 0.5] = 1\n",
    "\n",
    "plt.gray()\n",
    "plt.figure(figsize=(20,10))\n",
    "plt.subplot(1,3,1), plot_image(im, 'original')\n",
    "\n",
    "im1 = binary_erosion(im, rectangle(1,5))\n",
    "plt.subplot(1,3,2), plot_image(im1, 'erosion with rectangle size (1,5)')\n",
    "\n",
    "im1 = binary_erosion(im, rectangle(1,15))\n",
    "plt.subplot(1,3,3), plot_image(im1, 'erosion with rectangle size (1,15)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Farklı şekilde yapısal ögeler kullanılabilir\n",
    "![alt text](assets/6-3.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Farklı büyüklüklerde yapısal ögeler kullanılabilir\n",
    "![alt text](assets/6-4.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from skimage.morphology import square\n",
    "from skimage.morphology import dilation, erosion, closing, opening, square\n",
    "img = imread('images/einstein.jpg')\n",
    "img = rgb2gray(img)\n",
    "# kare filtre\n",
    "struct_elem = square(20)\n",
    "eroded = erosion(img, struct_elem)\n",
    "plot_images_horizontally(img, eroded, 'erosion')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dilation\n",
    "**Dilatasyon**, *erozyonun* büzüldüğü ön plan nesnelerini genişletir. Genişleme, aynı zamanda sınırları düzgünleştirir, ikili görüntülerde boşlukları ve boşlukları kapatır.\n",
    "\n",
    "![alt text](assets/6-5.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from skimage.morphology import binary_dilation, disk\n",
    "from skimage import img_as_float\n",
    "img = rgb2gray(img_as_float(imread('images/einstein.jpg')))\n",
    "img[img <= 0.5] = 0\n",
    "img[img > 0.5] = 1\n",
    "plt.gray()\n",
    "plt.figure(figsize=(18,9))\n",
    "plt.subplot(131)\n",
    "plt.imshow(img)\n",
    "plt.title('original', size=20)\n",
    "plt.axis('off')\n",
    "for d in range(1,3):\n",
    "    plt.subplot(1,3,d+1)\n",
    "    im1 = binary_dilation(img, disk(2*d))\n",
    "    plt.imshow(im1)\n",
    "    plt.title('dilation with disk size ' + str(2*d), size=20)\n",
    "    plt.axis('off')\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dilated = dilation(img, struct_elem)\n",
    "plot_images_horizontally(img, dilated, 'dilation')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Açınım ve Kapanım\n",
    "\n",
    "**Erosion** ve **dilation** operatörlerinin görüntü üzerine birlikte uygulanması ile gerçekleşir. \n",
    "\n",
    "- **Opening (açınım)** Öncelikli olarak erosion operatörü uygulanır ve ardından dilation operatörü uygulanır. \n",
    "\n",
    "- **Closing (Kapanım)** Görüntüye dilation operatörü uygulanır ve ardından Erosion operatörü uygulanır. \n",
    "\n",
    "**Açınım** küçük nesnelerin çıkarılması, **kapanım** ise deliklerin çıkarılmasıdır.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "opened = opening(img, struct_elem)\n",
    "plot_images_horizontally(img, opened, 'opening')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "closed = closing(img, struct_elem)\n",
    "plot_images_horizontally(img, closed, 'Closed')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "im = rgb2gray(imread('images/fingerprint.jpeg'))\n",
    "im[im <= 0.5] = 0\n",
    "im[im > 0.5] = 1\n",
    "im_o = binary_opening(im, square(2))\n",
    "im_c = binary_closing(im, square(2))\n",
    "im_oc = binary_closing(binary_opening(im, square(2)), square(2))\n",
    "plt.figure(figsize=(20,20))\n",
    "plt.subplot(221)\n",
    "plt.imshow(im)\n",
    "plt.title('original', size=20)\n",
    "plt.axis('off')\n",
    "plt.subplot(222)\n",
    "plt.imshow(im_o)\n",
    "plt.title('opening', size=20)\n",
    "plt.axis('off')\n",
    "plt.subplot(223)\n",
    "plt.imshow(im_c)\n",
    "plt.title('closing', size=20)\n",
    "plt.axis('off')\n",
    "plt.subplot(224)\n",
    "plt.imshow(im_oc)\n",
    "plt.title('opening + closing', size=20)\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sınır (boundary) Çıkarımı"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from skimage.morphology import binary_erosion\n",
    "im = rgb2gray(imread('images/footBall_orig.jpg'))\n",
    "#im = imread('../new images/dynasaurs.png')[...,3] / 255\n",
    "print(np.max(im))\n",
    "#im = 1 - im\n",
    "th = 0.4\n",
    "im[im < th] = 0\n",
    "im[im >= th] = 1\n",
    "#im1 = opening(im, square(6))\n",
    "boundary = im - binary_erosion(im)\n",
    "#im2 = closing(im, square(1))\n",
    "plot_images_horizontally(im, boundary, 'boundary',sz=(18,9))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from skimage.morphology import remove_small_objects\n",
    "im = rgb2gray(imread('images/coins.jpg'))\n",
    "im[im > 0.5] = 1\n",
    "im[im <= 0.5] = 0\n",
    "im = im.astype(np.bool)\n",
    "print(np.max(im), np.min(im), im.shape)\n",
    "plt.figure(figsize=(20,20))\n",
    "plt.subplot(221)\n",
    "plt.imshow(im)\n",
    "plt.axis('off')\n",
    "plt.title('original', size=20)\n",
    "i = 2\n",
    "for osz in [1000, 1500, 2400]:\n",
    "    im1 = remove_small_objects(im, osz, connectivity=1) #binary_dilation(im, bridge(2))\n",
    "    print(np.max(im1))\n",
    "    plt.subplot(2,2,i)\n",
    "    plt.imshow(im1)\n",
    "    plt.axis('off')\n",
    "    plt.title('removing small objects below size ' + str(osz), size=20)\n",
    "    i += 1\n",
    "plt.show()    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Diğer örnekler için: https://scikit-image.org/docs/dev/auto_examples/applications/plot_morphology.html#sphx-glr-auto-examples-applications-plot-morphology-py\n",
    "\n",
    "Detaylı anlatım için : https://docplayer.biz.tr/26820718-Hafta-12-morfolojik-goruntu-isleme.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "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.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}