Hi Tom, > Im trying to create a landuse map for a customer that requires the > removal of pixelation (isolated islands of pixels, possible larger than > 1 pixel). > To make things complicated, different pixelclasses have different > tresholds for removal. > For instance, class 1 is removed when the combined pixels are less than > 4, whereas class2 is removed when the combined pixels are less than 50. > Furthermore, some classes count diagonal neighbours as 'touching' > whereas other classes discard them. > > My solution is given below. > As you can see there is an expensive buffer-union-buffer trio to make > sure I connect the correct polygons before I can calculate their area. > This calculation is part of a big raster calculation. All of the > calculations are going very fast, except this one. > Anyone with an idea to make it faster? In the end all I need is removal > of isolated islands of pixels so any matrix calculation would be fine as > well.
I think you could easily implement a filter function to remove the 1 pixel type of island as a custom function of ST_MapAlgebraFctNgb(). See http://www.postgis.org/documentation/manual-svn/RT_ST_MapAlgebraFctNgb.html The size of the window should be 3x3 in this case. Return the pixel value if at least one neighbour has a value, null otherwise. I am 99% sure ST_MapAlgebraFctNgb would be faster on big rasters than vectorizing/union/rasterizing... However I have no idea how to implement such a filter to remove bigger islands (or speckles?) spanning on many pixels. Maybe with a little of research... Pierre _______________________________________________ postgis-users mailing list postgis-users@postgis.refractions.net http://postgis.refractions.net/mailman/listinfo/postgis-users