-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProcess_Image.py
56 lines (49 loc) · 2.86 KB
/
Process_Image.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import math
import cv2
import numpy as np
from skimage.measure import label, regionprops
def jakikolor(ob): # funkcja segreguje elementy pod kątem wartości kolorów zawartych w BoundingBox-ie
if cv2.inRange(ob, (1, 1, 150), (50, 50, 255)).any():
return 2
elif cv2.inRange(ob, (1, 150, 1), (50, 255, 50)).any():
return 0
elif cv2.inRange(ob, (1, 150, 150), (50, 255, 255)).any():
return 1
def ekstrakcja_cech(obiekt_do_ekstrakcji_cech):
# ekstrakcja cech
# binaryzacja obrazu
b = cv2.inRange(obiekt_do_ekstrakcji_cech, (0, 0, 0), (255, 255, 255)) - (
cv2.inRange(obiekt_do_ekstrakcji_cech, (0, 0, 0), (54, 53, 52)) + cv2.inRange(obiekt_do_ekstrakcji_cech,
(230, 229, 228),
(255, 255, 255)))
# etykietowanie i ekstrakcja cech
cechy = regionprops(label(b))
ile_obiektow = len(cechy)
lista_cech = ['EulerNumber', 'Area', 'BoundingBoxArea', 'FilledArea', 'Extent', 'EquivDiameter', 'Solidity']
ile_cech = len(lista_cech)
tabela_cech = np.zeros((ile_obiektow,
ile_cech + 1 + 7 + 5 + 1)) # "1" - to jedna cecha wyliczana, "7" to momenty Hu, "5" to yp xp yk xk, "1" to kolor
listaob = []
for i in range(0, ile_obiektow):
yp, xp, yk, xk = cechy[i]['BoundingBox']
if math.isclose(yk - yp, xk - xp, abs_tol=2): # wykluczamy obiekty "wlatujące" i "wylatujące" z granic klatki
tabela_cech[i, ile_cech + 9], tabela_cech[i, ile_cech + 10], tabela_cech[i, ile_cech + 11], tabela_cech[
i, ile_cech + 12] = yp, xp, yk, xk
aktualny_obiekt = obiekt_do_ekstrakcji_cech[yp:yk, xp:xk, :]
tabela_cech[i, ile_cech + 13] = jakikolor(aktualny_obiekt)
ret, binobj = cv2.threshold(aktualny_obiekt[:, :, 1], 0, 255, cv2.THRESH_BINARY)
listaob.append(binobj) # aktualny_obiekt
# rejestrujemy wybrane cechy wyznaczone przez regionprops
for j in range(0, ile_cech):
tabela_cech[i, j] = cechy[i][lista_cech[j]]
# dodajemy momenty Hu
hu = cv2.HuMoments(cv2.moments(binobj))
hulog = (1 - 2 * (hu > 0).astype('int')) * np.nan_to_num(np.log10(np.abs(hu)), copy=True, neginf=-99,
posinf=99)
tabela_cech[i, ile_cech + 1:ile_cech + 8] = hulog.flatten()
tabela_cech[:, ile_cech] = tabela_cech[:, 3] / tabela_cech[:, 2] # cecha wyliczana
tabela_cech[:, 0] = (tabela_cech[:, 0] == 1) # korekta liczby Eulera
# wyczyszczona_z_zer_tabela_cech = []
tabela_cech = np.nan_to_num(tabela_cech)
nw = tabela_cech[~np.all(tabela_cech == 0, axis=1)] # wycinamy wiersze zerowe
return listaob, nw