понеділок, 17 травня 2021 р.

Операція ''потрапив/не потрапив'' ( hit and miss)

Mathedemo
Операція ''потрапив/не потрапив'' корисна для пошуку шаблонів у бінарних зображеннях. Алгоритм на вхід отримує зображення $A$ і подвійний структурний елемент $B=(B_1,B_2), B_1 \cap B_2 =\varnothing$, а на виході -- зображення утворене з тих пікселів $A$ які є центром тих околів, які відповідають формі структурного елемента $B_1$ і не відповідають формі другого структурного елемента $B_2$. Математично ця операція записується так $$ (A \ominus B_1) \setminus ( \overline{A} \ominus B_2), $$ Операція ''потрапив/не потрапив'' в OpenCV реалізується функцією cv2.morphologyEx(img, cv2.MORPH_HITMISS, kernel) де kernel -- комбінований структурний елемент. Наведемо приклади деяких таких комбінованих елементів для стандартних патернів, з яких стає зрозумілий принцип їхнього утворення:
#Для ізольованого білого пікселя
point=np.array([[-1,-1,-1], 
[-1,1,-1],
[-1,-1,-1]], dtype="int")
#Для відрізку горизонтальної лінії товщиною 2 пікселі
# обмеженої згори пікселями фону 
hor=np.array([[-1,-1,-1], 
[1,1,1], 
[1,1,1]], dtype="int")
#Для відрізку вертикальної лінії товщиною 1 піксель 
vert=np.array([[-1,1,-1], 
[-1,1,-1], 
[-1,1,-1]], dtype="int")
#Для правого  верхньої кутового пікселя 
kut_vl=np.array([[-1,-1,-1], 
[1,1,-1], 
[0,-1,-1]], dtype="int")
										
#Для лівого нижнього кутового пікселя 
kutnp=np.array([[-1,1,0], 
[-1,1,-1], 
[-1,-1,-1]], dtype="int")
#Для ізольованого квадрату 2x2
kv=np.array([[-1,-1,-1,-1], 
[-1,1, 1,-1], 
[-1,1,1,-1],            
[-1,-1,-1,-1]], dtype="int")
На малюнку нижче показано результат застосування операції ''потрапив/не потрапив''
Результат застосування операції ''потрапив/не потрапив'' з комбінованим структурним елементом hor ( посередині) і ядром kut_vl.

Зауважимо, що ядро hor виділило лише пікселі (крім двох крайніх) верхньої горизонтальної сторони прямокутника і проігнорувало пікселі нижньої. Для виявлення нижньої горизонтальної лінії потрібно було використати такий комбінований структурний елемент:

np.array([[1,1,1], 
[1,1,1], 
[-1,-1,-1]], dtype="int")

Немає коментарів:

Дописати коментар