GRASS 8 Programmer's Manual 8.6.0dev(2026)-f6f2c534ea
Loading...
Searching...
No Matches
histo_eq.c
Go to the documentation of this file.
1/**************************************************************
2 * Rast_histogram_eq (histo, map, min, max)
3 *
4 * struct Histogram *histo; histogram as returned by Rast_read_histogram()
5 * unsigned char **map; equalized category mapping
6 * CELL *min, *max; min,max category for map
7 *
8 * perform histogram equalization
9 * inputs are histo, output is map,min,max
10 ****************************************************************/
11#include <grass/gis.h>
12#include <grass/raster.h>
13
14void Rast_histogram_eq(const struct Histogram *histo, unsigned char **map,
15 CELL *min, CELL *max)
16{
17 int i;
18 int x;
19 CELL cat, prev;
20 double total;
21 double sum;
22 double span;
23 int ncats;
24 long count;
25 unsigned char *xmap;
26 int len;
27 int first, last;
28
30 if (ncats == 1) {
32 *map = xmap = (unsigned char *)G_malloc(1);
33 *xmap = 0;
34 return;
35 }
36 if ((*min = Rast_get_histogram_cat(first = 0, histo)) == 0)
37 *min = Rast_get_histogram_cat(++first, histo);
38 if ((*max = Rast_get_histogram_cat(last = ncats - 1, histo)) == 0)
40 len = *max - *min + 1;
41 *map = xmap = (unsigned char *)G_malloc(len);
42
43 total = 0;
44 for (i = first; i <= last; i++) {
45 if (Rast_get_histogram_cat(i, histo) == 0)
46 continue;
48 if (count > 0)
49 total += count;
50 }
51 if (total <= 0) {
52 for (i = 0; i < len; i++)
53 xmap[i] = 0;
54 return;
55 }
56
57 span = total / 256;
58
59 sum = 0.0;
60 cat = *min - 1;
61 for (i = first; i <= last; i++) {
62 prev = cat + 1;
65 if (count < 0 || cat == 0)
66 count = 0;
67 x = (sum + (count / 2.0)) / span;
68 if (x < 0)
69 x = 0;
70 else if (x > 255)
71 x = 255;
72 sum += count;
73
74 while (prev++ <= cat)
75 *xmap++ = x;
76 }
77}
#define G_malloc(n)
Definition defs/gis.h:139
int Rast_get_histogram_num(const struct Histogram *)
Sorts the histogram in ascending order by counts then category.
Definition histogram.c:155
long Rast_get_histogram_count(int, const struct Histogram *)
Returns count for the nth element in the histogram.
Definition histogram.c:184
CELL Rast_get_histogram_cat(int, const struct Histogram *)
Returns cat for the nth element in the histogram.
Definition histogram.c:168
#define min(x, y)
Definition draw2.c:29
#define max(x, y)
Definition draw2.c:30
int CELL
Definition gis.h:634
void Rast_histogram_eq(const struct Histogram *histo, unsigned char **map, CELL *min, CELL *max)
Definition histo_eq.c:14
int count
#define x