def getArrayRegion(self, arr, img=None, axes=(0, 1), **kwds): """ Return the result of ROI.getArrayRegion() masked by the elliptical shape of the ROI. Regions outside the ellipse are set to 0. """ # Note: we could use the same method as used by PolyLineROI, but this # implementation produces a nicer mask. if kwds["returnMappedCoords"]: arr, coords = pgROI.getArrayRegion(self, arr, img, axes, **kwds) else: arr = pgROI.getArrayRegion(self, arr, img, axes, **kwds) if arr is None or arr.shape[axes[0]] == 0 or arr.shape[axes[1]] == 0: return arr w = arr.shape[axes[0]] h = arr.shape[axes[1]] ## generate an ellipsoidal mask mask = np.fromfunction( lambda x, y: (((x + 0.5) / (w / 2.) - 1)**2 + ((y + 0.5) / (h / 2.) - 1)**2)**0.5 < 1, (w, h)) # reshape to match array axes if axes[0] > axes[1]: mask = mask.T shape = [(n if i in axes else 1) for i, n in enumerate(arr.shape)] mask = mask.reshape(shape) if kwds["returnMappedCoords"]: return arr * mask, coords else: return arr * mask
def getArrayRegion(self, data, img, axes=(0, 1), **kwds): """ Return the result of ROI.getArrayRegion(), masked by the shape of the ROI. Values outside the ROI shape are set to 0. """ br = self.boundingRect() if br.width() > 1000: raise Exception() sliced = ROI.getArrayRegion(self, data, img, axes=axes, fromBoundingRect=True, **kwds) if kwds.get("returnMappedCoords"): sliced, mapped = sliced if img.axisOrder == "col-major": mask = self.renderShapeMask(sliced.shape[axes[0]], sliced.shape[axes[1]]) else: mask = self.renderShapeMask(sliced.shape[axes[1]], sliced.shape[axes[0]]) mask = mask.T # reshape mask to ensure it is applied to the correct data axes shape = [1] * data.ndim shape[axes[0]] = sliced.shape[axes[0]] shape[axes[1]] = sliced.shape[axes[1]] mask = mask.reshape(shape) if kwds.get("returnMappedCoords"): return sliced * mask, mapped else: return sliced * mask