Скелетом фігури (множини світлих пікселів) на бінарному зображенні називається множина пікселів, які рівновіддалені від країв фігури.
Скелет є спрощеним описом фігури і в деяких задачах полегшує її подальший аналіз. Як морфологічна операція скелетизація зводиться до операцій розмикання, замикання та об'єднання і визначається формулою Lantuéjoul: S(A)=N⋃k=1Sk(A),
де
Sk(A)=(A⊖kB)∖((A⊖kB)∘B),
а запис (A⊖kB) означає послідовне виконання k ерозій до зображення A з структурними елеементом B. Верхній індекс сумування визначається з умови
N=max{k∣(A⊖kB)≠∅}.
В 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 подається булівський масив.
Немає коментарів:
Дописати коментар