You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 20 години
преди 4 години
преди 4 години
преди 4 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * This file is part of Aptdec.
  3. * Copyright (c) 2004-2009 Thierry Leconte (F4DWV), Xerbo (xerbo@protonmail.com) 2019
  4. *
  5. * Aptdec is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. *
  18. */
  19. #include <stdio.h>
  20. #include <math.h>
  21. #include "offsets.h"
  22. typedef struct {
  23. float r, g, b, a;
  24. } rgba;
  25. static struct {
  26. rgba Sea;
  27. rgba Land;
  28. rgba Cloud;
  29. int Seaintensity;
  30. float Seaoffset;
  31. int Landthreshold;
  32. int Landintensity;
  33. int Landoffset;
  34. int Cloudthreshold;
  35. int Cloudintensity;
  36. } fcinfo = {
  37. {28, 44, 95, 1},
  38. {23, 78, 37, 1},
  39. {240, 250, 255, 1},
  40. 50,
  41. 0.5,
  42. 24,
  43. 34,
  44. 14,
  45. 141,
  46. 114
  47. };
  48. // Read the config file
  49. void readfcconf(char *file) {
  50. FILE *fin;
  51. fin = fopen(file, "r");
  52. if (fin == NULL)
  53. return;
  54. fscanf(fin, "%g %g %g\n", &fcinfo.Sea.r, &fcinfo.Sea.g, &fcinfo.Sea.b);
  55. fscanf(fin, "%g %g %g\n", &fcinfo.Land.r, &fcinfo.Land.g, &fcinfo.Land.b);
  56. fscanf(fin, "%g %g %g\n", &fcinfo.Cloud.r, &fcinfo.Cloud.g, &fcinfo.Cloud.b);
  57. fscanf(fin, "%d\n", &fcinfo.Seaintensity);
  58. fscanf(fin, "%g\n", &fcinfo.Seaoffset);
  59. fscanf(fin, "%d\n", &fcinfo.Landthreshold);
  60. fscanf(fin, "%d\n", &fcinfo.Landintensity);
  61. fscanf(fin, "%d\n", &fcinfo.Landoffset);
  62. fscanf(fin, "%d\n", &fcinfo.Cloudthreshold);
  63. fscanf(fin, "%d", &fcinfo.Cloudintensity);
  64. fclose(fin);
  65. };
  66. // RGBA Composite
  67. rgba composite(rgba top, rgba bottom){
  68. rgba composite;
  69. composite.r = MCOMPOSITE(top.r, top.a, bottom.r, bottom.a);
  70. composite.g = MCOMPOSITE(top.g, top.a, bottom.g, bottom.a);
  71. composite.b = MCOMPOSITE(top.b, top.a, bottom.b, bottom.a);
  72. composite.a = bottom.a == 1 || top.a == 1 ? 1 : (top.a+bottom.a)/2;
  73. return composite;
  74. }
  75. void falsecolor(float vis, float temp, float *r, float *g, float *b){
  76. rgba buffer;
  77. fcinfo.Land.a = 0; fcinfo.Sea.a = 0;
  78. // Calculate intensity of sea and land
  79. fcinfo.Sea.a = CLIP(vis, 0, 20)/fcinfo.Seaintensity + fcinfo.Seaoffset;
  80. if(vis > fcinfo.Landthreshold) fcinfo.Land.a = CLIP(vis-fcinfo.Landoffset, 0, fcinfo.Landintensity)/fcinfo.Landintensity;
  81. // Composite land on top of sea
  82. buffer = composite(fcinfo.Land, fcinfo.Sea);
  83. buffer.a = 1;
  84. // Composite clouds on top
  85. fcinfo.Cloud.a = CLIP(temp-fcinfo.Cloudthreshold, 0, fcinfo.Cloudintensity)/fcinfo.Cloudintensity;
  86. buffer = composite(fcinfo.Cloud, buffer);
  87. *r = buffer.r;
  88. *g = buffer.g;
  89. *b = buffer.b;
  90. }
  91. // GVI (global vegetation index) false color
  92. void Ngvi(float **prow, int nrow) {
  93. printf("Computing GVI false color\n");
  94. fflush(stdout);
  95. for (int n = 0; n < nrow; n++) {
  96. float *pixelv = prow[n];
  97. for (int i = 0; i < CH_WIDTH; i++) {
  98. float pv;
  99. double gvi;
  100. gvi = (pixelv[i + CHA_OFFSET] - pixelv[i + CHB_OFFSET]) / (pixelv[i + CHA_OFFSET] + pixelv[i + CHB_OFFSET]);
  101. pv = (gvi + 0.1) * 340.0;
  102. pv = CLIP(pv, 0, 255);
  103. pixelv[i + CHB_OFFSET] = pv;
  104. }
  105. }
  106. };