Saturday, May 12, 2012

Skeletonization using OpenCV-Python

I see people asking an algorithm for skeletonization very frequently. At first, I had no idea about it. But today, I saw a blog which demonstrates simple method to do this. Code was in C++, so I would like to convert it to Python here.

What is Skeletonization?





Answer is just right in the term. Simply, it make a thick blob very thin, may be one pixel width. Visit the wikipedia page for more details : Topological Skeleton

Code :

import cv2
import numpy as np
img = cv2.imread('sofsk.png',0)
size = np.size(img)
skel = np.zeros(img.shape,np.uint8)
ret,img = cv2.threshold(img,127,255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
done = False
while( not done):
 eroded = cv2.erode(img,element)
 temp = cv2.dilate(eroded,element)
 temp = cv2.subtract(img,temp)
 skel = cv2.bitwise_or(skel,temp)
 img = eroded.copy()
 zeros = size - cv2.countNonZero(img)
 if zeros==size:
 done = True
cv2.imshow("skel",skel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Below is the result I got:






References :

1) http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/

1 comment:

  1. great article. Do you have any idea how to remove those small 'hooks/ending' from skeleton

    Reply Delete

Subscribe to: Post Comments (Atom)

AltStyle によって変換されたページ (->オリジナル) /