#!/usr/bin/env python # coding: utf-8 # # Morfologické operace # Vstup: binární obraz nebo obraz s více úrovněmi jasu # # Výstup: binární obraz nebo obraz s více úrovněmi jasu # # Cíl: tvar objektů # # Vlastnosti: snadné a rychlé předzpracování # # ![input_image](http://www.kky.zcu.cz/uploads/courses/zdo/lesson5/original.jpg) # In[1]: get_ipython().run_line_magic('pylab', 'inline --no-import-all') import skimage import skimage.io import skimage.color import skimage.morphology import matplotlib.pyplot as plt import numpy as np import scipy import scipy.ndimage # In[2]: # thresholding - prahování text_color = skimage.io.imread('http://www.kky.zcu.cz/uploads/courses/zdo/lesson5/original.jpg') text_gray = skimage.color.rgb2gray(text_color) textb = text_gray > 0.5 plt.imshow(textb, cmap='gray') # ## Binární dilatace # In[3]: a = np.zeros((5,5), dtype=np.int) a[2, 2] = 1 #a[1:6, 2:5] = 1 print 'input \n', a kernel = skimage.morphology.diamond(1).astype(np.uint8) print 'kernel \n', kernel ad = skimage.morphology.binary_dilation(a, kernel) print 'dilation \n', ad #dir(skimage.morphology) #skimage.morphology.binary_dilation(a, morphology.diamond(1)).astype(np.uint8) # In[4]: kernel_big = skimage.morphology.diamond(5).astype(np.uint8) textd = skimage.morphology.binary_dilation(textb, kernel_big) plt.imshow(textd, cmap='gray') # ## Binární eroze # In[5]: a = np.zeros((7,7), dtype=np.int) a[1:6, 2:5] = 1 print 'input \n', a ad = skimage.morphology.binary_erosion(a, kernel) print 'erosion \n', ad # In[6]: #kernel_big = skimage.morphology.diamond(3).astype(np.uint8) textd = skimage.morphology.binary_erosion(textb, kernel_big) plt.imshow(textd, cmap='gray') # ## Binární otevření a uzavření # Kombinace obou předchozích metod # # * Otevření - eroze + dilatace # * Uzavření - dilatace + eroze # In[7]: # Otevření #kernel_big = skimage.morphology.diamond(4).astype(np.uint8) textd = skimage.morphology.binary_opening(textb, kernel_big) #plt.subplot(121) #plt.imshow(textb, cmap='gray') #plt.subplot(122) plt.imshow(textd, cmap='gray') # In[8]: # Uzavření textd = skimage.morphology.binary_closing(textb, kernel_big) plt.imshow(textd, cmap='gray') # ## Kostra (Skeleton) # In[9]: a = np.zeros((200, 300), dtype=np.int) #a[1:6, 2:5] = 1 a[50:100, 50:200] = 1 a[30:150, 100:150] = 1 skela = skimage.morphology.skeletonize(a) plt.figure(figsize=(9, 4)) plt.subplot(121) plt.imshow(a, cmap='gray') plt.subplot(122) plt.imshow(skela, cmap='gray') # In[10]: textd = skimage.morphology.skeletonize(textb) plt.imshow(textd, cmap='gray') # ## Vyplnění děr (Fill holes) # In[11]: texth = scipy.ndimage.morphology.binary_fill_holes(textb) plt.imshow(texth, cmap='gray') # ## Cvičení # Spočítejte čtverce na obrázku z kamery # # ![ctverce](https://pojabr.zcu.cz/uploads/courses/zdo/lesson5/pocitani_ctvercu.jpg) # # Příprava na písemku # * FT # * morfologické operace