HIÂ @jdh,
I'm throwing out an idea that one of my fellow Safers suggested.  This might be doable with some RasterConvolvers and RasterExpressionEvaluators  (Note: he didn't test this, and there may be some things to iron out):
1. Generate a "replacement" raster that we'll use to fill in the noise pixels. We can do this with a RasterConvolver, using the mean/majority operation, where the weights are
1Â 1Â 1
1Â 0Â 1
1Â 1Â 1
That is, we want to get the mean/majority of the surrounding cells only.
2. Generate a "mask" raster that we'll use to determine where to apply the replacement raster. This can be done with a couple steps:Â
a. Put the original raster through a RasterExpressionEvaluator to map water (200) to 1, and everything else to 0.
b. Use a RasterConvolver with the Sum operation and no Divisor, where the weights are
0Â 1Â 0
1Â 10Â 1
0Â 1Â 0
This will produce a raster where the cell value tells us something about the cell and its surroundings:
0, 4]   -> the center cell was not water, but there were surrounding water cells
Â
10       -> the center cell was water, there were no surrounding water cells
Â
h11, 14] -> the center cell was water, there were some surrounding water cells
This mask shows us which values to replace: we only want to replace values in the original raster where the mask = 10.
3. Use a couple RasterExpressionEvaluators to combine the original and replacement rasters, with the mask. That is, when the mask = 10 take the value from the replacement raster. Otherwise, take the original value.
I hope this helps!
HIÂ @jdh,
I'm throwing out an idea that one of my fellow Safers suggested.  This might be doable with some RasterConvolvers and RasterExpressionEvaluators  (Note: he didn't test this, and there may be some things to iron out):
1. Generate a "replacement" raster that we'll use to fill in the noise pixels. We can do this with a RasterConvolver, using the mean/majority operation, where the weights are
1Â 1Â 1
1Â 0Â 1
1Â 1Â 1
That is, we want to get the mean/majority of the surrounding cells only.
2. Generate a "mask" raster that we'll use to determine where to apply the replacement raster. This can be done with a couple steps:Â
a. Put the original raster through a RasterExpressionEvaluator to map water (200) to 1, and everything else to 0.
b. Use a RasterConvolver with the Sum operation and no Divisor, where the weights are
0Â 1Â 0
1Â 10Â 1
0Â 1Â 0
This will produce a raster where the cell value tells us something about the cell and its surroundings:
0, 4]   -> the center cell was not water, but there were surrounding water cells
Â
10       -> the center cell was water, there were no surrounding water cells
Â
h11, 14] -> the center cell was water, there were some surrounding water cells
This mask shows us which values to replace: we only want to replace values in the original raster where the mask = 10.
3. Use a couple RasterExpressionEvaluators to combine the original and replacement rasters, with the mask. That is, when the mask = 10 take the value from the replacement raster. Otherwise, take the original value.
I hope this helps!
Step 2B is an excellent suggestion, and the piece I was missing. The colleague who suggested it wouldn't happen to be Dmitri, would it?Â
Step 2B is an excellent suggestion, and the piece I was missing. The colleague who suggested it wouldn't happen to be Dmitri, would it?
Oh I'm glad this helped! Good guess, but it wasn't Dmitri.
HIÂ @jdh,
I'm throwing out an idea that one of my fellow Safers suggested.  This might be doable with some RasterConvolvers and RasterExpressionEvaluators  (Note: he didn't test this, and there may be some things to iron out):
1. Generate a "replacement" raster that we'll use to fill in the noise pixels. We can do this with a RasterConvolver, using the mean/majority operation, where the weights are
1Â 1Â 1
1Â 0Â 1
1Â 1Â 1
That is, we want to get the mean/majority of the surrounding cells only.
2. Generate a "mask" raster that we'll use to determine where to apply the replacement raster. This can be done with a couple steps:Â
a. Put the original raster through a RasterExpressionEvaluator to map water (200) to 1, and everything else to 0.
b. Use a RasterConvolver with the Sum operation and no Divisor, where the weights are
0Â 1Â 0
1Â 10Â 1
0Â 1Â 0
This will produce a raster where the cell value tells us something about the cell and its surroundings:
0, 4]   -> the center cell was not water, but there were surrounding water cells
Â
10       -> the center cell was water, there were no surrounding water cells
Â
h11, 14] -> the center cell was water, there were some surrounding water cells
This mask shows us which values to replace: we only want to replace values in the original raster where the mask = 10.
3. Use a couple RasterExpressionEvaluators to combine the original and replacement rasters, with the mask. That is, when the mask = 10 take the value from the replacement raster. Otherwise, take the original value.
I hope this helps!
Thank you @nampreetatsafe​ for this very creative approach. My impression is that those suggested convolution filters would only address cases of individual single pixels (which was indeed the requestor's use case). If one wants to fill up holes made up of up to 5 pixels for instance, then I assume running the GDAL's Sieve tool (eventually using a SystemCaller) would still be the best solution.