METHOD OF RESIZING AN IMAGE, DESIGNING A FILTER THEREFOR, AND MAPPING THE OUTPUT IMAGE TO THE INPUT IMAGE

Abstract: The present invention relates to a method of designing a Kaiser window filter. The filter is applied to an input image to generate a resized output image while preserving the information content of the input image. The method of mapping the output image space to the input image space of the present invention aligns the boundaries of the input image space with the boundaries of a set of new input pixels, and the coordinate points of the output pixels map to corresponding coordinate points of the new input pixels.

Description: TITLE OF THE INVENTION METHOD OF RESIZING AN IMAGE, DESIGNING A FILTER THEREFOR, AND MAPPING THE OUTPUT IMAGE TO THE INPUT IMAGE COPYRIGHT NOTICE A portion of the disclosure of this patent document contains material which is subject to copyright protection. The copyright owner has no objection to the facsimile reproduction by anyone of the patent document or the patent disclosure, as it appears in the Patent and Trademark Office patent file or records, but otherwise reserves all copyright rights whatsoever. BACKGROUND OF THE INVENTION Field of the Invention The present invention relates generally to the field of digital signal processing and more specifically to a method of resizing (i.e., interpolating or decimating) an image while preserving the information content of the image, a method of designing a filter for resizing the image and a method of mapping the output image space to the input image space of the resized image. Description of the Related Art Digital image-processing systems are important in a wide variety of applications, such as medical imaging, color printing, visual inspection systems and data storage systems. These applications often reguire expanding an image (interpolation) or contracting an image (decimation) to better examine the image. Decimation in particular is used in data storage and printing applications. Interpolation or decimation of an image requires resampling of original sampled data to a new pixel mapping scheme. Conceptually, data resampling requires two steps: first, a coordinate system transformation, and then pixel interpolation or decimation. Coordinate system transformation is an address calculation that determines where the desired output pixel is located with respect to the original, input pixels. Pixel interpolation or decimation constructs output pixels of the output image by performing a discrete convolution of the original image by an interpolation or decimation kernel. Pixel interpolation or decimation is required when the transformed pixel positions do not coincide with the original pixel positions. New pixel values are obtained by interpolating or decimating between original pixels in the neighborhood of the desired pixel position. A common interpolation or decimation technique is the cubic spline technique. With the cubic spline technique, a sequence of numbers is fitted with cubic sequence polynomials, which have continuity in values and first derivatives at common points. Interpolation or decimation is accomplished by resampling the cubic equation. The cubic equation guarantees to duplicate existing data from a spatial point of view. However, from a frequency domain point of view, the cubic spline technique theoretically is not the best type of interpolator or deci ator, since it produces artifacts in the resized image due to overshoot and undershoot in the intensity transitions regions. Other known interpolation or decimation techniques include pixel-replication, also known as the sharp mode technique, and linear or bilinear interpolation or decimation. Pixel-replication repeats an input value for each of a desired number of output pixels. In the interpolation-dominant case (i.e., where the interpolation rate is greater than or equal to the decimation rate) , pixel-replication introduces visual artifacts to the resized image. In the decimation-dominant case (i.e., where the decimation rate is greater than the interpolation rate) , pixel-replication causes significant loss of information. Linear interpolation or decimation fits a straight line between two adjacent input pixels and resamples the line at the location of the output pixels. Two-dimensional or bilinear interpolation or decimation takes four input pixels, constructs a plane therefrom and resamples the plane at the location of the output pixels. Linear and bilinear interpolation or decimation have poor responses in regions of large transitions in the image. When an image is resized, the edges of the output image space may not be aligned with the edges of the input image space. If the edges output image space are shifted to align with the edges of the input image space, then the ratio of the spacing between pixels is not the same as the ratio of the number of pixels in the input image space to the number of pixels in the output image space. Thus, the pixel spacing is not as expected. An alternative is to fix the pixel spacing ratio to the expected value. In this case, by maintaining the alignment of the first pixel, as is normally done for image resizing, the last pixels are not aligned. Thus, the edges of the input image space and the output image space are not treated similarly, and all the information along the edges of the input image space does not appear in the output image space. Accordingly, it is an object of the present invention to provide a method of designing a filter using frequency domain techniques for resizing an image while preserving the information content of the image, thereby reducing the introduction of artifacts or distortion in the resized image. A further object of the present invention is to provide a method of designing a filter using frequency domain techniques for resizing an image while preserving the information content of the image which replicates those pixels of the input image which are retained in the output image. Still another object of the present invention is to provide a method of resizing an image by applying a filter for resizing an image while preserving the information content of the image. Another object of the present invention is to provide a method of mapping the pixels of an output image space to an input image space when resizing the image which creates a set of new input pixels, whereby the boundaries of the original input pixels of the input image space and the new input pixels are aligned and each of the output pixel coordinate points maps to a corresponding new input pixel coordinate point. This method views each pixel as having an area of coverage. With this method, the spacing ratio and the pixel count ratio are identical, and the edges of the input image space and the output image space are treated identically, so that no information is lost. It is intended that the present invention be equally applicable to the fields of X-ray imaging, printing and publishing, visual inspection systems and data storage systems. SUMMARY OF THE INVENTION The present invention is directed to a method of designing a filter and a method of applying the filter for resizing an image. The method of designing the filter comprises selecting a first interpolation rate and a first decimation rate for a first sense and a second interpolation rate and a second decimation rate for a second sense. A first stopband attenuation and a first sharpness factor are selected for the first sense and a second stopband attenuation and a second sharpness factor are selected for the second sense. A first cutoff frequency js computed for the first sense, and a second cutoff frequency is computed for the second sense. An input kernel is established, where the input kernel has a first number of elements in the first sense and a second number of elements in the second sense. A first low-pass filter is generated for the first sense. The first low-pass filter comprises a first filter vector comprising a plurality of first coefficients. The first low-pass filter is modified by creating a first vector comprising a plurality of elements, each having a value equal to unity, where the first vector has a dimensionality equal to the first interpolation rate, and convolving the first filter vector with the first vector to create a modified first filter vector comprising a plurality of the first coefficients. A second low-pass filter is generated for the second sense. The second low-pass filter comprises a second filter vector comprising a plurality of second coefficients. The second low-pass filter is modified by creating a second vector comprising a plurality of elements each having a value equal to unity, where the second vector has a dimensionality equal to the second interpolation rate, and convolving the second filter vector with the second vector to create a modified second filter vector comprising a plurality of the second coefficients. A first set of coefficient vectors is created by selecting a plurality of the coefficients of the modified first filter vector as a function of the first interpolation rate, the first decimation rate and the first number of elements. A second set of coefficient vectors is created by selecting a plurality of the coefficients of the modified second filter vector as a function of the second interpolation rate, the second decimation rate and the second number of elements. The first and second sets of coefficient vectors are applied to a neighborhood of the values of the input pixels adjacent each output pixel to compute the value of each output pixel and the computed values are assigned to the corresponding output pixels, thereby producing a resized image. The resized image is stored in an output memory device. The method of resizing an input image comprises sampling the input image at a predetermined first interval in a first sense and at a predetermined second interval in a second sense for producing input data values for the location of each input pixel. A predetermined third interval is established in the first sense and a predetermined fourth interval is established in the second sense for producing output data values for the location of each output pixel. A filter is designed as set forth above. The first and second sets of coefficient vectors as set forth above are applied to a neighborhood of the values of the input pixels adjacent each output pixel to compute the value of each output pixel, and the computed values are assigned to the corresponding output pixels, thereby producing a resized image. The resized image is stored in an output memory device. The present invention is also directed to a method of mapping the pixels of an output image space to an input image space when resizing an image. The method comprises defining the input image space as including a predetermined number of non-overlapping, original input pixels, each original input pixel comprising a two-dimensional area represented by an input pixel coordinate point and extending in a first input sense and a second input sense. A total input image area is defined as the sum of the areas of each original input pixel, the total input image area having a first input extent in the first sense and a second input extent in the second sense. The output image space is defined as including a predetermined number of output pixels, each output pixel comprising a two-dimensional area extending in a first output sense and a second output sense, where the output image space has a first number of output pixels in the first output sense and a second number of output pixels in the second output sense. A set of new input pixels is defined by dividing the first input extent by the first number of output pixels and by dividing the second input extent by the second number of output pixels, each of the new input pixels being represented by an input pixel coordinate point and corresponding to an output pixel, whereby the boundaries of the original input pixels and the new input pixels are aligned, and each of the output pixel coordinate points maps to a corresponding new pixel coordinate point. A filter for resizing the input image is applied in the first and second output senses to a neighborhood of the values of the input pixels adjacent each new input pixel to compute the value of each of the new input pixels, and the computed values are assigned to the corresponding output pixels, whereby the image is resized. The values of the output pixels are stored in an output memory device. Additional objects and advantages of the invention will be set forth in part in the description which follows, and in part will be obvious from the description, or may be learned by practice of the invention. The objects and advantages of the invention will be realized and attained by means of the elements and combinations particularly pointed out in the appended claims. BRIEF DESCRIPTION OF THE DRAWINGS The accompanying drawings, which are incorporated in and constitute a part of this specification, illustrate several embodiments of the invention and together with the description, serve to explain the principles of the invention. Fig. 1 is a flowchart of the method for computing a first and a second coefficient vector set. Fig. 2 is a flowchart of the method for designing a filter for two senses. Fig. 3 is a block diagram showing the overall system for designing a filter and applying the filter to resize an image of the present invention. Fig. 4 is a flowchart of the method for resizing an image by applying the filter designed in accordance with the filter design method of the present invention. Fig. 5 is a graph showing the frequency response of a standard FIR1 Kaiser window low-pass filter of the prior art and as described in Example 1. Fig. 6 is a graph showing the frequency response of the modified Kaiser window filter of the ideal version of the filter design method of the present invention as described in Example 1. Fig. 7 is a graph showing the unit step response of the modified Kaiser window filter of the ideal version of the filter design method of the present invention as described in Example 1. Fig. 8 is a graph showing the frequency response of the modified Kaiser window filter of the pixel- replicating version of the filter design method of the present invention as described in Example 1. Fig. 9 is a graph showing the unit step response of the modified Kaiser window filter of the pixel- replicating version of the filter design method of the present invention as described in Example 1. Fig. 10 is a graph showing the frequency response of a standard FIR1 Kaiser window low-pass filter of the prior art and as described in Example 2. Fig. 11 is a graph showing the frequency response of the modified Kaiser window filter of the ideal version of the filter design method of the present invention as described in Example 2. Fig. 12 is a graph showing the unit step response of the modified Kaiser filter window of the ideal version of the filter design method of the present invention as described in Example 2. Fig. 13 is a graph showing the frequency response of the modified Kaiser window filter of the pixel- replicating version of the filter design method of the present invention as described in Example 2. Fig. 14 is a graph showing the unit step response of the modified Kaiser window filter of the pixel- replicating version of the filter design method of the present invention as described in Example 2. Fig. 15 is a graphic illustration showing how the method of designing a filter of the present invention applied in one sense selects a coefficient vector as a function of an output pixel mapped to an input space, and which input kernel is appropriate for the computation of the output pixels for Example 2. Fig. 16 is a graph showing the frequency response of the modified Kaiser window filter of the ideal version of the filter design method of the present invention as described in Example 3. Fig. 17 is a graph showing the unit step response of the modified Kaiser window filter of the ideal version of the filter design method of the present invention as described in Example 3. Fig. 18 is a graph showing the frequency response of a standard FIR1 Kaiser window low-pass filter of the prior art and as described in Example 3. Fig. 19 is a graph showing the frequency response of the modified Kaiser window filter of the ideal version of the filter design method of the present invention as described in Example 4. Fig. 20 is a graph showing the unit step response of the modified Kaiser window filter of the ideal version of the filter design method of the present invention as described in Example 4. Fig. 21 is a graphic illustration showing how the method of designing a filter of the present invention applied in one sense selects a coefficient vector as a function of an output pixel mapped to an input space, and which input kernel is appropriate for the computation of the output pixels for Example 4. Fig. 22 is a flowchart illustrating the steps of the two-dimensional mapping method of the present invention. Fig. 23A is a plan view of an input image space comprising a plurality of original input pixels for which a two-dimensional mapping is performed as described in Example 5. Fig. 23B is a plan view of a set of new input pixels for which a two-dimensional mapping is performed as described in Example 5. Fig. 23C is a plan view of an output image space comprising a plurality of output pixels for which a two- dimensional mapping is performed as described in Example 5. Fig. 24A is a plan view of an input image space for which a one-dimensional mapping is performed as described in Example 6. Fig. 24B is a plan view of a set of new input pixels for which a one-dimensional mapping is performed as described in Example 6. Fig. 24C is a plan view of an output image space comprising a plurality of output pixels for which a one- dimensional mapping is performed as described in Example 6. Fig. 25A is a plan view illustrating a plurality of original input pixels to which a set of 4 X 4 coefficient matrices is applied when resizing an image in accordance with the image resizing method of the present invention. Fig. 25B is a plan view illustrating only the 4 4 coefficient matrix of Fig. 25A and the original input pixels to which this matrix is applied. Appendix A is the source code for the method of designing a filter and the method of applying the filter to resize an input image of the present invention. Appendix B is the source code for the method of mapping the pixels of an output image space to an input image space of the present invention. DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS Reference will now be made in detail to the present preferred embodiments of the invention as illustrated in the accompanying drawings. In accordance with the invention, the present invention comprises a method of designing a filter for resizing an input image comprising a plurality of input pixels to generate a resized image comprising a plurality of corresponding output pixels while preserving the information content of the input image. The method of the present invention is applicable to designing both an interpolation- dominant and a decimation-dominant filter. In an interpolation-dominant filter, the interpolation rate is greater than or equal to the decimation rate, and application of the filter resizes the input image to an output image which is larger than the input image, at least in one sense. In a decimation-dominant filter, the decimation rate is greater than the interpolation rate, and application of the filter resizes the input image to an output image which is smaller than the input image, at least in one sense. The flowcharts for the method of designing a filter of the present invention are shown in Figs. 1 and 2. The method comprises the step of selecting a first interpolation rate and a first decimation rate in a first sense. In accordance with the method of the present invention, a first sense *i is set. This step is shown in block A of Figs. 1 and 2. A first resize ratio "Ri for the first sense is selected as shown in block B of Figs. 1. and 2, and a first interpolation rate Ij_ and a first decimation rate D^ are selected for a first sense x^ as shown in block C in Figs, l and 2. First interpolation rate 1^ and first decimation rate D^ are selected as an integer ratio equal to or close to R^, where R^ = I^/D ] ^ The decision diamonds N in Fig. 1 and I in Fig. 2 ask whether all the computations of the method of the present invention have been performed in the second sense. If not, a second sense X2 is set as shown in block A of Figs. 1 and 2. The method also comprises the step of selecting a second interpolation rate and a second decimation rate in a second sense. A second resize ratio R2 is selected, and a second interpolation rate I2 and a second decimation rate D 2 are selected for second sense x 2 as shown in block B of Figs. 1 and 2. Second interpolation rate I 2 and second decimation rate D2 are selected as an integer ratio equal to or close to R , where R2 = " 2I--2 - It should be noted that the first and second interpolation rates and the first and second decimation rates are integers, since the pixel spacing must be constant in the first and second senses. Thus, the resampling rate, R, which is defined as the ratio I/D may be either an integer or a non-integer. Also, although the first and second senses are usually orthogonal to each other, the invention is not limited to this arrangement. For example, the first and second senses may be non-orthogonal for a warped image. The method of designing a filter also includes the step of selecting a first stopband attenuation and a first sharpness factor for the first sense and a second stopband attenuation and a second sharpness factor for the second sense. A first stopband attenuation A r and a first sharpness factor F s are selected for first sense x^, and a second stopband attenuation A r and a second sharpness factor F s are selected for second sense X2. This step is designated by block C in Figs. 1 and 2. It should be noted that the first and second stopband attenuations are chosen to be as low as possible, since it is desirable to have a maximum amount of attenuation in the stopband. The method of designing a filter also comprises the step of computing a . first cutoff frequency for the first sense and a second cutoff frequency for the second sense. A first cutoff frequency f c is computed for first sense x^ and a second cutoff frequency f c is computed for second sense x . This step is designated by block D in Figs. 1 and 2. The first cutoff frequency f c may be computed as follows. In the case where first interpolation rate l is greater than or equal to first decimation rate D^, first cutoff frequency f c , first sharpness factor F s and first interpolation rate 1^ are related by the following equation; f Cl = F Sl ( l/2lι) In the case where first interpolation rate 1;^ is less than first decimation rate D 1# first cutoff frequency f c , first sharpness factor F s and first interpolation rate Iχ are related by the following equation: fc. = F, 5l 2Dι or, another way of saying this is that: f Cl = F Sl /2 X (MAX I 1 ,D 1 )) Second cutoff frequency f c may be computed as follows. In the case where second interpolation rate I 2 is greater than or equal to second decimation rate D2, second cutoff frequency f c , second sharpness factor F s and second interpolation rate I2 are related by the following equation: fc 2 - F S2 (1/2I 2 ) In the case where second interpolation rate I2 is less than second decimation rate D2, second cutoff frequency f c , second sharpness factor F s and second interpolation rate l are related by the following equation: f C2 = F S2 /2D 2 or, another way of saying this is that: fc 2 = F s 2 / 2 x ( AX ( I 2 ,D 2 ) ) The method of designing a filter also comprises the step of establishing an input kernel having a first number of elements in the first sense and a second number of elements in the second sense. This step is shown in blocks F and G of Fig. 1. An input kernel is established which has Mi elements in the first sense and M 2 elements in the second sense. Both ^ and M2 are even integers. In the preferred embodiment, the input kernel has four elements in the first sense and _our elements in the second sense. However, the method of the present invention is not limited to this size input kernel. The four cases of where the first interpolation rate is greater than or equal to the first decimation rate or where the first decimation rate is greater than the first interpolation rate, and where the second interpolation rate is greater than or equal to the second decimation rate or where the second decimation rate is greater than the second interpolation rate, determine whether first and second numbers M^ and 2 of the input kernel are selected as shown in block F of Fig. 1 or computed as shown in block G of Fig. 1. In the first case, the first interpolation rate is greater than or equal to the first decimation rate and the second interpolation rate is greater than or equal to the second decimation rate. Here, the input image is interpolated or expanded in both the first and second senses. In this case, the step of establishing an input kernel includes the step of selecting the first and second number of elements as a function of the first and second interpolation rate, respectively, the first and second decimation rate, respectively, the first and second cutoff frequency, respectively, the first and second sharpness factor, respectively, and the first and second stopband attenuation, respectively. In the second case, the first interpolation rate is greater than or equal to the first decimation rate and the second decimation rate is greater than the second » interpolation rate. Here, the input image is interpolated or expanded in the first sense and is decimated or contracted in the second sense. In this case, the step of establishing an input kernel includes the step of selecting the first number of elements as a function of the first interpolation rate, the first cutoff frequency, the first sharpness factor and the first stopband attenuation and computing the second number of elements as a function of the second decimation rate, the second cutoff frequency, the second sharpness factor and the second stopband attenuation. In the third case, the first decimation rate is greater than the first interpolation rate and the second interpolation rate is greater than or equal to the second decimation rate. Here, the input image is decimated or contracted in the first sense and is interpolated or expanded in the second sense. In this case, the step of establishing an input kernel includes the step of computing the first number of elements as a function of the first decimation rate, the first cutoff frequency, the first sharpness factor and the first stopband attenuation and selecting the second number of elements as a function of the second interpolation rate, the second cutoff frequency, the second sharpness factor and the second stopband attenuation. In the fourth case, the first decimation rate is greater than the first interpolation rate and the second decimation rate is greater than the second interpolation rate. Here, the input image is decimated or contracted in both the first and second senses. In this case, the step of establishing an input kernel includes the step of computing the first number of elements as a function of the first interpolation rate, the first cutoff frequency, the first sharpness factor and the first stopband attenuation, and computing the second number of elements as a function of the second decimation rate, the second cutoff frequency, the second sharpness factor and the second stopband attenuation. The method of designing a filter also comprises the step of generating a first low-pass filter, the first low-pass filter including a first filter vector comprising a first set of coefficients. A first low-pass filter is generated which includes a first filter vector w^n) . First filter vector ^fn) comprises a first set of coefficients, which are all real numbers. The step of generating a first low-pass filter further includes the step of establishing a first window- based filter having a first predetermined filter length and establishing a first window filter having a first predetermined window length. This step is illustrated by block H in Fig. 1. In the present invention, a window-based filter is the preferred type of low-pass filter. The first predetermined filter length is described by the equation: N fχ = M X + 1 and the first predetermined window length is described by the equation: Wl = M X - 1) X Ii + 2 First predetermined filter length N and first predetermined window length N w of the first window-based filter are a function of first predetermined number M ]^ of elements and first interpolation rate 1^. First predetermined filter length Nf is odd in order to be symmetrical with M^, which represents the number of elements in the input kernel in first sense x^ . The step of generating a first low-pass filter further includes the step of generating a first Kaiser window sequence. A first Kaiser window sequence w^(n)is generated which is a function of first predetermined window length N w and a first stopband attenuation A r . This step is designated by block I in Fig. 1. Kaiser window sequences are known in the art of finite-duration impulse response (FIR) digital filters, as described in Elliott, Handbook of Digital Signal Processing. Academic Press, Inc., 1987, pp. 68-9. (Also see J.F. Kaiser, "Nonrecursive Digital Filter Design Using the I 0 -Sinh Window Function", Proceedings of 1974 IEEE Symposium on Circuits and Systems, April 1974, pp. 20-23; and "Programs for Digital Signal Processing," (IEEE Press, John Wiley & Sons, edited by Digital Signal Processing Committee, IEEE Acoustic Speech & Signal Processing Society, 1979), pg. 5.2-1.) As described in Elliott, the Kaiser window sequence is designed based on discrete-time approximations of the prolate spheroidal wave functions. This window sequence has a flexible parameter β that can be chosen to meet a given stopband attenuation, and the window length N w can be chosen to meet the requirements of Δf]_. The Kaiser window sequence may be described as: where I 0 is the modified zeroth-order Bessel function, which can be computed as: OO ι 0 (x) = ι + jx/2 2)* k ■ k=l The parameter β is typically in the range 2 to 10. As the value of β increases, the stopband attenuation of the low- pass filter increases, and the transition band widens. The step of generating a first low-pass filter further includes the step of generating a first Kaiser window filter, the first Kaiser window filter being a function of the first cutoff frequency, the first sharpness factor and the first Kaiser window sequence. This step is designated by block J in Fig. 1. In the present invention, a Kaiser window filter is the preferred type of window-based filter, where the Kaiser window filter is designated by Wf(n) and is a preferred type of filter w^(n). The first low-pass filter is modified by creating a first vector comprising a plurality of elements, each having a value equal to unity, the first vector having a dimensionality equal to the first interpolation rate and convolving the first filter vector with the first vector to create a modified first filter vector comprising a plurality of the first coefficients. A first vector pχ(n) comprising a plurality of elements is created, where: Pi(n) = [1, l, ... l] and the dimensionality of first vector Pι(n) is equal to first interpolation rate I± . First filter vector w^(n) is then convolved with first vector pχ(n) to create a modified first filter vector h^(n) comprising a plurality of the first coefficients of first low-pass filter vector. This convolution is described by the equation: h x (n) = w x (n) ® Pι(n) where ® represents a discrete convolution. This step is designated by block L in Fig. 1. The method of designing a filter also comprises the step of generating a second low-pass filter, the second low-pass filter including a second filter vector comprising a second set of coefficients. A second low-pass filter is generated which includes a second filter vector W2(n) . Second filter vector W2(n) comprises a second set of coefficients, which are all real numbers. The step of generating a second low-pass filter further includes the step of establishing a second window- based filter having a second predetermined filter length and establishing a second window filter having a second predetermined window length. This step is shown in block H in Fig. 1. As noted above, in the present invention, a window-based filter is the preferred type of low-pass filter. The second predetermined filter length is described by the equation: Nf 2 = M 2 X I 2 + 1 and the second predetermined window length is described by the equation: N w 2 = (M 2 - 1) X I 2 + 2 Second predetermined filter length Nf and second predetermined window length N w of the second window-based filter are a function of second predetermined number M 2 of elements and second interpolation rate I2. Second predetermined filter length Nf is odd in order to be symmetrical with M 2 , which is an even number representing the number of elements in the input kernel in second sense x 2- The step of generating a second low-pass filter further includes the step of generating a second Kaiser window sequence. A second Kaiser window sequence w j ς(n)is generated which is a function of second predetermined window length N w and second stopband attenuation A r . This step is illustrated in block I of Fig. 1. The second Kaiser window sequence is generated in the same manner as the first Kaiser window sequence as discussed above. The step of generating a second low-pass filter further includes the step of generating a second Kaiser window filter, the second Kaiser window filter being a function of the second cutoff frequency, the second sharpness factor and the second Kaiser window sequence. This step is illustrated in block J of Fig. 1. As noted above, in the present invention, a Kaiser window filter is the preferred type of window-based filter. The second low-pass filter is modified by creating a second vector comprising a plurality of elements each having a value equal to unity, the second vector having a dimensionality equal to the first interpolation rate and convolving the second filter vector with the second vector to create a modified second filter vector comprising a plurality of the second coefficients. This step is shown in block K of Fig. 1. A second vector P2(n) comprising a plurality of elements each having a value equal to unity is created, where p 2 (n) is described by: p 2 (n) = [1, 1, ... 1] The dimensionality of the second vector P2(n) is equal to second interpolation rate I2. Second filter vector w 2 (n) is convolved with second vector p (n) to create a modified second filter vector h2(n) comprising a plurality of the second coefficients of the second low-pass filter vector. Modified second filter vector h2(n) is described by the equation: h 2 (n) = w 2 (n) ® p 2 (n) where ® represents a discrete convolution. The method of designing a filter also comprises the step of creating a first set of coefficient vectors by selecting a plurality of the coefficients of the modified first filter vector as a function of the first interpolation rate, the first decimation rate and the first number of elements. This step is shown by block M in Fig. 1 and block E in Fig. 2. A plurality of the coefficients of modified first filter vector h (n) is selected as a function of first interpolation rate 1^, first decimation rate D^ and first number of elements M^ in the input kernel to create a first set of coefficient vectors H n , . Each row of H n , represents a filter of length M^ for each output pixel which has been resized in the first sense. The first set of coefficient vectors is expressed as: The method of designing a filter also comprises the step of creating a second set of coefficient vectors by selecting a plurality of the coefficients of the modified second filter vector as a function of the second interpolation rate, the second decimation rate and the second number of elements. A plurality of the coefficients of modified second filter vector h2(n) are selected as a function of second interpolation rate I2, first decimation rate D 2 and second number of elements M 2 in the input kernel to create a second set of coefficient vectors H c . Each row of H c represents a filter of length M 2 for each output pixel which has been resized in the second sense. The second set of coefficient vectors may be expressed as: [h 2 (l 2 + D h 2 (2l 2 + 1) h 2 (3l 2 + 1) h 2 ( 2 l 2 + 1)] [h 2 (i 2 ) h 2 (2l 2 ) h 2 (3l 2 ) h 2 (M 2 l 2 )] H c 2 = . h 2 (l 2 -(l 2 -2)) 2 (2l 2 -(l 2 -2)) h 2 (3l 2 -(l 2 -2)) h 2 (M 2 l 2 -(l 2 -2))] __ The method of designing a filter for resizing an input image also includes applying the first and second sets of coefficient vectors to a neighborhood of the values of the input pixels adjacent each output pixel to compute the value of each output pixel and assigning the computed values to the corresponding output pixels, thereby producing the resized image. The first and second sets of coefficient vectors H c and H c , respectively, may be applied as either a one-pass or a two-pass filter. In a two-pass case, the first set of coefficient vectors is applied to the neighborhood of values of the input image in the first sense to obtain a resultant set of pixels and the second set of coefficient vectors is applied in the second sense to the resultant set of pixels. Alternatively, in a one-pass case, the first and second sets of coefficient vectors are combined into a first set of coefficient matrices, and the first set of coefficient matrices is applied to the neighborhood of the values of the input pixels simultaneously in the first and second senses. The first and second sets of coefficient vectors are combined into a first set of coefficient matrices, Hj k , as shown below: H i -jikir == '..",11) The decision diamond for combining the first and second sets of coefficient vectors for a one-pass filter is designated J in Fig. 2. The step of computing the first set of coefficient matrices is shown in block K in Fig. 2. The method of designing a filter for resizing an input image also comprises the step of storing the resized image in an output memory device. This step is shown in block H in Fig. 2. Such output memory device may include a random access memory (RAM), such as RAM 36 shown in Fig. 3, or a hard disk 30 or archival storage 32 as shown in Fig. 3. Archival storage 32 is typically a tape, a floppy disk or an optical disc. Alternatively, the image may be stored on a piece of photographic or X-ray film. In_addition_, the first and second sets of coefficients vectors H c and H c , respectively, and the first set of coefficient matrices Hj k may be stored in the output memory device. Fig. 3 is a schematic view of a computer system which is utilized to design and apply the filter of the present invention. As shown in Fig. 3, computer system 10 includes an image scanner 12, which is an input memory device which stores the input image. An image scanner interface 14 feeds the input image from image scanner 12 and puts the input image, comprising a plurality of input pixels, on a data bus 26 via connections 24 and into RAM 36 or onto a disk or tape of hard disk 30 or archival storage 32 through a storage device interface 28. An image resizing module 34 performs the image resizing (i.e., interpolation or decimation) . The resized image may also be stored in RAM 36 or on disk or tape of hard disk 30 or archival storage 32. From hard disk 30 or archival storage 32, the resized image can be fed back through an appropriate interface 18 or 22, respectively, to a printer 16 or a video display 20 as shown in Fig. 3. Image resizing module 34, storage device interface 28, printer interface 18 and video display interface 22 are also connected to data bus 26 by connections 24. A central processing unit (CPU) is connected to bus 26 for processing the data of system 10. In the method of the present invention, to check if an appropriate number of elements Mi and M 2 in the input kernel has been chosen, a first and a second window transition band Δf^ and Δf 2 for the first and second senses are selected. The window transition bands, Δf 1 and Δf 2 are expressed in terms of A r and A r and window length, N w and N w . A r 7.95 A r2 7.95 Δf n = 14.36(N W -1) a a n ιl d lu Δ"f""o2 =- 14.36(N W -1) In the interpolation-dominant case, M^ and M2 are chosen as a function of a stopband attenuation A r and A r , respectively, and a minimum filter length, N f , and N f . i MIN 2 MIN' respectively, which are described as: In the decimation-dominant case, M^ and M2 are computed as a function of the filter attenuation A r and A r , respectively, and a minimum filter length N' and N' , respectively, which are described as: 2 MIN N , f ι MIN - The above method represents the ideal version for interpolation and decimation of an image. Alternatively, a pixel-replicating method may be designed. The choice of a pixel-replicating filter is designated by decision diamond F in Fig. 2. In the pixel-replicating version, the first set of coefficient vectors is modified in the first sense by identifying the output pixels exactly aligning with the input pixels. The values of the first set of coefficient vectors corresponding to the output pixels aligning exactly with the input pixels are then identified. The values of the first set of coefficient vectors are then modified so that the aligned new pixels each have a value equal to the value of the corresponding input pixel. The values of the second set of coefficient vectors corresponding to the output pixels aligning exactly with the input pixels are then identified and are modified so that the aligned output pixels each have a value equal to the value of the corresponding input pixel. This step is shown in block G in Fig. 2. The filter created by the pixel-replicating version of the present invention may be applied either in a two-pass or a one-pass case. In the two-pass case, the first set of coefficient vectors is applied to the neighborhood of the values of the input pixels in the first sense and the second set of coefficient vectors is applied in the second sense to the neighborhood of the values of the set of pixels resulting from applying the first set of coefficient vectors to the input pixels in the first sense. Alternatively, in the one-pass case, the first and second sets of coefficient vectors are combined into a first set of coefficient matrices and the first set of coefficient matrices is applied to the neighborhood of the values of the input pixels simultaneously in the first and second senses. It should be noted that the above method of designing a filter may be implemented in either hardware or software. Also, the above method may be extended to N senses, other than the two senses as described above, where N is a positive integer. In such circumstances, a pixel is defined as a picture element in N dimensions. Further in accordance with the present invention there is provided a method of resizing an input image comprising a plurality of input pixels to generate a resized image comprising a plurality of corresponding output pixels while preserving the information content of the input image. The steps of the method are shown in Fig. 4. The method comprises the steps of sampling the input image at a predetermined first interval in a first sense and at a predetermined second interval in a second sense for producing a plurality of input data values of the locations of each of the input pixels. This step is shown in block A in Fig. 4. The sampled data values of the input pixels are then stored in a memory device, such as RAM 36, disc 30 or archival storage 32 shown in Fig. 3. A predetermined third interval is established in the first sense and a predetermined fourth interval is established in the second sense for producing a plurality of output data values of the locations of each of the output pixels. This step is shown in block B in Fig. 4. A filter is then designed in accordance with the method of designing a filter as described above, and the coefficient vectors are obtained. This step is shown in block C in Fig 4. The coefficient vector sets are stored in an output memory as shown in block D in Fig. 4. The output memory may be RAM 36, disc 30 or archival storage 32 as shown in Fig. 3. The input image is obtained from an input memory which may be image scanner 12 as shown in Fig. 3. The input image may be resized with either a one- pass or a two-pass filter. Decision diamond E in Fig. 4 asks whether a one-pass filter is applied. In the one-pass case, the first and second sets of coefficient vectors are applied to a neighborhood of the values of the input pixels adjacent each output pixel to compute the value of each output pixel, and the computed value is assigned to a corresponding output pixel, thereby producing a resized image. This step is shown in block F of Fig. 4. If the one-pass case is not applied, (i.e., the two-pass case) then first coefficient vector set H c is applied to a neighborhood of the values of the input pixels adjacent each output pixel to obtain a resulting set of pixels as shown in block H of Fig. 4, and second coefficient vector set H c is applied to the resulting set of pixels to compute the value of each output pixel. The computed value is assigned to a corresponding output pixel as shown in block I of Fig. 4. In either case, the resized image is then stored in the output memory, such as RAM 36, disc 30 or archival storage 32 as shown in Fig. 3. This step is designated by block G in Fig. 4. It should be noted that the above-described method of resizing an input image may be implemented either in hardware or in software. In addition, the above-described method may be extended to N senses other than two as described above, where N is a positive integer. In such circumstances, a pixel is defined as a picture element in N dimensions. The method of designing a filter of the present invention will be further clarified by the following examples, which are intended to be purely exemplary of the invention. EXAMPLE 1 Integer Interpolation (R=l) In this example, the resize ratio was selected to be equal to one (1 = 5 and D = 1) for an interpolation- dominant image expansion. Choosing the attenuation, A r = 60 dB and a 50% alias-free bandwidth gave the minimum filter length Nf of 20. Selecting an input kernel of M = 4 MIN pixels yielded a composite filter length of 21, exceeding the minimum criteria. The cutoff frequency was computed to be f c = 0.1 normalized Hertz (a function of I), and the sharpness factor, F s , was set to 1 to produce an ideal filter. A Kaiser window FIR low-pass filter of length 17 was designed using the Kaiser Window sequence with β = 5.6533, where the Kaiser window sequence w k (n) was: w k (n) = [0.0204 0.0806 0.1842 0.3302 0.5061 0.6891 0.8501 0.9606 1.0000 0.9606 0.8501 0.6891 0.5061 03302 0.1842 0.0806 0.0204] The standard "FIR1" (MATLAB function call , commercially available from The Mathworks , Inc. of South Natick, MA) filter design algorithm yielded a low-pass Kaiser window filter described by coefficient vector : wr(n) = [-0.0008 -0.0035 0.0058 0.0000 0.0241 0.0707 0.1309 0.1828 0.2034 0.1828 0.1309 0.0707 0.0241 0.0000 -0.0058 -0.0035 -0.0008] The frequency response of this standard filter design is shown in Fig. 5. The vector p(n) for a given sense was formed as: p(n) = [ 1 1 1 1 1 ] Convolution of Wf (n) with p (n) yielded a modified low-pass filter with a coefficient vector h(n) : h(n) = [ -0.0008 -0.0043 -0.0102 -0.0102 0.0139 0.0854 0.2198 0.4085 0.6119 0.7706 0.8308 0.7706 0.6119 0.4085 0.2198 0.0854 0.0139 -0.0102 -0.0102 -0.0043 -0.0008 ] It is noted that h(n) always has unity gain and minimal overshoot for constant inputs. However, the duplication of pixels is not guaranteed because h(ll) is not 1, and h(l), h(6) and h(16) are not all zeros. For comparative purposes, the frequency and unit step responses of the modified filter are plotted in Figs. 6 and 7 in the time domain. For the ideal modified Kaiser window design, it can be seen that the frequency response provides excellent attenuation in the stopband. The step response shows almost no undershoot or overshoot (on the order of 0.8%). There is more rolloff in the pass band of this example than that achieved by the cubic spline method, which causes more attenuation and smoothing of the image. A first set of coefficient vectors representing a polyphase (i.e., two-pass) interpolating filter was then created. By choosing the coefficients that map to the proper output pixel position, the resulting vectors, in matrix form, were: 0.0854 0.8308 0.0854 -0.0008 0.0139 0.7706 0.2198 -0.0043 -0.0102 0.6119 0.4085 -0.0102 -0.0102 0.4085 0.6119 -0.0102 L. -0.0043 0.2198 0.7706 0.0139. A similar process was followed to generate a second set of coefficient vectors. The filters were applied in a two-pass mode. The input pixel kernel was processed in one sense with the first polyphase filter. The intermediate results were then processed in the second sense with the second polyphase filter. The process was a discrete convolution of the input pixels or intermediate results with the filter coefficients corresponding to the desired output pixel locations. An alternative filtering application was used to combine vectors into a set of coefficient matrices representing a two-dimensional polyphase filter. The vector product was used to generate a matrix of coefficients for each interpolated output pixel: (j=l,2,...,I) Hjk - hj τ h } for (k=l,2,...,I) For example, a coefficient matrix for the first output pixel for R = 5 in both directions was: H 11 -0.0001 -0.0007 -0.0001 0.0000 This matrix was applied in a one-pass, two-dimensional filter mode. In this case, twenty-five 4 x 4 matrices were produced, one for each output pixel. In the ideal case, input pixels are not necessarily replicated at the overlapping pixel location. To preserve the input data, a pixel-replicating form of the Kaiser window filter was designed by forcing the coefficients for the interpolation point at the input pixels to be one at that location and zero elsewhere. A set of coefficient vectors h(n) for a one-dimensional, pixel- replicating filter was: h(n) =[-0.0008-0.0043 -0.0102 -0.0102 0.0139 0 0.2198 0.4085 0.6119 0.7706 1.0000 0.7706 0.6119 0.4085 0.2198 0 0.0139 -0.0102 -0.0102 -0.0043 0 ] which was converted to the polyphase filter: hi 0 1 0 0 h 2 0.0139 0.7706 0.2198 -0.0043 He » h 3 -0.0102 0.6119 0.4085 -0.0102 -0.0102 0.4085 0.6119 -0.0102 h 4 L- -0.0043 0.2198 0.7706 0.0139. The frequency and step responses are plotted for the pixel- replicating filter in Figs. 8 and 9. Several important differences between the ideal and pixel-replicating cases are noted. The stopband attenuation is much less for the pixel-replicating filter. Also, there is a degree of oscillation in the step response (-2%). The performance of the pixel-replicating filter is superior to that of the cubic spline, in the sense that the undershoot and overshoot will introduce minimal distortion. The design in this Example was restricted to a filter that uses only four data points per row. A kernel size of 8 x 8 may improve overall filter characteristics, but it will also widen the region of influence that far neighboring pixels have on the center kernel of interpolated pixels. A larger kernel also requires computations on the order of M^ x M2• A hardware implementation of the convolution algorithm can be realized for a 4 x 4 input kernel with a minimum of memory for coefficient sets, multipliers, and adders. EXAMPLE 2 Non-integer Expansion (R = I/D, I > D > 1) For non-integer ratios greater than one, a filter based on the interpolation rate was designed as in Example 1. The cutoff frequency of the filter required for interpolation was less than that for the decimating filter. Therefore, the filter designed for integer interpolation was sufficient. In this example, the resize ratio was selected to be 1.33333 = 4/3 where the interpolation rate, I, was selected to be 4 and the decimation rate, D, was selected to be 3. Choosing the attenuation, A r = 80dB and a 50% alias- free bandwidth gave a minimum filter length of 16. Selecting an input kernel of M = 4 first pixels yielded a composite filter length of 17, meeting the minimum criteria. The cutoff frequency was computed to be f c = 0.125 normalized Hertz (a function of I) . The sharpness factor, F s , was set to 1.25 to produce a filter with a sharper step transition and a cutoff frequency of 0.156. A Kaiser window FIR low-pass filter of length 14 was designed using the Kaiser window sequence with β - 7.857. The filter frequency response of Wf(n) is plotted in Fig. 10. As in example 1, the vector p(n) for a given sense was formed as: p(n) = [ 1 1 1 1 ] Convolution of Wf(n) with p(n) yielded a modified low-pass filter with a coefficient vector: h(n) = [0.0000 -0.0016 -0.0107 -0.0192 0.0274 0.2044 0.5107 0.8164 0.9453 0.8164 0.5107 0.2044 0.0274 -0.0192 -0.0107 -0.0016 0.0000 ] The frequency and step responses of h(n) are plotted in Figs. 11 and 12. The step response as plotted in Fig. 11 shows that the sharpness factor, by extending the filter cutoff frequency, yields more overshoot in the transition region. The sharpness factor can thus be used to affect image appearance in intensity or color transition regions. The resultant polyphase filter was constructed by mapping the coefficient vector h(n) to the appropriate output pixel coefficient vectors: i 0.0274 0.9453 0.0274 -0.0016 h 2 -0.0192 0.8164 0.2044 -0.0043 H C " 3 -0.0107 0.5107 0.5107 -0.0107 A- _ -0.0016 0.2044 0.8164 -0.0192. A pixel-replicating version of the filter was computed in the same way as Example 1, producing the coefficient vectors: The frequency and step responses are plotted in Figs. 13 and 14. In the two-pass case of the filtering operation, the method of the present invention created the coefficient vectors as a function of an output pixel mapped to an input space, and as a function of which input kernel is appropriate for the computation of the output pixel. Figure 15 illustrates this process in one dimension. As shown in Fig. 15, output points are located at interpolation fractional locations in the center of the input kernel. The filter selection order operates in the pattern below. 1 I 1-1 1-2 ... 2 More than one output pixel may be computed in the first kernel, and the last kernel does not compute an output pixel. The computational repeats after D kernel shifts. Modulo-type calculations can be done to determine if an output pixel lies within the input kernel space, and when to shift the input kernel. EXAMPLE 3 Integer Decimation (R = 1/D, 1 = 1) For the case of integer decimation, the image was reduced in one sense. A single low-pass filter was designed to process the data at the input sample rate. In this example, the resize ratio R was selected to be 1/3, and the decimation rate was selected to be 3. Choosing the attenuation, A r = 80 dB and a 50% alias-free bandwidth, the minimum input kernel was computed to be M = 12. The minimum filter length was 12. A kernel of 12 yielded a composite filter length of 13, exceeding the minimum criteria. The cutoff frequency was computed to be f c = 0.166667 normalized Hertz (a function of D) , and the sharpness factor, F s , was set to 1 to produce an ideal filter. A Kaiser window FIR low-pass filter of length 13 was designed using the Kaiser window sequence with β = 7.857. The design of the filter was performed as Example l, resulting in one coefficient vector h]_: h j =[-0.0023 -O.0110 0.0000 0.0920 0.2523 0.3381 0.2523 0.0920 0.0000 -0.0110 -0.0023-0.0000] The frequency and step responses are plotted as sho.vn in Figs. 16 and 17, respectively. The application of the filter to the input pixel data is a simple convolution sum. The input kernel location and movement is periodic in D. EXAMPLE 4 Non-integer Reduction (R = I/D, D > I > 1) In this example, the resize ratio, R, was selected to be 0.75, the interpolation rate, I, to be 3 and the decimation rate, D, to be 4. Choosing the attenuation, A r = 60 dB and a 50% alias-free bandwidth, the minimum input kernel was computed to be M = 12. The minimum filter length Nf was 12. A kernel of 12 yielded a composite filter length of 37, exceeding the minimum criteria. The cutoff frequency was computed to be f c = 0.125 normalized Hertz (a function of D) , and the sharpness factor, F s , was set to 1 to produce an ideal filter. A Kaiser window FIR low-pass filter of length 35 was designed using the Kaiser window sequence with β = 5.653. The Kaiser window filter frequency response is plotted as shown in Fig. 18. The vector p(n) for a given sense was formed as: p(n) = [ 1 1 1 ] and was convolved with the window filter to produce the composite filter: h(π) = [0.0003 0.0003 -0.0009 -0.0038 -0.0068 -0.0056 0.0032 0.0183 0.0299 0.0237 -0.0089 -0.0587 -0.0946 -0.0741 0.0333 0.2230 0.4462 0.6270 0.6966 0.6270 0.4462 0.2230 0.0333 -0.0741 -0.0946 -0.0587 -0.0089 0.0237 0.0299 0.0183 0.0032 -0.0056 -0.0068 -0.0038 -0.0009 0.0003 0.0003 ] The frequency and step responses of the filter are plotted as shown in Figs . 19 and 20 , respectively. In this case, the step response shows overshoot on the order of that of a cubic spline. The frequency response, however is much better than cubic spline filter. Aliasing effects are critical in this case. They must be minimized to preserve the image information content, even at the expense of step transition distortion. The coefficient vectors was computed as above, resulting in the polyphase filter: -0.0038 0.0032 0.0237 -0.0946 0.2230 0.6966 0.2230 -0.0946 0.0237 0.0032 -0.003β 0.0003 H„ = -0.0009 -0.0056 0.0299 -0.0587 0.0333 0.6270 0.4462 -0.0741 -0.0089 0.0183 -0.0068 0.0003 0.0003 -0.0068 0.0183 -0.0089 -0.0741 0.4462 0.6270 0.0333 -0.0587 0.0299 -0.0056 -0.0009 The application of the filter in one dimension is shown in Fig. 21 where a kernel size of 4 x 4 was used for illustration. As seen in Fig. 21, output pixels were located at interpolation fractional locations in the center of the input kernel. The filter selection order was governed by the decimation interval. The Dth input kernel had no output data points due to the left edge alignment of the input image space and the output image space. An extra kernel shift was required to begin the next period. The computational repeated after minimum of D + 1 kernel shifts. Modulo-type calculations can also be done to determine if an output pixel lies within the input kernel space, and when to shift the input kernel. A symmetric pixel mapping would result in a slightly different filtering sequence. According to a further aspect of the present invention there is provided a method of mapping the pixels of an output image space to an input image space when resizing the image. A flow chart showing the steps of the two-dimensional case of the method of the present invention is shown in Fig. 22. The first and second senses for the two-dimensional method are set as illustrated in block A of Fig. 22. The mapping method comprises the step of defining the input image space as including a predetermined number of non-overlapping, original input pixels, where each original input pixel comprises a two-dimensional area represented by an original input pixel coordinate point and extends in a first input sense and a second input sense. The step of defining the input image space is designated by block B in Fig. 22. The values of the pixels of the input image space are then obtained from an input memory device. The memory device may be an input image scanner, such as input image scanner 12 as shown in Fig. 3. The method of mapping of the present invention also includes the step of defining a total input image area. This step is designated by block C in Fig. 22. The total input image area is defined as the sum of the areas of each original input pixel, the total input image area having a first input extent in the first input sense and a second input extent in the second input sense. The method of mapping also comprises the step of defining the output image space. This step is designated by block D in Fig. 22. The output image space is defined as including a predetermined number of output pixels, each output pixel comprising a two-dimensional area extending in a first output sense and a second output sense. The output image space has a first number of output pixels in the first output sense and a second number of output pixels in the second output sense. A set of new input pixels is defined by dividing the first input extent by the first number of output pixels and the second input extent by the second number of output pixels. This step is illustrated by block E in Fig. 22. Each of the new input pixels is represented by a new input pixel coordinate point and corresponds to an output pixel. By defining the new set of input pixels, the boundaries of the original input pixels and the new input pixels are aligned and each of the output pixel coordinate points maps to a corresponding new input pixel coordinate point. With the mapping method of the present invention, the ratio of the spacing between the pixels in the output image space to the spacing between the pixels in the input image space (i.e., the pixel spacing ratio) is equal to the ratio of the number of pixels in the input image space to the number of pixels in the output image space (i.e., the pixel count ratio) . Decision diamond F in Fig. 22 asks whether the computations of the method of the present invention in the second sense have been completed. If they have, then either a one-pass filter or a two-pass filter may be applied as indicated by decision diamond G. A two-pass filter may be applied in the first sense as shown in block J and in the second sense as shown in block K of Fig. 22, or a one-pass filter may be applied as shown in block I of Fig. 22. If the one-pass filter is applied, then the first and second coefficient vector sets H c and H c are combined, and the first set of coefficient matrices Hjjς is created as designated in block H of Fig. 22 and as described in the method above. The filter is applied in the first and the second input senses to a neighborhood of the values of the original input pixels adjacent each new input pixel to compute the value of each of the new input pixels. The computed values are assigned to the corresponding output pixels, whereby the image is resized. The values of the output pixels are then stored in an output memory device. In addition, the present invention includes the step of storing the values of the new input pixel coordinate points and the correspondence between the new input pixel coordinate points and the output pixel coordinate points in the output memory device. This step is designated by block L in Fig. 22. The output memory device may comprises RAM 36 as shown in Fig. 3, or disk 30 or archival storage 32 as shown in Fig. 3. Alternatively, the values of the output pixels may be stored on a piece of photographic of X-ray film. In the method the present invention, the first and second input senses may align with the first and second output senses, respectively. In addition, the first and second input senses may be the same or different from the first and second output senses, respectively. The flow chart of Fig. 22 represents the software implementation of the two-dimensional mapping method of the present invention. However, the mapping method is equally applicable to a hardware implementation. Also, it should be noted that the mapping method of the present invention may be extended to N senses other than two as described above, where N is a positive integer. In such circumstances, a pixel is defined as a picture element in N dimensions. The mapping method of the present invention will be further clarified by the following examples, which are intended to be purely exemplary of the invention. EXAMPLE 5 To illustrate the method of mapping of the present invention, reference is made to the example in Figs. 23A-C, which illustrate mapping in two dimensions. In Fig. 23A, a plurality of original input pixels 50 are shown, each having an input pixel coordinate point 52. Each original input pixel is represented by a row and column designation, where the rows are designated by 1-6 and the columns are represented by 1-8. In Fig. 23A, the input image is 6 x 8 pixels in dimension, and each pixel is 0.75 x 0.75 units in dimension. A predetermined number of output pixels 60 are shown in Fig. 23C. In this case, there are one hundred output pixels in an output image of dimension 10 X 10 pixels. Each output pixel 60 comprises a two-dimensional area extending in a first output sense and a second output sense and identified by an output pixel coordinate point 62. The total input image area is defined as the sum of the areas of each original input pixel. The total input image area is divided by ten output pixels to define a set of new input pixels as shown at 54 in Fig. 23B. Each new input pixel 54 has a new input pixel coordinate point 56. Each of these new input pixels has a dimension of 0.60 x 0.45 units. Each coordinate point 62 of each output pixel 60 maps to a corresponding coordinate point 56 of each new input pixel 54, as shown by the dashed arrow from Fig. 23C to Fig. 23B. EXAMPLE 6 As noted above, the method of the present invention may be extended to one dimension to map the pixels of an input data space to an output data space when resizing data. Figs. 24A-C illustrate the method of mapping of the present invention applied in one dimension. Eight non-overlapping, original input pixels 50' are shown in Fig. 24A. Each of the input pixels is 1.0 unit in length. Each of the input pixels is represented by an input pixel coordinate point 52' . Ten output pixels 60' are shown in Fig. 24B, each of which are 0.8 units in length. Each output pixel 60 » comprises a data segment represented by an output pixel coordinate point 62* . A total input data segment is defined as the sum of the areas of each original input pixel. The total input data segment is divided by ten output pixels to define a new set of input pixels, 54' as shown in Fig. 24c. Each new input pixel 54• is represented by a new input pixel coordinate point 56'. Each coordinate point 56• of each new input pixel 54 ' maps to a corresponding coordinate point 62 ' of a corresponding output pixel 60'. The mapping method of the present invention may be used with the filter as described above to resize an input image according to the method described above. When this is done, and when the ratio of the decimation rate to the interpolation rate reduced to its lowest common denominator has one even and one odd number, only every other coefficient vector in the first and second sets H c and H c , respectively, of coefficient vectors is used. Figs. 25A and B illustrate an application of the two-dimensional mapping method of the present invention to the method of applying a filter to resize an image of the present invention. Fig. 25A is a plan view of a plurality of the original input pixels and a 4 x 4 coefficient matrix applied thereto when the image is resized in accordance with the image resizing method of the present invention, and Fig. 25B is a plan view of the coefficient matrix of Fig. 25A and the original input pixels to which the matrix is applied. In Figs. 25A and B, a plurality of original input pixels 50 is shown, and input pixel 50a, which is surrounded by the circle, is the alignment of the designated coefficient in the matrix with an original input pixel. New input pixel 54 is shown by the black diamond. In Fig. 25A, i and j represent the integer parts of the coordinate point of new input pixel 54, and Δx and Δy represent the fractional parts. _ First and second sets of coefficient vectors H c and H c , respectively, are created according to the method described above, and are combined into a first set of matrices according to the method as described above. In this application a 4 x 4 set of coefficient matrices is used. The first set of coefficient matrices defines K, L, k 1 and 1' as shown in Fig. 25B, where k 1 = K/2 and l 1 = L/2, and K = L = 4. The first set of coefficient matrices is aligned with original input pixels, specifically is k* aligned with i, and 1' is aligned with j. The first set of coefficient matrices is applied to each original input pixel 50 to obtain a set of new input pixels, only one of which is shown at 54. Additional advantages and modifications will readily occur to those skilled in the art. The invention in its broader aspects is, therefore, not limited to the specific details, representative apparatus and illustrative examples shown and described. Accordingly, departures may be made from such details without departing from the spirit or scope of the general inventive concept as defined by the appended claims and their equivalents. APPENDIX A .'opyrig h t (c) 1990 E. I. du Pont de Nemours and Company . All rights reserved . 'his sof t ware is proprietary. The program source, listing, binary and executable filed ar )u Pon t Company property and may not be dis tributed or copied for non-Du Pont use withou t .he express written approval of company management . Image Resizing Filter Design MATLAB Program % MATLAB Script: Several Function files were combined into this script. To This script represents the Modififed Window Filter based Design method % for producing image interpolating and decimating filter coefficent sets. function do_kaiser % dojcaiser is a function to loop and perform the filter % design process until ALL Directions (senses) are complete. % % Modified KAISER Window Based FIR Filter Design for % Image Interpolation: % by: % Mike J. Piovoso % Mark D. Wetzel % sense = 1; while sense <= 2 de kaiser_design sense = sense + 1; end; iiπag . -ng Filter Design MATLAB Program function kaiser_design % kaiserjdesign performs the Modified Window based FIR filter % design for image interpolation for the ideal and % pixel replicating cases. % % Modified KAISER Window Based FIR Filter Design for % Image Interpolation: % by: % MikeJ. Piovoso % Mark D. Wetzel % Created: 01/15/90 % % Version 1.0 % % Modified: % % 03/23/90: Made to Match Report Mathematics. New Documentation. % 03/24/90: New Method for Filter Design. % % 09/0-1/90: Extended to the effects of decimation. % 09/10/90: Added a "sharpness" factor to affect filter. % 10/31/90: Added the New and Improved Decimation filter design. % We design a one-dimensional filter for resampling Image Data. % Later we will combine the filter into two dimensions to create % a set of fixed coefficient matrices, one for each interpolation % point in the center of the input data kernel which is aligned % such that the fist output point maps over the second input point, % and the last output point is to the Left of the third input point % when our kernel is size 4. % % An overall one dimensional filter of order M*INTERP + 1 % is used for M input data points which are essentially % zero-padded with INTERP-1 zeros after each data point. % The filter is generated by convolving a window based FIR filter % of length (M-1HNTERP + 2 with a special filter % (to force zeros at specified places to remove periodic % extensions of our "resampling" process) % This method differs when decimation is involved. % When the decimation rate is greater than the interpolation rate To we will design a longer filter with a different method. Several To distinct cases must be covered:% % 0 Let R = Resample Ratio » I/D % % Case 1; R = I (D = 1) : Already covered. Standard design. % % Case 2: R = 1 /D (I s 1): Design a lowpass filter of a minimum length. We ignor a kernel of 4, and use more input data. % Tne minimum filter length is a function of D. WO 92/12495 44 Imag' " ing Filter Design MATLAB Program Qse 3: R = I/D, R >= 1 (I > D): Non-Integer Image expansion. % Design as per Case 1 based on Interpolation Rate. ~o Case 4: R = I/D, R < 1 (I < D): Non-Integer Image reduction. ?c Design Hybrid Filter based on Decimation Rate. Kernel length now must be determined as a part of the design. "a echo off format long fprintfCXn DuPont Window Based Filter Coefficient Generator\n\n'); n = inoutCEnter the Filter Dimension (1 [Whitcomb] or 2 [Byrne]): '); if (n == l) dimension = n; eiseif (n == 2) dimension = n; cise dimension = 1; % default coefficient domain for coeff files, end; n = inDutC'Enter the Interpolation Rate (5): '); if (n > ' θ) inierp = n; else interp = 5; % default size end; n = inputCEnter the Decimation Rate (1): '); if (n > 0) decimate = n; else decimate = 1; % default size end; % Define R = I/D: For Now, we Pick I and D, compute R. Ratio = interp/decimate; % R = I/D resample ratio • if (Ratio >= 1.0) n = inputCEnter the Input Kernel Size (4): '); if (n > ' θ. kemei_M = n; else kemεi_M = 4; % default size else kerπεi_M = interp * decimate; end; Λ • = insct.Εnter the Window Attenuation, A r (80dB): '); if (n > 0) A_r = n; eise Imag' '* .ing Filter Design MATLAB Program Λ_r = 80.0; % default Window passband to stopband attenuation end; ?o Optional Sharpness Multiplication Factor: F_s % This is used to move the desired window filter cutoff frequency ?o above the normal f_c to enhance step response of the filter. % Note that this will induce overshoot. n = 1.0; n = inputCEnter Optional Frequency Cutoff Sharpness Factor, F_s (1.0 -1.9): '); if (n > 1.0) if (n <= 1.9) F_s = n; else F_s = 1.9; end; else F_s = 1.0; % default sharpness factor if (Ratio >= 1.0) % Image Expansion (Interpolation Dominant): zero_freq = 1.Q/interp; % First zero location. f_c = 0.5 * zcro_freq; % Thό Window Cutoff Frequency filterjength = (kemel_M * interp) + 1; % We want an ODD length windowjcnglh = ((kernel rf - 1) * interp) + 2; % Kaiser window length delta J = 1.0; % 50% alias free bandwidth in corrected units. N_f_mιn = round((A_r • interp) / (20 * delta_0); else % Image Reduction (Decimation Dominant): zero Jreq * 1.0/decimate; % First zero location. f_c = 0-5 'zero Jreq; % The Window Cutoff Frequency delta J = 1.0; % 50% alias free bandwidth in corrected units. N J_mιn = round((A_r • decimate) / (20 ' delta J)); % Compute the Filter Length for Whitcomb: We want an ODD length % % IMPORTANT to NOTE: % For window filter design, as the length of the window grows, % the frequency response becomes sharper, but the STEP RESPONSE % gets more pronounced Overshoots and Undershoots!!! Up to 10%! To We need to see if in image reduction, this is the desired feature! ernel_M = NJ_min; % If the Kernel is ODD, make it EVEN: (filter with be ODD length) if (rem(kernel_M,2)) kernel_M = kemel_M + 1; fiiterjength = (kerneI_M*interp) + 1; wmdowjength = ((kernel Jv_-l)*interp) + 2; end; Imag- " zing Filler Design MATLAB Program ~_ Because our window will generate Zeros at % F_Zk = k * (l/zcro_freq), k=l,2... F_Zk <= 0.5, % we need to generate a filter with Zeros at these points to cancel the periodic resampling extension. We are essentially taking -AC' M input data points, and zero padding for the interpolation % points, using only the points in the center input interval. % For a 5x interpolation, a filter with zeros at 0.2 and 0.4 is % computed by: % fl = [l - 2'cos(2*pi » 0.2) U; % f2 = [1 - 2*cos(2 » pi » 0.4) 1]; % f = conv(fl,f2); (Convolution) % This will generate a filter of order 5 (INTERP) with coeffs = 1: % i.e. the vector [1 1 1 1 1]. So, to save time we only generate % a ones vector, then convolve with a window function. % Note also that we design a filter that will have an ODD length % so that we will have SYMMETRY in the coefficients! This will % eliminate any phase shift problems associated with EVEN length filters. fpr.ni.C " \n\n Generating the Kaiser Window and FIR Filter...\n\n'); % STEP 1) % Create the "Zeros" Insertion Filter: % To generalize to a filter of length INTERP, % create a unit vector (1 x interpolation size) to force zeros: % (for R < 1, use the decimation as the dominant factor: if (Ratio >= 1.0) f = onesO, interp); else :' = ones(l, interp); end; % STEP 2) % Create a KAISER window based HR Filter length KERNEL_M*INTERP+ 2: % 2.a) Determine the beta parameter for the Kaiser window: if (A_r > 50) beta = 0.1102 » (A_r-8.7); elseif (A_r > 21) beta = 0.5842*((A_r - 21) Λ 0.4) + 0.07886 » (A_r - 21); else beta = 0.0; end; 2.b. Determine the Cutoff Frequency of the Window Filter: :f (Ratio >= 1.0) % For 1 >= D, interpolation filter dominates and has a lower cutoff than the decimating filter, % so, we may use the interpolating filter cutoff frequency: :_c = C.5 * zero Jreq; lma-7 ' zing Filter Design MATLAB Program else " For D > I, the decimating filter dominates, BUT τ 0 we need to design filters for the I interpolation size with frequency characterisitics that have decimation To cutoff and attenuation. o So set the cutoff frequency for the decimation response: f_c = 0.5 * (1.0 / decimate); end; f_c_rnod = :_c'F_s; %Move Cutoff Frequency Up by sharpness factor. To 2.c) Generate the Window sequence with the Bessel Functions: k_window = kaiser(windowJength,beta); o 2.d) Generate the Window based FIR Lowpass Filter via the -O Classical technique: o See Reference: " Programs for Digital Signal Processing", IEEE Press John Wiley k Sons, 1979, pg.5.2-1. winl = firl(windowjength-l,2.0*f_c_mod,k_window); fprintf C\n\n Window and Filter Characteristics for R = I/D = %g/%g = %g:\n\n', ... interp, decimate, Ratio); fprintf C Kernel = %g , Window Length = %g , Filter Length = %g\n\n', ... kemel_M, windowjength, filterjength); fprintf C Window Beta = % , Window f_c = % , Mod f_c = %g\n\n',... beta, f_c, f_c_mod); fprintf.' Kit any key to Display the Window Frequency Response\n'); pause s itle = sprintf ('Kaiser Window LP Filter Frequency Response: R=%g/%g',... interp, decimate); pio:_freq_resp (winl,l,512,s itle); % STEP 3) % Convolve the window with the filter with placed zeros. o The vector h is the coefficient vector for the filter: h = conv(winl,f); ; Ccrr.p' ..e the Frequency Response of the Filter: h(n) -> H_z(w) fpr-.r.'.f. ' We have generated the Ideal Window based FIR Filter:\n\n'); fpπr.tfC Hit any key to Display Ideal Frequency Respσnse\n'); pause s_t:ϋe - spnntfCModified Kaiser Window Filter Frequency Response: R=I/D = %g/%g (Ideal )' , interp, decimate); plc:_freq_resp (h,interp,512,s itle); tmag ».ing Filter Design {vϊATLΛB Program o Plot the Unit Step Response of the Filter: a key test for us! fprimff Hit any key to Display Ideal Step Response ); pause % Strike any key to display the Step Response: s itle = sprintfCModified Kaiser Window Filter Step Response: R=I/D = %g/%g (Ideal)',interp, decimate); hold off; plot_step_resp (h,interp,s_title); fpπntf("\nHit any key to Build Coefficient File\n'); pause % Strike any key to build the coefficient file: % STEP 4) % Build h[][] coefficients for each interpolation % point and place them into an output file: % An INTERP x KERNEL rf Matrix of H_.c[I[] is formed, since each o interpolated output point will be a summation of KERNEL_M input C ,O points multiplied by an H_c[][] coefficient (other terms are 0). % First, we must REVERSE the order of the h() vector, so that the % convolution of the filter with the input generates the proper % sequence of points in the proper order. Furthermore, we must % drop the extra coefficient (which is almost 0). Then we load the % H_c matrix with the points corresponding the the interpolated % pixel position. % For example: % h vectors for each interpolation point for a 5x interpolation: % h0 = [b(6) b(ll) b(16) b(21)]; % hl = (b(5) b(10) b(15) b(20)]; % h2 = [b.4) b(9) b(14) b(19)]; % h3 = .b(3) b(8) b(13) b(18)]; % h4 = (b(2) b(7) b(12) b(17)]; % Each H.χ should sum to a gain of 1: T 0 sum(Hl) = l % Build the coefficent Matrix H_c (vectors of coefficients) % which will be interp rows x kemel_n cols: H_c = zeros(inte ,kernel_M); % H_c matrix coeff vectors. Map the h(k) one dimensional filter coefficents to the % H_c matrix by grouping coefficients that belong to each % interpolating point: The mapping for the 4 input kernel To and the filter must reverse one set for proper selection. for rcw=i.in.erp for coi=l:kernel_M k = interp'col - row + 2; % Mapping to Reverse and Pick H_c(row,col) = h(k); end; end; Imar izing Filter Design MATLAB Program % STEP 5) ~c Write the coefficients into a file: To Fc two dimensions, combine vectos of H_c to build matrices: .iie.name = inputCEnter a File Name for Ideal Filter: ','s'); savoji!ter_coeff (H_c,dimension,interp,kerneIJvi,file_name); Te ! ! !! ! .' I ! I ! ! ! !! !!!!!! !!!!!.'!!!! U !!!!!!!!! 1 !!!.'!!.'!!!!!!!! ! ! % I ! ! .' ! I ! ! ! I ! ! !!!!!!!!! !! !!!!!!! U ! H !! I !!!!!!!!!!!! !! !!!!!! ! To % Now, produce a Pixel Replication form of the filter: % Force the interpolating point at 0,0 to be the input: % Display the change in frequency response: % We force the H[l] row to be 0 AND h(l) too, and H_c[l][2] = 1.0 % H(l] = (h(interp+l) h(2 » interp+l) h(3 » interp+l) h(4 » interp+l)] clc if (Ratio >= 1) answer = inputCCreate a Pixel Replicating Filter? [Y/N]: ','s'); else answer = ' N'; % Cannot Replicate effectively with Decimating filter! end; if (answer == 'y') answer = 'Y'; end; if (answer == T) fpπntfCNow Generating the Pixel Replication Filter...\n'); % Load a new vector and matrix with the replicating vector: h_rep = h; H_c_rep = H_c; H_c_rep(l,:) = zeros(l,kerneI_M); H_c_rep(l,2) - 1.0; for col=l:kernel_M h_rep(interp*col + 1) a 0.0; e d; h_rep(interp * 2 + 1) = 1.0; ; ?'.o' the Frequency Response of the Filter: :pr:n!f( ' We have Generated the Pixel Replication Filter:\n\n'); :pr.r.::T Hit any key to Display Frequency ResponseW); r.τjs-3 % Strike any key to display Non-Ideal Frequency Response: 3_:;::e = spπntfCModified Kaiser Window Filter Frequency Response: R«I/D β%g/%g (Pixel Repl)', :r.:erp. cecimate); hold off; piot_freq_resp (h_rep,interp,512,s i.le); Imag zing Filter Design MATLAB Program fprintfC Hit any key to Display Pixel Repl. Step ResponseW); pause % Strike any key to display the Non-Ideal Step Response: s_t:tle = sprintfCModified Kaiser Window Filter Step Response: R=I/D = %g/%g (Pixel Λepi)',:nteφ, decimate); oid off; p!ot_step_resp (h_rep,interp,s_title); fprintfCHit any key to Build Coefficient FileW); pause % Strike any key to build the coefficient file: c!c file.name = inputCEnter a File Name for Pixel Replicating Filter: ','s'); saveJilter_coeff (H__c_rep,dimension,inteφ,kerneL ,fHe_name); cnύ; %.' i ill.'. 1 .' !!.'!!! !!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! %!!!!! !!!!!!!!!!!,'!!. '!!!!!!. , !!!!!!. , . , !!!. , . , π!. '!!!!!!!!!!!!. '!!!!!! % Fix to File out lock problems: Write to a dummy file: delete junk.dat; fprintf Cjunk.dat'/done\n'); clc fprin;f('\nResampling Filter Generation DoneΛn'); Ima,' izing Filter Design MATLAB Program function savejilter roeff (H_c,dimension,inteφ,kemel_n,file_name) % SAVΞ_FILTER_COEFF generates vector or matrix coefficient sets % for inteφolation and decimation of image data in a To sequential order. ; Parameters: % H_c = set of vectors in a matrix form inteφ * kernel % dimension = 1 dimensional vector filter, 2 dimensional matrix % filename = file to write data into if (length(file_name) > 1) chdir DSP_Stuff:DSPJnterpolation:Inteφθlation_.Coefficients; de!ete(file_name); %delete or else we append to a file! if (dimension a* 1) % For One Dimension Filters (Jim Whitcomb), % save the Vectors by ROW: for rowsl:inteφ for colsl:kemeI_.n fprintf(file_name,'%18.14fW,H_c(row,col)); end; end; else % For Two Dimension Filters (Tim Byrne), % Compute the Filter coefficient matrices and save them To in a sequential order: % Two dimensional interpolation coefficient generation: % Now, do you want to generate the positional varying Matrices % of the Tensor H_hat, where each coefficient matrix Hjk is % a kemel_n x kemel_n (4x4) computed from: To o H Jk = H_c.j,:)'*H_c(k,:) (the vector outer product) for j=l:inteφ for kalύntβφ H Jk = H_c(j,:)'Η_.c(k,:); % Vector OUTER Product % Write the Coefficient Matrix Hjk to disk by ROW: for .ow=l:kemel_n for col=l:kemel_.n fprintf(file_name,'%18.14fW,HJk(row,col)); end; end; Tofprintf('\nMatrix HJ%g %g) Gain %gW, j, k,... % ' sum ( sι_m(H k))); e .d; end; e ; e d; Λ.'l'i.NUlX Ii s so,:wcrc is proprieCar e program source, listing, "ry and executable files _ 3- Per.: Company property ....d may not be distributed or C y..-d for non-Du Por.c use :r.: : :.ne express written approval of company management. "6 - * * C ;OoDpyVright (c) 1990 E. I. du Pont de Nemours & Company. All riches reserved. J.A. Whitcomb Rev. 1 - June 14, 1990 This first version was to simulate the architecture for a hardware simulator, and thus was not an effecient software implementation. Rev. 2 - August 23-29, 1990 A major revision! The architecture was optimized for implementation in software. User interface remained but interpolation changed completely. Rev. 3 - September 18-25, 1990 Major change was to replace the method of mapping output pixels to the input image, now using a rational fraction rather than a floating numbe: Continued documentation improvements begun in Rev. 2. Rev. 3.1 - October 11, 1990 Added command line arguments from a file (fcommandO and flag -c) Added flag -X to execute the interpolation mainloop Added flag -a to force output aspect ratio :RI?TION . • lain program for the interpolator software. Parses command line arg mε: and calls mainloop0 to do the actual resizing. crr.ar.d line arguments argc and argv. See also Resize Users Manual. See ote under I/O, SIDE EFFECTS, ETC. below. See code comments, espec: heading the non-flag parsing section. iA S - Defined stru t imgjlef image image storage for input and output struct imgjjef t_img temporary image storage struct resize_def hdef horiz resize parameters struct resize_def vdef vert resize parameters struct arc def arg interpreted command line arguments *infp input file reference *outfp output file reference st io. for stderr, fprintf (), FILE, fopen(), sp: console.h for ccocπ an () — for ThinkC for Macintosh C Lϊ string. for strcpy .h for atoi() for isdigit(. , ' r. for cleanup(), mainloop (;, usage (5 , fcommand;, , NIL image, t_img, arg, *outfp, hdef, vcε: O92/12495 resize.c Copyright (c) 1990 E. I. du Pont de Nemours & Company. All rights reserved. J.A. whitcomb Rev. l - June 14, 1990 This first version was to simulate the architecture for a hardware simulator, and thus was not an effecient software implementation. Rev. 2 - August 23-29, 1990 A major revision! The architecture was optimized for implementation in software. User interface remained but interpolation changed completely. Rev, 3 - September 18-25, 1990 Major change was to replace the method of mapping output pixels to the input image, now using a rational fraction rather than a floating number. Continued documentation improvements begun in Rev. 2. Rev. 3.1 - October 11, 1990 Added command line arguments from a file (fcommando and flag -c) Added flag -X to execute the interpolation mainloop Added flag -a to force output aspect ratio DESCRIPTION Main program for the interpolator software. Parses command line arguments and calls mainloop() to do the actual resizing. ARGUMENTS Command line arguments argc and argv. See also Resize Users Manual. See note under I/O, SIDE EFFECTS, ETC. below. See code comments, especially heading the non-flag parsing section. G 03ALS - Defined struct img def image image storage for input and output struct img ief t_i_ng temporary image storage struct resize_def hdef horiz resize parameters struct resize~def vdef vert resize parameters struct arg lef arg interpreted command line arguments *infρ input file reference FILE *outfp output file reference RZTURN None • SSCCIATED FILES stdio.h for stderr, fprintf(), FILE, fopen(), sprintf(), getchaπ console.h for ccommandO — for ThinkC for Macintosh ONLY string. for strcpyO stdlib.h for atoiO ctype.h for isdigitO resize.h for cleanup() mainloop() , usage () , fcommand() , NIL image, t_img arg, *infp, *outfp, hdef, vdef es of Called Functions: ~ usage.c command.c mainloop.c See also: Resize Users Manual for complete description including command line _ Rev. 3.1 Update definition and usage. :/C, SIDE EFFECTS, ETC. NOTE: The use of ccommandO to get UNIX command line arguments is for the THINK C 4.0 environment. The precompiler will remove for otner environments for compatability. Command line parsing silently ignores undefined flags. If no significant flags are given (where flags 'i', r o', 's', and 'e' are considered significant) then no resize is attempted. Cr. successfully opening an input or output file ε message is output to stderr. On failure to open either file an error message is output to stderr. / •include <stdio.h> =i def THINK_C sinclude <console.h> -er.άLf 'include <stdlib.h> ?include <string.h> <ctype.h> =include "resize.h" Λ - .'-iacro to parse command line arguments of the form "AfK" where "A" is the * argument flag, "#" is a (long int) consisting of the decimal digits [0...9J, * and "K" is an optional multiplier flag. If "K" is given the value of "#" is * multiplied by 1024. * NOTE: the pc— is to compensate for the increment of pc in the parsing for loop. ' TΞ: the break ending the macro. */ =cefι..e IntParse(var, c) var = atoi (++pc) ; \ while ( isdigit(*pc) ) \ pc++; \ if ( *pc — 'K' ) \ var *- 1024; \ else \ pc—; \ by = c; \ break; struct ιmg_def image, /* input and output image */ t_img; /* internal temporary image */ Ξz — res ze_def hdef, /* holds horizontal resize parameters */ vdef; /* holds vertical resize parameters */ Ξtru ; =rg_cef arg; /* contains command line arguments */ 'infp " stdin, /* input and output file references */ 'outfp = stdout; main(argc, argv) int argc; • char *argv[); fcza f' -r- S i/asr a h/us T2> yec . υ r z-r /c rχi $ -<s_ register char *pc; <_? . v _ y r s char by » I _ I int notinputfn ■ 0; s .f*Hd_e_« T THINK C get command line arguments under Think C 4.0 on Macintosh argc = cco mand(iargv) ; #endif if ( argc <- 1 ) { usage(); return; } else if ( argc » 2 && *argv[l] !» '-' get all command arguments from a file names by the second argument. */ argc = fcommand(fiargv) ; _ime_stamp(NULL, "Begin Resize") default (initialize) storage for command line argument parsing "/ arg.flag = arg.aspect « 0; arg.cinx = arg.coutx » 256; arg.rinx = arg.routx ■ 0; arg.cins = arg.rins - 1; arg.cine = arg.rine «= 0; arg.kernal = 'l 1 ; arg.header - 'n'; arg.infn[0] = arg.outfn[0] » NIL; parse command line arguments */ while ( —argc > 0 ) { /* for each argument */ if ( (*++argv) [0] « ) { /* see if argument is a flag */ Flag arguments consist of a '-' followed by a flag character followed as appropriate with additional characters. Multiple flag characters may follow one '-' with no intervening white space. Multiple flag arguments may be used interspersed with non-flag arguments. All processing is done after comolete 495 * parsing of the command line. '/ or ( pc - argv(0]+l; *ρc !» 0; pc++ ) { switch (*pc) { /* act on each flag in turn - I case 'i' : IntParse(arg.cinx, 'i'); case 'o': IntParse(arg.coutx, O 1 ); case 's' : IntParse(arg.cins, 's'); case 'e': IntParse(arg.cine, 'e'); case 'x': switch (by) { case 'i' : IntParse(arg.rinx, • '); case 'o': IntParse(ar .rout , 'x'); case 's': IntParse(arg.rins, 'x'); case 'e' : IntParse(arg.rine, 'x') ; default: ; /* ignore */ ) break; case l Jc l : arg.kernal « *++ρc; break; case 'h': arg. eader « *++pc; break; case 'q' : usage(); break; case 'f: arg.flag « 1; break; case 'a': arg.aspect » 1; break; case 'n': notinputfn « 1; break; case r c': argc * fcommand(fiargv); break; case 'X': if { by — '-' f I by — '+' ) break; /* no significant input */ mainloop(); /* execute the interpolation loop */ by ■ .'+'; /* filenames now considered significant */ notinputfn « 0; /* next filename is for input */ 2/12495 infp » stdin; outfp ■ stdout; arg.infn(O) «* arg.outfn(O) = NIL; break; default: /* ignore */ } /* end of switch (*pc) *7 ) /* end of for ( pc ... ) */ /* end of if ( (*++argv) (0] ... ) */ else { /* therefore is a non-flag argument */ * Non-flag arguments are filenames, which are parsed using one * of these templates: * resize -flags infn $s outfn * resize -flags -n $$ outfn * where 'infn' is the input filename with or without extension * 'outfn' is the output filename without extension * '$$' is any additional non-flag arguments, which have no effect * 'infn' is the first non-flag argument if the 'n' flag is not given * 'outfn' is the last non-flag argument if the 'n' flag is not given * AND there is more then one non-flag argument. * * There is no error checking for the existance of filenames on the * command line, as defaulting is allowed. Defaults are':. * infn and outfn default to an empty string, * infp defaults to stdin, and outfp defaults to stdout. * * If "infn" is given an attempt is made to open for read "infn". If that * fails then an attempt is made to open for read "infn.cpf" (if a cpf * style header is to be read) or "infn.img" (otherwise.) If both * attempted opens fail an error message is output to stderr. * * if "outfn" is given an attempt is made to open for write "oυtfn.cpf" * (if a cpf style header is to be output) or "outfn.img" (otherwise.) * If the open fails an error message is output to stderr. */ if ( notinputfn ) { /* * Thus an output filename given * * Append to the filename ".cpf if a header is to be output, * otherwise append ".img" • / if ( arg. eader «- 'o' II arg.header = 'b' ) sprintf(arg.outfn, "%s.cρf", *argv) ; else sprintf(arg.outfn, "%s.img", argv) ; . ( (outfp » fopen(arg.outfn, "w")) «=» NULL ) ( fprintf(stderr, "ERROR...could not open output file '%s'\n", arg.outfn) ; return; } fprint (stderr, "Output file '%s' opened.n", arg.outfn); if ( by — ■ +' ) by - - Z - : ) else { * It is an input filename given * Try first opening filename as given */ strcpy(arg.infn, *argv) ; if ( (infp - fopen(arg.infn, "r")) — NULL ) { /* * Could not open as given so try with appropriate extension * Append to the filename ".cpf" if a header is to be read, * otherwise append ".img" */ if ( arg. eader ■» 'i' 11 arg.header *= 'b' ) sprintf(arg.infn, "%s.cρf", *argv); else sprint (arg.infn, B %s.img", *argv) ; if ( (infp - fopen(arg. nfn, "r")) — NULL ) { fprintf(stderr, "ERROR...could not open input file '%s' or ' s *argv, arg.infn); return; ) } notinputfn « 1; fprint (stderr, "Input file '%s' opened\n n , arg.infn); if ( by — •+• ) by » 'z 1 ; /* end of while ( —argc ... ) */ /- * This completes parsing of command line arguments */ * check for any significant input • / if ( by I- •-' &£ by !■ •+• ) mainloo (); __, „,- _ ■ (stderr, "Thankyou...\n") ; mainloop.c Copyright (c) 1990 E. I. du Pont de Nemours fi Company. All rights reserved. .A. hitcomb Rev. 2 - August 24, 1990 Rev. 3 - September 20-25, 1990 Rev. 3.1 - October 12, 1990 Added cleanup() call, moved from resize.c DESCRIPTION This is the main function of the resize task. Main activities are: initializes struct members, including LUTs reads and writes header if requested reads and writes image interpolates (resizes) image in-memory ARGUMENTS None GLC2ALS - Used struct img_def • image image storage for input and output struct img_def tJLmg temporary image storage struct arg__def arg interpreted command line arguments "ILΞ *infp, *outfp input and output file references struct resize lef hdef, vdef horiz fi vert resize parameter RETURN OK if all goes well ERROR if any error is detected; i.e., any called function returns ERROR ASSXIATΞD FILES stdio.h for sprintf(), FILE string,h fpr strcpyO resize. for mainloo () , image__rea () , image_write(), initialize () , initcoefO, image~read(), interpolate () , image_write(), arg, image, t__img c?f_hdr.h for hdr, cpf hdr Tnit(), cpf hdr read(), cpf hdr_write() Called by: "" resize.c Files of called functions: c?f_hdr .nit.c cpf_hdr_read. c initialize . c c?f_hdr_write.c i.mtcoef . c mage_read.c interpolate.c age__write.c cleanup.c I /O, SICE EFFECTS, ETC. Causes an image to be read, interpolated, and written. /» ' initialization needed by cpf hdr write if no header is read '/ c?f_hdr_iπit(); f : arg.header ■» 'i' || arg.header ■= 'b' ) { / « τ Read header from input file '/ if ( cpf vdr read (infp) !« OK ) return; /' * use the header defined input image size * this takes precedence over the command line input,, if any */ arg.cinx « hdr. ixels; arg.rinx « hdr.lines; ' Default fi bounds checking, constant calculations, etc. _ if . initialize() !■ OK ) return; if ( arg. eader =» 'o' II arg.header «=* 'b' ) { * Change header struct information to reflect the output image '/ hdr.pixels « = arg.coutx; /* change image size */ hdr.lines ■ arg.routx; strcp (hdr.filename, arg.outfn); /* change filename */ ' Change the description to include the resize function */ sprint (buf, "resize(%5.3fx%5.3f)%c; %s", (double)hdef.interp / (double)hdef.decimate, (double)vdef.interp / (double)vdef.decimate, arg.kernal, hd .descript ) suf[80) ■ NIL; /* limit to 80 characters */ strcpy(hdr.descript, buf); put header in output file -/ if ( cpf_hdr_write(outfp) != OK ) return; * define coefficient look-up tables based on kernal type -/ if ; mitcoef() !- OK ) return; /- * define the image size then read the image image. idth » arg.cinx; image.height » arg.rinx; ιm.e_stamp(NULL, "Begin image read"); if ( image_read(infp, fiimage) !■ OK ) return; /- * define maximum height (width of t-img) for output image ' then do vertical interpolation "/ z img.width - arg.routx; if ( arg.flag ) { t_me_staπ.p(NULL, "Dump input image"); dump_img(fiimage) ; t_r.e_stamp(NULL, "Begin vertical interpolation"); if ( interpolate(fiimage, fit_img, fivdef) !- OK ) return; I- * define maximum width for output image * then do horizontal interpolation _ / image.width « arg.coutx; if ( "Dump temporary image"); Cmp_img(fit ^ img) ; ιme_starap (NULL, "Begin horizontal interpolation" ) ; f ( interpolate (δt_img, fiimage, fihdef) !■ OK ( ') return; output the interpolated image -/ f { arg.flag ) { time_stamp(NULL, "Dump output image"); άump_img(fiimage); : me_stamp(NULL, "Begin image write"); age_write(outfp, fiimage) ; :lea.up{); /* close files, deallocate memory */ :ιme_stamp(NULL, "Completed Resize"); re rn; _ define or alter most variables in the global strυcts defining tne resizing function, thus implementing value defaulting / • * The following is needed by cleanup() should initialize() return with ERROR */ image.img(0) » t_img.img(0) ■ NULL; * check valid range and provide defaulting to command line entered values • / range_chec (arg.cinx, MINSIZE, MAXSIZE, "Input width", fierr); rar.ge_check(arg.coutx, MINSIZE, MAXSIZE, "Output width", fierr); if ( arg.rinx — 0 ) arg.rinx - arg.cinx; /* default */ else range_check(arg.rinx, MINSIZE, MAXSIZE, "Input height", fierr); if ( arg.cine ■— 0 ) arg.cine » arg.cinx; /* default */ else range_check(arg.cine, MINSIZE, arg.cinx, "Input end width", fierr); if ( arg.rine ■- 0 ) if ( arg.cine «■» arg.cinx ) arg.rine ■ arg.rinx; /* default */ else arg.rine - arg.cine; /* alternate default */ rar.gε_check(arg.rine, MINSIZE, arg.rinx, "Input end height", fierr); ?-_r.cs check and default (calculate) cins fi rins ' arc.cms <= 1 ) T 64 S91/09159 arg. cins « 1; /* default */ _lse f ( arg. cine - MINSIZE + 1 < arg. cins ) arg. cins « arg. cine - MINSIZE + 1; arg.rins < « 1 ) irg.rins » arg.cins; default */ f : arg.rine - MINSIZE ■ < • 1 < arg.rins ) \s ' « arg.rine - MINSIZE + 1; culate the input range for interpolation C. w . _-.._ arg.cine - arg.cins + 1; erc.rmr arg.rine - arg.rins + 1;_ arg.aspect arg.routx » (long) ((double) rg.coutx * (double) rg.rinr / (double)arg.cinr + .5) else if ( arg.routx —■ 0 ) arg.routx « arg.coutx; /* default */ range_chec (arg.routx, MINSIZE, AXSIZE, "Output height", «err) ; if ( err ) retur (ERROR); /* at least one range ^ check was out of bounds - / /* "' * Define the desired resizing in terms of interpolate and decimate factors, * where both factors are positive integers. The resize is then defined by the * fraction of these factors, i.e., the resize ratio is interp / decimate. */ hdef.decimate » arg.cinr; hde .interp ■ arg.coutx; vde .decimate « arg.rinr; vcef.ir.terp » arg.routx; /« * Reduce the resize fraction by removing common factors. * Thus for example, 2/4 becomes 1/2. « / reduce(fihdef.decimate, fchdef.interp); res ce(fivdef.decimate, fivdef. nterp) ; * Check for valid resize ratios (cannot use range_check() as rat c s a double. ra c = (double) hdef.decimate / (double) hdef.interp; .: ' ratio < MINRATIO I I MAXRATIO < ratio ) { fprmtf(stderr, "ERROR...width resize ratio %5.3f = %ld / %ld", ratio, hdef.decimate, hdef.interp) ; fprmtf(stderr, " not in range %5.3f to * %5.3f\n", MINRATIO, .AXRATIC ; retur (ERROR) ; ratio = (double) vdef.decimate / (double) vdef.interp; if ' ratio < MINRATIO II MAXRATIO < ratio ) { fprmtf(stderr, "ERROR...height resize ratio %5.3f - %ld / %ld", ratio, vdef.decimate, vdef.interp) ; fprmtf(stderr, " not in range %5.3f to %5.3f\n", MINRATIO, MAXRATIC: return(ERROR); • Calculate input map of first output pixel hcef.denom = 2 * hdef.interp; hdef.stepf - 2 * hdef.decimate; πdef.mapf β hdef.decimate - hdef.interp + 2 * hdef.interp * arg.cins; r.def.mapn ■ hdef.mapf / hdef.denom; /* get the integer part */ hdef.mapf %« hdef.denom; /* rest is fractional part */ vdef.denom ■ 2 * vdef.interp; vdef.stepf « 2 * vde .decimate; vdef.mapf - vdef.decimate - vdef.interp + 2 * vdef.interp τ arg.rins; vdef. apn - vdef.mapf / vdef.denom; /* get the integer part */ vdef.mapf %» vdef. enom; /* rest is fractional part */ / • NOTE: The first output pixel is maped at (hdef.map, vdef.map) where map - mapn + mapf / denom (and likewise for vertical throughout) Subsequent pixels axe mapped by stepping through the image using map » map + step ■ map + stepf / denom This is actually implemented by using the following statements: mapf +■ stepf; ** increment ** mapn +» mapf / denom; ** integer part ** mapf %- denom; ** remaining fractional part ** Using this procedure mapf will always bie in the range 0 to (denom - 1] See in particular macro defined in interpolate.c τ allocate memory for the two image storage areas • / ; » (arg.rinx > arg.routx) ? arg.rinx : arg.routx; :< = (arg.cinx > arg.coutx) ? arg.cinx : arg.coutx; for ( i - 0; i < j; i++ ) if ( (image. mgCi] ■ (img_type *) malloc( (size_t) k ) ) — NULL ) { fprintf(stderr, "ERROR...could not allocate image storage (%d) \r.", i, return(ERROR); f r ' = C; i < arg.cinx; i++ ) if : (t_img.img(i) » (img_tyρe *) malloc( (size_t) arg.routx }) = NULL . fprintf(stderr, "ERROR...could not allocate t_img storage (.d) ...", , return(ERROR) ; As ar. error check, force the next pointers to a NULL Cr.ec ed m interpolate.c ι.-age.imgι j] s NULL; t_ .τ.g. ιmg[arg. cinx] ■ NULL; * output to stderr information defining the resize operation fprmtf(stderr, "Input Image Size: %51d x %-51d\n", arg.cinx, arg.rinx); fprmtf(stderr, "Resize Image Area: %51d x %-51d to %51d x %-51d\n", arg.cins, arg.rins, arg.cine, arg.rine); fprmtf(stderr, "Output Image Size: %51d x %-51d\n", arg.coutx, arg.routx); fprmtf(stderr, "Reduced Fractional Resize Ratios: %ld / %ld x %ld / %ld\n", hdef.interp, hdef.decimate, vdef.interp, vdef.decimate) ; rmtf(stderr, "Resize Ratios: %β.3f x %β.3f\n", (double)hdef.interp / (double)hdef.decimate, (double)vdef.interp / (double)vdef.decimate) ; fp mtf(stderr, " Step Size: %6.3f x (double)hdef.stepf / (double)hdef.denom, (double)vdef.stepf / (double)vdef.denom); f rmtf(stderr, "1st output mapped to input at: "); fprmtf(stderr, "%ld + %ld / %ld x %ld + %ld / %ld\n", hdef.mapn, hdef.mapf, hdef.denom, vdef.mapn, vdef.mapf, vde .denom, ; cp .-,rmt (stderr, "Kernal type is ^c'Nn", arg.kernal); (stderr, "Memory allocated: Input/Output: ") fprintf (stderr, "%31d x %31d Temp: %31d x %31d\n", k, j, arg.routx, arg. cinx) ; return (OK) ; r.izcoe . c Copyright (c) 1990 E. I. du Pont de Nemours & Company. All rights reserve: .Λ. hitcomb Rev. 1 - June 14, 1990 Rev. 2 - August 23-29, 1990 Rev. 3 - September 19-25, 1990 Major change. Now uses allocated memory of size needed for LUT. Uses fractional description of resize ratio to determine LUT resol t on Rsv. 3.1 - October 12, 1990 3etter definition handling of size_t INSCRIPTION " ills in the coefficient look-up tables (LUT) based on the specified kernal type (command line argument k.) A-RGl.-ΞNTS None GLCΞALS - Used struct arg_def arg interpreted command line arguments members used: kernal, flag struct resize_def hdef horiz resize parameters struct resize_def vdef vert resize parameters RETURN OK if all goes well ERROR if any error is detected, specifically: kernal type not defined could not allocate storage for hclut ot vclut the called definelut_*** functions returns ERROR ASSOCIATED FILES stdio.h for stderr, fprintf(), NULL stdlib.h for size_t — callocO for ThinkC for Macintosh ONLY mailoc.h for callό " c() — for Unix resize.h or ERROR, OK,. KERNAL_SIZE initcoef() , definelut *** () Called by: mainloop.c riles of called functions: definelut__cubic.c cεfinelut~dupont.c dεfinelut_linear.c cefinelut_neaxest.c L/C SIDE EFFECTS, ETC. Normally the LUT tables are allocated and initialized appropriately, Or. ERROR outputs error message to stderr (although no new message for ERROR returns simply passed on from function calls.) _ag is set LUT values are printed to stderr. j, k; allocate memory for the LUTs ■ ; = 0; j < KERNAL SIZE; j++ ) { if C (hdef.lut[j] -~ * ( UT TYPE *) calloo( (size_t) hdef.denom, (size__t) sizeof(LUT_TYPE) J) -= ■ NULL ) {- fprintf(stderr, "ERROR...could not allocate storage for hclut (%d)\n", j. return(ERROR) ; f ( (vdef.lutCj] - (LUT TYPE *) calloc( (size_t) vdef,denom, (size_t) sizeof(LUT_TYPE) )) — NULL ) {. ■ _ fprintf(stderr, "ERROR...could not allocate storage for vclut (%d)\n", j); return(ERROR) ; printf(stderr, "Lookup tables allocated: Horizontal: "); fprmtf(stderr, "%3d x %31d Vertical: .3d x %31d\n", KERNAL SIZE, hdef.denom, KERNAL SIZE, vdef.denom); _-__- 3*. fill in the LUTs with the appropriate values based on the kernal type switc (arg.kernal) { case '1': /* Linear coef. */ if ( definelut_linear(fihdef) != OK 11 definelut_linear(fivdef) \ - OK ) return(ERROR) ; break; case 'd': /* Du Pont algorithm */ if ( definelut__dupont(fihdef) ! » OK 11 definelut_dupont(fivdef) != OK ) return(ERROR) ; ' ~~ break; case ! c': /* cubic spline */ if ( definelut cubic(fihdef) != OK || definelut cubic (fivdef) != OK ! return (ERROR) ; :reaJ_; 'r.': /* nearest neighbor replication */ f ; cefmelut_nearest(fihdef) != OK II definelut_nearest (-vcef, = ; return(ERROR) ; o ea ; la lt: fprmtf(stderr, "ERROR...kernal type '.c' not defined.n", arc...er..al return(ERROR) ; ♦ output LUT values if flag set » / if { arg.flag ) { =ιfcef C0U3LE__LUT ==ef e TKT " %5.3f" . = "β / ( KERNAL_SIZE * 6 - ■ 2 ) ; /* the number of LUT values per Ime * ' scefir.e FMT "%3x" = 76 / ( KERNAL SIZE * 3 + 2 ); /* the number of LUT values per line */ fprintf(stderr, "\nHCLUT: %c", arg.kernal); for ( i ■ 0; i < hdef.denom; i++ ) { if ( ! (i % k) ) fprintf(stderr, "\n%3d:", i) ; else fprintf(stderr, " -"); for ( j » 0; j < KERNAL SIZE; j++ ) fprintf(stderr, FMlT hdef.lut[j] [i)) ; fprintf(stderr, "\n\nVCLUT: %c", arg.kernal); for ( i ■ 0; i < vdef.denom; i++ ) ( if ( ! (i % k) ) fprintf(stderr, "\n%3d:", i) ; else fprint (stderr, " -"); for ( j ■ 0; j < KERNAL_SIZE; j++ ) fprintf(stderr, FMτ7 vdef.lut[j] [i]); fprintf(stderr, "\n\n"); retur (OK) ; csfιr_eiut_cubic.c Copyright (c) 1990 E. I. Du Pont de Nemours fi Company. Ail rights reserved. .A. hitcomb Rev. 2 - August 23, 1990 Rev. 3 - September 19-25, 1990 - CEΞCRIPTION Defines the LUT according to a cubic spline algorithm. struct resizejief def reference to a structure containing LUτ<Tτ* " ~ and spatial resolution (denom) None • RETURN CK if all goes well ERROR if any error is detected, specifically: <« currently no errors are checked for >» • ASSOCIATED FILES resize.h for ERROR, OK, KERNAL_SIZE LUT_RESOLUTION, definelut_cubic() stdio.h for FILE used by resize.h • Called by: initcoef.c ' I/O, SIDE EFFECTS, ETC. Cr. ERROR outputs error message to stderr Otherwise the contents of the referenced LUT are changed. ASSUMES KERNALjSIZE is 4. Smaller values will give a SILENT erro: Larger values will not be taken advantage of. ϊi.-.cl ce <stdio.h> .include "resize. " t de elut_cubic(def) str-ct resize_def *def; register int i; register double x, x2, x3, k; sifcef CCU3LΞ_LUT . = (double) def->denom; . i = 0; i < def->denom; iτ+ ) { x - (double) i / k; x2 « x * x; UT_R£S0LUTI0N; ( i~= 0; i < def->denom; i++ ) { x = (double) i / (double) def->denom; x2 = x * x; x3 = x2 * x; def->lut[3] [i] - (long) (( -(2./15.J * x - x2 / 5. + x3 / 3. ) * k) ; def->lut(2][i] » (long) (( (4./5.) * x + (β./5.) * x2 - x3) * k); def->lut[l][i] « (long) (( 1. - (1./5.) * x - (9./5.) * x2 + x3) * k) ; cef->lut[0)(i] - LUT RESOLUTION - def->lut[3][i] - def->lut[2](i] - def->lut[l] [ij; def->lutI0Jti] - (long) (( -(7. /IS.) * x + (4./5.) * x2 - x3 / 3.) * k) ; » / return (OK) ; i.T.a e reac. c Copyright (c) 1990 E. I. du Pont de Nemours fi Company. All rights reserve: J.A. Whitcomb Rev. 2 - August 24-29, 1990 Rev. 3 - September 20-25, 1990 Rev. 3.1 - October 12, 1990 Better definition handling of size_t DESCRIPTION Reads an image from input file and stores in image array. ARGUMENTS FILE *fp reference to a file assumed opened for read struct img_def *image reference to image including image size to read and image storage None r£Z"J? CK if all goes well ERROR if any error is detected, specifically: invalid file reference given image_read width or height out of range (message by range_check() ) cannot read input image ASSOCIATED FILES stdio.h for stderr, fprintf(), FILE, fread(), NULL string.h for size_t resize. for ERROR, OK, struct img_def, range_check() , imaσe_read() Called by: mainloop.c Files of called functions: range_check.c See also: image_write.c I/O, SIDE EFFECTS, ETC. On ERROR an error message is output to stderr (possibly by range_check() : Normally the image is read from the referenced file and the image is stored in the image member of the referenced image struct. ^he size of the image read is defined by the size members of the referenced image struct. ' / <stdio.h> <string.h> "resize.h" _.τ.=g=_read (fp, image) register FILE *fp; register struct img ^ def *image; register long i, h, w; t err » 0; if : fp — NULL ) { fprintf(stderr, "ERROR...invalid file reference given image_read ..-."; ; return(ERROR) ; r. = image->height; - = image->width; rs.ge_check(h, MINSIZE, MAXSIZE, "iraage_read height ", fierr); rar.ge_chec (w, MINSIZE, MAXSIZE, "image read width", fierr); f ( err ) return(ERROR); for ( i - 0; i < h; i++ ) { if ( fread(image->img[i], (size__t) 1, (size__t) w, fp) !<= w ) { fprintf(stderr, "ERROR...cannot read input image (line %d)\π", i); return(ERROR) ; ) return(OK) ; .εrpolate.c.essence Copyright (c) 1990 E. I. du Pont de Nemours 5 Company. All rights reserve. J.A. Whitcomb Rev. 3.1 -- October 15, 1990 CRIPTION Performs a one directional interpolation of a two dimentional image. Zr.s resultant image is stored rotated & fliped ready for a second pass tr.rough this function to do the second directional interpolation. n fter tr.e second pass the image is returned to its original orientation (that is, wo rotate and flip operations leave an image unchanged.) ~-r.o^.\__,-'<._ _j struct i g j def *from image to interpolate struct imgjdef *to interpolated image, rotated and flipped struct resize_def *def resize parameters, including lut -_vC-_^ ——_.• * * CK if all goes well ERROR if any error is detected, specifically: invalid argument given interpolate * ASSOCIATED FILES stdio.h for stderr, fprintf(), fflushO resize.h for struct img j def, struct resize_def Called by: r-.air.ioop.c * See also: initialize.c for initial mapping values and definition * I/O, SIDE EFFECTS, ETC. ' r.e to struct is redefined . based on the interpolation Or. ERROR outputs error message to stderr -include <stdio.h> ! induce "resize,h" mt interpolate(from, to, def) struct img j def *from, *to; struct resize def *def; r.= ύ to assign most appropriate variables to registers 92/12495 75 n, f; 0 ___ { ■ ι.j> < z ~ l<-'> - ft - S- ft nn, ff, to__height, to - ii etc- ιu/ ) tz>r i" i *$- to width, max, v, out col - 0; ic ster img_type *d0, *dl, *d2, *d3; recister double cO, cl, c2, c3; i; = to->height «= from->width; • • dth = to->width; (/c- - > <l l "'-ιιι Deals with output pixels which map before the first input pixel Boundary condition 1 Le ( nn < 1 fifi outcol < tojwidth ) { d2 = from->img[0]; d3 = from->img[l] ; c2 = def->lut[0] [ff] + def->lut[l] [ff] + def->lut[2] [ff] ; z2 = def->lut[3] [ff] ; for ( i = 0; i < to_height; i++ ) { v - (long) ((double) *d2++ * c2 + (double) *d3++ * c3 + 0.5) to->img[i] [outcol] = (img_type) v; outcol++; ff +■ def->stepf; /* increment */ r.n ■ < • -' ff / def->denom; /* integer part */ ff %» def->denom; /* remaining fractional part */ * Deals with output pixels which map between the first and second input pixe - Boundary condition 2 »/ ■ -r.ile ( n « = 1 && outcol < tojwidth ) { dl = from->img[0] ; z2 » from->img[lj; 3 = from->img[2]; d = def->lut[0] [ff] + def->lut[l][ff]; c2 = def->lut[2J [ff]; = cεf->lut[3] [ff]; : { i = 0; i < to_height; i+÷ ) { v = (long) ((double) » dl++ * cl ÷ (double) *d2++ * c2 • <- (double) * 3+-"- * c3 tc-> mg[i] [outcol] = (ιmg_type) v; -= def->stepf; increment */ -= ff / def->denom; /* integer part */ %= def->denom; /* remaining fractional part <- » / Deals with the bulk of the image where the output pixel maps between the second and next-to-last input pixels. Cmer sections deal with boundary conditions outside this range. = from->height - 1; e ( nn < max fifi outcol < tojwidth ) { d = from->img[nn - 2); d - from->img[nn - 1] ; zl - from->img[nn]; d3 = from->img[nn + 1); cO = def->lut[0] [ff]; d = def->lut[l] [ff]; c2 = def->lut[2] [ff]; c3 - def->lut[3] [ff] ; for ( i - 0; i < to_height; i++ ) { v = (long) ((double) *d0++ * cO + (double) *dl++ * cl + (double) *d2++ * c2 + (double) *d3++ * c3 + 0.5); to->img[i] [outcol] = (img_type) v; f -= def->stepf; /* increment */ ". -= ff / def->denom; /* integer part */ ff %= cef->denom; /* remaining fractional part */ Deals with output pixels which map between the next-to-last and last input pixels Boundary condition 3 e ; r.r. < max fifi outcol < tojwidth ) { dC = from->img[nn - 2]; d = from->img[nn - 1); dl = from->img[nn] ; d = cef->lut[0] [ff]; d = cef->lut[lj [ff]; d = cεf->Iut[2] [ff] f def->lut[3][ff); for ; i = 0; i < to_height; i÷+ ) { v = liong) ((double) *d0+÷ * cO T (double) *dl++ * cl (double) *d2++ * c2 + 0, to->img[i] [outcol] - (img_type) v; -= def->stepf; /* increment */ '= ff / def->denom; /* integer part */ %= def->denom; /* remaining fractional part Deals with output pixels which map after the last input pixel Boundary condition 4 outcol++; ff + - def->stepf; /* increment */ -r. *- ff / def->denom; /* integer part */ :: ' %= def->denom; /* remaining fractional part * / tf ( stderr, BULLET) ; mtf (stderr, "\n") ; :rr. (O ) ; srpolate . c Copyright (c) 1990 E. I . du Pont de Nemours 5 Company . All rigr.ts reserv? J.A. hitcomb Rev. 3 - September 13-25, 1990 Completely rewritten function. Assumes (double) luts anc coes tr.e main calculation in floating point (double) , Rev. 3.1 — October 15, 1990 Added ALLOWjDEBUG precompiler flag to make more effecier.t r.orrr.εl cede. :RI?TION Performs a one directional interpolation of a two dimentional image. ' r.e resultant image is stored rotated & fliped ready for a second pass through this function to do the second directional interpolation. After tr.e second pass the image is returned to its original orientation (that : wo rotate and flip operations leave an image unchanged. ) image to interpolate interpolated image, rotated and flipped resize parameters, including lut CX if all goes well ERROR if any error is detected, specifically: invalid argument given interpolate ASSOCIATED FILES stdio.h for stderr, fprintf(), f lush() resize.h for struct imgjdef, struct resize j def illed by: mainloop.c ;e also: initialize.c for initial mapping values and definition , SIDE EFFECTS, ETC. ~ ' r. to struct is redefined based on the interpolation Cr. ERROR outputs error message to stderr Places a series of six '•' (or '*') to stderr to map progress <stdio.h> "resize.h" CpdateNF outcol++; ff + ■ def->stepf; increment */ \ nn + » ff / def->denom; /* integer part */ \ ff %» def->denom; /* remaining fractional part - I = fu-ction contains many conditional debugging print statements. ϊi .' z- for optimum run-time performance these are normally precompiled ou: me source. To permit using these statements add the following :c- _ dιer flag: seefine ALLOW DEBUG • .tsrpclate (from, to, def) _cef τ from, "to; ,_e def *def; r.eec to assign most appropriate variables to registers n, f; nn, ff, to_height, tojwidth, max, v, outcol ■ 0; recister imgjtype *d0, *dl, *d2, *d3; register double cO, cl, c2, c3; register :π; i; rom — NULL | | to — NULL | | def — NULL ) { fprmtf(stderr, "ERROR...invalid argument given interpolate\n": return (ERROR) ; sight = to->height from- width; :dtr. = to->width; def->mapn; e: " ->map ; ;ιaiize.c Copyright (c) 1990 E. I. du Pont de Nemours fi Company. All rights reservec. .A. whitcomb Rev. 1 - June 15, 1990 Rev. 2 - August 24-29, 1990 Rev. 3 - September 21-25, 1990 Rev. 3.1 - October 12, 1990 Added calculation for forcing output aspect ratio (flag -a; 3etter definition handling of size_t LRIPTION Does various defaulting, range checking, and initialization calculations prior to actual resizing. Also allocates image memory. image storage for input and output temporary image storage interpreted command line arguments horiz resize parameters vert resize parameters RETUN OK if all goes well ERROR if any error occurs, specifically: Input or output image size width or height not in range Input image resize end point width or height not in range width or height resize ratio not in valid range could not allocate storage for image or t_img •SSCCIATED FILES stdio.h for stderr, fprintf(), NULL stdlib.h for size t ~ mallocO for ThinkC for Macintosh ONLY .-alloc.h for mallόcO — for Unix resize. for ERROR, OK, MINRATIO, MAXRATIO, MINSIZE, MAXSIZE, image, t_img, arg, hdef, vdef, initialile( ' ) , range_check(), reduce() Lεlled by: -amloop,c " lies of called functions: rangejcheck.c recuce.c See also: interpolate.c for macro to increment maping : Z SIDE EFFECTS, ETC. Cutouts to stderr general information pertinent to the resizing. c- ERROR an error message is output to stderr. Deals with output pixels which map before the first input pixe! Boundary condition 1 fprmtf (stderr, BULLET) ; lush (stderr) ; - -. e ( nn < 1 δδ outcol < to width ) { i ce ALLOW DEBUG f ( arg . flag ) fprintf (stderr, "\n" ) ; 62 » from->img[0] ; d3 = from->img[l) ; c2 - def->lut [0] [ff] + def->lut [l] [ff] + def->lut [2] [ff ] ; c3 = def->lut [3] [ff] ; for ( i - 0; i < to height; i++ ) { ' i ce ALLOW )EBUG if ( arg. lag ) fprintf(stderr, "1 %3d %31d - %2X %2X : %5.3f %5.3 i,outcol, (unsigned int)*d2, (unsigned int) *d3, c2,c3); v = (long) ((double) *d2++ * c2 + (double) *d3++ * c3 + -C.5); if ( v < 0 ) v » 0; else if ( v > 255 ) v « 255; to->img[i] [outcol] » (img type) v; s ifdef ALLOW_DEBUG ~ if ( arg.flag ) fprint (stderr, " I %2X\n", (unsigned int)to->img[i] [outcol] ) ; ; UpdateNF; I- Deals with output pixels which map between the first and second input pixels * Boundary condition 2 • / fprmtf(stderr, BULLET); lus (stderr); w hile ( nn — 1 &fi outcol < to_width ) { sl cef ΛLLOW_DEBUG if ( arg.flag ) fprintf(stderr, π \n π ); send. = fro ->img[0]; = from->img[l] ; = from->img[2]; = def->lut[0] [ff] + def->lut[l] [ff]; = def->lut[2][ff]; ■ def->lut[3] [ff]; : ; i - 0; i < to_heιght; i++ ) ( ALLOW_DEBUG if ( arg.flag ) fprintf(stderr, "2 %3d V31d - %2X %2X %2X : %5.3f %5.3f %5.3f i,outcol, (unsigned int)*dl, (unsigned int)*d2, (unsigned int) *d3, cl,c2,c3); v = (long) ((double) *dl++ ' cl t (double) *d2++ * c2 + (double) *d3++ * c3 * C.5); if ( v < 0 ) v = 0; else if ( v > 255 ) v- 255; ro->img[i] [outcol] - (img_type) v; .-_LLO _OEBUG if ( arg.flag ) fprintf(stderr, " I %2X\n", (unsigned int)to->img[i] (outcol] ) ; s e .-.C Uodate F; * Deals with the bulk of the image where the output pixel maps between the second and next-to-last input pixels. 1 Other sections deal with boundary conditions outside this range. • / max ■ from->height - 1; fprintf(stderr, BULLET); fflush(stderr) ; while ( nn < max && outcol < to width ) { 'i def ALLOW_DEBUG *" if ( arg.flag ) fprintf(stderr, n \n π ) ; =ena : cO » from->img[nn - 2) ; dl = from->img[nn - 1] ; z2 = f rom->img[nn] ; d3 » from->img[nn + 1] ; cO « def->lutlOJ [ffl ; cl - def->lut [l] [ff) ; c2 - def->lut[2] [ff) ; c3 = ef->lut[3] [ffj ; for ( i « 0; i < to height; i++ ) { A10W_DEBUG if ( arg.flag ) fprint (stderr, "3 %3d %31d - %2X %2X %2X %2X : %5.3f %5.3f %5.3f %5. i,outcol, (unsigned int)*d0, (unsigned int)*dl, .(unsigned int)*d2, (unsigned int)*d3, cC,cl,c2,c3) ; v = (long) ((double) *d0+÷ * cO + (double) 'dl++ τ cl - (double) *d2++ * c2 + (double) *d3ι-τ * c3 - 0.5!; if ; v < c } v = C; else if ( v > 255 ) v - 255; to->ιmg[i] [outcol] « (img_type) v; ΛLLCWJ3E3UG " if ( arg. flag ) fprintf (stderr, " I %2X\n", (unsigned int) to->img[i] [oucccl! ) ■ sdaceNT. /. * Deals with output pixels which map between the next-to-last and last input pixels - 3oundary condition 3 */ max". fprintf(stderr, BULLET); fflush(stderr); while ( nn < max &£ outcol < to width ) ( 'i ef ALLO _DEBUG f ( arg. lag ) printf(stderr, "\n"); s e.di dO = from->img[nn - 2]; dl ■ from->img[nn - 1); d2 - from->img[nn); c2 - def->lut[2J[ffJ + dβf->lut[3J[ffJ; for ( i « 0; i < to height; i++ ) { ? if def ALLOW .EBUG "" if ( arg. flag ) fprintf (stderr, "4 %3d %31d - %2X %2X %2X : %5.3f %5.3f %5.3. i,outcol, (unsigned int)*d0, (unsigned int)*dl, (unsigned int) * L2, c0,cl,c2); wer.dif v m (long) ((double) *d0++ * cO + (double) *dl++ * cl + (double) *d2++ * c2 + 0.5); if ( v < 0 ) v = 0; else if ( v > 255 ) v - 255; to->img[i] [outcol] - (img_type) v; = :==: " λLLC _DEBUG if ( arg. flag ) fprintf (stderr, " I %2X\n π , (unsigned int)to->img[i] [outcol] ; : «<_r.c_ιf -ccate F; * Deals with output pixels which map after the last input pixel - Boundary condition 4 fprmtf (stderr, BULLET); fflusr. (stderr) ; --. le . nn = max &δ outcol < to_width ) ( = f=ef -_LL0 _DE3UG f arg. flag ) fprintf (stderr, "\n" ) ; d3 = from->img[nn - 2); =1 = from->img[nn - 1]; c: = def->lut[0] [ff]; cl = def->lut[l] [ff] + def->lut[2] [ff] + def->lut[3] [ff ] ; for ( i = 0; i < to_height; i++ ) { = ι:cef A-LLOW_DEBUG " if ( arg. flag ) fprintf (stderr, "5 %3d %31d - %2X %2X : %5.3f %5.3f i,outcol, (unsigned int)*d0, (unsigned int)*dl, c0,cl) v = (long) ((double) *d0++ * cO + (double) *dl++ * cl +-0.5); if ( v < 0 ) v ■ 0; else if ( v > 255 ) v » 255; to->img[i] [outcol} » (img_type) v; 'ifdef ΛLLOW_DEBUG if ( arg.flag ) fprintf(stderr, n | %2X\n", (unsigned int)to->img[i] [outcol] ) , ri. *- UpdateN?; mt (stderr, BULLET); mtf(stderr, π \n"5; return(OK) ; .τ.aςe_write.c ' copyright (c) 1990 E. I. du Pont de Nemours & Company. All rights reserve: .A. hitcomb Rev. 2 - August 2.-29, 1990 Rev. 3 - September 20-25, 19S0 Rev. 3.1 - October 12, 19S0 Better definition handling of size_t DESCRIPTION rites an image to output file from the stored image array. . ARGUMENTS FILE *fp reference to a file assumed opened for write struct img_def *image reference to image, including image size to write and image storage GLCEALS - Used char arg.outfn[] output filename RETURN CK if all goes well ERROR if any error is detected, specifically: invalid file reference given image_write cannot write output image ASSOCIATED FILES stdio.h for stderr, fprintf(), FILE, fwriteO, NULL string.h for size_t resize.h for ERROR, OK, image_write() , arg, struct img_def Called by: mainloop.c See also: image_read.c :/C, SIDE EFFECTS, ETC. Cr. E ROR an error message is output to stderr Otherwise the contents of image member of the referenced image struct s written to the output file using the size contained in the struct. Tr.e referenced image struct is unchanged. m.tl ce <stdio.h> : -.tl'_. e <string.h> "resize. " _r.eςe_-rιte (fp, image) re stsr FIL* * • fp; register struct img_def • image; t fp = NULL ) { fprintf (stderr, "ERROR. . . invalid file reference given image_write\r." ; retur (ERROR) ; h = mage->height; - = r.age->width; for { i » 0; i < h; i++ ) { if ( fwrite(image->img[i], (size_t) 1, w, fp) != w ) { fprint (stderr, "ERROR...cannot write output image (%d)\n", i); return(ERROR) ; } fprintf(stderr, "Output Image of size %ld x %ld written to %s\n", (long) w, h, arg.outfn); return(OK) ;

Claims: CLAIMS 1. A method of designing a filter for resizing an input image comprising a plurality of input pixels to generate a resized image comprising a plurality of corresponding output pixels while preserving the information content of the image, comprising the steps of: (a) selecting a first interpolation rate and a first decimation rate for a first sense; (b) selecting a second interpolation rate and a second decimation rate for a second sense; (c) selecting a first stopband attenuation and a a first sharpness factor for the first sense and a second stopband attenuation and a second sharpness factor for the second sense; (d) computing a first cutoff frequency for the first sense and a second cutoff frequency for the second sense; (e) establishing an input kernel having a first number of elements in the first sense and a second number of elements in the second sense; (f) generating a first low-pass filter for the first sense, the first low-pass filter comprising a first filter vector including a plurality of first coefficients; (g) modifying the first low-pass filter, comprising the steps of: (1) creating a first vector comprising a plurality of elements each having a value equal to unity, the first vector having a dimensionality equal to the first interpolation rate, and (2) convolving the first filter vector with the first vector to create a modified first filter vector comprising a plurality of the first coefficients; (h) generating a second low-pass filter for the second sense, the second low-pass filter comprising a second filter vector including a plurality of second coefficients; (i) modifying the second low-pass filter, comprising the steps of: (1) creating a second vector comprising a plurality of elements each having a value equal to unity and the second vector having a dimensionality equal to the second interpolation rate, and (2) convolving the second filter vector with the second vector to create a modified second filter vector comprising a plurality of the second coefficients; (j) creating a first set of coefficient vectors by selecting a plurality of the coefficients of the modified first filter vector as a function of the first interpolation rate, the first decimation rate and the first number of elements; ( ) creating a second set of coefficient vectors by selecting a plurality of the coefficients of the modified second filter vector as a function of the second interpolation rate, the second decimation rate and the second number of elements; (1) applying the first and second sets of coefficient vectors to a neighborhood of the values of input pixels adjacent each output pixel to compute the value of each output pixel and assigning the computed values to the corresponding output pixels, thereby producing the resized image; and (m) storing the resized image in an output memory device. 2. The method of claim 1, further including the step of obtaining the input image from an input memory device. 3. The method of claim 1, further including the step of storing the first and second sets of coefficient vectors in the output memory device. 4. The method of claim 1 , wherein the step of applying the first and second sets of coefficient vectors comprises the steps of applying the first set of coefficient vectors to the neighborhood of the values of the input pixels in the first sense to obtain a resultant set of pixels and applying the second set of coefficient vectors in the second sense to the resultant set of pixels. 5. The method of claim 1, wherein the step of applying the first and second sets of coefficient vectors comprises the steps of combining the first and second sets of coefficient vectors into a first set of matrices and applying the first set of matrices to the neighborhood of the values of the input pixels simultaneously in the first and second senses. 6. The method of claim 1, wherein the first interpolation rate and the first decimation rate are integers. 7. The method of claim 1, wherein the second interpolation rate and the second decimation rate are integers. 8. The method of claim 1, wherein the first and second numbers of elements are rounded to the next higher even integer. 9. The method of claim 1, wherein the step of generating a first low-pass filter includes the step of establishing a first window-based filter having a first predetermined odd filter length, the first predetermined filter length being a function of the first number of elements and the first interpolation rate. 10. The method of claim 1, wherein the step of generating a first low-pass filter further includes the step of establishing a first predetermined window length, the first predetermined window length being a function of the first number of elements and the first interpolation rate. 11. The method of claim 10, wherein the step of generating a first low-pass filter further includes the step of generating a first Kaiser window sequence, the first Kaiser window sequence being a function of the first predetermined window length and the first stopband attenuation. 12. The method of claim 11, wherein the step of generating a first low-pass filter further includes the step of generating a first Kaiser window filter, the first Kaiser window filter being a function of the first cutoff frequency, the first sharpness factor and the first Kaiser window sequence. 13. The method of claim 1, wherein the step of generating a second low-pass filter includes the step of establishing a second window filter having a second predetermined odd filter length, the second predetermined filter length being a function of the second number of elements and the second interpolation rate. 14. The method of claim 1, wherein the step of generating a second low-pass filter further includes the step of establishing a second predetermined window length, the second predetermined window length being a function of the second number of elements and the second interpolation rate. 15. The method of claim 14, wherein the step of generating a second low-pass filter further includes the step of generating a second Kaiser window sequence, the second Kaiser window sequence being a function of the second predetermined window length and the second stopband attenuation. 16. The method of claim 15, wherein the step of generating a second low-pass filter further includes the step of generating a second Kaiser window filter, the second Kaiser window filter being a function of the second cutoff frequency, the second sharpness factor and the second Kaiser window sequence. 17. The method of claim 1, wherein the first decimation rate is less than the first interpolation rate and the second decimation rate is less than the second interpolation rate. 18. The method of claim 17, wherein the step of establishing an input kernel includes the step of selecting the first and second number of elements as a function of the first and second interpolation rate, respectively, the first and second decimation rate, respectively, the first and second cutoff frequency, respectively, the first and second sharpness factor, respectively and the first and second stopband attenuation, respectively. 19. The method of claim 1, wherein the first decimation rate is less than the first interpolation rate and the second decimation rate is greater than the second interpolation rate. 20. The method of claim 19, wherein the step of establishing an input kernel includes the step of selecting the first number of elements as a function of the first interpolation rate, the first cutoff frequency, the first sharpness factor and the first stopband attenuation and computing the second number of elements as a function of the second decimation rate, the second cutoff frequency, the second sharpness factor and the second stopband attenuation. 21. The method of claim 1, wherein the first decimation rate is greater than the first interpolation rate and the second decimation rate is less than the second interpolation rate. 22. The method of claim 21, wherein the step of establishing an input kernel includes the step of computing the first number of elements as a function of the first decimation rate, the first cutoff frequency, the first sharpness factor and the first stopband attenuation and selecting the second number of elements as a function of the second interpolation rate, the second cutoff frequency, the second sharpness factor and the second stopband attenuation. 23. The method of claim 1, wherein the first decimation rate is greater than the first interpolation rate and the second decimation rate is greater than the second interpolation rate. 24. The method of claim 23, wherein the step of establishing an input kernel includes the step of computing the first number of elements as a function of the first interpolation rate, the first cutoff frequency, the first sharpness factor and the first stopband attenuation, and computing the second number of elements as a function of the second decimation rate, the second cutoff frequency, the second sharpness factor and the second stopband attenuation. 25. The method of claim 1, further including the step of modifying the first set of coefficient vectors in the first sense by identifying the output pixels aligning exactly with the input pixels. 26. The method of claim 25, further including the step of identifying the values of the first set of coefficient vectors corresponding to the output pixels aligning exactly with the input pixels. 27. The method of claim 26, further including the step of modifying the values of the first set of coefficient vectors so that the aligned output pixels each have value equal to the value of the corresponding input pixel. 28. The method of claim 27, further including the step of identifying the values of the second set of coefficient vectors corresponding to the output pixels aligning exactly with the input pixels. 29. The method of claim 28, further including the step of modifying the values of the second set of coefficient vectors so that the aligned output pixels each have value equal to the value of the corresponding input pixel. 30. The method of claim 29, wherein the step of applying the first and second coefficient vectors further includes the steps of applying the first set of coefficient vectors to the neighborhood of the values of the input pixels in the first sense to obtain a resultant set of pixels and applying the second set of coefficient vectors in the second sense to the neighborhood of the values of the resultant set of pixels. 31. The method of claim 29, wherein the step of applying the first and second sets of coefficient vectors further includes the steps of combining the first and second sets of coefficient vectors into a first set of coefficient matrices and applying the first set of coefficient matrices to the input pixels simultaneously in the first and second senses. 32. A method of resizing an input image comprising a plurality of input pixels to generate a resized image comprising a plurality of corresponding output pixels while preserving the information content of the image, comprising the steps of: (a) sampling the input image at a predetermined first interval in a first sense and at a predetermined second interval in a second sense for producing input data values for the location of each input pixel; (b) establishing a third interval in the first sense and a predetermined fourth interval in the second sense for producing output data values for the location of each output pixel; (c) designing a filter for resizing the image, comprising the steps of: (1) selecting a first interpolation rate and a first decimation rate in a first sense, (2) selecting a second interpolation rate and a second decimation rate in a second sense. (3) establishing an input kernel having a first number of elements in the first sense and a second number of elements in the second sense, (4) generating a first low-pass filter for the first sense, the first low-pass filter comprising a first filter vector including a plurality of first coefficients, (5) modifying the first low-pass filter, c-jmprising the steps of: (A) creating a first vector comprising a plurality of elements each having a value equal to unity, the first vector having a dimensionality equal to the first interpolation rate, and (B) convolving the first filter vector with the first vector to create a modified first filter vector comprising a plurality of the first coefficients, (6) generating a second low-pass filter for the second sense, the second low-pass filter comprising a second filter vector including a plurality of second coefficients, (7) modifying the second low-pass filter, comprising the steps of: (A) creating a second vector comprising a plurality of elements each having a value equal to unity, the second vector having a dimensionality equal to the second interpolation rate, and (B) convolving the second filter vector with the second vector to create a modified second filter vector comprising a plurality of the second coefficients, (8) creating a first set of coefficient vectors by selecting a plurality of the coefficients of the modified first filter vector as a function of the first interpolation rate, the first decimation rate and the first number of elements , (9) creating a second set of coefficient vectors by selecting a plurality of the coefficients of the modified second filter vector as a function of the second interpolation rate, the second decimation rate and the second number of elements; (d) applying the first and second sets of coefficient vectors to a neighborhood of the values of the input pixels adjacent each output pixel to compute the value of each output pixel and assigning the computed values to the corresponding output pixel, thereby producing a resized image; and (e) storing the resized image in an output memory device. 33. The method of claim 32, further including the step of storing the data values of each of the input pixels in an input memory device. 34. The method of claim 32, further including the step of storing the output data values of each of the output pixels in the output memory device. 35. The method of claim 32, further including the step of storing the first and second sets of coefficient vectors in the output memory device. 36. The method of claim 32, wherein the step of applying the first and second sets of coefficient vectors includes the step of applying the first set of coefficient vectors to the neighborhood of the values of the input pixels in the first sense to obtain a resultant set of input pixels and applying the second set of coefficient vectors in the second sense to the neighborhood of the values of the resultant set of pixels. 37. The method of claim 32, wherein the step of applying the first and second sets of coefficient vectors further includes the steps of combining the first and second sets of coefficient vectors into a first set of matrices and applying the first set of matrices to the neighborhood of the values of the input pixels simultaneously in the first and second senses. 38. A method of mapping the pixels of an output image space to an input image space when resizing an image, comprising the steps of: (a) defining the input image space as including a predetermined number of non-overlapping, original input pixels, each original input pixel comprising a two- dimensional area represented by an original input pixel coordinate point and extending in a first input sense and a second input sense; (b) defining a total input image area as the sum of the areas of each original input pixel, the total input image area having a first input extent in the first input sense and a second input extent in the second input sense; (c) defining the output image space as including a predetermined number of output pixels, each output pixel comprising a two-dimensional area extending in a first output sense and a second output sense, the output image space having a first number of output pixels in the first output sense and a second number of output pixels in the second output sense; (d) defining a set of new input pixels image by dividing first input extent by the first number of output pixels and dividing the second input extent by the second number of output pixels, each of the new input pixels being represented by a new input pixel coordinate point and corresponding to an output pixel, whereby the boundaries of the original input pixels and the new input pixels are aligned and each of the output pixel coordinate points maps to a corresponding new input pixel coordinate point; (e) applying a filter for resizing the input image in the first and second input senses to a neighborhood of the values of the original input pixels adjacent each new input pixel to compute the value of each of the new input pixels and assigning the computed values to the corresponding output pixels, whereby the image is resized; and (f) storing the values of the output pixels in an output memory device. 39. The method of claim 38, further including the step of obtaining the values of the pixels of the input image space from an input memory. 40. The method of claim 38, further including the step of storing the values of the new input pixel coordinate points and the correspondence between the values of the new input pixel coordinate points and the values of the output pixel coordinate points in the output memory device. 41. The method of claim 38, wherein each of the first and second input senses aligns with each of the first and second output senses, respectively. 42. The method of claim 38, wherein each of the first and second input senses is different from each of the first and second output senses, respectively. 43. The method of claim 38, wherein each of the first and second input senses is the same as each of the first and second output senses, respectively.

Inventors: PIOVOSO MICHAEL JOSEPH, WETZEL MARK DAVID, WHITCOMB JAMES ARTHUR, PIOVOSO, MICHAEL, JOSEPH, WETZEL, MARK, DAVID, WHITCOMB, JAMES, ARTHUR
Applicants: DU PONT, E.I. DU PONT DE NEMOURS AND COMPANY
Application year: 1991
Main classification: G06F15
IPC codes: G06T3, G06T5, G09G5, H04N7