ESF projekt Západočeské univerzity v Plzni reg. č. CZ.02.2.69/0.0/0.0/16 015/0002287

Object Description

Popis objektu - cílem je nalézt popis objektu, jež dostatečně vyjadřuje jeho vlastnosti. Použit následně pro klasifikátor.

Barvení oblastí - ekvalizace barev (kolize při obarvení).

Freemanův řetězový kod - 4 okolí, 8 okolí

Popis oblasti - velikost, pravoúhlost, podlouhlost

Velikost - Dána počtem obrazových elementů

Eulerovo cislo - E = S (počet souvislých částí) - N (počet děr) Výška, Šířka

Výstřednost - poměr nejdelší tětivy a k ní nejdelší kolem tětivy

Podlouhlost - poměr mezi délkou a šířkou pravoúhelníku opsaného oblasti, která má nejmenší plochu ze všech pravoúhelníků, které lze oblasti opsat

Pravoúhlost - poměr mezi velikostí oblasti a plochou opsaného pravoúhelníka ve směru natočení

Směr - smysl pro podlouhle oblasti

Nekompaktnost - (délka_hranice_oblasti)na druhou/ velikost

Konvexní obal - nejmenší opsaná konvexní oblast

In [1]:
import skimage
import skimage.io
import skimage.morphology
import skimage.measure
import matplotlib.pyplot as plt
import numpy as np
In [9]:
imrgb = skimage.io.imread('http://www.kky.zcu.cz/uploads/courses/zdo/lesson7/1.jpg')
im = skimage.color.rgb2gray(imrgb) > 0.5

imlabel0 = skimage.measure.label(im)

imlabel1 = skimage.measure.label(im, background=0)

plt.subplot(131)
plt.title('orig')
plt.imshow(im, cmap='gray')
plt.subplot(132)
plt.title('label')
plt.imshow(imlabel0, cmap='gray')
plt.subplot(133)
plt.title('label\n defined backgr.')
plt.imshow(imlabel1, cmap='gray')
Out[9]:
<matplotlib.image.AxesImage at 0x23018fca6d8>
In [11]:
print("labels ", np.unique(imlabel1))

plt.subplot(131)
plt.title('Object 0')
plt.imshow(imlabel1==0, cmap='gray')
plt.subplot(132)
plt.title('Object 1')
plt.imshow(imlabel1==1, cmap='gray')
plt.subplot(133)
plt.title('Object 2')
plt.imshow(imlabel1==2, cmap='gray')
labels  [0 1 2]
Out[11]:
<matplotlib.image.AxesImage at 0x23019148b70>
In [19]:
props = skimage.measure.regionprops(imlabel1)
object_number = 0
print("Centroid: ", props[object_number].centroid)
print("Area: ", props[object_number].area)
print ("Euler: ", props[object_number].euler_number)
print ("Perimeter: ", props[object_number].perimeter)
ci = props[object_number].convex_image
plt.imshow(ci)
plt.show()
Centroid:  (62.486293379994166, 84.67264508603091)
Area:  6858
Euler:  -1
Perimeter:  686.4823227814082
In [20]:
props = skimage.measure.regionprops(imlabel1)

object_number = 1
print("Centroid: ", props[object_number].centroid)
print ("Area: ", props[object_number].area)
print ("Euler: ", props[object_number].euler_number)
print ("Perimeter: ", props[object_number].perimeter) 
ci = props[object_number].convex_image
plt.imshow(ci)
Centroid:  (113.5, 146.51309408341416)
Area:  2062
Euler:  1
Perimeter:  179.19595949289334
Out[20]:
<matplotlib.image.AxesImage at 0x230194cea58>
In [21]:
for i in range(len(props)):
    print("Id: ", i)
    print("Centroid: ", props[i].centroid)
    print("Area: ", props[i].area)
    print("Euler: ", props[i].euler_number)
    print ("")
Id:  0
Centroid:  (62.486293379994166, 84.67264508603091)
Area:  6858
Euler:  -1

Id:  1
Centroid:  (113.5, 146.51309408341416)
Area:  2062
Euler:  1

Bez pomoci props naprogramujte skript, ktery spocte plochu a obvod. Vykresli objekty s nejvetsim obvodem a nejvetsi plochou.