0
|
1 #include "wm.h"
|
|
2 #include "dwt_util.h"
|
|
3 #include <ctype.h>
|
|
4
|
|
5 void copy_coeffs_from_dwt(double ** block_coeffs, double ** dwt_coeffs,
|
|
6 int level, int band, int width, int height) {
|
|
7 int i, j;
|
|
8 int size = width >> level;
|
|
9 int h = (band > 2) ? size : 0;
|
|
10 int w = (band & 1) ? 0 : size;
|
|
11
|
|
12 for (i = 0; i < size; i++)
|
|
13 for (j = 0; j < size; j++)
|
|
14 block_coeffs[i][j] = dwt_coeffs[h + i][w + j];
|
|
15 }
|
|
16
|
|
17 void copy_coeffs_to_dwt(double ** dwt_coeffs, double ** block_coeffs,
|
|
18 int level, int band, int width, int height) {
|
|
19 int i, j;
|
|
20 int size = width >> level;
|
|
21 int h = (band > 2) ? size : 0;
|
|
22 int w = (band & 1) ? 0 : size;
|
|
23
|
|
24 for (i = 0; i < size; i++)
|
|
25 for (j = 0; j < size; j++)
|
|
26 dwt_coeffs[h + i][w + j] = block_coeffs[i][j];
|
|
27 }
|
|
28
|
|
29 char *subband_name(int type) {
|
|
30 switch (type) {
|
|
31 case LL: return "LL";
|
|
32 case HL: return "HL";
|
|
33 case LH: return "LH";
|
|
34 case HH: return "HH";
|
|
35 default: return "XX";
|
|
36 }
|
|
37 }
|
|
38
|
|
39 int subband_in_list(char *list, int type, int level) {
|
|
40 return 1;
|
|
41 }
|
|
42
|
|
43 int subband_wp_in_list(char *list, char *name) {
|
|
44 return 1;
|
|
45 }
|
|
46
|
|
47 int calc_subband_wp_level(char *name){
|
|
48 return strlen(name);
|
|
49 }
|
|
50
|
|
51 void calc_subband_location(int cols, int rows, int type, int level, int *col, int *row) {
|
|
52 *col = *row = 0;
|
|
53
|
|
54 if (level <= 0 || level > find_deepest_level(cols, rows) - 1) return;
|
|
55
|
|
56 switch (type) {
|
|
57 case LL:
|
|
58 break;
|
|
59 case HL:
|
|
60 *col = 0;
|
|
61 *row = rows >> level;
|
|
62 break;
|
|
63 case LH:
|
|
64 *col = cols >> level;
|
|
65 *row = 0;
|
|
66 break;
|
|
67 case HH:
|
|
68 *col = cols >> level;
|
|
69 *row = rows >> level;
|
|
70 break;
|
|
71 default:
|
|
72 break;
|
|
73 }
|
|
74 }
|
|
75
|
|
76 void calc_subband_wp_location(int cols, int rows, char *name, int *col, int *row) {
|
|
77 char *p = name;
|
|
78 int level = 0;
|
|
79 *col = *row = 0;
|
|
80
|
|
81 while (*p) {
|
|
82 level++;
|
|
83 switch (toupper(*p)) {
|
|
84 case 'A':
|
|
85 break;
|
|
86 case 'H':
|
|
87 *col += (cols >> level);
|
|
88 break;
|
|
89 case 'V':
|
|
90 *row += (rows >> level);
|
|
91 break;
|
|
92 case 'D':
|
|
93 *col += (cols >> level);
|
|
94 *row += (rows >> level);
|
|
95 break;
|
|
96 default:
|
|
97 break;
|
|
98 }
|
|
99 p++;
|
|
100 }
|
|
101 }
|
|
102
|
|
103 Pixel *get_dwt_data(Image_tree dwt, int level, int type) {
|
|
104 return get_dwt_image(dwt, level, type)->data;
|
|
105 }
|
|
106
|
|
107 Image get_dwt_image(Image_tree dwt, int level, int type) {
|
|
108 return get_dwt_subband(dwt, level, type)->image;
|
|
109 }
|
|
110
|
|
111 Image_tree get_dwt_subband(Image_tree dwt, int level, int type) {
|
|
112 while (--level)
|
|
113 dwt = dwt->coarse;
|
|
114
|
|
115 switch (type) {
|
|
116 case LL:
|
|
117 return dwt->coarse;
|
|
118 case HL:
|
|
119 return dwt->vertical;
|
|
120 case LH:
|
|
121 return dwt->horizontal;
|
|
122 case HH:
|
|
123 return dwt->diagonal;
|
|
124 }
|
|
125
|
|
126 return NULL;
|
|
127 }
|
|
128
|
|
129 Pixel get_dwt_coeff(Image_tree dwt, int level, int type, int coeff) {
|
|
130 return get_dwt_data(dwt, level, type)[coeff];
|
|
131 }
|
|
132
|
|
133 Pixel get_dwt_location(Image_tree dwt, int level, int type, int col, int row) {
|
|
134 return get_pixel(get_dwt_image(dwt, level, type), col, row);
|
|
135 }
|
|
136
|
|
137 static void calc__subband(Image_tree p, Image_tree q, double *min, double *max, double *error) {
|
|
138 int i;
|
|
139
|
|
140 if (!p || !q) return;
|
|
141
|
|
142 *error = 0;
|
|
143 *min = *max = fabs(p->image->data[0] - q->image->data[0]);
|
|
144 for (i = 0; i < p->image->size; i++) {
|
|
145 double diff = fabs(p->image->data[i] - q->image->data[i]);
|
|
146
|
|
147 *error += sqr(diff);
|
|
148 if (diff < *min) *min = diff;
|
|
149 if (diff > *max) *max = diff;
|
|
150 }
|
|
151 }
|
|
152
|
|
153 void calc_subband(Image_tree p, Image_tree q, int type, double *min, double *max, double *error) {
|
|
154 calc__subband(p, q, min, max, error);
|
|
155 }
|
|
156
|
|
157 void calc_subband_wp(Image_tree p, Image_tree q, char *name, double *min, double *max, double *error) {
|
|
158 calc__subband(p, q, min, max, error);
|
|
159 }
|