{ "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", "\n", "\n", "" ] }, { "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", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Farklı büyüklüklerde yapısal ögeler kullanılabilir\n", "" ] }, { "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", "" ] }, { "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 }