comparison Meerwald/cmp_pgm.c @ 3:acb6967ee76d

update to 0.5
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Tue, 14 Aug 2007 21:11:21 +0200
parents be303a3f5ea8
children f83ef905a63d
comparison
equal deleted inserted replaced
2:b92f06d9a967 3:acb6967ee76d
2 #include "pgm.h" 2 #include "pgm.h"
3 3
4 char *progname; 4 char *progname;
5 5
6 void usage(void) { 6 void usage(void) {
7 fprintf(stderr, "usage: %s [-C] [-h] [-m n] [-o file] [-pP] [-r file] -i file file\n\n", progname); 7 fprintf(stderr, "usage: %s [-C] [-h] [-m n] [-o file] [-pP] -i file file\n\n", progname);
8 fprintf(stderr, "\t-C\t\tprint PSNR value only\n"); 8 fprintf(stderr, "\t-C\t\tprint PSNR value only\n");
9 fprintf(stderr, "\t-h\t\tprint usage\n"); 9 fprintf(stderr, "\t-h\t\tprint usage\n");
10 fprintf(stderr, "\t-i file\t\toriginal image file\n"); 10 fprintf(stderr, "\t-i file\t\toriginal image file\n");
11 fprintf(stderr, "\t-m n\t\tmultiplication factor (default auto)\n"); 11 fprintf(stderr, "\t-m n\t\tmultiplication factor (default auto)\n");
12 fprintf(stderr, "\t-o file\t\toutput file for difference image\n"); 12 fprintf(stderr, "\t-o file\t\toutput file for difference image\n");
13 fprintf(stderr, "\t-p\t\tprint PSNR, RMS and MSE\n"); 13 fprintf(stderr, "\t-p\t\tprint PSNR, RMS and MSE\n");
14 fprintf(stderr, "\t-P\t\tonly print PSNR, RMS and MSE, no difference image\n"); 14 fprintf(stderr, "\t-P\t\tonly print PSNR, RMS and MSE, no difference image\n");
15 fprintf(stderr, "\t-r file\t\tROI (region-of-interest) mask (default none)\n");
16 exit(0); 15 exit(0);
17 } 16 }
18 17
19 int main(int argc, char *argv[]) { 18 int main(int argc, char *argv[]) {
20 19
21 FILE *in = stdin; 20 FILE *in = stdin;
22 FILE *out = stdout; 21 FILE *out = stdout;
23 FILE *orig = NULL; 22 FILE *orig = NULL;
24 FILE *roi = NULL;
25 23
26 gray **input_image; 24 gray **input_image;
27 gray **orig_image; 25 gray **orig_image;
28 gray **roi_image;
29 26
30 char output_name[MAXPATHLEN] = "(stdout)"; 27 char output_name[MAXPATHLEN] = "(stdout)";
31 char input_name[MAXPATHLEN] = "(stdin)"; 28 char input_name[MAXPATHLEN] = "(stdin)";
32 char orig_name[MAXPATHLEN]; 29 char orig_name[MAXPATHLEN];
33 char roi_name[MAXPATHLEN];
34 30
35 int in_cols, in_rows, in_format; 31 int in_cols, in_rows, in_format;
36 gray in_maxval; 32 gray in_maxval;
37 int roi_cols, roi_rows, roi_format;
38 gray roi_maxval;
39 int orig_cols, orig_rows, orig_format; 33 int orig_cols, orig_rows, orig_format;
40 gray orig_maxval; 34 gray orig_maxval;
41 int cols, rows, format; 35 int cols, rows, format;
42 gray maxval; 36 gray maxval;
43 int col, row; 37 int col, row;
44 38
45 int roisize = 0;
46
47 int i; 39 int i;
48 int c; 40 int c;
49 41
50 int m = 0; 42 int m = 0;
51 int min, max; 43 int min, max;
57 49
58 progname = argv[0]; 50 progname = argv[0];
59 51
60 pgm_init(&argc, argv); wm_init(); 52 pgm_init(&argc, argv); wm_init();
61 53
62 while ((c = getopt(argc, argv, "h?i:m:o:r:pPC")) != EOF) { 54 while ((c = getopt(argc, argv, "h?i:m:o:pPC")) != EOF) {
63 switch (c) { 55 switch (c) {
64 case 'h': 56 case 'h':
65 case '?': 57 case '?':
66 usage(); 58 usage();
67 break; 59 break;
70 fprintf(stderr, "%s: unable to open original image file %s\n", progname, optarg); 62 fprintf(stderr, "%s: unable to open original image file %s\n", progname, optarg);
71 exit(1); 63 exit(1);
72 } 64 }
73 strcpy(orig_name, optarg); 65 strcpy(orig_name, optarg);
74 break; 66 break;
75 case 'r':
76 if ((roi = fopen(optarg, "rb")) == NULL) {
77 fprintf(stderr, "%s: unable to open ROI image file %s\n", progname, optarg);
78 exit(1);
79 }
80 strcpy(roi_name, optarg);
81 break;
82 case 'm': 67 case 'm':
83 m = atoi(optarg); 68 m = atoi(optarg);
84 if (m <= 0) { 69 if (m <= 0) {
85 fprintf(stderr, "%s: multiplication factor %d out of range\n", progname, m); 70 fprintf(stderr, "%s: multiplication factor %d out of range\n", progname, m);
86 exit(1); 71 exit(1);
127 exit(1); 112 exit(1);
128 } 113 }
129 114
130 pgm_readpgminit(in, &in_cols, &in_rows, &in_maxval, &in_format); 115 pgm_readpgminit(in, &in_cols, &in_rows, &in_maxval, &in_format);
131 116
132 if (orig) { 117 pgm_readpgminit(orig, &orig_cols, &orig_rows, &orig_maxval, &orig_format);
133 pgm_readpgminit(orig, &orig_cols, &orig_rows, &orig_maxval, &orig_format); 118
134 119 if (in_cols != orig_cols || in_rows != orig_rows) {
135 if (in_cols != orig_cols || in_rows != orig_rows) { 120 fprintf(stderr, "%s: input image %s does not match dimensions of original image %s\n", progname, input_name, orig_name);
136 fprintf(stderr, "%s: input image %s does not match dimensions of original image %s\n", progname, input_name, orig_name); 121 exit(1);
137 exit(1);
138 }
139 }
140
141 if (roi) {
142 pgm_readpgminit(roi, &roi_cols, &roi_rows, &roi_maxval, &roi_format);
143
144 if (in_cols != roi_cols || in_rows != roi_rows) {
145 fprintf(stderr, "%s: input image %s does not match dimensions of ROI image %s\n", progname, input_name, roi_name);
146 exit(1);
147 }
148 } 122 }
149 123
150 cols = in_cols; 124 cols = in_cols;
151 rows = in_rows; 125 rows = in_rows;
152 format = in_format; 126 format = in_format;
153 maxval = in_maxval; 127 maxval = in_maxval;
154 128
155 input_image = pgm_allocarray(cols, rows); 129 input_image = pgm_allocarray(cols, rows);
156 orig_image = pgm_allocarray(cols, rows); 130 orig_image = pgm_allocarray(cols, rows);
157 roi_image = pgm_allocarray(cols, rows);
158 131
159 for (row = 0; row < rows; row++) { 132 for (row = 0; row < rows; row++) {
160 pgm_readpgmrow(in, input_image[row], cols, in_maxval, in_format); 133 pgm_readpgmrow(in, input_image[row], cols, in_maxval, in_format);
161 if (orig) 134 pgm_readpgmrow(orig, orig_image[row], cols, orig_maxval, orig_format);
162 pgm_readpgmrow(orig, orig_image[row], cols, orig_maxval, orig_format);
163 else
164 memset(orig_image[row], cols, 0);
165 if (roi)
166 pgm_readpgmrow(roi, roi_image[row], cols, roi_maxval, roi_format);
167 else
168 memset(roi_image[row], cols, PGM_MAXMAXVAL);
169 } 135 }
170 136
171 fclose(in); 137 fclose(in);
172 if (orig) fclose(orig); 138 fclose(orig);
173 if (roi) fclose(roi); 139
174 140 min = max = abs(input_image[0][0] - orig_image[0][0]);
175 max = 0;
176 min = PGM_MAXMAXVAL;
177 141
178 for (row = 0; row < rows; row++) { 142 for (row = 0; row < rows; row++) {
179 gray *pi = input_image[row]; 143 gray *pi = input_image[row];
180 gray *po = orig_image[row]; 144 gray *po = orig_image[row];
181 gray *pr = roi_image[row];
182 145
183 for (col = 0; col < cols; col++) { 146 for (col = 0; col < cols; col++) {
184 int diff = abs(*pi - *po); 147 int diff = abs(*pi - *po);
185 int inroi = (!roi || *pr > 0);
186
187 pi++;
188 po++;
189 pr++;
190
191 if (roi && !inroi)
192 continue;
193
194 roisize++;
195
196 error += sqr(diff); 148 error += sqr(diff);
197 if (diff < min) min = diff; 149 if (diff < min) min = diff;
198 if (diff > max) max = diff; 150 if (diff > max) max = diff;
199 151
152 pi++;
153 po++;
200 } 154 }
201 } 155 }
202 156
203 for (row = 0; row < rows; row++) { 157 for (row = 0; row < rows; row++) {
204 gray *pi = input_image[row]; 158 gray *pi = input_image[row];
205 gray *po = orig_image[row]; 159 gray *po = orig_image[row];
206 gray *pr = roi_image[row];
207 160
208 for (col = 0; col < cols; col++) { 161 for (col = 0; col < cols; col++) {
209 int diff = abs(*pi - *po); 162 int diff = abs(*pi - *po);
210 int inroi = (!roi || *pr > 0); 163 if (m > 0)
211 164 *pi = PIXELRANGE(diff * m);
212 if (!inroi) { 165 else
213 *pi = 0; 166 *pi = PIXELRANGE((double) (diff - min) / (double) (max - min) * maxval);
214 }
215 else {
216 if (m > 0)
217 *pi = PIXELRANGE(diff * m);
218 else
219 *pi = PIXELRANGE((double) (diff - min) / (double) (max - min) * maxval);
220 }
221 167
222 pi++; 168 pi++;
223 po++; 169 po++;
224 pr++;
225
226 } 170 }
227 } 171 }
228 172
229 if (!print_psnr_only) { 173 if (!print_psnr_only) {
230 pgm_writepgminit(out, cols, rows, maxval, 0); 174 pgm_writepgminit(out, cols, rows, maxval, 0);
234 fclose(out); 178 fclose(out);
235 } 179 }
236 180
237 pgm_freearray(input_image, rows); 181 pgm_freearray(input_image, rows);
238 pgm_freearray(orig_image, rows); 182 pgm_freearray(orig_image, rows);
239 pgm_freearray(roi_image, rows);
240 183
241 if (print_psnr || print_psnr_only) { 184 if (print_psnr || print_psnr_only) {
242 double mse = (roisize) ? error / (double) roisize : 0; 185 double mse = error / (double) (cols * rows);
243 double rmse = sqrt(mse); 186 double rmse = sqrt(mse);
244 double psnr = (rmse) ? 20.0 * log(255.0 / rmse) / log(10.0) : 0; 187 double psnr = 20.0 * log(255.0 / rmse) / log(10.0);
245 FILE *print = print_psnr_only ? out : stderr; 188 FILE *print = print_psnr_only ? out : stderr;
246 if (!print_psnr_value_only) { 189 if (!print_psnr_value_only) {
247 if (roi)
248 fprintf(print, "ROI size: %d\n", roisize);
249 if (mse > 0.0) 190 if (mse > 0.0)
250 fprintf(print, "PSNR: %lf dB\n", psnr); 191 fprintf(print, "PSNR: %lf dB\n", psnr);
251 else 192 else
252 fprintf(print, "PSNR: inf\n"); 193 fprintf(print, "PSNR: inf\n");
253 fprintf(print, "RMSE: %lf\n", rmse); 194 fprintf(print, "RMSE: %lf\n", rmse);

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