Skip to content

Instantly share code, notes, and snippets.

@Seagor
Created April 25, 2016 20:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Seagor/809eff4e0489389af0a37253241986d9 to your computer and use it in GitHub Desktop.
Save Seagor/809eff4e0489389af0a37253241986d9 to your computer and use it in GitHub Desktop.
import numpy as np
import cv2
from skimage import measure
from skimage.measure import regionprops
from skimage.morphology import skeletonize, convex_hull_image, medial_axis, opening
from scipy import ndimage
def seg_buffer(im, dist=25):
mask = im.copy()
edm1 = cv2.distanceTransform(~im, cv2.cv.CV_DIST_L2, 5)
s = (edm1 < dist)
mask[s] = 1
return mask, edm1
skel = skeletonize(binary_mask).astype(np.int)
#render_array(~skel, width=5, height=5, cmap=plt.cm.gray)
k = np.array([[1,1,1],[1,0,1],[1,1,1]])
ngrid = ndimage.convolve(skel, k, mode='constant') * skel
ngrid[ngrid > 2] = 0
ngrid[(ngrid <= 2) & (ngrid > 0)] = 1
segment_labels = measure.label(ngrid)
segment_props = measure.regionprops(segment_labels)
i=0
buffers = []
for seg in segment_props:
i += 1
if (seg.orientation < 0
or seg.orientation > 1
or seg.solidity < 0.1):
continue
buff, edm1 = seg_buffer((segment_labels == i).astype(np.uint8) * 255, dist=15)
buffers.append(buff)
buffer_sum = reduce( lambda s,e: s + e, buffers )
contours, hierarchy = cv2.findContours( buffer_sum.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
vis = clipped[0].copy()
regions = []
for i, cnt in enumerate(contours):
if cv2.contourArea(cnt) > 0.0:
rect = cv2.minAreaRect(cnt)
box = cv2.cv.BoxPoints(rect)
box = np.int0(box)
cv2.drawContours(vis,[box],0,(0,0,255),2)
regions.append({ 'box': box, 'rect': rect, 'bounds': cv2.boundingRect(cnt)})
render_array(buffer_sum)
render_array(vis)
def crop_region(region, img):
rect = region['rect']
center = rect[0]
angle = rect[2]
size = rect[1]
size = (int(size[0]), int(size[1]))
M = cv2.getRotationMatrix2D(center, angle, 1.0)
warped = cv2.warpAffine(img, M, dsize=img[:,:,0].shape, flags=cv2.INTER_CUBIC)
crop = np.ndarray((size[1],size[0],4))
for i in xrange(4):
crop[:,:,i] = cv2.getRectSubPix(warped[:,:,i], size, center)
return crop.astype(np.uint8)
image_regions = [[crop_region(region, img.copy()) for region in regions[1:-2]] for img in clipped]
render_array(image_regions[4][5])
render_array(image_regions[1][3])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment