субота, 15 травня 2021 р.

Скелетизація

Mathedemo
Скелетом фігури (множини світлих пікселів) на бінарному зображенні називається множина пікселів, які рівновіддалені від країв фігури. Скелет є спрощеним описом фігури і в деяких задачах полегшує її подальший аналіз. Як морфологічна операція скелетизація зводиться до операцій розмикання, замикання та об'єднання і визначається формулою 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 подається булівський масив.

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

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