Скелетом фігури (множини світлих пікселів) на бінарному зображенні називається множина пікселів, які рівновіддалені від країв фігури.
Скелет є спрощеним описом фігури і в деяких задачах полегшує її подальший аналіз. Як морфологічна операція скелетизація зводиться до операцій розмикання, замикання та об'єднання і визначається формулою Lantuéjoul: $$
S(A)=\bigcup_{k=1}^N S_k(A),
$$
де
$$
S_k(A)=(A \ominus k B) \setminus ((A \ominus k B) \circ B),
$$
а запис $(A \ominus k B)$ означає послідовне виконання $k$ ерозій до зображення $A$ з структурними елеементом $B.$ Верхній індекс сумування визначається з умови
$$
N=\max\{ k \mid (A \ominus k B) \neq \varnothing \}.
$$
В OpenCV немає окремої функції скелетизації, але в розширенні opencv-contrib-python є функція cv2.ximgproc.thinning яка має режим скелетизації:
img=cv2.imread('elef.jpg')
img_gray=255-cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_bin = cv2.threshold(img_gray, 25, 255, cv2.THRESH_BINARY)[1]
rect = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
dilate = cv2.dilate(img_bin,rect,iterations = 2)
img_sk=cv2.ximgproc.thinning(dilate,thinningType=cv2.ximgproc.THINNING_GUOHALL)
Скелетизація кольорового зображення.
Також можна використати функцію skeletonize з бібліотеки skimage. Приклад використання
from skimage import morphology
img = cv2.imread('Ji.jpg',0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]
img=np.array(img,dtype=bool)
sk=morphology.skeletonize(img)
Скелетизація зображення та його негативу.
Звернемо увагу, що на вхід функції skeletonize подається булівський масив.
Немає коментарів:
Дописати коментар