Re: [postgis-users] Better way of removing pixelation with postgis raster

2012-07-19 Thread Tom van Tilburg

Pierre,

Thanks for putting your brain on this!
This last option I thought about as well, but since I need to remove 
pixelation on *all* classes, I would have to do the process of 
vectorizing on all of them as well. In the end, wouldn't  the total 
processing time be about the same?


In my idea staying with the algebra functions should be doable, even 
with complex speckles.
As long as the mask is big enough (finding speckles of max N pixels 
takes a 2N x 2N matrix) one should be able to run a neighbourhood scan 
outwards from the centre pixel. With some smart iterations that might 
work, I just need to start learning plpsql or something...

Would you agree that that kind of method would be faster than vectorizing?

Cheers,
 Tom

On 18-7-2012 23:14, Pierre Racine wrote:

What if you use ST_Mapalgebra to isolate the value you want to work on before 
vectorizing so that you reduce a lot the number of pixel to vectorize?

In your case you would produce two intermediate rasters (one for class 1, one 
for class 2), vectorize/buffer/union/rasterize them and then merge them using 
ST_Union(rast)?

Pierre


-Original Message-
From: postgis-users-boun...@postgis.refractions.net [mailto:postgis-users-
boun...@postgis.refractions.net] On Behalf Of Tom van Tilburg
Sent: Friday, July 06, 2012 9:37 AM
To: PostGIS Users Discussion
Subject: [postgis-users] Better way of removing pixelation with postgis raster

Hi list,

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.

thanks, Tom

--
WITH
--Dump to polygons
polygons As
(
  SELECT (ST_DumpAsPolygons(rast)).geom geom,
(ST_DumpAsPolygons(rast)).val val
  FROM out_landuse_rast_30
)
--Merge polygons
,polygons_dissolved As
(
  SELECT
ST_Buffer((ST_Dump(ST_Union(ST_Buffer(geom,1.geom,-1) geom, val
  FROM polygons
  GROUP BY val
)

--Select polygons that should go out
,polygons_out As
(
  SELECT St_Collect(geom) geom FROM polygons_dissolved
  WHERE
  (ST_Area(geom) = ((30*30) * 4) --4 pixels
  AND val IN (1)
  )
  OR
  (ST_Area(geom) = ((30*30) * 50) --50 pixels
  AND val IN (2)
  )
)

--Create raster (mask) that should go out
SELECT 1 As rid, ST_AsRaster(a.geom, b.rast, '8BUI',1,0,false) rast
FROM polygons_out a, emptycanvas30 b;


___
postgis-users mailing list
postgis-users@postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users

___
postgis-users mailing list
postgis-users@postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users


___
postgis-users mailing list
postgis-users@postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users


Re: [postgis-users] Better way of removing pixelation with postgis raster

2012-07-19 Thread Pierre Racine
 In my idea staying with the algebra functions should be doable, even
 with complex speckles.
 As long as the mask is big enough (finding speckles of max N pixels
 takes a 2N x 2N matrix) one should be able to run a neighbourhood scan
 outwards from the centre pixel. With some smart iterations that might
 work, I just need to start learning plpsql or something...
 Would you agree that that kind of method would be faster than vectorizing?

I can't answer this as I haven't played much with ST_MapAlgebraFctNgb.. It all 
depends on the size of the window.

Give it a try! plpgsql is very easy and you can start from the example in the 
doc.

Pierre
___
postgis-users mailing list
postgis-users@postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users


Re: [postgis-users] Better way of removing pixelation with postgis raster

2012-07-18 Thread Pierre Racine
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