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:
Martin Chase 2021-04-08 13:43:30 -07:00 committed by GitHub
parent 711ad8afaa
commit 0f94c17d86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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,6 +1215,9 @@ 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)
if returnMappedCoords:
return sliced * mask, mappedCoords
else:
return sliced * mask 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,8 +1858,16 @@ 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:
if returnMappedCoords:
return arr, mappedCoords
else:
return arr return arr
w = arr.shape[axes[0]] w = arr.shape[axes[0]]
h = arr.shape[axes[1]] h = arr.shape[axes[1]]
@ -1867,6 +1881,9 @@ 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)
if returnMappedCoords:
return arr * mask, mappedCoords
else:
return arr * mask return arr * mask
def shape(self): def shape(self):