If you have Landsat-7 ETM+ then you are likely to encounter striping caused by the failure of the scan line corrector (SLC) in 2003. The SLC failure introduced major striping in ETM+ imagery. So what can we do about this (using ENVI)?
I have tested three approaches to solve the problem:
- Principle Components Analysis
- A tool downloaded from the ITTVIS code library
- Filtering, using a morphological filter approach
The PCA failed miserably: having defined a User cut filter I found I was removing much more than just the striping. The resulting image was horribly degraded. A second try with more moderate filter definition just replaced some of the black stripes with speckled stripes: I didn’t think about the interpolation problem. Back to the drawing board
The code library tool was not entirely satisfactory. Only one band was corrected so I would need to save bands seperately, then destripe them, before stacking them again. Despite using the complex interpolation option the striping was quite crudely interpolated over. Previously I had tested the simpler alternative with better, and faster, results. Incidentally, memory allocation issues seem quite common and can be easily fixed by changing the Tile Size value in the Files>Preferences>Misc. (50 Mb works for me). This is a fairly common error with third party ENVI tools, so why not adjust the Tile Size upwards anyway?
Ultimately I tried an approach using a Closing Filter to try to ‘seal the gaps’ of the striping. Closing filters attempt to remove narrow isthmuses in data. I tried several filter sizes before settling on a 7×7 kernel. The result was quite satisfactory, though of course there was smoothing resulting from the filter operation.
So, problem solved? Almost. I was quite pleased with the result, though it is not perfect (see Fig.). The next step is to find the optimal approach to recovering some of the information lost during filtering. Two approaches spring to mind and these I will test ASAP: high pass filtering, and image sharpening using a fusion type approach (Transform>Image Sharpening). All can be implemented in ENVI. A wavelet approach would also be interesting but I would need to do that in Matlab or another package.
UPDATE: As noted in the comments extreme striping towards the edges of the images requires a larger kernel (filter window) size. To cope with this I would recommend subsetting the image into five or seven smaller images. The subsets would be spaced at equal intervals from the central strip that is unaffected by SLC stripping and extend across the whole image in the north-south direction (i.e. they should be long and narrow).
Let us call the central strip, or sub image, subset 1. Immediately to the left (west) is subset 2 and immediately to the right (east) is subset 3. Subsets four and five would then be the subset outside 2 and 3 respectively. If you chose 7 subset images, then subsets 6 and 7 would be the outer sub images.
Subset 1 will not be filtered as it is unaffected by SLC stripping. Subsets 2 and 3 can be filtered by a smaller kernel (5×5 or 7×7). The kernel size is then increased with increasing distance from the subset 1. At the outer subsets you may need an 11×11 or 15×15 kernel (hence if you have time seven subsets might be best). When all the subsets are finished use the moasic tool in the Map menu to recompose a full image (i.e. join the subsets together).