apply.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include <grass/raster.h>
  2. #include "filter.h"
  3. /**************************************************************
  4. * apply_filter: apply the filter to a single neighborhood
  5. *
  6. * filter: filter to be applied
  7. * input: input buffers
  8. **************************************************************/
  9. DCELL apply_filter(FILTER * filter, DCELL ** input)
  10. {
  11. int size = filter->size;
  12. double **matrix = filter->matrix;
  13. double divisor = filter->divisor;
  14. int r, c;
  15. DCELL v;
  16. v = 0;
  17. if (divisor == 0) {
  18. int have_result = 0;
  19. for (r = 0; r < size; r++)
  20. for (c = 0; c < size; c++) {
  21. if (Rast_is_d_null_value(&input[r][c]))
  22. continue;
  23. v += input[r][c] * matrix[r][c];
  24. divisor += filter->dmatrix[r][c];
  25. have_result = 1;
  26. }
  27. if (have_result)
  28. v /= divisor;
  29. else
  30. Rast_set_d_null_value(&v, 1);
  31. }
  32. else {
  33. for (r = 0; r < size; r++)
  34. for (c = 0; c < size; c++) {
  35. if (Rast_is_d_null_value(&input[r][c])) {
  36. Rast_set_d_null_value(&v, 1);
  37. return v;
  38. }
  39. v += input[r][c] * matrix[r][c];
  40. }
  41. v /= divisor;
  42. }
  43. return v;
  44. }