Source code for ddd_pylib.labels_manip._labels_properties_operator
from ddd_pylib._base import MeasurementsOperator
from skimage.measure import regionprops
from tifffile import imread
import pandas as pd
import numpy as np
import xarray as xr
[docs]
class LabelsPropertiesOperator(MeasurementsOperator):
def __init__(self):
super().__init__()
self.secondary_image = None
self.properties = []
self.dataframe = None
[docs]
def getSecondaryImage(self):
return self.secondary_image
[docs]
def setProperties(self, properties):
self.properties = [] if properties is None else properties
[docs]
def getProperties(self):
return self.properties
[docs]
def getDataFrame(self):
return self.dataframe
[docs]
def setSecondaryImage(self, image):
if not image is None:
self.secondary_image = image
def _measureLabel(self, image, secondary_image=None):
region_props = regionprops(label_image=image.values, intensity_image=secondary_image)
if self.properties != []:
if "measure" in self.properties:
measure = "volume" if "Z" in image.dims else "area"
data = {}
for prop in self.properties:
if prop == "measure":
prop = measure
data[prop] = []
for key in self.properties:
key1 = key
if key=="measure":
key=measure
key1="area"
for e in region_props:
data[key].append(getattr(e, key1, None))
result = self._createDataFrame(data)
else:
result = self._createDataFrame(region_props)
return result
def _createDataFrame(self, array):
self.dataframe = pd.DataFrame(data=array)
return self.dataframe
[docs]
def getPrefix(self):
return "DataFrameMeasure - "
def _applyToFrame(self, frameData, t, nT):
if self.secondary_image is None:
image1 = frameData[0]
return self._measureLabel(image1)
else:
image1, image2 = frameData
return self._measureLabel(image1, image2)
def _zipInputs(self):
if self.secondary_image is None:
return super()._zipInputs()
else:
imA = self.getMainImage()
imB = self.getSecondaryImage()
if "T" in imA.dims:
return [
(imA.isel(T=t), imB.isel(T=t)) for t in range(self.getNTimePoints())
]
else:
return [(imA, imB)]