[GRASS-SVN] r44064 - grass/trunk/imagery/i.rectify

svn_grass at osgeo.org svn_grass at osgeo.org
Thu Oct 28 03:20:54 EDT 2010


Author: mmetz
Date: 2010-10-28 00:20:54 -0700 (Thu, 28 Oct 2010)
New Revision: 44064

Added:
   grass/trunk/imagery/i.rectify/lanczos.c
Log:
add lanczos and lanczos fallback to i.rectify, next try

Added: grass/trunk/imagery/i.rectify/lanczos.c
===================================================================
--- grass/trunk/imagery/i.rectify/lanczos.c	                        (rev 0)
+++ grass/trunk/imagery/i.rectify/lanczos.c	2010-10-28 07:20:54 UTC (rev 44064)
@@ -0,0 +1,109 @@
+/*
+ * Name
+ *  lanczos.c -- use lanczos interpolation for given row, col
+ *
+ * Description
+ *  lanczos returns the value in the buffer that is the result of
+ *  lanczos interpolation for the given row, column indices.
+ *  If the given row or column is outside the bounds of the input map,
+ *  the corresponding point in the output map is set to NULL.
+ *
+ *  If single surrounding points in the interpolation matrix are
+ *  NULL they where filled with their neighbor
+ */
+
+#include <grass/gis.h>
+#include <grass/raster.h>
+#include <math.h>
+#include "global.h"
+
+void p_lanczos(struct cache *ibuffer,	/* input buffer                  */
+	     void *obufptr,	/* ptr in output buffer          */
+	     int cell_type,	/* raster map type of obufptr    */
+	     double *row_idx,	/* row index (decimal)           */
+	     double *col_idx,	/* column index (decimal)        */
+	     struct Cell_head *cellhd	/* information of output map     */
+    )
+{
+    int row;			/* row indices for interp        */
+    int col;			/* column indices for interp     */
+    int i, j, k;
+    DCELL t, u;			/* intermediate slope            */
+    DCELL result;		/* result of interpolation       */
+    DCELL cell[25];
+
+    /* cut indices to integer */
+    row = (int)floor(*row_idx);
+    col = (int)floor(*col_idx);
+
+    /* check for out of bounds of map - if out of bounds set NULL value     */
+    if (row - 2 < 0 || row + 2 >= cellhd->rows ||
+	col - 2 < 0 || col + 2 >= cellhd->cols) {
+	Rast_set_null_value(obufptr, 1, cell_type);
+	return;
+    }
+
+    k = 0;
+    for (i = 0; i < 5; i++) {
+	for (j = 0; j < 5; j++) {
+	    const DCELL *cellp = CPTR(ibuffer, row - 2 + i, col - 2 + j);
+	    if (Rast_is_d_null_value(cellp)) {
+		Rast_set_null_value(obufptr, 1, cell_type);
+		return;
+	    }
+	    cell[k++] = *cellp;
+	}
+    }
+
+    /* do the interpolation  */
+    t = *col_idx - 0.5 - col;
+    u = *row_idx - 0.5 - row;
+
+    result = Rast_interp_lanczos(u, t, cell);
+
+    Rast_set_d_value(obufptr, result, cell_type);
+}
+
+void p_lanczos_f(struct cache *ibuffer,	/* input buffer                  */
+	     void *obufptr,	/* ptr in output buffer          */
+	     int cell_type,	/* raster map type of obufptr    */
+	     double *row_idx,	/* row index (decimal)           */
+	     double *col_idx,	/* column index (decimal)        */
+	     struct Cell_head *cellhd	/* information of output map     */
+    )
+{
+    int row;			/* row indices for interp        */
+    int col;			/* column indices for interp     */
+    DCELL *cellp, cell;
+
+    /* cut indices to integer */
+    row = (int)floor(*row_idx);
+    col = (int)floor(*col_idx);
+
+    /* check for out of bounds - if out of bounds set NULL value     */
+    if (row < 0 || row >= cellhd->rows || col < 0 || col >= cellhd->cols) {
+        Rast_set_null_value(obufptr, 1, cell_type);
+        return;
+    }
+
+    cellp = CPTR(ibuffer, row, col);
+    /* if nearest is null, all the other interps will be null */
+    if (Rast_is_d_null_value(cellp)) {
+        Rast_set_null_value(obufptr, 1, cell_type);
+        return;
+    }
+    cell = *cellp;
+
+    p_lanczos(ibuffer, obufptr, cell_type, row_idx, col_idx, cellhd);
+    /* fallback to bicubic if lanczos is null */
+    if (Rast_is_d_null_value(obufptr)) {
+        p_cubic(ibuffer, obufptr, cell_type, row_idx, col_idx, cellhd);
+	/* fallback to bilinear if cubic is null */
+	if (Rast_is_d_null_value(obufptr)) {
+	    p_bilinear(ibuffer, obufptr, cell_type, row_idx, col_idx, cellhd);
+	    /* fallback to nearest if bilinear is null */
+	    if (Rast_is_d_null_value(obufptr))
+		Rast_set_d_value(obufptr, cell, cell_type);
+	}
+    }
+}



More information about the grass-commit mailing list