satpy icon indicating copy to clipboard operation
satpy copied to clipboard

Resampling with gradient search results in interlacing image artefacts if corner pixels have no data

Open gerritholl opened this issue 3 months ago • 0 comments

Describe the bug

When resampling with gradient search to my target area, the resulting image exhibits interlacing image artefacts. In gwenview, the image is shown with large slices, although the exact slicing depends on the zoom level. In the gimp, the image is shown interlaced with black lines (mode L) or semitransparent (mode LA).

When I use nearest neighbour resampling, the resulting image looks correct.

To Reproduce

import hdf5plugin
from satpy import Scene
from satpy.utils import debug_on; debug_on()
from glob import glob
from pyresample import create_area_def
fci_files = glob("/media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928*_C_0076_*.nc")
ar = create_area_def(
        "test", 4087,
        area_extent=[-10000000, -10000000, 10000000, 10000000],
        resolution=3000)
sc = Scene(filenames={"fci_l1c_nc": fci_files})
sc.load(["vis_06"])
ls = sc.resample(ar, resampler="gradient_search")
ls.save_datasets(filename="/tmp/test/{platform_name}-{sensor}-{start_time:%Y%m%d%H%M}-{area.area_id}-{name}-test.tif", fill_value=0)

Expected behavior

I expect an image that displays correctly in standard tools.

Actual results

Selected console output
[WARNING: 2024-04-02 13:10:53 : root] shape found from radius and resolution does not contain only integers: (6666.666666666667, 6666.666666666667)
Rounding shape to (6667, 6667) and resolution from (3000.0, 3000.0) meters to (2999.850007499625, 2999.850007499625) meters
[DEBUG: 2024-04-02 13:10:53 : satpy.readers.yaml_reader] Reading ('/data/gholl/checkouts/satpy/satpy/etc/readers/fci_l1c_nc.yaml',)
<...snip...>
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928123928_IDPFI_VAL_20230928123720_20230928123755_N__C_0076_0031.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928123939_IDPFI_VAL_20230928123729_20230928123803_N__C_0076_0032.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928123953_IDPFI_VAL_20230928123737_20230928123819_N__C_0076_0033.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928124003_IDPFI_VAL_20230928123755_20230928123835_N__C_0076_0034.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928124008_IDPFI_VAL_20230928123811_20230928123842_N__C_0076_0035.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928124015_IDPFI_VAL_20230928123819_20230928123856_N__C_0076_0036.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928124026_IDPFI_VAL_20230928123835_20230928123908_N__C_0076_0037.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928124030_IDPFI_VAL_20230928123849_20230928123914_N__C_0076_0038.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928124033_IDPFI_VAL_20230928123856_20230928123919_N__C_0076_0039.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.fci_l1c_nc] Reading vis_06_pixel_quality from /media/nas/x23352/MTG/FCI/L1c-cases/202309_10-cwg/09/28/12/W_XX-EUMETSAT-Darmstadt,IMG+SAT,MTI1+FCI-1C-RRAD-FDHSI-FD--CHK-BODY---NC4E_C_EUMT_20230928124035_IDPFI_VAL_20230928123908_20230928123924_N__C_0076_0040.nc
[DEBUG: 2024-04-02 13:11:07 : satpy.readers.yaml_reader] Requested orientation for Dataset None is 'native' (default). No flipping is applied.
[DEBUG: 2024-04-02 13:11:07 : satpy.scene] Resampling DataID(name='vis_06', wavelength=WavelengthRange(min=0.59, central=0.64, max=0.69, unit='µm'), resolution=1000, calibration=<1>, modifiers=())
[DEBUG: 2024-04-02 13:11:07 : satpy.scene] Data reduction disabled by the user
[DEBUG: 2024-04-02 13:11:07 : pyresample.gradient] /!\ Instantiating an experimental GradientSearch resampler /!\
[WARNING: 2024-04-02 13:11:07 : pyresample.resampler] The input area chunks are large. This usually means that the input area is of much higher resolution than the output area. You can reduce the chunks passed, and ponder whether you are using the right resampler for the job.
[WARNING: 2024-04-02 13:11:07 : pyresample.resampler] The input area chunks are large. This usually means that the input area is of much higher resolution than the output area. You can reduce the chunks passed, and ponder whether you are using the right resampler for the job.
[WARNING: 2024-04-02 13:11:07 : pyresample.resampler] The input area chunks are large. This usually means that the input area is of much higher resolution than the output area. You can reduce the chunks passed, and ponder whether you are using the right resampler for the job.
[DEBUG: 2024-04-02 13:11:07 : satpy.scene] Resampling DataID(name='vis_06_pixel_quality', resolution=1000, modifiers=())
[DEBUG: 2024-04-02 13:11:07 : satpy.scene] Data reduction disabled by the user
[DEBUG: 2024-04-02 13:11:07 : satpy.writers] Reading ['/data/gholl/checkouts/satpy/satpy/etc/writers/geotiff.yaml']
[DEBUG: 2024-04-02 13:11:07 : rasterio.session] Could not import boto3, continuing with reduced functionality.
[DEBUG: 2024-04-02 13:11:07 : satpy.writers] Adding enhancement configuration from file: /data/gholl/checkouts/satpy/satpy/etc/enhancements/generic.yaml
[DEBUG: 2024-04-02 13:11:07 : satpy.writers] Adding enhancement configuration from file: /home/gholl/Arbeit/checkouts-perforce/config/enhancements/generic.yaml
[DEBUG: 2024-04-02 13:11:07 : satpy.writers] Adding enhancement configuration from file: /home/gholl/checkouts/pytroll-dwd-config/enhancements/generic.yaml
[DEBUG: 2024-04-02 13:11:07 : satpy.writers] Data for DataID(name='vis_06', wavelength=WavelengthRange(min=0.59, central=0.64, max=0.69, unit='µm'), resolution=1000, calibration=<1>, modifiers=()) will be enhanced with options:
	[{'name': 'linear_stretch', 'method': <function stretch at 0x7f9b09cdf380>, 'kwargs': {'stretch': 'crude', 'min_stretch': 0.0, 'max_stretch': 100.0}}, {'name': 'gamma', 'method': <function gamma at 0x7f9b09cdfd80>, 'kwargs': {'gamma': 1.5}}]
[DEBUG: 2024-04-02 13:11:07 : trollimage.xrimage] Applying stretch crude with parameters {'min_stretch': 0.0, 'max_stretch': 100.0}
[DEBUG: 2024-04-02 13:11:07 : trollimage.xrimage] Applying gamma 1.5
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] Entering env context: <rasterio.env.Env object at 0x7f9b052d5fd0>
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] Starting outermost env
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] No GDAL environment exists
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] New GDAL environment <rasterio._env.GDALEnv object at 0x7f9b04f368c0> created
[DEBUG: 2024-04-02 13:11:07 : rasterio._filepath] Installing FilePath filesystem handler plugin...
[DEBUG: 2024-04-02 13:11:07 : rasterio._env] GDAL_DATA found in environment.
[DEBUG: 2024-04-02 13:11:07 : rasterio._env] PROJ_DATA found in environment.
[DEBUG: 2024-04-02 13:11:07 : rasterio._env] Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f9b04f368c0>.
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] Entered env context: <rasterio.env.Env object at 0x7f9b052d5fd0>
[DEBUG: 2024-04-02 13:11:07 : rasterio._io] Path: _UnparsedPath(path='/tmp/test/MTG-I1-fci-202309281230-test-vis_06-test.tif'), mode: w, driver: GTiff
[DEBUG: 2024-04-02 13:11:07 : rasterio._base] Nodata success: 1, Nodata value: 0.000000
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] Exiting env context: <rasterio.env.Env object at 0x7f9b052d5fd0>
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] Cleared existing <rasterio._env.GDALEnv object at 0x7f9b04f368c0> options
[DEBUG: 2024-04-02 13:11:07 : rasterio._env] Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f9b04f368c0>.
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] Exiting outermost env
[DEBUG: 2024-04-02 13:11:07 : rasterio.env] Exited env context: <rasterio.env.Env object at 0x7f9b052d5fd0>
[INFO: 2024-04-02 13:11:07 : satpy.writers] Computing and writing results...

Text output of actual results or error messages including full tracebacks if applicable.

Screenshots

Gwenview shows the image sliced, with the slicing somewhat unpredictable:

gwen1

gwen2

In The Gimp, the image looks too dark at first. When zooming in to look at the pixels, this is revealed to be due to black lines between lines with pixels:

gimp1

When I remove fill_value=0 to produce an LA image, the transparency shows through in Image Magick (shown here) and The Gimp:

im1

When I use Image Magick to convert from .tif to .png, the black lines also appear in gwenview.

Environment Info:

  • OS: openSUSE Leap 15.3
  • Satpy Version: v0.47.0-71-g9952f3981
  • PyResample Version: v1.28.2-6-g61fd133

Additional context

When I change the resolution in the AreaDefinition from 3000 to 9000, the resulting image is all-black.

When I change the area extent from [-10000000, -10000000, 10000000, 10000000] to [-5000000, -5000000, 5000000, 5000000], the resulting image looks correct.

The problem seems to occur if the corner pixels have no data.

gerritholl avatar Apr 02 '24 11:04 gerritholl