0
|
1 #include "dwt_util.h"
|
|
2 #include "wang_common.h"
|
|
3
|
|
4 void init_subbands(Image_tree tree) {
|
|
5 int levels = 0;
|
|
6 int i;
|
|
7 Image_tree p = tree;
|
|
8
|
|
9 // determine # of detail subbands
|
|
10 while (p->coarse != NULL) {
|
|
11 levels++;
|
|
12 p = p->coarse;
|
|
13 }
|
|
14
|
|
15 // there are 3 detail subbands per level
|
|
16 n_subbands = 3 * levels;
|
|
17
|
|
18 // allocate memory for subband data
|
|
19 subbands = malloc(n_subbands * sizeof(Subband_data));
|
|
20
|
|
21 p = tree;
|
|
22 i = 0;
|
|
23 while (p->coarse != NULL) {
|
|
24 subbands[i++] = alloc_subband(HORIZONTAL, p->horizontal);
|
|
25 subbands[i++] = alloc_subband(VERTICAL, p->vertical);
|
|
26 subbands[i++] = alloc_subband(DIAGONAL, p->diagonal);
|
|
27
|
|
28 p = p->coarse;
|
|
29 }
|
|
30
|
|
31 }
|
|
32
|
|
33 Subband_data alloc_subband(int type, Image_tree tree) {
|
|
34 int i;
|
|
35 Subband_data p = malloc(sizeof(struct Subband_data_struct));
|
|
36
|
|
37 p->T = 0.0;
|
|
38 p->beta = 0.0;
|
|
39 p->Cmax = 0.0;
|
|
40 p->tree = tree;
|
|
41 p->level = tree->level;
|
|
42 p->width = tree->image->width;
|
|
43 p->height = tree->image->height;
|
|
44 p->size = p->height * p->width;
|
|
45 p->image = tree->image;
|
|
46 p->type = type;
|
|
47
|
|
48 p->selected = malloc(p->height * sizeof(char *));
|
|
49 p->selected[0] = calloc(p->size, sizeof(char));
|
|
50 for (i = 1; i < p->height; i++)
|
|
51 p->selected[i] = &(p->selected[0][i * p->width]);
|
|
52
|
|
53 return p;
|
|
54 }
|
|
55
|
|
56 void set_subband_beta(Subband_data subband, double beta) {
|
|
57 subband->beta = beta;
|
|
58 }
|
|
59
|
|
60 void set_subbands_beta(double beta) {
|
|
61 int i;
|
|
62
|
|
63 for (i = 0; i < n_subbands; i++)
|
|
64 set_subband_beta(subbands[i], beta);
|
|
65 }
|
|
66
|
|
67 void set_subbands_type_beta(int type, double beta) {
|
|
68 int i;
|
|
69
|
|
70 for (i = 0; i < n_subbands; i++)
|
|
71 if (subbands[i]->type == type)
|
|
72 set_subband_beta(subbands[i], beta);
|
|
73 }
|
|
74
|
|
75 void calc_subband_threshold(Subband_data subband) {
|
|
76 double max;
|
|
77 int i, j;
|
|
78
|
|
79 max = fabs(get_pixel(subband->image, 0, 0));
|
|
80 for (i = 0; i < subband->height; i++)
|
|
81 for (j = 0; j < subband->width; j++) {
|
|
82 Pixel p = fabs(get_pixel(subband->image, i, j));
|
|
83 if (p > max)
|
|
84 max = p;
|
|
85 }
|
|
86
|
|
87 subband->Cmax = max;
|
|
88 subband->T = max / 2.0;
|
|
89 }
|
|
90
|
|
91 void calc_subbands_threshold() {
|
|
92 int i;
|
|
93
|
|
94 for (i = 0; i < n_subbands; i++)
|
|
95 calc_subband_threshold(subbands[i]);
|
|
96 }
|
|
97
|
|
98 Subband_data select_subband() {
|
|
99 int max = 0;
|
|
100 int i;
|
|
101
|
|
102 for (i = 0; i < n_subbands; i++)
|
|
103 if ((subbands[i]->beta * subbands[i]->T) > (subbands[max]->beta * subbands[max]->T))
|
|
104 max = i;
|
|
105
|
|
106 return subbands[max];
|
|
107 }
|
|
108
|
|
109 int subband_coeff_isselected(Subband_data subband, int coeff) {
|
|
110 return subband->selected[0][coeff];
|
|
111 }
|
|
112
|
|
113 Pixel get_subband_coeff(Subband_data subband, int coeff) {
|
|
114 return subband->image->data[coeff];
|
|
115 }
|
|
116
|
|
117 void set_subband_coeff(Subband_data subband, int coeff, Pixel data) {
|
|
118 subband->image->data[coeff] = data;
|
|
119 }
|
|
120
|
|
121 int select_subband_coeff_from(Subband_data subband, int from) {
|
|
122 int i;
|
|
123
|
|
124 for (i = from; i < subband->size; i++)
|
|
125 if (!subband_coeff_isselected(subband, i) &&
|
|
126 get_subband_coeff(subband, i) > subband->T)
|
|
127 return i;
|
|
128
|
|
129 return -1;
|
|
130 }
|
|
131
|
|
132 int select_subband_coeff(Subband_data subband) {
|
|
133 select_subband_coeff_from(subband, 0);
|
|
134 }
|
|
135
|
|
136 void mark_subband_coeff(Subband_data subband, int coeff) {
|
|
137 subband->selected[0][coeff] = 1;
|
|
138 }
|
|
139
|
|
140 void free_subband(Subband_data subband) {
|
|
141 free(subband->selected[0]);
|
|
142 free(subband->selected);
|
|
143 free(subband);
|
|
144 }
|
|
145
|
|
146 void free_subbands() {
|
|
147 int i;
|
|
148
|
|
149 for (i = 0; i < n_subbands; i++)
|
|
150 free_subband(subbands[i]);
|
|
151
|
|
152 free(subbands);
|
|
153 }
|
|
154
|
|
155 #define LARGE DBL_MAX
|
|
156
|
|
157 Pixel figure_orig_coeff(double T, double alpha, double beta, Pixel coeff) {
|
|
158 int p, p_min = 0;
|
|
159 double dist_min = LARGE;
|
|
160 double sign = (coeff >= 0) ? 1.0 : -1.0;
|
|
161
|
|
162 for (p = 1; p < 1.0 / (2.0 * alpha); p++) {
|
|
163 double dist, delta;
|
|
164
|
|
165 delta = (1.0 + 2.0 * p * alpha) * T;
|
|
166 dist = fabs(delta - fabs(coeff));
|
|
167
|
|
168 if (dist < dist_min) {
|
|
169 dist_min = dist;
|
|
170 p_min = p;
|
|
171 }
|
|
172 }
|
|
173
|
|
174 if (!p_min) p_min = 1;
|
|
175 return sign * (1.0 + 2.0 * p_min * alpha) * T;
|
|
176 }
|