You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.2 KiB

  1. import numpy as np
  2. import xarray as xr
  3. class ImageAnalyser():
  4. def __init__(self) -> None:
  5. self._image_name = {
  6. 'atoms': 'atoms',
  7. 'background': 'background',
  8. 'dark': 'dark',
  9. 'OD':'OD',
  10. }
  11. self._center = None
  12. self._span = None
  13. self._fraction = None
  14. @property
  15. def image_name(self):
  16. return self._image_name
  17. @image_name.setter
  18. def image_name(self, value):
  19. self._image_name.update(value)
  20. @property
  21. def center(self):
  22. return self._center
  23. @center.setter
  24. def center(self, value):
  25. self._center = value
  26. @property
  27. def span(self):
  28. return self._span
  29. @span.setter
  30. def span(self, value):
  31. self._span = value
  32. @property
  33. def fraction(self):
  34. return self._fraction
  35. @fraction.setter
  36. def fraction(self, value):
  37. self._fraction = value
  38. def get_offset_from_corner(self, dataArray, x_fraction=None, y_fraction=None, fraction=None, xAxisName='x', yAxisName='y'):
  39. if fraction is None:
  40. if x_fraction is None:
  41. x_fraction = self._fraction[0]
  42. if y_fraction is None:
  43. y_fraction = self._fraction[1]
  44. else:
  45. x_fraction = fraction[0]
  46. y_fraction = fraction[1]
  47. x_number = dataArray[xAxisName].shape[0]
  48. y_number = dataArray[yAxisName].shape[0]
  49. mean = dataArray.isel(x=slice(0, int(x_number * x_fraction)), y=slice(0 , int(y_number * y_fraction))).mean(dim=[xAxisName, yAxisName])
  50. mean += dataArray.isel(x=slice(0, int(x_number * x_fraction)), y=slice(int(y_number - y_number * y_fraction) , int(y_number))).mean(dim=[xAxisName, yAxisName])
  51. mean += dataArray.isel(x=slice(int(x_number - x_number * x_fraction) , int(x_number)), y=slice(0 , int(y_number * y_fraction))).mean(dim=[xAxisName, yAxisName])
  52. mean += dataArray.isel(x=slice(int(x_number - x_number * x_fraction) , int(x_number)), y=slice(int(y_number - y_number * y_fraction) , int(y_number))).mean(dim=[xAxisName, yAxisName])
  53. return mean / 4
  54. def substract_offset(self, dataArray, **kwargs):
  55. return dataArray - self.get_offset_from_corner(dataArray, **kwargs)
  56. def crop_image(self, dataSet, center=None, span=None):
  57. if center is None:
  58. center = self._center
  59. if span is None:
  60. span = self._span
  61. x_start = int(center[0] - span[0] / 2)
  62. x_end = int(center[0] + span[0] / 2)
  63. y_end = int(center[1] + span[1] / 2)
  64. y_start = int(center[1] - span[1] / 2)
  65. return dataSet.isel(x=slice(x_start, x_end), y=slice(y_start, y_end))
  66. def get_OD(self, imageAtom, imageBackground, imageDrak):
  67. numerator = np.atleast_1d(imageBackground - imageDrak)
  68. denominator = np.atleast_1d(imageAtom - imageDrak)
  69. numerator[numerator == 0] = 1
  70. denominator[denominator == 0] = 1
  71. imageOD = np.abs(np.divide(denominator, numerator))
  72. imageOD= -np.log(imageOD)
  73. if len(imageOD) == 1:
  74. return imageOD[0]
  75. else:
  76. return imageOD
  77. def get_Ncount(self, dataSet, dim=['x', 'y'], **kwargs):
  78. return dataSet.sum(dim=['x', 'y'], **kwargs)
  79. def get_absorption_images(self, dataSet, dask='allowed', keep_attrs=True, **kwargs):
  80. kwargs.update(
  81. {
  82. 'dask': dask,
  83. 'keep_attrs': keep_attrs,
  84. }
  85. )
  86. dataSet = dataSet.assign(
  87. {
  88. self._image_name['OD']: xr.apply_ufunc(self.get_OD, dataSet[self._image_name['atoms']], dataSet[self._image_name['background']], dataSet[self._image_name['dark']], **kwargs)
  89. }
  90. )
  91. return dataSet
  92. def remove_background(self, dataSet, dask='allowed', keep_attrs=True, **kwargs):
  93. kwargs.update(
  94. {
  95. 'dask': dask,
  96. 'keep_attrs': keep_attrs,
  97. }
  98. )
  99. xr.apply_ufunc(self.get_OD, dataSet[self._image_name['atoms']], dataSet[self._image_name['background']], dataSet[self._image_name['dark']], **kwargs)