diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 6063601..3685788 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,5 @@ -github: [janezlapajne] +github: + - janezlapajne + - siapy +ko_fi: janezlapajne +custom: buymeacoffee.com/janezlapajne diff --git a/docs/license.md b/docs/permit.md similarity index 100% rename from docs/license.md rename to docs/permit.md diff --git a/mkdocs.yml b/mkdocs.yml index d0cb926..7c9d150 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -98,7 +98,7 @@ nav: - Plots: api/utils/plots.md - Contributing: contributing.md - Release Notes: changelog.md - - License: license.md + - License: permit.md markdown_extensions: # Python Markdown diff --git a/siapy/entities/images.py b/siapy/entities/images.py index 8a0147f..173256f 100644 --- a/siapy/entities/images.py +++ b/siapy/entities/images.py @@ -220,6 +220,23 @@ def to_signatures(self, pixels: "Pixels") -> Signatures: signatures = Signatures.from_array_and_pixels(image_arr, pixels) return signatures + def to_subarray(self, pixels: "Pixels") -> np.ndarray: + image_arr = self.to_numpy() + u_max = pixels.u().max() + u_min = pixels.u().min() + v_max = pixels.v().max() + v_min = pixels.v().min() + # create new image + image_arr_area = np.nan * np.ones( + (v_max - v_min + 1, u_max - u_min + 1, self.bands) + ) + # convert original coordinates to coordinates for new image + v_norm = pixels.v() - v_min + u_norm = pixels.u() - u_min + # write values from original image to new image + image_arr_area[v_norm, u_norm, :] = image_arr[pixels.v(), pixels.u(), :] + return image_arr_area + def mean(self, axis: int | tuple[int] | None = None) -> float | np.ndarray: image_arr = self.to_numpy() return np.nanmean(image_arr, axis=axis) diff --git a/siapy/entities/signatures.py b/siapy/entities/signatures.py index ccbe606..a8a88a3 100644 --- a/siapy/entities/signatures.py +++ b/siapy/entities/signatures.py @@ -76,7 +76,7 @@ def _create(cls, pixels: Pixels, signals: Signals) -> "Signatures": def from_array_and_pixels(cls, image: np.ndarray, pixels: Pixels) -> "Signatures": u = pixels.u() v = pixels.v() - signals_list = list(image[v, u, :]) + signals_list = image[v, u, :] signals = Signals(pd.DataFrame(signals_list)) return cls._create(pixels, signals) diff --git a/tests/entities/test_entities_images.py b/tests/entities/test_entities_images.py index 44a1703..cb342aa 100644 --- a/tests/entities/test_entities_images.py +++ b/tests/entities/test_entities_images.py @@ -7,6 +7,7 @@ from siapy.entities import Pixels, Shape, SpectralImage from siapy.entities.images import GeometricShapes, _parse_description +from siapy.utils.plots import pixels_select_lasso def test_envi_open(configs): @@ -180,6 +181,29 @@ def test_to_signatures(spectral_images): assert np.array_equal(signatures.pixels.df.iloc[2].to_numpy(), iterable[2]) +@pytest.mark.manual +def test_to_signatures_perf(spectral_images): + spectral_image_vnir = spectral_images.vnir + selected_areas_vnir = pixels_select_lasso(spectral_image_vnir) + spectral_image_vnir.to_signatures(selected_areas_vnir[0]).signals.to_numpy() + pass + + +def test_to_subarray(spectral_images): + spectral_image_vnir = spectral_images.vnir + iterable = [(1, 2), (3, 4), (2, 4)] + pixels = Pixels.from_iterable(iterable) + subarray = spectral_image_vnir.to_subarray(pixels) + expected_subarray = np.full((3, 3, spectral_image_vnir.bands), np.nan) + image_array = spectral_image_vnir.to_numpy() + expected_subarray[0, 0, :] = image_array[2, 1, :] + expected_subarray[2, 2, :] = image_array[4, 3, :] + expected_subarray[2, 1, :] = image_array[4, 2, :] + + assert expected_subarray.shape == (3, 3, spectral_image_vnir.bands) + assert np.array_equal(subarray, expected_subarray, equal_nan=True) + + def test_mean(spectral_images): spectral_image_vnir = spectral_images.vnir