00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00036 #include <stdlib.h>
00037 #include <stdio.h>
00038 #include <string.h>
00039 #include <math.h>
00040
00041 #include "io_tiff.h"
00042
00046 int main(int argc, char **argv)
00047 {
00048
00049 size_t nx, ny;
00050 size_t _nx, _ny;
00051 float *data, *data2;
00052 float *data_ptr, *data2_ptr;
00053 float delta;
00054 float scale, tmp;
00055 int i, c;
00056 float sdif[3];
00057
00058
00059 if (2 <= argc && 0 == strcmp("-v", argv[1]))
00060 {
00061 fprintf(stdout, "%s version " __DATE__ "\n", argv[0]);
00062 return EXIT_SUCCESS;
00063 }
00064
00065 if (5 != argc)
00066 {
00067 fprintf(stderr, "usage : %s A.tiff B.tiff D out.tiff\n",
00068 argv[0]);
00069 fprintf(stderr, " D : max difference to visualize\n");
00070 return EXIT_FAILURE;
00071 }
00072
00073
00074 delta = atof(argv[3]);
00075 if (0 >= delta)
00076 {
00077 fprintf(stderr, "delta must be > 0\n");
00078 return EXIT_FAILURE;
00079 }
00080
00081
00082 data = (float *) read_tiff_rgba_f32(argv[1], &nx, &ny);
00083 data2 = (float *) read_tiff_rgba_f32(argv[2], &_nx, &_ny);
00084
00085
00086 if ((nx != _nx) || (ny != _ny))
00087 {
00088 fprintf(stderr, "image sizes don't match\n");
00089 free(data);
00090 free(data2);
00091 return EXIT_FAILURE;
00092 }
00093
00094
00095
00096
00097
00098 {
00099
00100 data_ptr = data;
00101 data2_ptr = data2;
00102 scale = 128. / delta;
00103
00104 for (c=0; c < 3; c++)
00105 {
00106
00107 i = 0;
00108 sdif[c] = 0.0f;
00109
00110 while (i < nx * ny)
00111 {
00112
00113
00114 *data_ptr -= *data2_ptr++;
00115
00116 sdif[c] += *data_ptr * (*data_ptr);
00117
00118
00119
00120 *data_ptr *= scale;
00121
00122 *data_ptr += 128.;
00123
00124
00125 tmp = floor(*data_ptr + .5);
00126 *data_ptr++ = (tmp > 255 ? 255. : (tmp < 0 ? 0. : tmp));
00127
00128 i++;
00129 }
00130
00131 sdif[c] /= (float) (nx*ny);
00132 sdif[c] = sqrt(sdif[c]);
00133
00134 }
00135
00136 printf("Root Mean Square Error (R,G,B) = (%2.2f, %2.2f, %2.2f)\n", sdif[0], sdif[1], sdif[2]);
00137
00138 }
00139
00140
00141
00142
00143 write_tiff_rgba_f32(argv[4], data, nx, ny);
00144
00145 free(data);
00146 free(data2);
00147
00148 return EXIT_SUCCESS;
00149 }