1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
|
include <imhdr.h>
# PLT_GETDATA -- Decrease resolution of image by either subsampling
# or block averaging. A pointer to the data values to be plotted is
# returned, as well as the number of columns and lines in the data matrix.
pointer procedure plt_getdata (im, sub, pre, xres, yres, nx, ny)
pointer im # Pointer to image header
bool sub # Subsample versus block average (yes/no)?
bool pre # Preserve aspect ratio (yes/no)?
int xres, yres # desired resolution
int nx, ny # dimensions of output array
int nxin, nyin
pointer subras, data
pointer plt_blkaverage(), plt_subsample(), imgs2r()
errchk plt_blkaverage, plt_subsample, calloc
begin
# First, determine if the image resolution is to be decreased or not.
nxin = IM_LEN(im,1)
nyin = IM_LEN(im,2)
if ((nxin > xres && xres != 0) || (nyin > yres && yres != 0)) {
# Need to decrease resolution; image can be either subsampled
# or block averaged.
if (sub) {
data = plt_subsample (im, xres, yres, pre, nx, ny)
return (data)
} else {
data = plt_blkaverage (im, xres, yres, pre, nx, ny)
return (data)
}
} else {
# Return entire image as data matrix.
nx = nxin
ny = nyin
call calloc (data, nx * ny, TY_REAL)
subras = imgs2r (im, 1, nxin, 1, nyin)
call amovr (Memr[subras], Memr[data], nx * ny)
return (data)
}
end
# PLT_SUBSAMPLE -- The input data array is subsampled by the specified
# factors. The reduced data array and its dimensions are returned.
pointer procedure plt_subsample (im, xres, yres, pre, nxout, nyout)
pointer im # input image
int xres, yres # desired output resolution
bool pre # preserve aspect ratio?
int nxout, nyout # dimensions of output array (returned)
pointer sp, xvec, data
int x_factor, y_factor, xrf, yrf
int nxin, nyin, yin, ii, jj, index, nop
errchk imgl2r, calloc
pointer imgl2r()
begin
call smark (sp)
nxin = IM_LEN(im,1)
nyin = IM_LEN(im,2)
# User could have disabled subsampling in x or y, but not both.
if (xres == 0)
xres = nxin
if (yres == 0)
yres = nyin
x_factor = (nxin + xres - 1) / xres
y_factor = (nyin + yres - 1) / yres
if (pre) {
xrf = max (x_factor, y_factor)
yrf = max (x_factor, y_factor)
} else {
xrf = x_factor
yrf = y_factor
}
nxout = nxin / xrf
nyout = nyin / yrf
call eprintf ("Image will be subsampled by %d in x and %d in y\n")
call pargi (xrf)
call pargi (yrf)
call salloc (xvec, nxin, TY_REAL)
call calloc (data, nxout * nyout, TY_REAL)
yin = 1
do jj = 1, nyout {
call amovr (Memr[imgl2r (im, yin)], Memr[xvec], nxin)
nop = 1
do ii = 1, nxin {
index = data + ((jj-1) * nxout) + nop - 1
if (mod (ii-1, xrf) == 0) {
Memr[index] = Memr[xvec+ii-1]
nop = nop + 1
}
}
yin = yin + yrf
}
call sfree (sp)
return (data)
end
# PLT_BLKAVERAGE -- Block average the input image by the specified reduction
# factors. The reduced array and its dimensions are returned.
pointer procedure plt_blkaverage (im, xres, yres, pre, nx, ny)
pointer im # input image
int xres, yres # blocking factors
bool pre # preserve aspect ratio?
int nx, ny # dimensions of output array (returned)
real sum
pointer sp, xvec, data
int nxin, nyin, nxout, nyout, nxout_full, nyout_full
int jj, ii, index, nxcols, yin, nxrows, bfx, bfy, x_factor, y_factor
errchk abavr, aclrr, aaddr, salloc, calloc, imgl2r
pointer imgl2r()
begin
call smark (sp)
nxin = IM_LEN(im,1)
nyin = IM_LEN(im,2)
# User could have disabled blockaveraging in x or y, but not both.
if (xres == 0)
xres = nxin
if (yres == 0)
yres = nyin
bfx = nxin / xres
bfy = nyin / yres
if (pre) {
x_factor = max (bfx, bfy)
y_factor = max (bfx, bfy)
} else{
x_factor = bfx
y_factor = bfy
}
call eprintf ("Image will be block averaged by %d in x and %d in y\n")
call pargi (x_factor)
call pargi (y_factor)
nxout = (nxin + x_factor - 1) / x_factor
nyout = (nyin + y_factor - 1) / y_factor
nxout_full = nxin / x_factor
nyout_full = nyin / y_factor
nxcols = nxin - (nxout_full * x_factor)
nxrows = nyin - (nyout_full * y_factor)
call salloc (xvec, nxin, TY_REAL)
call calloc (data, nxout * nyout, TY_REAL)
yin = 1
do jj = 1, nyout_full {
call aclrr (Memr[xvec], nxin)
do ii = 1, y_factor {
call aaddr (Memr[imgl2r(im,yin)], Memr[xvec], Memr[xvec], nxin)
yin = yin + 1
}
call adivkr (Memr[xvec], real(y_factor), Memr[xvec], nxin)
index = data + (jj-1) * nxout
call abavr (Memr[xvec], Memr[index], nxout_full, x_factor)
if (nxcols != 0) {
sum = 0.0
# deal with trailing column pixels
do ii = 1, nxcols
sum = sum + Memr[xvec+(nxout_full*x_factor)+ii-1]
Memr[index+nxout_full] = sum / real (nxcols)
}
}
if (nxrows != 0) {
call aclrr (Memr[xvec], nxin)
do ii = yin, nyin
call aaddr (Memr[imgl2r(im,ii)], Memr[xvec], Memr[xvec], nxin)
call adivkr (Memr[xvec], real (nxrows), Memr[xvec], nxin)
index = data + (nyout - 1) * nxout
call abavr (Memr[xvec], Memr[index], nxout_full, x_factor)
if (nxcols != 0) {
# Deal with trailing column pixels.
do ii = 1, nxcols
sum = sum + Memr[xvec+(nxout_full*x_factor)+ii-1]
Memr[index+nxout_full] = sum / real (nxcols)
}
}
nx = nxout
ny = nyout
call sfree (sp)
return (data)
end
|