Create Mask From Skimage Contour
Solution 1:
A bit late but you know the saying. Here is how I would accomplish this.
import scipy.ndimage as ndimage
# Create an empty image to store the masked array
r_mask = np.zeros_like(r, dtype='bool')
# Create a contour image by using the contour coordinates rounded to their nearest integer value
r_mask[np.round(contour[:, 0]).astype('int'), np.round(contour[:, 1]).astype('int')] = 1# Fill in the hole created by the contour boundary
r_mask = ndimage.binary_fill_holes(r_mask)
# Invert the mask since you want pixels outside of the region
r_mask = ~r_mask
Solution 2:
If you're still looking for a faster way to achieve that, I would recommend using skimage.draw.polygon, I'm kind of new to this but it seems to be built in to do exactly what you are trying to accomplish:
import numpy as np
from skimage.draw import polygon
# fill polygon
poly = np.array((
(300, 300),
(480, 320),
(380, 430),
(220, 590),
(300, 300),
))
rr, cc = polygon(poly[:, 0], poly[:, 1], img.shape)
img[rr, cc, 1] = 1
So in your case, a 'closed contour' is a 'poly', we are creating a blank image with the shape of your contours filled with the value 1:
mask = np.zeros(r.shape)
rr, cc = polygon(contour[:, 0], contour[:, 1], mask.shape)
mask[rr, cc] = 1
And now you can apply your mask to the original image to mask out everything outside the contours:
masked = ma.array(r.copy(), mask=mask)
Documented in scikit image - Shapes
Solution 3:
Ok, I was able to make this work by converting the contour to a path and then selecting the pixels inside:
# Convert the contour into a closed path
from matplotlib import path
closed_path = path.Path(contour.T)
# Get the points that lie within the closed path
idx = np.array([[(i,j) for i in range(r.shape[0])] for j in range(r.shape[1])]).reshape(np.prod(r.shape),2)
mask = closed_path.contains_points(idx).reshape(r.shape)
# Invert the mask and apply to the image
mask = np.invert(mask)
masked_data = ma.array(r.copy(), mask=mask)
However, this is kind of slow testing N = r.shape[0]*r.shape[1]
pixels for containment. Anyone have a faster algorithm? Thanks!
Post a Comment for "Create Mask From Skimage Contour"