Fix roi get array region (#1700)
* ROI.py, getArrayRegion: Fix return mapped coordinates The *getArrayRegion* method is defined as returning a tuple of the points in the selected region and the mapped coordinates if the *returnMappedCoords* keyword argument is set to True in the parent class *ROI*. In the *EllipseROI* class, *getArrayRegion* was overriden, however it ignores the *returnMappedCoords* keyword argument, leading to unintended bugs because of the change in interface between the parent class and the subclass. This patch fixes the above bug. If *returnMappedCoords* is set to False, then only *arr* containing the array region is returned. If *returnMappedCoords* is set to True, a tuple of the array region and the mapped coordinates is returned. NB: At the time of this commit, the same bug is present in several classes extending *ROI*. This commit only fixes the issue for the *EllipseROI* class. * ROI.py, PolyLineROI.getArrayRegion: Fix return mapped coordinats The *getArrayRegion* method is defined as returning a tuple of the points in the selected region and the mapped coordinates if the *returnMappedCoords* keyword argument is set to True in the parent class *ROI*. In the *PolyLineROI* class, *getArrayRegion* was overriden, however it ignores the *returnMappedCoords* keyword argument, leading to unintended bugs because of the change in interface between the parent class and the subclass. This patch fixes the above bug. If *returnMappedCoords* is set to False, then only *arr* containing the array region is returned. If *returnMappedCoords* is set to True, a tuple of the array region and the mapped coordinates is returned. * remove merge conflict cruft * lint Co-authored-by: Malik Olivier Boussejra <malik@boussejra.com>
This commit is contained in:
parent
711ad8afaa
commit
0f94c17d86
@ -1185,22 +1185,25 @@ class ROI(GraphicsObject):
|
|||||||
mapped = fn.transformCoordinates(img.transform(), coords)
|
mapped = fn.transformCoordinates(img.transform(), coords)
|
||||||
return result, mapped
|
return result, mapped
|
||||||
|
|
||||||
def _getArrayRegionForArbitraryShape(self, data, img, axes=(0,1), **kwds):
|
def _getArrayRegionForArbitraryShape(self, data, img, axes=(0,1), returnMappedCoords=False, **kwds):
|
||||||
"""
|
"""
|
||||||
Return the result of :meth:`~pyqtgraph.ROI.getArrayRegion`, masked by
|
Return the result of :meth:`~pyqtgraph.ROI.getArrayRegion`, masked by
|
||||||
the shape of the ROI. Values outside the ROI shape are set to 0.
|
the shape of the ROI. Values outside the ROI shape are set to 0.
|
||||||
|
|
||||||
See :meth:`~pyqtgraph.ROI.getArrayRegion` for a description of the
|
See :meth:`~pyqtgraph.ROI.getArrayRegion` for a description of the
|
||||||
arguments.
|
arguments.
|
||||||
|
|
||||||
Note: ``returnMappedCoords`` is not yet supported for this ROI type.
|
|
||||||
"""
|
"""
|
||||||
br = self.boundingRect()
|
br = self.boundingRect()
|
||||||
if br.width() > 1000:
|
if br.width() > 1000:
|
||||||
raise Exception()
|
raise Exception()
|
||||||
sliced = ROI.getArrayRegion(self, data, img, axes=axes, fromBoundingRect=True, **kwds)
|
if returnMappedCoords:
|
||||||
|
sliced, mappedCoords = ROI.getArrayRegion(
|
||||||
|
self, data, img, axes, returnMappedCoords, fromBoundingRect=True, **kwds)
|
||||||
|
else:
|
||||||
|
sliced = ROI.getArrayRegion(
|
||||||
|
self, data, img, axes, returnMappedCoords, fromBoundingRect=True, **kwds)
|
||||||
|
|
||||||
if img.axisOrder == "col-major":
|
if img.axisOrder == 'col-major':
|
||||||
mask = self.renderShapeMask(sliced.shape[axes[0]], sliced.shape[axes[1]])
|
mask = self.renderShapeMask(sliced.shape[axes[0]], sliced.shape[axes[1]])
|
||||||
else:
|
else:
|
||||||
mask = self.renderShapeMask(sliced.shape[axes[1]], sliced.shape[axes[0]])
|
mask = self.renderShapeMask(sliced.shape[axes[1]], sliced.shape[axes[0]])
|
||||||
@ -1212,7 +1215,10 @@ class ROI(GraphicsObject):
|
|||||||
shape[axes[1]] = sliced.shape[axes[1]]
|
shape[axes[1]] = sliced.shape[axes[1]]
|
||||||
mask = mask.reshape(shape)
|
mask = mask.reshape(shape)
|
||||||
|
|
||||||
return sliced * mask
|
if returnMappedCoords:
|
||||||
|
return sliced * mask, mappedCoords
|
||||||
|
else:
|
||||||
|
return sliced * mask
|
||||||
|
|
||||||
def getAffineSliceParams(self, data, img, axes=(0,1), fromBoundingRect=False):
|
def getAffineSliceParams(self, data, img, axes=(0,1), fromBoundingRect=False):
|
||||||
"""
|
"""
|
||||||
@ -1840,7 +1846,7 @@ class EllipseROI(ROI):
|
|||||||
|
|
||||||
p.drawEllipse(r)
|
p.drawEllipse(r)
|
||||||
|
|
||||||
def getArrayRegion(self, arr, img=None, axes=(0, 1), **kwds):
|
def getArrayRegion(self, arr, img=None, axes=(0, 1), returnMappedCoords=False, **kwds):
|
||||||
"""
|
"""
|
||||||
Return the result of :meth:`~pyqtgraph.ROI.getArrayRegion` masked by the
|
Return the result of :meth:`~pyqtgraph.ROI.getArrayRegion` masked by the
|
||||||
elliptical shape of the ROI. Regions outside the ellipse are set to 0.
|
elliptical shape of the ROI. Regions outside the ellipse are set to 0.
|
||||||
@ -1852,9 +1858,17 @@ class EllipseROI(ROI):
|
|||||||
"""
|
"""
|
||||||
# Note: we could use the same method as used by PolyLineROI, but this
|
# Note: we could use the same method as used by PolyLineROI, but this
|
||||||
# implementation produces a nicer mask.
|
# implementation produces a nicer mask.
|
||||||
arr = ROI.getArrayRegion(self, arr, img, axes, **kwds)
|
if returnMappedCoords:
|
||||||
|
arr, mappedCoords = ROI.getArrayRegion(self, arr, img, axes,
|
||||||
|
returnMappedCoords, **kwds)
|
||||||
|
else:
|
||||||
|
arr = ROI.getArrayRegion(self, arr, img, axes,
|
||||||
|
returnMappedCoords, **kwds)
|
||||||
if arr is None or arr.shape[axes[0]] == 0 or arr.shape[axes[1]] == 0:
|
if arr is None or arr.shape[axes[0]] == 0 or arr.shape[axes[1]] == 0:
|
||||||
return arr
|
if returnMappedCoords:
|
||||||
|
return arr, mappedCoords
|
||||||
|
else:
|
||||||
|
return arr
|
||||||
w = arr.shape[axes[0]]
|
w = arr.shape[axes[0]]
|
||||||
h = arr.shape[axes[1]]
|
h = arr.shape[axes[1]]
|
||||||
|
|
||||||
@ -1867,7 +1881,10 @@ class EllipseROI(ROI):
|
|||||||
shape = [(n if i in axes else 1) for i,n in enumerate(arr.shape)]
|
shape = [(n if i in axes else 1) for i,n in enumerate(arr.shape)]
|
||||||
mask = mask.reshape(shape)
|
mask = mask.reshape(shape)
|
||||||
|
|
||||||
return arr * mask
|
if returnMappedCoords:
|
||||||
|
return arr * mask, mappedCoords
|
||||||
|
else:
|
||||||
|
return arr * mask
|
||||||
|
|
||||||
def shape(self):
|
def shape(self):
|
||||||
if self.path is None:
|
if self.path is None:
|
||||||
|
Loading…
Reference in New Issue
Block a user