Example #1
0
def test_write_rgb_classified():
    """Test saving a transparent RGB."""
    from pyninjotiff.ninjotiff import save
    from pyninjotiff.tifffile import TiffFile

    area = FakeArea(
        {
            'ellps': 'WGS84',
            'lat_0': 90.0,
            'lat_ts': 60.0,
            'lon_0': 0.0,
            'proj': 'stere'
        }, (-1000000.0, -4500000.0, 2072000.0, -1428000.0), 1024, 1024)

    x_size, y_size = 1024, 1024
    arr = np.zeros((3, y_size, x_size))

    attrs = dict([('platform_name', 'NOAA-18'), ('resolution', 1050),
                  ('polarization', None),
                  ('start_time', TIME - datetime.timedelta(minutes=65)),
                  ('end_time', TIME - datetime.timedelta(minutes=60)),
                  ('level', None), ('sensor', 'avhrr-3'),
                  ('ancillary_variables', []), ('area', area),
                  ('wavelength', None), ('optional_datasets', []),
                  ('standard_name', 'overview'), ('name', 'overview'),
                  ('prerequisites', [0.6, 0.8, 10.8]),
                  ('optional_prerequisites', []), ('calibration', None),
                  ('modifiers', None), ('mode', 'P')])

    kwargs = {
        'compute': True,
        'fill_value': None,
        'sat_id': 6300014,
        'chan_id': 1700015,
        'data_cat': 'PPRN',
        'data_source': 'SMHI',
        'nbits': 8
    }

    data1 = da.tile(da.repeat(da.arange(4, chunks=1024), 256), 256).reshape(
        (1, 256, 1024))
    datanan = da.ones((1, 256, 1024), chunks=1024) * 4
    data2 = da.tile(da.repeat(da.arange(4, chunks=1024), 256), 512).reshape(
        (1, 512, 1024))
    data = da.concatenate((data1, datanan, data2), axis=1)
    data = xr.DataArray(data,
                        coords={'bands': ['P']},
                        dims=['bands', 'y', 'x'],
                        attrs=attrs)

    from trollimage.xrimage import XRImage
    img = XRImage(data)
    with tempfile.NamedTemporaryFile(delete=DELETE_FILES) as tmpfile:
        filename = tmpfile.name
        if not DELETE_FILES:
            print(filename)
        save(img, filename, data_is_scaled_01=True, **kwargs)
        tif = TiffFile(filename)
        res = tif[0].asarray()
        for idx in range(3):
            np.testing.assert_allclose(
                res[:, :, idx],
                np.round(np.nan_to_num(arr[idx, :, :]) * 255).astype(np.uint8))
        np.testing.assert_allclose(res[:, :, 3] == 0, np.isnan(arr[0, :, :]))
Example #2
0
def test_write_bw_colormap():
    """Test saving a BW image with a colormap.

    Albedo with a colormap.

    Reflectances are 0, 29.76, 60, 90.24, 120.
    """
    from pyninjotiff.ninjotiff import save
    from pyninjotiff.tifffile import TiffFile

    area = FakeArea(
        {
            'ellps': 'WGS84',
            'lat_0': 90.0,
            'lat_ts': 60.0,
            'lon_0': 0.0,
            'proj': 'stere'
        }, (-1000000.0, -4500000.0, 2072000.0, -1428000.0), 1024, 1024)
    scale = 1.0 / 120
    offset = 0.0
    attrs = dict([('resolution', 1050), ('polarization', None),
                  ('platform_name', 'NOAA-18'), ('sensor', 'avhrr-3'),
                  ('units', '%'), ('name', '1'), ('level', None),
                  ('modifiers', ()), ('wavelength', (0.5, 0.6, 0.7)),
                  ('calibration', 'reflectance'),
                  ('start_time', TIME - datetime.timedelta(minutes=75)),
                  ('end_time', TIME - datetime.timedelta(minutes=70)),
                  ('area', area), ('ancillary_variables', []),
                  ('enhancement_history', [{
                      'offset': offset,
                      'scale': scale
                  }])])

    cm_vis = [
        0, 4095, 5887, 7167, 8191, 9215, 9983, 10751, 11519, 12287, 12799,
        13567, 14079, 14847, 15359, 15871, 16383, 16895, 17407, 17919, 18175,
        18687, 19199, 19711, 19967, 20479, 20735, 21247, 21503, 22015, 22271,
        22783, 23039, 23551, 23807, 24063, 24575, 24831, 25087, 25599, 25855,
        26111, 26367, 26879, 27135, 27391, 27647, 27903, 28415, 28671, 28927,
        29183, 29439, 29695, 29951, 30207, 30463, 30975, 31231, 31487, 31743,
        31999, 32255, 32511, 32767, 33023, 33279, 33535, 33791, 34047, 34303,
        34559, 34559, 34815, 35071, 35327, 35583, 35839, 36095, 36351, 36607,
        36863, 37119, 37119, 37375, 37631, 37887, 38143, 38399, 38655, 38655,
        38911, 39167, 39423, 39679, 39935, 39935, 40191, 40447, 40703, 40959,
        40959, 41215, 41471, 41727, 41983, 41983, 42239, 42495, 42751, 42751,
        43007, 43263, 43519, 43519, 43775, 44031, 44287, 44287, 44543, 44799,
        45055, 45055, 45311, 45567, 45823, 45823, 46079, 46335, 46335, 46591,
        46847, 46847, 47103, 47359, 47615, 47615, 47871, 48127, 48127, 48383,
        48639, 48639, 48895, 49151, 49151, 49407, 49663, 49663, 49919, 50175,
        50175, 50431, 50687, 50687, 50943, 50943, 51199, 51455, 51455, 51711,
        51967, 51967, 52223, 52223, 52479, 52735, 52735, 52991, 53247, 53247,
        53503, 53503, 53759, 54015, 54015, 54271, 54271, 54527, 54783, 54783,
        55039, 55039, 55295, 55551, 55551, 55807, 55807, 56063, 56319, 56319,
        56575, 56575, 56831, 56831, 57087, 57343, 57343, 57599, 57599, 57855,
        57855, 58111, 58367, 58367, 58623, 58623, 58879, 58879, 59135, 59135,
        59391, 59647, 59647, 59903, 59903, 60159, 60159, 60415, 60415, 60671,
        60671, 60927, 60927, 61183, 61439, 61439, 61695, 61695, 61951, 61951,
        62207, 62207, 62463, 62463, 62719, 62719, 62975, 62975, 63231, 63231,
        63487, 63487, 63743, 63743, 63999, 63999, 64255, 64255, 64511, 64511,
        64767, 64767, 65023, 65023, 65279
    ]

    kwargs = {
        'ch_min_measurement_unit': np.array([0]),
        'ch_max_measurement_unit': np.array([120]),
        'compute': True,
        'fill_value': None,
        'sat_id': 6300014,
        'chan_id': 100015,
        'data_cat': 'P**N',
        'data_source': 'SMHI',
        'physic_unit': '%',
        'nbits': 8,
        'cmap': [cm_vis] * 3
    }

    data = da.tile(da.repeat(da.arange(5, chunks=1024) / 4.0, 205)[:-1],
                   1024).reshape((1, 1024, 1024))[:, :1024]
    data = xr.DataArray(data,
                        coords={'bands': ['L']},
                        dims=['bands', 'y', 'x'],
                        attrs=attrs)
    img = FakeImage(data)
    with tempfile.NamedTemporaryFile(delete=DELETE_FILES) as tmpfile:
        filename = tmpfile.name
        if not DELETE_FILES:
            print(filename)
        save(img, filename, data_is_scaled_01=True, **kwargs)
        tif = TiffFile(filename)
        page = tif[0]
        res = page.asarray(colormapped=False).squeeze()
        colormap = page.tags['color_map'].value

        assert (len(colormap) == 768)
        assert (np.allclose(colormap[:256], cm_vis))
        assert (np.allclose(colormap[256:512], cm_vis))
        assert (np.allclose(colormap[512:], cm_vis))
        assert (np.allclose(res[0, ::205], np.array([1, 64, 128, 192, 255])))
Example #3
0
def test_write_bw():
    """Test saving a BW image.

    Reflectances.
    """
    from pyninjotiff.ninjotiff import save
    from pyninjotiff.tifffile import TiffFile

    area = FakeArea(
        {
            'ellps': 'WGS84',
            'lat_0': 90.0,
            'lat_ts': 60.0,
            'lon_0': 0.0,
            'proj': 'stere'
        }, (-1000000.0, -4500000.0, 2072000.0, -1428000.0), 1024, 1024)
    scale = 1.0 / 120
    offset = 0.0
    attrs = dict([('resolution', 1050), ('polarization', None),
                  ('platform_name', 'NOAA-18'), ('sensor', 'avhrr-3'),
                  ('units', '%'), ('name', '1'), ('level', None),
                  ('modifiers', ()), ('wavelength', (0.5, 0.6, 0.7)),
                  ('calibration', 'reflectance'),
                  ('start_time', TIME - datetime.timedelta(minutes=5)),
                  ('end_time', TIME), ('area', area),
                  ('ancillary_variables', []),
                  ('enhancement_history', [{
                      'offset': offset,
                      'scale': scale
                  }])])

    kwargs = {
        'ch_min_measurement_unit': xr.DataArray(0),
        'ch_max_measurement_unit': xr.DataArray(120),
        'compute': True,
        'fill_value': None,
        'sat_id': 6300014,
        'chan_id': 100015,
        'data_cat': 'P**N',
        'data_source': 'SMHI',
        'physic_unit': '%',
        'nbits': 8
    }

    data = da.tile(da.repeat(da.arange(4, chunks=1024) / 3.0, 256),
                   1024).reshape((1, 1024, 1024))
    data = xr.DataArray(data,
                        coords={'bands': ['L']},
                        dims=['bands', 'y', 'x'],
                        attrs=attrs)
    img = FakeImage(data)
    with tempfile.NamedTemporaryFile(delete=DELETE_FILES) as tmpfile:
        filename = tmpfile.name
        if not DELETE_FILES:
            print(filename)
        save(img, filename, data_is_scaled_01=True, **kwargs)
        tif = TiffFile(filename)
        page = tif[0]
        res = page.asarray(colormapped=False).squeeze()
        colormap = page.tags['color_map'].value
        for i in range(3):
            assert (np.all(
                np.array(colormap[i * 256:(i + 1) * 256]) == np.arange(256) *
                256))
        assert (np.all(res[0, ::256] == np.array([1, 86, 170, 255])))
Example #4
0
def test_write_rgb_tb():
    """Test saving a non-trasparent RGB with thumbnails."""
    from pyninjotiff.ninjotiff import save
    from pyninjotiff.tifffile import TiffFile

    area = FakeArea(
        {
            'ellps': 'WGS84',
            'lat_0': 90.0,
            'lat_ts': 60.0,
            'lon_0': 0.0,
            'proj': 'stere'
        }, (-1000000.0, -4500000.0, 2072000.0, -1428000.0), 1024, 1024)

    x_size, y_size = 1024, 1024
    arr = np.zeros((3, y_size, x_size))
    radius = min(x_size, y_size) / 2.0
    centre = x_size / 2, y_size / 2

    for x in range(x_size):
        for y in range(y_size):
            rx = x - centre[0]
            ry = y - centre[1]
            s = ((x - centre[0])**2.0 + (y - centre[1])**2.0)**0.5 / radius
            if s <= 1.0:
                h = ((np.arctan2(ry, rx) / np.pi) + 1.0) / 2.0
                rgb = colorsys.hsv_to_rgb(h, s, 1.0)
                arr[:, y, x] = np.array(rgb)

    attrs = dict([('platform_name', 'NOAA-18'), ('resolution', 1050),
                  ('polarization', None), ('level', None),
                  ('sensor', 'avhrr-3'), ('ancillary_variables', []),
                  ('area', area),
                  ('start_time', TIME - datetime.timedelta(minutes=45)),
                  ('end_time', TIME - datetime.timedelta(minutes=40)),
                  ('wavelength', None), ('optional_datasets', []),
                  ('standard_name', 'overview'), ('name', 'overview'),
                  ('prerequisites', [0.6, 0.8, 10.8]),
                  ('optional_prerequisites', []), ('calibration', None),
                  ('modifiers', None), ('mode', 'RGB'),
                  ('enhancement_history', [{
                      'scale': np.array([1, 1, -1]),
                      'offset': np.array([0, 0, 1])
                  }, {
                      'scale':
                      np.array([0.0266347, 0.03559078, 0.01329783]),
                      'offset':
                      np.array([-0.02524969, -0.01996642, 3.8918446])
                  }, {
                      'gamma': 1.6
                  }])])

    kwargs = {
        'compute': True,
        'fill_value': None,
        'sat_id': 6300014,
        'chan_id': 6500015,
        'data_cat': 'PPRN',
        'data_source': 'SMHI',
        'nbits': 8,
        'tile_length': 256,
        'tile_width': 256
    }
    data = da.from_array(arr.clip(0, 1), chunks=1024)
    data = xr.DataArray(data,
                        coords={'bands': ['R', 'G', 'B']},
                        dims=['bands', 'y', 'x'],
                        attrs=attrs)

    from trollimage.xrimage import XRImage
    img = XRImage(data)

    with tempfile.NamedTemporaryFile(delete=DELETE_FILES) as tmpfile:
        filename = tmpfile.name
        if not DELETE_FILES:
            print(filename)
        save(img, filename, data_is_scaled_01=False, **kwargs)
        tif = TiffFile(filename)
        res = tif[0].asarray()
        assert (tif.pages[0].tags['tile_length'].value == 256)
        assert (tif.pages[1].tags['tile_length'].value == 128)
        assert (tif.pages[0].tags['tile_width'].value == 256)
        assert (tif.pages[1].tags['tile_width'].value == 128)
        assert (len(tif.pages) == 2)
        assert (tif.pages[0].shape == (1024, 1024, 4))
        assert (tif.pages[1].shape == (512, 512, 4))
        for idx in range(3):
            np.testing.assert_allclose(
                res[:, :, idx],
                np.round(arr[idx, :, :] * 255).astype(np.uint8))

        tags = {
            'new_subfile_type':
            0,
            'image_width':
            1024,
            'image_length':
            1024,
            'bits_per_sample': (8, 8, 8, 8),
            'compression':
            32946,
            'photometric':
            2,
            'orientation':
            1,
            'samples_per_pixel':
            4,
            'planar_configuration':
            1,
            'software':
            b'tifffile/pytroll',
            'datetime':
            b'2020:01:17 14:17:23',
            'tile_width':
            256,
            'tile_length':
            256,
            'tile_offsets':
            (951, 24414, 77352, 126135, 141546, 206260, 272951, 318709, 349650,
             413166, 475735, 519168, 547960, 570326, 615924, 666705),
            'tile_byte_counts':
            (23463, 52938, 48783, 15411, 64714, 66691, 45758, 30941, 63516,
             62569, 43433, 28792, 22366, 45598, 50781, 13371),
            'extra_samples':
            2,
            'sample_format': (1, 1, 1, 1),
            'model_pixel_scale':
            (0.026949458523585643, 0.027040118922685666, 0.0),
            'model_tie_point':
            (0.0, 0.0, 0.0, -35.00279008179894, 73.3850622630575, 0.0),
            '40000':
            b'NINJO',
            '40001':
            6300014,
            '40002':
            1579264321,
            '40003':
            1579267043,
            '40004':
            6500015,
            '40005':
            2,
            '40006':
            b'/tmp/tmpb4kn93qt',
            '40007':
            b'PPRN',
            '40008':
            b'',
            '40009':
            24,
            '40010':
            b'SMHI',
            '40011':
            1,
            '40012':
            1024,
            '40013':
            1,
            '40014':
            1024,
            '40015':
            b'NPOL',
            '40016':
            -35.00278854370117,
            '40017':
            24.72344398498535,
            '40018':
            6378137.0,
            '40019':
            6356752.5,
            '40021':
            60.0,
            '40022':
            0.0,
            '40023':
            0.0,
            '40024':
            b'None',
            '40025':
            b'None',
            '40026':
            0,
            '40027':
            255,
            '40028':
            1.0,
            '40029':
            0.0,
            '40040':
            0,
            '40041':
            0,
            '40042':
            1,
            '40043':
            0,
            '50000':
            0,
            'fill_order':
            1,
            'rows_per_strip':
            4294967295,
            'resolution_unit':
            2,
            'predictor':
            1,
            'ycbcr_subsampling':
            1,
            'ycbcr_positioning':
            1
        }
        read_tags = tif.pages[0].tags
        assert (read_tags.keys() == tags.keys())
        for key, val in tags.items():
            if key in ['datetime', '40002', '40003', '40006']:
                continue
            assert (val == read_tags[key].value)
Example #5
0
def test_write_rgb_with_a():
    """Test saving a transparent RGB."""
    from pyninjotiff.ninjotiff import save
    from pyninjotiff.tifffile import TiffFile

    area = FakeArea(
        {
            'ellps': 'WGS84',
            'lat_0': 90.0,
            'lat_ts': 60.0,
            'lon_0': 0.0,
            'proj': 'stere'
        }, (-1000000.0, -4500000.0, 2072000.0, -1428000.0), 1024, 1024)

    x_size, y_size = 1024, 1024
    arr = np.zeros((3, y_size, x_size))
    radius = min(x_size, y_size) / 2.0
    centre = x_size / 2, y_size / 2

    for x in range(x_size):
        for y in range(y_size):
            rx = x - centre[0]
            ry = y - centre[1]
            s = ((x - centre[0])**2.0 + (y - centre[1])**2.0)**0.5 / radius
            if s <= 1.0:
                h = ((np.arctan2(ry, rx) / np.pi) + 1.0) / 2.0
                rgb = colorsys.hsv_to_rgb(h, s, 1.0)
                arr[:, y, x] = np.array(rgb)
            else:
                arr[:, y, x] = np.nan

    attrs = dict([('platform_name', 'NOAA-18'), ('resolution', 1050),
                  ('polarization', None),
                  ('start_time', TIME - datetime.timedelta(minutes=55)),
                  ('end_time', TIME - datetime.timedelta(minutes=50)),
                  ('level', None), ('sensor', 'avhrr-3'),
                  ('ancillary_variables', []), ('area', area),
                  ('wavelength', None), ('optional_datasets', []),
                  ('standard_name', 'overview'), ('name', 'overview'),
                  ('prerequisites', [0.6, 0.8, 10.8]),
                  ('optional_prerequisites', []), ('calibration', None),
                  ('modifiers', None), ('mode', 'RGB'),
                  ('enhancement_history', [{
                      'scale': np.array([1, 1, -1]),
                      'offset': np.array([0, 0, 1])
                  }, {
                      'scale':
                      np.array([0.0266347, 0.03559078, 0.01329783]),
                      'offset':
                      np.array([-0.02524969, -0.01996642, 3.8918446])
                  }, {
                      'gamma': 1.6
                  }])])

    kwargs = {
        'compute': True,
        'fill_value': None,
        'sat_id': 6300014,
        'chan_id': 6500015,
        'data_cat': 'PPRN',
        'data_source': 'SMHI',
        'nbits': 8
    }
    data = da.from_array(arr.clip(0, 1), chunks=1024)

    data = xr.DataArray(data,
                        coords={'bands': ['R', 'G', 'B']},
                        dims=['bands', 'y', 'x'],
                        attrs=attrs)
    from trollimage.xrimage import XRImage
    img = XRImage(data)
    with tempfile.NamedTemporaryFile(delete=DELETE_FILES) as tmpfile:
        filename = tmpfile.name
        if not DELETE_FILES:
            print(filename)
        save(img, filename, data_is_scaled_01=True, **kwargs)
        tif = TiffFile(filename)
        res = tif[0].asarray()
        for idx in range(3):
            np.testing.assert_allclose(
                res[:, :, idx],
                np.round(np.nan_to_num(arr[idx, :, :]) * 255).astype(np.uint8))
        np.testing.assert_allclose(res[:, :, 3] == 0, np.isnan(arr[0, :, :]))
Example #6
0
def _load_file_values_with_colormap(filename):
    tif = TiffFile(filename)
    page = tif[0]
    res = page.asarray(colormapped=False).squeeze()
    colormap = page.tags['color_map'].value
    return colormap, res
Example #7
0
def test_write_bw_inverted_ir_fill():
    """Test saving a BW image with transparency."""
    from pyninjotiff.ninjotiff import save
    from pyninjotiff.tifffile import TiffFile

    area = FakeArea(
        {
            'ellps': 'WGS84',
            'lat_0': 90.0,
            'lat_ts': 60.0,
            'lon_0': 0.0,
            'proj': 'stere'
        }, (-1000000.0, -4500000.0, 2072000.0, -1428000.0), 1024, 1024)
    scale = 1.0 / 120
    offset = 70.0 / 120
    attrs = dict([('resolution', 1050), ('polarization', None),
                  ('platform_name', 'NOAA-18'), ('sensor', 'avhrr-3'),
                  ('units', 'K'), ('name', '4'), ('level', None),
                  ('modifiers', ()), ('wavelength', (10.3, 10.8, 11.3)),
                  ('calibration', 'brightness_temperature'),
                  ('start_time', TIME - datetime.timedelta(minutes=35)),
                  ('end_time', TIME - datetime.timedelta(minutes=30)),
                  ('area', area), ('ancillary_variables', []),
                  ('enhancement_history', [{
                      'offset': offset,
                      'scale': scale
                  }])])

    kwargs = {
        'ch_min_measurement_unit': np.array([-70]),
        'ch_max_measurement_unit': np.array([50]),
        'compute': True,
        'fill_value': None,
        'sat_id': 6300014,
        'chan_id': 900015,
        'data_cat': 'P**N',
        'data_source': 'SMHI',
        'physic_unit': 'C',
        'nbits': 8
    }

    data1 = da.tile(da.repeat(da.arange(4, chunks=1024) / 3.0, 256),
                    256).reshape((1, 256, 1024))
    datanan = da.ones((1, 256, 1024), chunks=1024) * np.nan
    data2 = da.tile(da.repeat(da.arange(4, chunks=1024) / 3.0, 256),
                    512).reshape((1, 512, 1024))
    data = da.concatenate((data1, datanan, data2), axis=1)
    data = xr.DataArray(data,
                        coords={'bands': ['L']},
                        dims=['bands', 'y', 'x'],
                        attrs=attrs)
    img = FakeImage(data)
    with tempfile.NamedTemporaryFile(delete=DELETE_FILES) as tmpfile:
        filename = tmpfile.name
        if not DELETE_FILES:
            print(filename)
        save(img, filename, data_is_scaled_01=True, **kwargs)
        tif = TiffFile(filename)
        res = tif[0].asarray()
        assert (np.allclose(res[0, 0, ::256],
                            np.array([65024, 43264, 21760, 0])))