3 # The latest update : %G% at %U%
5 #%Z% lmrcImageMontageCreate ver %I%
8 #%Z% Usage : lmrcImageMontageCreate
15 #include "lmrcImageMontage.h"
16 #include "lmrcImageEdgeAverage.h"
18 static char __sccs_id[] = "%Z%lmrcImageMontageCreate ver%I%; Date:%D% %Z%";
21 lmrcImageMontageCreate(mrcImage* out, mrcImage* in, int imageNum, lmrcImageMontageInfo linfo, int mode)
25 mrcImageParaTypeReal x, y, z;
26 mrcImageParaTypeReal sx, sy, sz;
31 lmrcImageEdgeAverageInfo* llinfo;
32 lmrcImageEdgeAverageInfo llinfotmp;
33 mrcImageParaTypeInteger icenter = imageNum/2; /* Center */
34 mrcImageParaTypeInteger icenterx;
35 mrcImageParaTypeInteger icentery;
37 icenterx = icenter%linfo.nx;
38 icentery = icenter/linfo.nx;
40 out->Header = in[0].Header;
41 out->HeaderN.x = linfo.PadInfo.Width *linfo.nx;
42 out->HeaderN.y = linfo.PadInfo.Height*linfo.ny;
46 for(x=0; x<out->HeaderN.x; x++) {
47 for(y=0; y<out->HeaderN.y; y++) {
48 for(z=0; z<out->HeaderN.z; z++) {
49 mrcPixelDataSet(out, x, y, z, linfo.PadInfo.Value, mrcPixelRePart);
54 if(linfo.flagEdgeAverage) {
55 avg = (double*)memoryAllocate(sizeof(double)*imageNum, "in lmrcImageMontageCreate");
56 llinfo = (lmrcImageEdgeAverageInfo*)memoryAllocate(sizeof(lmrcImageEdgeAverageInfo)*imageNum, "in lmrcImageMontageCreate");
57 for(i=0; i<imageNum; i++) {
58 llinfo[i].width = linfo.EdgeAverageWindow;
60 DEBUGPRINT1("#### Edge %d ####\n", i);
61 lmrcImageEdgeAverage(&(in[i]), &(llinfo[i]), 0);
84 llinfo[shotID].avg[Edge][Devide]
87 avg[6] = sqrt((llinfo[6].avg[0][1]/(llinfo[3].avg[2][1]/(llinfo[3].avg[1][0]/llinfo[4].avg[3][0])))
88 *(llinfo[6].avg[1][0]/(llinfo[7].avg[3][0]/(llinfo[7].avg[0][0]/llinfo[4].avg[2][0]))));
90 avg[7] = (llinfo[7].avg[0][0]/llinfo[4].avg[2][0]);
92 avg[8] = sqrt((llinfo[8].avg[0][0]/(llinfo[5].avg[2][0]/(llinfo[5].avg[3][0]/llinfo[4].avg[1][0])))
93 * (llinfo[8].avg[3][0]/(llinfo[7].avg[1][0]/(llinfo[7].avg[0][0]/llinfo[4].avg[2][0]))));
95 avg[3] = (llinfo[3].avg[1][0]/llinfo[4].avg[3][0]);
99 avg[5] = (llinfo[5].avg[3][0]/llinfo[4].avg[1][0]);
102 avg[0] = sqrt((llinfo[0].avg[2][1]/(llinfo[3].avg[0][1]/(llinfo[3].avg[1][0]/llinfo[4].avg[3][0])))
103 *(llinfo[0].avg[1][1]/(llinfo[1].avg[3][1]/(llinfo[1].avg[2][0]/llinfo[4].avg[0][0]))));
105 avg[1] = (llinfo[1].avg[2][0]/llinfo[4].avg[0][0]);
107 avg[2] = sqrt((llinfo[2].avg[2][0]/(llinfo[5].avg[0][0]/(llinfo[5].avg[3][0]/llinfo[4].avg[1][0])))
108 *(llinfo[2].avg[3][1]/(llinfo[1].avg[1][1]/(llinfo[1].avg[2][0]/llinfo[4].avg[0][0]))));
110 DEBUGPRINT3("avg[7] %f = [7]avg[0][0] %f / [4].avg[2][0] %f\n", avg[7], llinfo[7].avg[0][0], llinfo[4].avg[2][0]);
114 fprintf(stderr, "Not supported imageNum for Edge-Averaging: %d\n", imageNum);
120 if(linfo.flagNoAverage) {
122 for(i=0; i<imageNum; i++) {
123 avgall += in[i].HeaderAMean;
127 orgValue = linfo.PadInfo.Value;
129 for(i=0; i<imageNum; i++) {
130 mrcStatDataSet(&(in[i]), 0);
131 if(in[i].HeaderN.z>1) {
132 fprintf(stderr, "Not supported: Nz=%f\n", in[i].HeaderN.z);
136 if(linfo.flagEdgeAverage) {
137 linfo.PadInfo.Value = orgValue*(in[i].HeaderAMean/in[icenter].HeaderAMean)/avg[i];
139 DEBUGPRINT2("##### Edge %d center %d####\n", i, icenter);
140 DEBUGPRINT2("ImageAverage: center %f current %f \n", in[icenter].HeaderAMean, in[i].HeaderAMean);
141 DEBUGPRINT2("PadInfo : %f -> %f \n", orgValue, linfo.PadInfo.Value);
142 DEBUGPRINT2("Edge: %f == %f \n", llinfo[icenter].avg[2][0]/in[icenter].HeaderAMean*orgValue, llinfo[i].avg[0][0]/in[i].HeaderAMean*linfo.PadInfo.Value);
144 } else if(linfo.flagNoAverage) {
145 DEBUGPRINT("No Avearge");
146 linfo.PadInfo.Value = orgValue - (avgall - in[i].HeaderAMean);
150 lmrcImagePad(&tmp, &(in[i]), &(linfo.PadInfo), linfo.PadMode);
153 DEBUGPRINT1("##### Edge %d ####\n", i);
154 llinfotmp = llinfo[i];
155 lmrcImageEdgeAverage(&tmp, &llinfotmp, 0);
156 mrcStatDataSet(&tmp, 0);
157 DEBUGPRINT2("ImageAverage: original %f current %f \n", in[i].HeaderAMean, tmp.HeaderAMean);
160 sx = (i%linfo.nx)*tmp.HeaderN.x;
161 sy = (i/linfo.nx)*tmp.HeaderN.y;
162 DEBUGPRINT3("s(%f %f) %d\n", sx, sy, i);
163 for(x=0; x<tmp.HeaderN.x; x++) {
164 for(y=0; y<tmp.HeaderN.y; y++) {
165 for(z=0; z<tmp.HeaderN.z; z++) {
166 mrcPixelDataGet(&tmp, x, y, z, &data, mrcPixelRePart, mrcPixelHowNearest);
167 if(linfo.flagMaxValue) {
168 if(linfo.MaxValue < data) {
169 if(linfo.flagValueAssignedToMax) {
170 data = linfo.ValueAssignedToMax;
172 data = linfo.PadInfo.Value;
176 mrcPixelDataSet( out, sx+x, sy+y, z, data, mrcPixelRePart);
180 mrcImageFree(&tmp, "main");