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
import skimage
import skimage.io
import skimage.morphology
import skimage.measure
import matplotlib.pyplot as plt
import numpy as np
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')
<matplotlib.image.AxesImage at 0x20a6f0bd548>
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]
<matplotlib.image.AxesImage at 0x20a6f1c2b88>
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
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
<matplotlib.image.AxesImage at 0x20a6f2fec88>
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.