Different S1 DInSAR processing results using SNAP and Snappy

Dear all,

I am working with Snappy to automate the DInSAR workflow. After running the following steps:

  1. Split
  2. Apply Orbit File
  3. ETAD Correction
  4. Back-Geocoding
  5. ESD
  6. Interferogram Formation
  7. Deburst
  8. Remove Topographic Phase
  9. Multilooking
  10. Goldstein Phase Filtering

I compared the results with those obtained directly from ESA SNAP and noticed differences in the coherence band values. I carefully checked the metadata and the processing graph step by step, and all parameter settings are identical. The phase band results, however, are the same for both processing methods.

Do you have any suggestions, or can I proceed with Snaphu export, unwrap, and import, given that the phase band results after interferogram formation are consistent?

Thank you in advance for your advice.
Markéta

Are the scaling (range of max/min values) of the coherence images the same? It makes sense to understand why they appear to be different, but if the phase images are identical you should be fine to continue with phase unwrapping regardless.

1 Like

Dear Henrik,

Thank you for your response and for your help. Unfortunately, the coherence values are not the same. The one from snappy seems to have worse resolution or at least it appears like that to me.

I have investigated the Processing Graph, and I’ve attached a picture showing the results (on the left from SNAPPY and on the right from SNAP).

I suspect that the issue occurs during the Interferogram Formation step. Below is the script I’m using:

print("\n=== Step: Interferogram Formation ===")
interf_params = HashMap()
interf_params.put("Subtract flat-earth phase", True)
interf_params.put("Degree of \"Flat Earth\" polynomial", 5)
interf_params.put("Number of \"Flat Earth\" estimation points", 501)
interf_params.put("Orbit interpolation degree", 3)
interf_params.put("Include coherence estimation", True)
interf_params.put("Square Pixel", True)
interf_params.put("Independent Window Sizes", False)
interf_params.put("Coherence Azimuth Window Size", 3)
interf_params.put("Coherence Range Window Size", 10)
interferogram = GPF.createProduct('Interferogram', interf_params, esd_product)
interf_path = save_product(interferogram, master_base, "Stack_esd_ifg")
interf_product = ProductIO.readProduct(interf_path)

Do you have any idea what might be causing this issue? I would be really grateful for any advice.

Kind regards,
Markéta

With scaling (or stretching) I meant that it would be good to look at the histograms from the respective image and not necessarily focus too much on the max/min values. To adjust the appearance of an image, QGIS or other software can be more convenient than SNAP.

Based on the processing graph images you provided now, it seems you are using a coherence window of 10 pixels in azimuth for Snappy and only 3 in SNAP, which therefore affects the resolution and values of the output. Try using the same processing parameters and hopefully the outputs should look the same.

2 Likes

Dear Henrik,

Thank you again for your help. I discovered what caused the problem.

Although the parameters were set correctly in the code, the resulting coherence band had a lower resolution. The issue was resolved by changing the parameter names and types in the code as follows:

# Previous version
interf_params.put("Independent Window Sizes", False)
interf_params.put("Coherence Azimuth Window Size", 3)
interf_params.put("Coherence Range Window Size", 10)

# Updated version
interf_params.put("independentWindowSizes", True)
interf_params.put("cohWinAz", Integer(3))
interf_params.put("cohWinRg", Integer(10))

After this modification, the results from SNAP and SNAPPY are now identical.
Thanks for the support!

1 Like