Popis objektů

  • Vstup: binární obraz
  • Výstup: binární obraz, vektor příznaků
  • Cíl: popsat objekty čísly

Identifikace oblastí

In [2]:
%pylab inline --no-import-all
import skimage
import skimage.io
# skimage.morphology.label => skimage.measure.label
import skimage.morphology
import skimage.measure
import matplotlib.pyplot as plt
import numpy as np
Populating the interactive namespace from numpy and matplotlib
In [3]:
imrgb = skimage.io.imread('http://www.kky.zcu.cz/uploads/courses/zdo/lesson7/1.jpg')
imrgb = skimage.io.imread('objekty/label.jpg')
im = skimage.color.rgb2gray(imrgb) > 0.5
# v tomto případě má pozadí label 0
imlabel0 = skimage.measure.label(im)
# v tomto případě má pozadí label -1
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\ndefined backgr.')
plt.imshow(imlabel1, cmap='gray')
Out[3]:
<matplotlib.image.AxesImage at 0x22f39f00b70>

Práce s oblastí

Následující příklad ukazuje vybrání zvolené oblasti

In [5]:
print("labels ", np.unique(imlabel1))

plt.subplot(121)
plt.title('Object 0')
plt.imshow(imlabel1==0, cmap='gray')
plt.subplot(122)
plt.title('Object 1')
plt.imshow(imlabel1==1, cmap='gray')
labels  [0 1 2]
Out[5]:
<matplotlib.image.AxesImage at 0x22f3a04e048>

Jednoduché popisy oblastí

  • 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 projekce1

  • 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.

In [8]:
print(np.unique(imlabel1))
props = skimage.measure.regionprops(imlabel1+1)

print("Centroid: ", props[1].centroid)
print("Area: ", props[1].area)
print("Euler: ", props[1].euler_number)
print("Perimeter: ", props[1].perimeter)
ci = props[1].convex_image
plt.imshow(ci)
plt.show()
[0 1 2]
Centroid:  (62.486293379994166, 84.67264508603091)
Area:  6858
Euler:  -1
Perimeter:  686.4823227814082
In [10]:
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:  (76.83132073428277, 84.18519521308279)
Area:  18467
Euler:  -1

Id:  1
Centroid:  (62.486293379994166, 84.67264508603091)
Area:  6858
Euler:  -1

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

Regionprops s intenzitami

In [22]:
props = skimage.measure.regionprops(imlabel1 + 1, im)
props[1].mean_intensity
Out[22]:
1.0
In [14]:
## stara implementace

# props0 = skimage.measure.regionprops(imlabel1==0)
# props = props0
# print "Centroid ", props[0].centroid
# print "Area ", props[0].area
# print "Euler ", props[0].euler_number


# #print "Centroid 1 ", props[1].centroid

# props1 = skimage.measure.regionprops(imlabel1==1)
# props = props1
# print "Centroid ", props[0].centroid
# print "Area ", props[0].area
# print "Euler ", props[0].euler_number

Freemanův řetězový kód

freeman

freeman

Obecný momentový popis

Obecné momenty

$$ M_{ij} = \sum_x \sum_y x^i, y^j I (x,y) $$

skimage.measure.moments()

Centrální moment

Souřadnice centroidu $ \bar{x} = \frac{M_{10}}{M_{00}}$ $ \bar{y} = \frac{M_{01}}{M_{00}}$

$$ \mu_{pq} = \sum_x \sum_y (x-\bar{x})^p (y-\bar{y})^q f(x,y) $$

kde $f(x,y)$ je digitální obraz

skimage.measure.moments_central()

Huovy momenty

Sedm momentů nezávislých na posunutí, změnu měřítka a rotaci. Prvních šest je nezávislých na zrcadlení. Poslední při zrcadlení mění znaménko. $$ I_1 = \eta_{20} + \eta_{02}$$ $$ I_2 = (\eta_{20} - \eta_{02})^2 + 4\eta_{11}^2$$ $$ I_3 = (\eta_{30} - 3\eta_{12})^2 + (3\eta_{21} - \eta_{03})^2$$ $$ I_4 = (\eta_{30} + \eta_{12})^2 + (\eta_{21} + \eta_{03})^2 $$ $$ I_5 = (\eta_{30} - 3\eta_{12}) (\eta_{30} + \eta_{12})\left[ (\eta_{30} + \eta_{12})^2 - 3 (\eta_{21} + \eta_{03})^2\right] + (3 \eta_{21} - \eta_{03}) (\eta_{21} + \eta_{03})\left[ 3(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2\right]$$ $$ I_6 = (\eta_{20} - \eta_{02})[(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2] + 4\eta_{11}(\eta_{30} + \eta_{12})(\eta_{21} + \eta_{03})$$ $$ I_7 = (3 \eta_{21} - \eta_{03})(\eta_{30} + \eta_{12})\left[(\eta_{30} + \eta_{12})^2 - 3(\eta_{21} + \eta_{03})^2\right] - (\eta_{30} - 3\eta_{12})(\eta_{21} + \eta_{03})\left[3(\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2\right]$$ $$ $$ Huovy momenty na wiky

skimage.measure.moments_hu()

In [ ]: