Skip to content

Commit f34bdb4

Browse files
author
Justin McAllister
committed
This addresses #47 more explicitly and adds some tests to ensure the proper scale is used for the current set of metadata tags.
1 parent be1bccc commit f34bdb4

3 files changed

Lines changed: 32 additions & 11 deletions

File tree

micasense/metadata.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,7 @@ def dls_pose(self):
146146
return yaw, pitch, roll
147147

148148
def dls_irradiance(self):
149-
if self.get_item('XMP:SpectralIrradiance') is not None:
150-
irr = float(self.get_item('XMP:SpectralIrradiance'))
151-
else:
152-
irr = 0.0
153-
return irr
149+
return self.spectral_irradiance()
154150

155151
def rig_relatives(self):
156152
if self.get_item('XMP:RigRelatives') is not None:
@@ -266,17 +262,32 @@ def __float_or_zero(self, str):
266262
else:
267263
return 0.0
268264

265+
# due to calibration differences between DLS1 and DLS2, we need to account for a scale factor
266+
# change in their respective units. This scale factor is pulled from the image metadata, or, if
267+
# the metadata doesn't give us the scale, we assume one based on a known combination of tags
268+
def irradiance_scale_factor(self):
269+
if self.get_item('XMP:IrradianceScaleToSIUnits') is not None:
270+
# the metadata contains the scale
271+
scale_factor = self.__float_or_zero(self.get_item('XMP:IrradianceScaleToSIUnits'))
272+
elif self.get_item('XMP:HorizontalIrradiance') is not None:
273+
# DLS2 but the metadata is missing the scale, assume 0.01
274+
scale_factor = 0.01
275+
else:
276+
# DLS1, so we use a scale of 1
277+
scale_factor = 1.0
278+
return scale_factor
279+
269280
def spectral_irradiance(self):
270-
return self.__float_or_zero(self.get_item('XMP:SpectralIrradiance'))
281+
return self.__float_or_zero(self.get_item('XMP:SpectralIrradiance'))*self.irradiance_scale_factor()
271282

272283
def horizontal_irradiance(self):
273-
return self.__float_or_zero(self.get_item('XMP:HorizontalIrradiance'))/100.0
284+
return self.__float_or_zero(self.get_item('XMP:HorizontalIrradiance'))*self.irradiance_scale_factor()
274285

275286
def scattered_irradiance(self):
276-
return self.__float_or_zero(self.get_item('XMP:ScatteredIrradiance'))
287+
return self.__float_or_zero(self.get_item('XMP:ScatteredIrradiance'))*self.irradiance_scale_factor()
277288

278289
def direct_irradiance(self):
279-
return self.__float_or_zero(self.get_item('XMP:DirectIrradiance'))
290+
return self.__float_or_zero(self.get_item('XMP:DirectIrradiance'))*self.irradiance_scale_factor()
280291

281292
def solar_azimuth(self):
282293
return self.__float_or_zero(self.get_item('XMP:SolarAzimuth'))

tests/conftest.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,8 @@ def meta_v3():
138138
@pytest.fixture()
139139
def meta_bad_exposure():
140140
image_path = os.path.join('data', '0001SET', '000')
141-
return metadata.Metadata(os.path.join(image_path, 'IMG_0003_1.tif'))
141+
return metadata.Metadata(os.path.join(image_path, 'IMG_0003_1.tif'))
142+
143+
@pytest.fixture()
144+
def meta_altum_dls2(altum_flight_image_name):
145+
return metadata.Metadata(altum_flight_image_name)

tests/test_metadata.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,10 @@ def test_good_exposure_v3(meta_v3):
125125
assert meta_v3.exposure() == pytest.approx(0.00171)
126126

127127
def test_bad_exposure_time(meta_bad_exposure):
128-
assert meta_bad_exposure.exposure() == pytest.approx(247e-6, abs=1e-3)
128+
assert meta_bad_exposure.exposure() == pytest.approx(247e-6, abs=1e-3)
129+
130+
def test_dls1_scale_factor(meta):
131+
assert meta.irradiance_scale_factor() == pytest.approx(1.0)
132+
133+
def test_dls2_scale_factor(meta_altum_dls2):
134+
assert meta_altum_dls2.irradiance_scale_factor() == pytest.approx(0.01)

0 commit comments

Comments
 (0)