Операція ''потрапив/не потрапив'' корисна для пошуку шаблонів у бінарних зображеннях. Алгоритм на вхід отримує зображення $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")
Немає коментарів:
Дописати коментар