Introduction
The problem of halftoning in digital printing has provided a splendid new example of a mathematical opportunity in modern technology. Digital halftoning is the technique used to display an image with a few immiscible colors discretely applied to paper. This problem involves various fields of science such as the physics of light, the biology of the human visual system, and the mathematics of analog-to-digital conversion. Digital halftoning can be considered a huge optimization problem, but we shall see that by sacrificing optimality one can construct efficient algorithms which achieve very satisfactory results. Halftoning is above all an art, yet mathematics, particularly the theory of dynamical systems, helps to improve this art, while the art suggests a rich collection of mathematical problems and insights.
Specifically, we address the question of how full-color images should be imitated by printers which print at positions on a lattice with colors limited to a few available choices. This question subsumes the simpler, more restrictive one of getting continuous-tone gray-scale images from black and white dots. Black and white digital halftoning was initially created for television well before digital printers! We call the available colors pixel colors and the locations on the lattice pixel locations. Purists reserve the term pixels for screens and instead use pels for printing, but we shall stick to pixels. Pixel colors are for us the colors of inks or toners. In some printers the choice of pixel colors can be augmented by superposition of these substances, but this is not allowed in highlight printers. The two images of Brian Wu (see Figure 1) illustrate halftoning for gray scale: Figure 1(b) is a coarse-grain halftone image of the fine-grain image in Figure 1(a), which is approximately a full gray-scale image.
Figure 1
The halftone image in Figure 1 was made by a clustered dither mask, which is discussed later. It was modified to accommodate artificially large pixels. The mathematical problem of digital halftoning is to construct an algorithm whose output is a sequence of pixel colors that creates the full-color visual experience of an input image sequence. For gray-scale images, one wants discrete black and white dots to appear as continuous tones.
In discussing the mathematics of printing, one cannot avoid using the language of geometry. It has long been known that our perception of color can be modeled by vector addition in a color space, the dimension of which we call the color dimension. For rendering gray-scale images with black and white dots, the color dimension is 1; for the color space of full color, it is 3.
Colors and gamuts
Standard ink and toner colors are cyan (C), magenta (M), yellow (Y), and black (K). The letters in parentheses represent color vectors. Added to this set is white (W), taken for the color of paper. The primary colors for light are red (R), green (G), and blue (B). In color space we have the following relations:
W = R + G + B,
M = W G = R + B,
C = W R = G + B,
Y = W B = R + G.
Since inks and toners act as light absorbers, only blue light is reflected from a combination of magenta and cyan on white paper. Similarly, only red light is reflected from magenta and yellow, and green from cyan and yellow.
We assume that the coefficient of the color vector of inks is either 0 or 1, although the use of more levels is on the rise, and 16 (4 bits of information per pixel) is typically used in the new high-end machines.
Vector addition is used to describe the perceived color generated by a combination of light rays emanating from a single source. However, a printed image is made up of many sources, each emitting its own pixel color. The eye averages received light over areas consisting of many pixels. This means that we do not describe the perceived color in a printed image by taking positive linear combinations of color vectors at individual pixels, but rather by convex combinations.
Given the set of pixel colors available to a printer, the set of convex combinations of these pixel color vectors is called the printer gamut, or simply gamut. The geometrical significance of this is that the gamut is a polytope in color space (defined in the subsection on color error diffusion). The printer gamut is a subset of the gamut of the human eye (see the Commission Internationale de l'Eclairage (CIE) colorimetric system in [1]), which is a much more complicated convex body in color space [2].
When all eight colors C, M, Y, R, G, B, K, and W are available to a printer and arranged in the cube, as in Figure 2, the Cartesian product structure of the cube allows for significant mathematical simplification in printing, as follows:
-
Each component of a color vector along the C, M, Y axes is treated separately with W in the same way one would deal with a black and white image. The page is overprinted three times, one for each pixel color, and possibly a fourth time in order to print as much K as possible (black ink or toner is cheaper, and K, W render better grays than C, M, Y, W).
-
When overprinting the sheet multiple times, one must take care of interference (Moiré) patterns due to misalignment in the superposition of colors, a phenomenon which is now well understood (see for instance [3, 4] and the discussion at the end of the subsection on clustered masks).
Figure 2
Actually, the eight color vectors form the vertices of a six-sided figure which is far from cubic in any perceptual color space such as the one given by the CIE colorimetric system. Furthermore, constraints such as the impossibility of superimposing inks to get R, G, or B, or the addition of other shades to augment printer gamuts, such as “light magenta” and “light cyan,” also lead to significant departures from the cube.
Index dimension
While printing is done in two dimensions, we define an index dimension as the dimension of the coordinate system used to specify pixel locations. If pixel locations are simply ordered, the index dimension is 1, but if locations are given by a pair (i, j) of integers, the index dimension is 2, and so on. From the point of view of dynamical systems, color dimension can be thought of as a phase-space dimension, while index dimension is that of time: This is indeed our mindset in treating the digital halftoning problem by using an algorithm which corresponds to running a nonautonomous dynamical system.
Suppose over a region R an image has input color vectors ( ) at pixel locations , where specifies an index of some given index dimension; and we print pixel color vectors ( ). The total error (R) made over the region R is
| (1) |
The question as to whether a uniform bound on (R) exists has a negative answer for two-dimensional regions R. We recall that the uniform distribution theory developed by T. van Aardenne-Ehrenfest, H. Davenport, K. F. Roth, and others (see for example [5]) shows that it is not possible to bound the error over all possible two-dimensional rectangles using black and white pixels. This is in strong contrast to one-dimensional results, which show that these errors can be very well bounded for black and white printing [6–12]. Thus, mathematics seems to imply that, while there is no inherent difficulty in digital printing on a line, there may be one in doing it on a page.
Although we wish to make (R) as small as possible, we do not require a uniform bound on this quantity. All that is really needed is that the average error (1/N) (R), where N is the number of pixels in R, be small for all regions of reasonable size and shape. The eye's averaging is somewhat different, but the average given above is sufficient for our purposes. For more realistic models of the human visual system and the role they play in digital halftoning, see for instance [6, 7, 13–17].
One gets a sense of the size of the combinatorial optimization problem associated with digital halftoning from the fact that typical printers print 600 pixels per linear inch. For a modest size 4 × 4 image, this gives 5,760,000 pixels! A sine qua non for industrial applications is fast and cheap methods of deciding at each pixel location an output pixel color which gives good imitations of the input. Two classes of techniques are primarily used: dithering and error diffusion. Dithering makes decisions pixel by pixel on the basis of a threshold mask. Error diffusion is a dynamical system which makes decisions on the basis of a running error.
Dithering
Dithering is based on a completely local determination which is both simple and fast. We first consider the easier case of black and white (BW) printing, for which the color dimension is 1. Furthermore, we assume that the index dimension is 2. A dithering mask (mask for short) is specified by an n × m matrix M of threshold coefficients M(i, j). The numbers M(i, j) range over the unit interval in a uniform fashion. The image to be halftoned is given by an h × matrix of input gray levels (i, j), also numbers in the unit interval. Typically, n and m are much smaller than either or h. The output image (or halftone image) is given by an h × zero-one matrix, = [ (i, j)], which controls the printing of black as follows: At pixel location (i, j), black is printed if and only if (i, j) = 1. The matrix (i, j) is defined by
The method of dithering for black and white printing is illustrated in Figure 3.
Figure 3
The problem of dithering is to arrange the numbers M(i, j) in the mask so that good image quality results. This can be quite printer-dependent, at least when it comes to fine tuning. The more thresholds in the mask, the more continuity in the gray spectrum and the smoother the picture. A commonly used upper limit to the number of gray levels is 256. Masks are constructed so that constant gray images look good, the idea being that natural images, which are nearly constant in small areas, will then also look good. There is a price to be paid for the instant decision-making ability of a mask: Namely, it is always possible to construct improbable images on which it will fail badly. However, this does not happen for the usual pictures for which masks are designed.
Two main classes of masks
One usually distinguishes two classes of masks:
-
The dispersed masks, mostly used by ink-jet printers, which are slow but reliably print single ink dots.
-
The clustered masks, used by laser printers, which do not reliably print isolated dots.
Dispersed masks
One might think that numbers M(i, j) should be placed in the mask as randomly as possible. However, this produces undesirable irregular clusters and other unpleasant defects. To avoid such shortcomings, one tries to place numbers in the mask so that (i, j) = 1 will be well dispersed for each gray level. Masks by their nature (dispersed or clustered) impose an increasing gray-level constraint (or stacking constraint); i.e., if some pixel is printed for a gray level, it is also printed for any darker one (see Figure 4). This constraint presents a serious difficulty in designing masks.
Figure 4
Another disturbing feature of an improperly constructed dispersed mask is that periods n and m of the mask dimensions can sometimes be detected. To avoid this, masks are often constructed so that the product n × m is much larger than the number of distinct threshold levels. Particularly popular in this respect are blue noise masks, so called because low frequencies in the power spectrum of the patterns turn out to be attenuated [18]. The most pleasing pattern for gray level 0.5 is the maximally dispersed checkerboard pattern, but too much regularity in the presence of noise is undesirable, so checkerboard patterns are avoided in most blue noise masks. Adler, Thompson, Tresser, and Wu based an invention [19] on the aperiodic Thue–Morse sequence1 in order to tile a large mask by two much smaller ones. The memory required for this is considerably less than that for one large mask alone. This gives an alternative (or a complement) to blue noise masks, and can be used in the clustered mask case also.
Clustered masks
It is difficult to construct a good clustered mask when its size is not much larger than the number of gray levels to be rendered. Furthermore, there is a tradeoff between the number of gray levels to be rendered and the size of clusters: The bigger the cluster, the more levels the mask can render, but the more noticeable the cluster. Thompson, Tresser, and Wu, using ideas inspired by celestial and statistical mechanics, have addressed this difficulty in patents2 [24–26]. The main idea behind the new masks is to start with a large mask consisting of several copies of a small mask with 256 levels. There are certain gray levels for which there is an ideal pattern: for example, the checkerboard for the 0.5 gray level. One attempts to keep these patterns and obtain the intermediate threshold values by interpolation. This involves a trial-and-error procedure in which one repetitively resets thresholds and judges print quality. This method is very versatile, and it can be used for a variety of situations: for example, to create several masks for machines whose behavior degrades between maintenances, to adapt a mask to a new printer that has been tuned for another, etc. Other inventions mentioned above concern variations on this theme. These ideas can also be used for the simpler problem of building dispersed masks.
For standard color dithering, four different masks are used, one for each nonwhite color (including K, which is applied first, since it is usually the cheapest ink). Using the same mask four times is usually avoided because of the possibility of misregistration that causes disturbing Moiré patterns. In the past, color printing was done with screens that performed like masks (indeed, the word screen is still used in lieu of dithering mask). To minimize Moiré patterns, the screens for separate colors were set at different angles. For digital printing, there is a technique in designing the different masks that is equivalent to the effect of rotating a screen. For a description of this method, see [4]. A pending patent by Rao, Thompson, Tresser, and Wu proposes to build what they call semi-digital printers: printers intermediate to digital and analog ones, in which each color plane is treated as in the usual digital printing, but the screens are rotated as in traditional analog printing.3
Calibration of dither masks
In constructing dither masks, it is usually assumed that the number of black pixels in a halftone pattern is proportional to the gray level. We refer to such dither masks as linear dither masks. This assumption is not true when nonlinear effects such as dot gain or dot overlap are introduced. Another nonlinear effect occurs when a quantity called lightness [4] is used to measure gray levels.
One way to compensate for nonlinear effects is to first apply a tone reproduction curve (TRC) to the input data and then use a linear dither mask, as shown in Figure 5. The TRC describes the relationship between input gray levels and output ones. Using 8-bit numbers to represent gray levels, the TRC as used in Figure 5 maps an 8-bit number to another one. Since the TRC is generally not the identity map, this means that the output of the TRC has less than 256 distinct values (see Figure 6 for a 2-bit input/output example). Thus, after the application of such a dither mask, there will be fewer than 256 distinct halftone patterns, which reduces the number of renderable gray levels, especially when the nonlinearity is strong. However, for small nonlinearities it is the method of choice.
Figure 5
Figure 6
A way to compensate for strong nonlinearities is to directly modify thresholds in the mask, which has the advantage of preserving the number of renderable gray levels. Furthermore, since it obviates the need for a TRC, it can increase processing speed. The construction of such a nonlinear dither mask proceeds as follows. First, a series of good halftone patterns are chosen to be reproduced by the dither mask; this provides a set of data points. A curve, serving as a tone reproduction curve, is then obtained by interpolating, say, a spline curve between these data points. However, instead of using the curve as in Figure 5, the inverse of the curve is used to determine the number of black pixels needed for each gray level. This information is then used to generate a dither mask with correct output. In contrast to the linear dither mask, the difference in the number of black pixels between halftone patterns of successive gray levels is not constant, but is determined by the inverse curve. The stacking constraint requires that interpolation generate a monotonic curve. See [26] for more details. This method can be used in color printers in which multiple masks are used [27]. For related matter, see also [28].
Several of the new techniques for dithering that we have discussed have been employed in the halftone design of the IBM line of laser printers, ranging from the desktop models to production print machines.
Error diffusion
For error diffusion, as before, we first consider the easier case of color dimension d = 1, e.g., black and white printing. In addition, we take the index dimension to be 1. Instead of Equation (1), we define the running error (n) by
| (2) |
where, at pixel location k, (k) is a gray defined proportionally to its darkness by a number from 0 for white to 1 for black, and (k) the printed pixel color, with (k) = 0 for white and 1 for black. The running error satisfies the recursion
(n + 1) = (n) + (n + 1) (n + 1),
| (3) |
where n = 0, 1, 2, ... and (0) = 0.
Simple error diffusion
Simple error diffusion is defined by taking (n + 1) to satisfy the greedy algorithm: Namely, (n + 1) takes the value 0 or 1, whichever minimizes (n + 1) with a tie-breaking rule. It is easy to show that (n) lies in the interval [-½, ½] under (3) for any choice of the sequence { (n)}n∈ . Thus, (n) is bounded, and (n)/n → 0. Setting x(n + 1) = (n) + (n + 1), we can rewrite Equation (3) as
(n + 1) = (n) + (n + 1) *[x(n + 1)],
| (4) |
where *[x(n + 1)] is the closest (with a tie-breaking rule) endpoint of the interval [0, 1] to x(n + 1). (Since their domains of definition are different, we chose not to abuse notation by using for *.) It is easy to see that x(n) is trapped in the interval [-½, 3/2]. Bounding x(n) is equivalent to bounding (n). Adding (n + 2) to both sides of Equation (4) and reducing indices, we get
x(n + 1) = x(n) + (n + 1) *[x(n)].
| (5) |
The advantage of Equation (5) over Equation (4) is due to the fact that (5) can be interpreted as a time-dependent dynamical system, as follows. The orbits x(n) of this system can be expressed recursively by x(n) = f (n)[x(n 1)], where { (n)} is a sequence of points in the unit interval and {f (n)} is a sequence of mappings selected from a family of mappings {f | ∈[0, 1]}, each defined by
*(x) being the closest endpoint (with a tie-breaking rule) of the unit interval to x. Trapping the orbits x(n), and hence bounding the errors (n), is equivalent to the following.
Theorem 1
There exists a bounded interval (J = [-1/2, 3/2]) containing [0, 1] which is invariant under all members f of the family.
Sturmian sequences
When the sequence { (n)}n∈ is constant, (n) ≡ 0, Equation (6) taken mod 1 is a classical dynamical system, i.e., rotation on the circle by angle 0. It is easy to check that the sequence { *[x(n)]}n∈ is a (non-exceptional) Sturmian sequence with the proportion of 1s equal to 0. The non-exceptional Sturmian sequences have the property that a given proportion of 0s and 1s are distributed as evenly as possible (the exceptional ones are those that are not generated by rotations) [29, 30]. This is remarkable considering that these well-distributed sequences are all generated by a single simple greedy algorithm. We are currently investigating a higher-dimensional generalization of this striking fact.
Color error diffusion
We now turn our attention to color printing. In color space, the printer gamut is a polytope P with pixel color vectors as vertices. A polytope is defined as the convex hull of a finite set of points: Equivalently, it is a compact intersection of a finite number of half spaces.
As we have mentioned, when all eight colors M, C, Y, R, G, B, K, W are used, replacing P with a cube gives reasonable results even though P is far from a cube. A generalization to simple error diffusion is vector error diffusion, in which (n), (n + 1), x(n + 1) = (n) + (n + 1), and *[x(n + 1)] of Equation (4) are vectors in 3-space (see also [31]).
The boundedness of x(n)| and  (n) is a corollary to the following d-dimensional generalization to Theorem 1, although we give a proof here for only d = 2.
Theorem 2
Let P be an arbitrary polytope and {f | ∈P} a family of mappings defined as in (6) by
where now x and are vectors in n-space, ∈P, and *(x) is the closest vertex of P to x. Then there exists a bounded convex set P' P which is invariant under any member f of the family. Furthermore, P' can be constructed to be arbitrarily large.
It is easy to give examples of sequences { (n)}n∈ in which the (n) are not in P such that {x(n)} and hence { (n)} diverge. Figure 7 illustrates the geometrical nature in two dimensions of Equation (7) with triangular P.
Figure 7
By taking flatter and flatter triangles, one can check that the ratio of the diameters of P' and P can be arbitrarily large. This can be taken as an indication of the non-triviality of the general problem.
Notice that we have considered Euclidean distance only in Theorem 2, so that only the shape of P counts. For some important choices of P such as a cube with faces parallel to the coordinate planes, other norms such as the max or the sum of the absolute values of the coordinates might be useful as well.
Notation
We adhere to the convention of writing the inner product of vectors as a dot product.
Let i, i = 0, ... , n 1, n ≥ 2, be the vertices of a convex polygon P and nj, j = 1, ... , n, the unit normal vectors to edges j+1 j of P. Let Pt denote the polygon generated by moving the edges of P perpendicularly outward a distance t: i.e.,
where P = P0. The Voronoi region R i of vertex i is the set of points closer to i than to any other vertex. It is defined as
For ∈P we define the mapping f : 2 → 2 by
where (x) = i, the index i being the smallest for which x ∈R i.
Lemma 1
If ni ≠ n0 and ni ≠ n1, then either ( 2 1) · ni > 0 or ( 0 1) · ni > 0. Furthermore, if ( 2 1) · ni > 0, then (n1, ni) is a basis, and if ( 0 1) · ni > 0, then (n0, ni) is a basis of 2.
Proof
It is clear from Figure 8 that ni can be written as ni = an0 + bn1, where either a < 0 or b < 0. Suppose a < 0; then ( 2 1) · ni = a( 2 1) · n0. Since 1 · n0 = d0 and ( 2 · n0 < d0, it follows that 2 1) · n0 < 0, and thus ( 2 1) · ni > 0. Furthermore, since a ≠ 0, ni is not parallel to n1, and thus (n1, ni) form a basis. The case in which b < 0 is similar.
Figure 8
Proof [Proof of Theorem 2]
It suffices to show that for t large enough,
f (Pt R i ) Pt
for all ∈P.
Let x ∈Pt Rv1. Then f (x) · n0 = (x + 1) · n0 = x · n0 + · n0 1 · n0. Since 1 · n0 = d0 and · n0 ≤d0, it follows that (x + 1) · n0 ≤x · n0 ≤d0 + t. Similarly, (x + 1) · n1 ≤x · n1 ≤d1 + t. Let ni ≠ n0, ni ≠ n1. Without loss of generality, we assume that by Lemma 1 (v2 v1) · ni > 0 and (n1, ni) is a basis. Clearly, (n1 · ni)2 < 1. Let x = c1n1 + c2ni. Then c1 + c2n1 · ni = x · n1 and c1n1 · ni + c2 = x · ni. Solving for c2, we obtain
Therefore, ( 2 1) · x = c2( 2 1) · ni = [x · ni (n1 · ni)x · n1], where
Since x ∈R 1, |x 1|2 ≤|x 2|2. This implies that ( 2 1) · x ≤(1/2)(| 2|2 | 1|2), and therefore x · ni (n1 · ni)x · n1 ≤(1/2 )(| 2|2 | 1|2), which implies that
provided d1 + t > 0. Since (1/2 )(|v2|2 |v1|2) is independent of t and |n1 · ni| < 1, it is clear that x · ni ≤di + t for large enough t. Therefore, x ∈Pt, and the proof is complete.
Remark
The above method works for d = 1, 2 but will not work for d ≥ 3. Moving all faces outwardly a fixed perpendicular distance is doomed to failure. A simple tetrahedral counterexample can be constructed in which one of the vertices passes out of its Voronoi region. A new idea for an invariant set is needed. We deal with this in a subsequent work. However, the theorem can easily be proved for special polytopes P such as the cube or the regular simplex in any dimension. Also, Adler et al. [6, 7] have proved the existence of an error bound in vector error diffusion in all dimensions under a rule different from the greedy algorithm.
Beyond simple error diffusion
In simple error diffusion, only the error accumulated up to the last pixel is explicitly taken into consideration. Instead, one can take into account several past errors and weight them. In practice, the system of weights is often taken as a probability vector (non-negative entries that sum to one), which is not necessarily constant, as follows:
| (9) |
where wi(n) ≥ 0, ∑wi = 1, and (n + 1) is the greedy algorithm which minimizes (n + 1). Setting
| (10) |
we have
(n) = x(n) (n);
| (11) |
thus,
| (12) |
where wi(n) ≥0, ∑wi = 1, and *[x(n)] = (n). A corollary to Theorem (2), by virtue of the convexity of P', is that x(n) ∈P' for all n, hence the error (n) of Equation (9) is bounded.
For printing, the natural index dimension is 2. Trials of space filing curves to overcome the fundamental two-dimensionality of a page, as in [32], give reasonable but largely suboptimal results. Floyd and Steinberg made a crucial invention in the field of digital halftoning [33] which allows index dimension 1 to resemble in some sense index dimension 2. They used a scheme of weights wi(k) which involved the neighbors to the left and above the current pixel. Soon afterward, Jarvis, Judice, and Ninke [34] introduced a larger 12-neighbor error scheme. Stucki [35] also constructed a 12-neighbor scheme (see also [36, 37]). Figure 9 shows the two schemes (to obtain individual weights, one normalizes the numbers in a table by dividing by their sum).
Figure 9
For reasons which have not been completely understood, error diffusion creates artifacts in the form of small-scale worms (see Figure 10). More recently, Tresser and Wu [38] made improvements to reduce these artifacts using systems of weights chosen to produce predetermined patterns judged to be good for certain gray levels in BW printing, and then interpolating sets of weights for the remaining gray levels. In their scheme there are gray levels with negative weights. In this case, Theorem 2 cannot be applied to prove boundedness of (n).
Figure 10
Calibration for error diffusion
As in the case of the dither mask, one has to take account of the dot gain and dot overlap. A method patented by Tresser and Wu [39] improves on former methods for correction [40, 41].
Constrained error diffusion
Late in the last century, all major manufacturers of high-end printers competed to bring to market their own models based on a common new print engine. The only pixel colors available to a preliminary version of the IBM InfoColor* 100 printer were black, yellow, magenta, cyan, and white. No overlap of toners was allowed. This constraint is shared by certain types of printers such as the Kodak ImageSource** 70cp Series II. Printers with such constraints are often used as highlight printers, to color simple objects such as pie charts. We developed algorithms to transform the preliminary IBM version into a near-full-color printer4 by using error diffusion on the restricted printer gamut P = convex hull of {K, Y, M, C, W}, in combination with a gamut-reduction map from the unit three-dimensional color cube to P. Even though no saturated red, green, or blue was printable, the results were quite acceptable. IBM was consequently able to present the first color high-speed Advanced Function Presentation* (AFP*) printer at the 1998 XPLOR trade show, enabling the corporation to enter a market it had previously not penetrated. In subsequent, more advanced printers, in which red, green, and blue are available by superimposing colors, our method developed for the IBM InfoColor 100 printers can be used in a draft mode as a toner or ink saver.
Finally, a comprehensive survey of error diffusion and other techniques can be found in the books of R. Ulichney [42] and H. Kang [4].
Acknowledgments
This paper has described both methods and contributions of the IBM Research Mathematical Sciences Department in collaboration with other IBM divisions and departments. In particular we acknowledge the contributions of Jean Aschenbrenner, Gordon Braudaway, Danielle Dittrich, Joan Mitchell, Ravi Rao, Nenad Rijavec, Robert Risch, Mikel Stanich, Gerry Thompson, Fred Mintzer, and Howard Sachar.
Footnotes
1The Thue–Morse sequence is a sequence of 0s and 1s formed by a series of concatenations. In each step, a new block is concatenated to an old one, the new block being formed by interchanging 0s and 1s in the old. The first four blocks of the sequence are 0, 01, 0110, 01101001, … . The total sequence has the property that no subblock is repeated more than twice in succession [20–23].
2M. J. Stanich, G. Thompson, C. Tresser, and C. W. Wu, patent pending.
3R. Rao, G. R. Thompson, C. P. Tresser, and C. W. Wu, patent pending.
4R. L. Adler, M. Martens, J. L. Mitchell, R. Risch, N. Rijavec, C. P. Tresser, and C. W. Wu, patent pending.
*Trademark or registered trademark of International Business Machines Corporation.
**Trademark or registered trademark of Eastman Kodak Company.
Received October 19, 2001;
accepted
for publication July 24, 2002; Internet publication December 9, 2002 |