comparison Meerwald/wang_common.c @ 0:be303a3f5ea8

import
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Sun, 12 Aug 2007 13:14:34 +0200
parents
children f83ef905a63d
comparison
equal deleted inserted replaced
-1:000000000000 0:be303a3f5ea8
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 }

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.