#!/usr/bin/env python # coding: utf-8 # # Několik odkazů do začátku # Instalace Pythonu # # PythonXY # https://code.google.com/p/pythonxy/ # # WinPython # http://winpython.github.io/ # # Anaconda # https://store.continuum.io/cshop/anaconda/ # # # Programování v Pythonu # http://pythonic.eu/fjfi/ # # Stránky našeho předmětu ZDO # http://www.kky.zcu.cz/cs/courses/zdo # # Ukazky metod zpracovani obrazu # http://scipy-lectures.github.io/packages/scikit-image/ # # # Pusťme si ipython notebook # In[1]: get_ipython().run_line_magic('pylab', 'inline') # from pylab import * # import cStringIO import urllib import scipy import scipy.misc import skimage import skimage.data from skimage.filters import threshold_otsu # from skimage.filters import gaussian_filter from skimage.filters import gaussian as gaussian_filter # from skimage.filter import threshold_otsu, gaussian_filter from skimage.morphology import label from scipy.ndimage.morphology import binary_closing, binary_erosion, binary_opening, binary_dilation from skimage.measure import regionprops from skimage.color import label2rgb from skimage.io import imread # import skimage.filter # from skimage.filters import # ## Trocha Pythonu # In[3]: print("hello") # In[4]: def mojeFunkce(vstup): vystup = vstup + 6 return vystup mojeFunkce(5) # In[5]: for i in range(2,5): print(i) # In[6]: pole = ['Franta', 'Jakub', 'Marta'] for jmeno in pole: print(jmeno) # ## Načtení a zobrazení obrázku z URL # In[19]: # URL = "http://plzen.cz/cameraFeed.php" URL = "http://vysilani.zaktv.cz/camera/namesti.jpg" img = imread(URL) imshow(img) # show() # In[20]: plt.figure(figsize=[10, 5]) subplot(131) imshow(img[:, :, 0], cmap="Reds") plt.axis("off") subplot(132) imshow(img[:, :, 1], cmap="Greens") plt.axis("off") subplot(133) imshow(img[:, :, 2], cmap="Blues") plt.axis("off") img.shape # ### Zobrazení obrázku z kamery # In[66]: URL = "http://uc452cam01-kky.fav.zcu.cz/snapshot.jpg" # In[67]: img = imread(URL, as_grey=True) imshow(img, cmap='gray') # In[31]: # ukazkova data img = skimage.data.coins() / 255.0 imshow(img, cmap='gray') # ### Práce s obrazovými daty # In[32]: img.shape # In[33]: img[50, 10] # In[34]: imgi = img.astype(np.int) imgi # In[35]: img[10:20,15:20] # In[36]: # img[10:200, 10:-100] = 100 imshow(img, cmap='gray') colorbar() # # Segmentace # [cviceni7](http://nbviewer.jupyter.org/github/mjirik/ZDO/blob/master/ZDOcvSegmentation.ipynb) # In[38]: imthr = img > 0.2 imshow(imthr, cmap='gray') # In[43]: imthr = img > 0.50 imshow(imthr, cmap='gray') # In[ ]: # ## Barveni obrazu - label # In[44]: # blobs_labels = skimage.morphology.label(img, background=0) imlabel = label(imthr, background=0) imshow(imlabel, cmap='gray') # In[45]: np.unique(imlabel) # In[46]: # pocet labelu print(np.max(imlabel)) # ### Zobrazení jednoho objektu # In[47]: imshow(imlabel==35) # In[58]: fig, axes = subplots(1,3, figsize=(15,4)) axes[0].imshow(imlabel==35) axes[1].imshow(imlabel==36) axes[2].imshow(imlabel==64) # ### Barevná vizualizace # In[61]: # Barevne provedeni image_label_overlay = label2rgb(imlabel, image=img) plt.imshow(image_label_overlay) # # Filtrace # In[62]: coins_zoom = img[10:80, 300:370] from scipy import ndimage gaussian_coins1 = gaussian_filter(coins_zoom, sigma=1) gaussian_coins2 = gaussian_filter(coins_zoom, sigma=15) fig, axes = subplots(1,3, figsize=(15,4)) axes[0].imshow(coins_zoom, cmap='gray') axes[1].imshow(gaussian_coins1, cmap='gray') axes[2].imshow(gaussian_coins2, cmap='gray') # ## Optimální volba volba prahu - Otsu # http://scikit-image.org/docs/dev/auto_examples/plot_otsu.html # In[26]: thr = threshold_otsu(img) thr # In[27]: imthr = img > thr imshow(imthr, cmap='gray') # Spocitame pocet objektu? # # Morfologicke operace # In[28]: # plt.figure(figsize(10,10)) # imshow(imthr[0:20,260:310], interpolation='nearest') # In[56]: imer = binary_erosion(imthr, iterations=1) imdil = binary_dilation(imthr, iterations=2) fig, axes = subplots(1,3, figsize=(15,5)) axes[0].imshow(imdil[160:230,240:310], interpolation='nearest') axes[1].imshow(imthr[160:230,240:310], interpolation='nearest') axes[2].imshow(imer[160:230,240:310], interpolation='nearest') # In[30]: ones([5,5]) # Pocet prekryvajicich se objektu? # # Popis objektu # [cviceni8](http://nbviewer.ipython.org/github/mjirik/ZDO/blob/master/ZDOcv8.ipynb) # # * Velikost # * Eulerovo číslo # $$E = S - N$$ # kde $S$ je počet souvislých oblastí a $N$ je počet děr # * Výška, šířka # * Projekce # ![projekce0](http://www.kky.zcu.cz/uploads/courses/zdo/lesson7/projekce.jpg) # ![projekce1](http://www.kky.zcu.cz/uploads/courses/zdo/lesson7/projekce2.jpg) # # * Výstřednost - poměr délek nejdelší tětivy a nejdelší tětivy k ní kolmé # * Podlouhlost # * Pravoúhlost # * Směr # * Nekompaktnost # $$\textrm{nekompaktnost}=\frac{(\textrm{délka hranice})^2}{\textrm{velikost}}$$ # # # Využijeme funkce [regionprops](http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops). # In[83]: objnumber = 38 imshow(imlabel==objnumber) # print np.unique(imlabel) props = regionprops(imlabel+1) print("Centroid ", props[objnumber].centroid) print("Plocha ", props[objnumber].area) print("Obvod ", props[objnumber].perimeter) # ### Hromadné zpracování # In[88]: for objnumber in range(1, len(props)): if props[objnumber].area > 2000: print("id ", objnumber) print("Centroid ", props[objnumber].centroid) print("Plocha ", props[objnumber].area) print("Obvod ", props[objnumber].perimeter) # # Zadani # Spocitejte kolik objektu urciteho typu se objevuje na obrazku z webkamery. Rozeznavame nasledujici typy objektu: # # * Kolecko # * Ctvrec # * Obdelnik # * Hvezda # # Trenovaci data naleznete [zde](https://github.com/mjirik/ZDO/tree/master/objekty) # # * Odevzdejte skript ve formátu `.ipynb` nebo `.py` # * V názvu souboru uveďte své jméno # * Jako parametr nechť je URL k obrázku # # ![ukazka](https://github.com/mjirik/ZDO/blob/master/objekty/01.jpg?raw=true) # # Bonus - klasifikátory # # [ZDO - classification](https://nbviewer.jupyter.org/github/mjirik/ZDO/blob/master/Cviceni_IG/ZDO_classification.ipynb) # # In[ ]: train_target = [1,1,1,2,2,2,3,3,3] # In[ ]: # Features - příznaky train_data = np.zeros([9,2]) print(train_data) for objnumber in range(1, len(props)): train_data[objnumber - 1, 0] = props[objnumber].area train_data[objnumber - 1, 1] = props[objnumber].perimeter print(train_data) # In[1]: ## Training from sklearn import svm svc = svm.SVC() svc.fit(train_data, train_target) # In[ ]: ## Testing y_pred = svc.predict(test_data) # print("Number of mislabeled points : %d" % (test_target != y_pred).sum()) # In[ ]: y_pred = svc.predict([[300, 7800]]) y_pred