sig.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <stdlib.h>
  2. #include <grass/imagery.h>
  3. int I_init_signatures(struct Signature *S, int nbands)
  4. {
  5. S->nbands = nbands;
  6. S->nsigs = 0;
  7. S->sig = NULL;
  8. S->title[0] = 0;
  9. return 0;
  10. }
  11. #define SIG struct One_Sig
  12. int I_new_signature(struct Signature *S)
  13. {
  14. int n;
  15. int i;
  16. i = S->nsigs++;
  17. S->sig = (SIG *) G_realloc(S->sig, S->nsigs * sizeof(SIG));
  18. S->sig[i].mean = (double *)G_calloc(S->nbands, sizeof(double));
  19. S->sig[i].var = (double **)G_calloc(S->nbands, sizeof(double *));
  20. for (n = 0; n < S->nbands; n++)
  21. S->sig[i].var[n] = (double *)G_calloc(S->nbands, sizeof(double));
  22. S->sig[i].status = 0;
  23. S->sig[i].have_color = 0;
  24. sprintf(S->sig[i].desc, "Class %d", i + 1);;
  25. return S->nsigs;
  26. }
  27. int I_free_signatures(struct Signature *S)
  28. {
  29. int n;
  30. int i;
  31. for (i = 0; i < S->nsigs; i++) {
  32. for (n = 0; n < S->nbands; n++)
  33. free(S->sig[i].var[n]);
  34. free(S->sig[i].var);
  35. free(S->sig[i].mean);
  36. }
  37. I_init_signatures(S, 0);
  38. return 0;
  39. }
  40. int I_read_one_signature(FILE * fd, struct Signature *S)
  41. {
  42. int n;
  43. int i;
  44. struct One_Sig *s;
  45. while ((i = fgetc(fd)) != EOF)
  46. if (i == '#')
  47. break;
  48. if (i != '#')
  49. return 0;
  50. i = I_new_signature(S);
  51. s = &S->sig[i - 1];
  52. I_get_to_eol(s->desc, sizeof(s->desc), fd);
  53. G_strip(s->desc);
  54. if (fscanf(fd, "%d", &s->npoints) != 1)
  55. return -1;
  56. for (i = 0; i < S->nbands; i++) {
  57. if (fscanf(fd, "%lf", &s->mean[i]) != 1)
  58. return -1;
  59. }
  60. for (i = 0; i < S->nbands; i++) {
  61. for (n = 0; n <= i; n++) {
  62. if (fscanf(fd, "%lf", &s->var[i][n]) != 1)
  63. return -1;
  64. s->var[n][i] = s->var[i][n]; /* added 28 aug 91 */
  65. }
  66. }
  67. if (fscanf(fd, "%f%f%f", &s->r, &s->g, &s->b) == 3 &&
  68. s->r >= 0.0 && s->r <= 1.0 &&
  69. s->g >= 0.0 && s->g <= 1.0 && s->b >= 0.0 && s->b <= 1.0)
  70. s->have_color = 1;
  71. s->status = 1;
  72. return 1;
  73. }
  74. int I_read_signatures(FILE * fd, struct Signature *S)
  75. {
  76. int n;
  77. S->title[0] = 0;
  78. while ((n = fgetc(fd)) != EOF)
  79. if (n == '#')
  80. break;
  81. if (n != '#')
  82. return -1;
  83. I_get_to_eol(S->title, sizeof(S->title), fd);
  84. G_strip(S->title);
  85. while ((n = I_read_one_signature(fd, S)) == 1) ;
  86. if (n < 0)
  87. return -1;
  88. if (S->nsigs == 0)
  89. return -1;
  90. return 1;
  91. }
  92. int I_write_signatures(FILE * fd, struct Signature *S)
  93. {
  94. int k;
  95. int n;
  96. int i;
  97. struct One_Sig *s;
  98. fprintf(fd, "#%s\n", S->title);
  99. for (k = 0; k < S->nsigs; k++) {
  100. s = &S->sig[k];
  101. if (s->status != 1)
  102. continue;
  103. fprintf(fd, "#%s\n", s->desc);
  104. fprintf(fd, "%d\n", s->npoints);
  105. for (i = 0; i < S->nbands; i++)
  106. fprintf(fd, "%g ", s->mean[i]);
  107. fprintf(fd, "\n");
  108. for (i = 0; i < S->nbands; i++) {
  109. for (n = 0; n <= i; n++)
  110. fprintf(fd, "%g ", s->var[i][n]);
  111. fprintf(fd, "\n");
  112. }
  113. if (s->have_color)
  114. fprintf(fd, "%g %g %g\n", s->r, s->g, s->b);
  115. }
  116. return 1;
  117. }