#!/usr/bin/env python
# coding: utf-8
#
# ESF projekt Západočeské univerzity v Plzni reg. č. CZ.02.2.69/0.0/0.0/16 015/0002287
# Segmentace obrazu
# =================
#
# * [Vstup] intenzitní obraz
# * [Výstup] intenzitní obraz, kde hodnota šedi udává číslo objektu
# * [Cíl] Nalézt objekty
#
#
# Prahování
# ----
#
#
# ![Alt text style](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/fram022.jpg "vstupní obraz" )
#
#
# Interaktivní určení prahu
#
# ![prah 1 ](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/prah1.jpg)
#
#
# Automatické určení prahu
#
# ![prah 2 ](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/prah2.jpg)
# ### Python example - coins
# In[2]:
get_ipython().run_line_magic('pylab', 'inline --no-import-all')
import numpy as np
import matplotlib.pyplot as plt
import skimage
from skimage import data
import skimage.segmentation
import scipy
import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage import data
from skimage.filters import gaussian
from skimage.segmentation import active_contour
# import skimage.color
# import skimage.data
# import skimage.filters
skimage.__version__
# In[2]:
coins = skimage.data.coins()
hist = np.histogram(coins, bins=np.arange(0, 256))
plt.figure(figsize=(8, 3))
plt.subplot(121)
plt.imshow(coins, cmap=plt.cm.gray, interpolation='nearest')
plt.axis('off')
plt.subplot(122)
plt.plot(hist[1][:-1], hist[0], lw=2)
plt.title('histogram of grey values')
# In[3]:
plt.figure(figsize=(9, 3.5))
plt.subplot(121)
plt.imshow(coins > 100, cmap=plt.cm.gray, interpolation='nearest')
plt.title('coins > 100')
plt.axis('off')
plt.subplot(122)
plt.imshow(coins > 150, cmap=plt.cm.gray, interpolation='nearest')
plt.title('coins > 150')
plt.axis('off')
plt.subplots_adjust(hspace=0.01, wspace=0.01, top=1, bottom=0, left=0, right=1)
# ### Barvení nasegmentovaných oblastí (labeling)
# In[4]:
from skimage import morphology
import matplotlib.pyplot as plt
from scipy import ndimage
import numpy as np
#
n = 12
l = 256
np.random.seed(1)
im = np.zeros((l, l))
points = l*np.random.random((2, n**2))
im[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
im = ndimage.gaussian_filter(im, sigma=l/(4.*n))
blobs = im > 0.7 * im.mean()
all_labels = morphology.label(blobs)
blobs_labels = morphology.label(blobs, background=0)
plt.figure(figsize=(9, 3.5))
plt.subplot(131)
plt.imshow(blobs, cmap='gray')
plt.axis('off')
plt.subplot(132)
plt.imshow(all_labels)
plt.axis('off')
plt.subplot(133)
plt.imshow(blobs_labels)
plt.axis('off')
plt.tight_layout()
plt.show()
# ### Better color visualization
# In[9]:
from skimage.color import label2rgb
image_label_overlay = label2rgb(morphology.label(coins > 150), image=coins)
plt.imshow(image_label_overlay)
# Pro vizualizaci je možné využívat i barevný výstup
#
# ### Otsu segmentation
# In[10]:
#%pylab --no-import-all inline
#Imports
import matplotlib.pyplot as plt
# Prahování
from skimage import data
from skimage import filters
from skimage import exposure
camera = data.camera()
val = filters.threshold_otsu(camera)
mask = camera < val
plt.figure(figsize=(9, 3.5))
plt.gray()
plt.subplot(131)
plt.imshow(camera)
plt.subplot(132)
plt.imshow(mask)
hist, bins_center = exposure.histogram(camera)
plt.subplot(133)
plt.plot(bins_center, hist, lw=2)
plt.axvline(val, color='k', ls='--')
plt.show()
#plt.tight_layout()
# ## Segmentace založená na detekci hran ##
#
# Původní obraz
#
# ![input image](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/hranice2.jpg)
#
# dafa
#
# ![edge of image](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/hraniceprah.jpg)
#
# určení hranice na základě znalosti tvaru
#
# jestliže známe předpokládaný tvar objektu můžeme chybějící části doplnit
#
# ![doplneni](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/hranicespoj.jpg)
#
# určení hranice na základě zpřesňování
#
# spojíme koncové body hranic a další bod hranice hledáme na kolmici ve středu spojnice
#
# ![vylepsene doplneni](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/hranice21.jpg)
#
#
# gradientní pole
#
# ![gvf](http://www.kky.zcu.cz/uploads/courses/zdo/lesson6/hranice3.jpg)
# ### Hranově založená segmentace v pythonu
# In[13]:
# from skimage.filters import canny
from skimage.feature import canny
edges = canny(coins/255.)
plt.figure(figsize=(6, 4))
plt.imshow(edges, cmap=plt.cm.gray, interpolation='nearest')
plt.axis('off')
plt.title('Canny detector')
# In[15]:
from scipy import ndimage
fill_coins = ndimage.binary_fill_holes(edges)
plt.figure(figsize=(6, 4))
plt.imshow(fill_coins, cmap=plt.cm.gray, interpolation='nearest')
plt.axis('off')
plt.title('Filling the holes')
# ## Segmentace založená na analýze oblastí (Region-based Segmentaiton)
# In[24]:
from skimage.filters import sobel
import skimage.morphology
elevation_map = sobel(coins)
plt.figure(figsize=(4, 3))
plt.imshow(elevation_map, cmap=plt.cm.jet, interpolation='nearest')
plt.axis('off')
plt.title('elevation_map')
# In[29]:
markers = np.zeros_like(coins)
markers[coins < 30] = 1
markers[coins > 150] = 2
plt.figure(figsize=(4, 3))
plt.imshow(markers, cmap="jet", interpolation='nearest')
plt.axis('off')
plt.title('markers')
# In[32]:
segmentation = skimage.morphology.watershed(elevation_map, markers)
plt.figure(figsize=(6, 4))
plt.imshow(segmentation, cmap=plt.cm.gray, interpolation='nearest')
plt.axis('off')
plt.title('segmentation')
# ## Active Contour Model (Snakes)
# $$
# E_{snake}^*=\int\limits_0^1E_{snake}(\mathbf{v}(s))\,ds=
# \int\limits_0^1 \left\{
# \left[ E_{internal}\mathbf{v}(s)\right] +
# \left[ E_{image}\left(\mathbf{v}(s)\right) \right] +
# \left[ E_{con}(\mathbf{v}(s)) \right]
# \right\}\,ds
# $$
#
# ![snakes](https://raw.githubusercontent.com/pmneila/morphsnakes/master/examples/anim_nodule.gif)
# ![snakes_lakes](https://raw.githubusercontent.com/pmneila/morphsnakes/master/examples/anim_lakes.gif)
# ![snakes_3d](https://raw.githubusercontent.com/pmneila/morphsnakes/master/examples/anim_dendrite.gif)
#
# https://github.com/pmneila/morphsnakes
# In[31]:
img = data.astronaut()
img = rgb2gray(img)
s = np.linspace(0, 2*np.pi, 400)
r = 100 + 100*np.sin(s)
c = 220 + 100*np.cos(s)
init = np.array([r, c]).T
#snake
snake = active_contour(gaussian(img, 3),
init, alpha=0.015, beta=10, gamma=0.001,
coordinates='rc')
# visualization
fig, ax = plt.subplots(figsize=(7, 7))
ax.imshow(img, cmap=plt.cm.gray)
ax.plot(init[:, 1], init[:, 0], '--r', lw=3)
ax.plot(snake[:, 1], snake[:, 0], '-b', lw=3)
ax.set_xticks([]), ax.set_yticks([])
ax.axis([0, img.shape[1], img.shape[0], 0])
plt.show()
# ## Graph-Cut
#
# [Graph cut examples](https://nbviewer.jupyter.org/github/mjirik/ZDO/blob/master/ZDO_graph_cut.ipynb)