SYSTEM AND METHODS FOR ANALYZING TOOTH SHADES

Abstract: A digital camera (12) connects to a tooth shade analyzer subsystem, e.g., a digital video processor (14), and a color display monitor for the electronic determination of the color of patient's teeth. Preliminarily, the camera captures (26) a series of digital color images of tooth shades corresponding to reference shade guides (34), and electronically compares the reference shades to an image of the patient's tooth. In a preferred embodiment the comparison is done over a set of pseudo-pixels, each corresponding to a group of pixels in an high-resolution camera. Once a match is found, it is communicated to a user of the system (52). In a specific embodiment the camera is equipped with a sleeve and illumination subsystems that help reduce the variations in the color of digital images due to external factors.

Description: SYSTEM AND METHODS FOR ANALYZING TOOTH SHADES FIELD OF THE INVENTION The invention is directed to methods and devices for tooth shade determination using digital signal processing. More specifically, the invention is directed to computer- based system and methods for analyzing color images of one or more teeth and comparing them to known tooth shades for use in certain clinical or cosmetic procedures. BACKGROUND OF THE INVENTION There has been a shift in recent years in dentistry from a philosophy of drilling and filling to one of prevention and cosmetics. Due to concerns about the visual appearance of their teeth, many people undergo clinical procedures to enhance their smile or to correct certain dental defects. Clinical or cosmetic procedures of this type generally involve the modification of tooth shape, alignment and, more recently, color. A necessary step in the modification of a patient's tooth color is to determine the "shade" of an existing tooth. Such a determination is useful, for example, to patients seeking a whiter, brighter smile, who frequently want a record of their existing tooth color so they can make a before and after comparison. Shade determination is even more important when reconstructive work is done, since one goal of the process is to achieve a natural appearance. To this end, it is necessary to know the existing tooth shade so that it can be accurately matched with the new restoration. At present, with respect to tooth color modification, most dentists utilize standardized shade guides created by companies which manufacture reconstructive materials. One well-known shade guide is the VITA™ shade guide, which includes sixteen different shades. Other, shade guides used in practice include the guides provided by BIOFORM™ and SR-VIVADENT™. For the most part, the existing shade guides are still utilized in a rudimentary fashion. The guide itself is a plastic plate with a plurality of removable color tabs that are shaped like a tooth, e.g., the front tooth. Typically, to assess a patient's tooth shade, a dentist removes one or more of the colored tabs and holds them up to the patient's tooth to "eyeball" the closest match. Understandably, this approach sometimes fails, in part because of the need for a subjective assessment by the dentist, who may not be sufficiently qualified for the task. Another problem with the currently prevailing procedure is that once the tooth shade is determined, the information must be communicated correctly to the lab that makes the crown, bridge or denture. As known in the art, in bonding or filling a tooth, for example, the composite materials required for the restoration are specified within the range of the shade guide, e.g., one of sixteen shades for the VITA™ range. Errors in the determination of the tooth shade, or the communication of the determined shade to the lab will result in a poor shade match for the patient. For example, some dentists use uncommon shade guides, thereby leaving it to the lab technician to eyeball and convert the shade information to a VITA™ standard shade (since porcelain is often made from the VITA™ shade guide). This too can result in improper shade matching. The process for selecting the porcelain for a particular tooth shade illustrates the difficulty in assessing and manufacturing the correct color match. If, for example, a crown of VITA™ shade A3 is desired, porcelain is built by hand with a paint brush onto a model of the tooth to be restored. The porcelain is built in layers on the model to achieve translucency and natural appearance. Each layer has a particular color and intensity associated with it. To generate shade A3, the technician follows a "recipe" that is given by the manufacturer VIDENT™, requiring a different shade for each layer of porcelain applied. If a doctor asks for a shade that is not a VITA™ standard shade, the technician typically seeks to achieve that shade by combining different porcelain shade combinations together, to increase or decrease the chroma, hue and value of the shade. To further complicate the color-matching process, some dentists are simply not skilled in taking and determining shade information. Therefore, these dentists sometimes send their patients directly to the lab where the technician can determine the shade information. Alternatively, these dentists sometimes have a technician come to their office. In either event, there is, at times, one more level of subjective uncertainty injected into the correct match and determination of a patient's tooth shade. It was apparent, therefore that there is a need for improvements in this area. I the prior art, several attempts have been made to measure tooth shade. Such prior art includes, without limitation, the following patents and publications, each of which is incorporated by reference as providing useful background information: JP 4-338465 by Kazeo Eto; JP 4301530 by Kisaka; U.S. Patent No. 3,986,777; U.S. Patent No. 4,247,202; U.S. Patent No. 4,414,635; U.S. Patent No. 4,518,258; U.S. Patent No. 4,547,074; U.S. Patent No. 4,623,973; U.S. Patent No. 4,654,794; U.S. Patent No. 4,692,481; U.S. Patent No. 4,836,674; U.S. Patent No. 4,881,811; U.S. Patent No. 5,012,431; U.S. Patent No. 5,124,797; U.S. Patent No. 5,231,472; U.S. Patent No. 5,240,414; U.S. Patent No. 5,313,267; U.S. Patent No. 5,343,267; U.S. Patent No. 5,373,364; U.S. Patent No. 5,383,020; U.S. Patent No. 5,690,486; U.S. Patent No. 5,759,030; WO 86/03292; WO 91/02955. Generally, the attempts to measure tooth shade, as disclosed in the illustrative prior listed above, fail for various reasons, including primarily color contamination due to reflection and/or tooth translucency. In addition to inconsistent and sometimes inadequate and unreliable tooth shade determination, methods and devices disclosed in the prior art also have other limitations. For example, prior art using colorimeters often samples a single tooth location in attempt to analyze its color. Such an approach, however, fails to adequately characterize the entire spatial extent of the tooth, much less address the issue of matching the shade of one tooth to the shades of adjacent teeth. PCT Application WO97/01308 and U.S. Patent No. 5,766,006 ("the '006 patent") addresses many problems associated with the prior art. In particular, it discloses camera that connects to an electronic shade analyzer system. The camera captures a digital color image of a tooth and compares that image to a stored plurality of tooth shades. Once a match is determined, the matching tooth shade is communicated to a user of the system, so that the desired tooth can be constructed. The methodology disclosed in the patent also includes the specification of fractional tooth shades. It will be appreciated that the approach discussed in the '006 patent is a substantial improvement over the prior art at least in terms of removing several levels of subjectivity. Despite the significant advances achieved over the years, it is perceived that there is a need for improvements in several important areas. For example, these areas include the methods for digital signal processing which minimize the probability of matching errors due to various system imperfections. Another area where further improvements are desirable is the data capture process. By means of an example, it will be appreciated that it is very difficult to capture information about a tooth or groups of teeth that is independent of the lighting conditions, or the particular camera used. Accordingly, there is a need for improvements in several areas related to optimal analysis and processing of tooth shades. SUMMARY OF THE INVENTION The invention relates to methods and system for determining a patient's tooth shade using digital signal processing of an image of the tooth. Im a preferred embodiment, a digital camera connects to a tooth shade analyzer, e.g., a digital video processor. The camera captures digital color images of the tooth, which are processed to form pseudo- pixels corresponding to areas of the tooth surface, and then compared to images of tooth shades relating to reference shade guides. In a preferred embodiment the comparison is done over a set of pseudo-pixels, each corresponding to a group of pixels in an high- resolution camera. Once a match is found, it is communicated to a user of the system. In a specific embodiment the camera is equipped with a sleeve and illumination subsystems that help reduce the variations in the color of digital images due to external factors. More specifically, the invention is a method for associating a tooth shade relative to a tooth, comprising: providing a digital image of the tooth, the digital image having pixels; processing the digital image to generate a REAL IMAGE formed of pseudo-pixels, at least one of said pseudo-pixels comprising two or more pixels of the digital image; correlating the generated REAL IMAGE with two or more REFERENCE IMAGES representing tooth shades to determine which tooth shade most closely matches visual characteristics of the tooth. In specific embodiments, the method of this invention further is comprises the steps of capturing digital images of two or more tooth shades, and processing the captured digital images to form said two or more REFERENCE IMAGES, which can be color images. In other specific embodiment, the step of processing the digital image of the tooth comprises dividing the digital image into segments forming said pseudo-pixels, which can be based on the shape of the tooth, and need not be contiguous. In a preferred embodiment, the step of processing the digital image comprises determining pixels, the values for which are outside a pre-determined range compared with values of adjacent pixels, and excluding such pixels from further processing. In other embodiments the step of correlating comprises computing a closeness measure. In another aspect, the invention is a method for determining color characteristics a patient's tooth, comprising: providing a digital image of the tooth, the digital image having pixels; dividing the digital image into segments, each segment forming a pseudo-pixel comprising one or more pixels of the digital image; computing color characteristics of each pseudo-pixel based on the corresponding one or more pixels of the original image; and storing the computed color characteristics in a computer memory. In yet another aspect, the invention is a system for associating a tooth shade relative to a tooth, comprising: a digital camera for capturing digital images of human teeth, the digital images having pixels; a processor for converting digital images captured by the camera to REAL IMAGES formed of pseudo-pixels, at least one of said pseudo-pixels comprising two or more pixels of the digital image; and means for correlating the generated REAL IMAGE with two or more REFERENCE IMAGES representing tooth shades to determine which tooth shade most closely matches visual characteristics of the tooth. IN a specific embodiment, the system further comprising means for illuminating the tooth when capturing a digital image, and a sleeve for shielding a tooth from light not generated by said means for illuminating. BRIEF DESCRIPTION OF THE DRAWINGS These and other aspects of the invention should be more apparent from the following detailed description and drawings in which: FIG. 1 illustrates a shade analyzer system for capturing images in accord with a specific embodiment of this invention; FIG. 2 shows a representative image captured by the system of FIG. 1; FIG. 3 shows a representative image made up of pixels as captured by detector elements of the system in accord with the invention; FIG. 4 illustrates processing of the image of FIG. 3 using pseudo-pixels, in accord with one preferred embodiment of the invention; FIG. 5 shows an end piece constructed for use with the system in FIG. 1, for simultaneous processing of an actual tooth image and various reference tooth shades; FIG. 6 illustrates a compression sleeve constructed according with a specific embodiment of the invention for capturing high-quality tooth images; FIG. 7 illustrates a source-to-tooth illumination, for improved image capturing in accord with one embodiment of the invention; FIG. 8 illustrates baffling and stray- light rejection within a sleeve in a specific embodiment of the invention; FIG. 9 illustrates different pseudo-pixel imaging mechanisms, optionally dependent upon tooth shape characteristics, used in accord with the invention; FIG. 10 illustrates a non-contact tooth imaging system, with stray light rejection, constructed according to a specific embodiment the invention; FIG. 11 illustrates another embodiment of a non-contact tooth imaging system in accordance with the present invention; FIG. 12 illustrates a digital image of a tooth; FIG. 13 illustrates a system for reimaging a tooth; FIG. 14 illustrates various tooth decay patterns and restorations that can be addressed in accordance with the present invention. DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS A number of different aspects of the invention are disclosed. For clarity of presentation, these aspects are organized and described below in sections which generally correspond to the methods and the system of the present invention. This organization of the preferred embodiments is not intended to be limiting in any way. The Method With reference to Fig. 1, in accord with this invention utilizes, a solid state camera 12 (e.g., a CCD camera coupled to a PC board, or an intra-oral camera) is utilized to capture one or more images of each known conventional tooth shade. Tooth shades used to this end may correspond, for example, to the VITA™ Shade guide, or a shade guide corresponding to a porcelain by another dental products manufacturer. By way of example, a first series of images taken in accordance with the invention corresponds to sequential images of the Al shade by Vita, a second series of images corresponds to sequential images of the A2 shade by Vita, and so on. In accordance with the invention, captured image series of the known 7 tooth shade guides are properly labeled and then stored onto the hard disk of the computer, or other suitable storage device for further analysis. FIG. 2 illustrates a representative digital image 30 captured by the camera 12. As known in the art, each digital image has a plurality of picture elements, i.e., "pixels", corresponding to the elements of the solid state camera and representing the light intensity and color properties of a given spatial location on the tooth. The distance between adjacent pixels in the image is determined by the spatial resolution of the camera. For example, an image of a tooth shade (or a human tooth) can be made up of 300 pixels in width across the tooth and 350 pixels in height. In human teeth, any given tooth is approximately the same size, give or take a couple of millimeters, for all people. For example, most central incisors usually measure between 9 - 11 mm in width, and somewhat greater in length It is clear therefore that for a given spatial resolution of the camera, in accordance with this invention an image of a tooth can be taken knowing the approximate number of pixels corresponding to the tooth in the image. Thus, in the example above, 1 mm of the tooth width may be represented by 30 pixels. It will naturally be appreciated that the tooth image is typically not rectangular, and that pixels at the corners of an image may correspond to the background (i.e., the region outside of the tooth) and not of the tooth or tooth shade. See FIG. 2 for further illustration. As indicated above, in a specific embodiment of the method of this invention a single digital image can be captured for each tooth shade or actual tooth. Those skilled in the art will appreciate, however, that taking a series of images per shade is preferable, since it reduces the risk of image anomalies, as explained in further detail below. In a second step of the method of this invention, each image or each image in a series is processed into a "pseudo" reference image (hereinafter PSEUDO IMAGE) made up of pseudo-pixels. As used in this disclosure, pseudo-pixels correspond to groups of pixels covering specific areas (i.e., rectangular or square) of the image plane. FIG. 3 shows a blow up image of the pixels 42 (only representative pixels 42 are shown) which make up the tooth image 40 of FIG. 2. In accord with the invention, these pixels are transformed into pseudo-pixels 44, as shown in FIG. 4. In the embodiment illustrated in FIG. 4 each pseudo-pixel 44 is made up of all real pixels within the area of the associated pseudo-pixel. Pseudo-pixels 44b shown in the figure illustrate, for example, how a pseudo-pixel can be generated from nine real pixels 42. FIG. 4 also illustrates that an image can be made from either a real tooth 40 (resulting in a REAL IMAGE) or a reference shade 40 (resulting in a REFERENCE IMAGE). FIG. 9 shows how pseudo-pixels can be arranged in a preferred embodiment in different patterns, automatically, depending upon which tooth is imaged. For example, an incisor 200 can have an arrangement of pseudo-pixels 202, as shown in the left-hand example, while a molar 204 can have an arrangement of pseudo-pixels 206, as shown in the right-hand example. With further reference to FIG. 1, such arrangements can be made automatically in the system of this invention by informing the computer 14, and hence the software 50, to apply pseudo-pixels in the appropriate pattern. Such arrangements assist in overall processing by ensuring appropriate pseudo-pixel placement. As illustrated in FIG. 9, pseudo-pixels need not be contiguous, or aligned, such as shown by the arrangement of pseudo-pixels 206. In a preferred embodiment, the intensity and color associated with a pseudo-pixel are computed or otherwise formed as an average (or other statistical measure) of the actual pixels forming the pseudo-pixel. By way of example, if an actual image taken in the first step of the method corresponds to a rectangular tooth that is digitized at 300W by 35 OH resolution, i.e., having a total of 300x350 elements, in accordance with this embodiment one can create pseudo-pixels such as 6W by 7H, with each pseudo-pixel being formed as a statistical measure of the 50x50 pixels within the pseudo-pixel (resulting in 42 pseudo- pixels representing the entire tooth). As noted above, in accordance with a preferred embodiment, pseudo-pixels are generated by data derived from the actual pixels located within the pseudo-pixel. For example, in a specific embodiment one can average the red, green and blue (RGB) components for each of the 2500 pixels within each pseudo-pixel to determine a reference RGB for that pseudo-pixel. Those skilled in the art will appreciate that other statistical measures or characteristics can be used, such as the mean "hue" measure of the pixels within a pseudo-pixel, or others. For example, the RGB pixel values may be converted into the Hue, Saturation and Intensity ("HSI") color space by using known algorithms, such as the Gonzalez and Woods method,, as follows: R = Red value for pixel G = Green value for pixel B = Blue value for pixel Intensity = 1/3 (R+ G + B) Saturation = 1 - (3/ R +G + B)) * Min(R, G, B) Hue - Cos "1 ( (0.5* ((R -G) + (R-B))) / ((R -B) * (G - B)) °' 5 ) If S = 0, Hue is meaningless If (B/Intensity) > (G/Intensity) then Hue = 360 - Hue Since Hue is an angle in degrees values were normalized to 0J with Hue = Hue/360 As known in the art, the RGB color space can be represented as a simple cube, with R, G and B emanating from one corner along three perpendicular edges. The origin corner (0,0,0) is black, and the opposite corner (1,1,1) is white. All points along this line from corner to corner are shades of grey. The HSI color space is this same cube stood on the origin corner, with the Black White line being vertical. The black - white line is the intensity axis, the hue is given by an angle from the intensity axis and the saturation is the distance from the intensity axis to the color point (i.e., the radius). The new VITAPAN 3D- Master Shade system uses an L*a*b* Color Sphere to determine tooth shades based on Value, Chroma and Hue. It is possible to convert the RGB values to this color system, if necessary or desired. In accordance with a preferred embodiment, PSEUDO IMAGES corresponding to series of images are processed then into a "REFERENCE IMAGE". By way of example, the REFERENCE IMAGE is generated as an average (or other statistical measure) of the PSEUDO IMAGE series of images of the VITA™ A2 shade guide. The measure in this example is obtained by averaging the R, G, B components for each pseudo-pixel of the A2 PSEUDO IMAGE series to determine an average RGB value for a pseudo-pixel of the REFERENCE IMAGE. In alternative embodiments operating in the HSI color space, the corresponding average values can also be determined for each pseudo-pixel of the PSEUDO IMAGE series; and, for example, an average hue (or other statistical measure of hue) can also be associated with each pseudo-pixel in the REFERENCE IMAGE. Those skilled in the art will appreciate that other color characteristics can be used alternatively or in conjunction with the measure of RGB and/or hue. It will be appreciated that if only one PSEUDO IMAGE is made per shade, than that PSEUDO IMAGE defaults as the REFERENCE IMAGE since no other statistical combination is available. It should be noted that forming of pseudo-pixels is not a requirement for practicing this invention. However, pseudo-pixels are used in a preferred embodiment because they may reduce the processing load of the system, minimize storage requirements and also because they can simplify the task of aligning corresponding pixels from different images. Proper pixel alignment is important in order to ensure the integrity and accuracy of the statistical averages used in the formation of REFERENCE IMAGES. In this regard it will be appreciated that it is generally difficult to precisely align all pixels in several images taken from the shades of the same shade guide, unless there is extremely good control utilized in the image capture sequence. Using pseudo-pixels in accordance with the preferred embodiment reduces the total number of pixels per image and thus simplifies the task of aligning different images accurately. Pseudo-pixels are even more important in later steps of the processing method of this invention. That is, although one has complete freedom to set up the optics and the camera, which together determine the magnification of a captured tooth shade (or tooth) image, when trying to "match" a REFERENCE IMAGE to an actual digital image of a patient's tooth, the actual image (hereinafter referred to as a SNAPSHOT) may be quite different in shape and size (either real size or apparent size due to magnification differences in the optics or camera CCD element size). As such, a "one-to-one" comparison between the SNAPSHOT and the REFERENCE IMAGE is difficult. Pseudo-pixels help in this respect because the SNAPSHOT can be scaled to approximate the REFERENCE IMAGE size, or vice versa; and the SNAPSHOT can also be processed into pseudo-pixels. The scaled and pseudo-pixel version of the SNAPSHOT image is denoted as the "REAL IMAGE" hereinafter. Pseudo-pixels used in a preferred embodiment thus permit a convenient mechanism for comparing a REFERENCE IMAGE to a REAL IMAGE. In accordance with a preferred embodiment, the generation of each REFERENCE IMAGE preferably includes a "bad pixel" routine where each pseudo-pixel in the PSEUDO IMAGE series is analyzed for bad pixels. A "bad pixel" means any real pixel corresponding to a defective CCD element or corresponding to an area with an unwanted artifact, e.g., reflection, in the digital image, or an area that contains "background" imagery (e.g., any pixel image not corresponding to the tooth or tooth shade). Any pseudo-pixel in the PSEUDO IMAGE which contains a bad pixel is preferably not utilized in the generation of the REFERENCE IMAGE. That is, if for example a REFERENCE IMAGE is made up as an average of three PSEUDO IMAGES, and yet one pseudo-pixel in one of the PSEUDO IMAGES contains a bad pixel, then in a specific embodiment the resulting pseudo-pixel of the REFERENCE IMAGE is either discarded, or computed only as an average of the other two associated pseudo-pixels of the PSEUDO IMAGES. Note that the bad pixel routines are particularly important at the edges of the image of the tooth or tooth shade. Consider, for example, the shape of the tooth 40 in FIG. 3 or the irregular shapes illustrated in FIG. 14. Clearly, such shapes are not rectangular, and thus creating pseudo-pixels in accordance with the preferred embodiment will result in certain pseudo-pixels having bad pixels at the image edge. FIG. 4 illustrates bad pseudo- pixels 44a that contain pixels 42a, which are not part of the tooth image 40. Bad pixel routines used in accordance with a preferred embodiment to detect such pixels and disqualify them from further processing. For example, if 5% or more of the pixels within a pseudo-pixel are "bad" (e.g., containing reflections or other unwanted data), then such pseudo-pixels are disqualified. Though not shown, other pseudo-pixels might be disqualified if for example reflections from the light ports cause unwanted reflections in the other pseudo-pixels image 40. In a preferred embodiment, such pseudo-pixels are deleted from inclusion in the REFERENCE IMAGE. In a specific embodiment, the bad pixel routine need only be implemented when capturing and generating REAL IMAGES. In that process, conditions such as lighting and other variables can create unwanted artifacts that should be eliminated from processing. In addition, when cameras are used in the field, one pixel might become defective over time; and REAL IMAGES later generated from the defective camera should be adjusted so that the pseudo-pixel which contains the bad pixel is not counted or utilized. In another aspect, areas of the tooth for which the color is to be evaluated are predefined, allowing the analyzer program operating in accordance with this invention to batch-process the images. For example, a sample image can be loaded into an Area Selection Editor program module, where adjustments can be made to user-selected (or predefined) areas of the tooth image. These defined areas are then applied to each image in turn, and the pixel colors within each area are analyzed. In operation, following the image capture in one embodiment the method of this invention proceeds to automatically select the area(s) of the sample for analysis, for example, by applying a general rule to locate the edges of the tooth in the image, and apply a predefined segmentation of the remaining area for analysis. Preferably, the user is allowed to manually select an area of interest in the image, for example, using a computer mouse, as known in the art. In accordance with one embodiment, following the detection of the correct areas for analysis (i.e., excluding edges, light reflections and others), the selected area is divided by using, for example a grid overlay, as shown in Fig. 9. As known, each shade has a varying color content from top to bottom. Therefore, in accordance with this embodiment a more accurate analysis of the entire surface of interest can be made if color determination and matching is applied to the individual cells of the grid, as compared with corresponding area cells of the stored color reference model for each shade guide. Following this stage, in a preferred embodiment before analyzing the area, various filtering operations can be applied to the image, as known in the art. For example, filtering is applied to eliminate abnormalities such as lamp reflections or dark spots. In addition, maximum, minimum and average values for the R, G and B components can be determined over the area of interest and used to, for example, limit the variation from the average value to halfway to the maximum and minimum values. This simple filtering operation has shown satisfactory results in actual testing, although alternative or additional filtering operations can be applied, as known in the art in order to obtain a standard image. In the next step of the method in accordance with this invention, a SNAPSHOT of a patient's tooth is taken by the camera. Next, the digital image of the SNAPSHOT is scaled, if necessary, to approximate the size of the corresponding REFERENCE IMAGE. In the preferred embodiment using pseudo-pixels SNAPSHOT pixels are next processed into pseudo-pixels resulting in a REAL IMAGE containing pseudo-pixels, which substantially correspond to REFERENCE IMAGE pseudo-pixels. A bad pixel routine preferably processes the REAL IMAGE to delete REAL IMAGE pseudo-pixels containing a bad pixel. As above, the bad pixel routine is particularly important at the edges of the tooth image within the SNAPSHOT, where some pixels will certainly contain background (unless the camera and optics are arranged to capture only the tooth; however this is not efficient since effective matching between the REAL IMAGE and the REFERENCE IMAGE occurs when a larger area of the tooth is used in the comparison algorithms, which are defined in further detail below. In a subsequent step, the REAL IMAGE is compared (i.e., correlated) to each REFERENCE IMAGE in the database (e.g., there could be sixteen REFERENCE IMAGES corresponding to the A1-A4, B1-B4, C1-C4 and D2-D4 Vita Shades) via the correlation algorithm (hereinafter "Correlation Algorithm") described below. In this step, each pseudo- pixel of the REAL IMAGE is compared to each pseudo-pixel of the REFERENCE IMAGE; and a composite match number ("CMN") is created indicating how well the REAL IMAGE matches to that REFERENCE IMAGE. The composite match numbers are compared to one another and one of the REFERENCE IMAGES is selected as the "best fit" match to the REAL IMAGE. There is potentially a problem associated with the bad pixel routine and subsequent correlation between REAL IMAGES and the series of REFERENCE IMAGES. As described above, in a specific embodiment, when there is a bad pixel in any pseudo-pixel, all other pseudo-pixels of the same spatial location are discarded. This can become a problem in a case when every (or even most) pseudo-pixel is disqualified, resulting in a situation where no meaningful comparison can be made. Accordingly, in a preferred embodiment, images are correlated on the basis of mathematical measure, i.e., an average, that is functionally dependent upon how many pseudo-pixels remain in an image (REAL or REFERENCE). That is, for any given correlation between a REAL IMAGE and a REFERENCE IMAGE, the number of pseudo-pixels for that comparison are used as a ratio for comparison to other correlation. This aspect of the invention is described in more detail below. In an alternative embodiment, the averaging technique discussed above is used only when, for example, more than 20-25% of the pseudo-pixels are disqualified for all comparisons. Accordingly, so long as there is a sufficient number of remaining pseudo- pixels for comparison, a direct comparison of these pixels can be made without resorting to averages. In a specific embodiment, a sufficient number is deemed to be about 75-80% of the total number of pseudo-pixels available for comparison. Other ratios can be used in alternate embodiments. Bad pixel routines are generally known in the art and thus need not be described in much detail. It is sufficient to note that in accordance with this invention a pixel is determined to be "bad" if its light intensity or color values deviate by more than a certain predefined percentage from adjacent pixels known to be "good". For example, if a pixel deviates by more than 30% from the light intensity of the neighboring 8 pixels, there is a good likelihood that this deviation is anomalous, i.e., due to a bad camera element or corresponding to an image border, and has to be discarded. In a preferred embodiment, a pseudo-pixel is validated only when it contains less than a certain percentage, i.e., about 5%, bad pixels of the total pixels making up the pseudo-pixel. Preferably, bad pixels are also not used in the statistical characterization (e.g., RGB) of the pseudo-pixel. Accordingly, in this embodiment if more than about 5% bad pixels exist for a pseudo-pixel, the pseudo-pixel is not used in further processing. Correlation Algorithms In a preferred embodiment, the Correlation Algorithm of the present invention operates as follows. Each REFERENCE IMAGE is actually a matrix of vectors, each vector corresponding to a pseudo-pixel. By way of example, the REFERENCE IMAGE corresponding to the Al Vita Shade can be assigned as vector Z A] . For the sixteen Vita Shade guide, the remaining fifteen shades for example each have a REFERENCE IMAGE too, e.g., Z^, Z^, etc. Each REFERENCE IMAGE vector "Z" - corresponding to shade guide or porcelain "X" - thus has data similar to the following matrix: Λ where each of the pseudo-pixels "PP" has three values for each of R, G and B values of the pseudo-pixel (actually, the RGB values are the statistically computed (e.g., averaged) composition of the images in the series for that REFERENCE IMAGE, if available). The subscript "x" refers to the appropriate shade, e.g., "Al". Subscripts 1-n define separate pseudo-pixels in the REFERENCE IMAGE. Those skilled in the art will appreciate that ι additional, other or different data can make up each vector, including hue data for each pseudo-pixel. Additionally, other vectors can be considered and processed in the correlation, such as hue and RGB values. In a typical example, each REFERENCE IMAGE might have 20x20 pseudo-pixels which define the REFERENCE IMAGE. Therefore, "n" in the above matrix is 400. 20 When a REAL IMAGE "I" is generated, in accordance with this invention it too is arranged as a matrix of similar form, with each pseudo-pixel "PI" of the REAL IMAGE being a vector of RGB form (or, like above, containing other or additional factors such as hue): In a specific embodiment, the Correlation Algorithm used in accordance with the present invention computes a measure of closeness, i.e., a composite match number 35 ("CMN") through the following relationship: or In accordance with present invention, once the CMN number is computed for each , 0 tooth shade, as shown in the example above, a search is then conducted for the lowest CMN X to find the best fit REFERENCE IMAGE for the REAL IMAGE. That is, the tooth shade or porcelain "X" is identified for the lowest associated value of CMN. As noted above, if there is more than a certain percentage of bad pixels in any pseudo-pixel q for either the REFERENCE IMAGE or the REAL IMAGE, in a preferred embodiment that , - pseudo-pixel is not used in the valuation of CMN. For example, in accordance with the present invention it is acceptable to determine CMN without the q-th pseudo-pixel; however, every other concurrent q-th pseudo-pixel valuation of CMN X in identifying the composite match number is also discarded, so that CMNs for all tooth shades can be compared correctly. ~ f . As noted, the Correlation Algorithm of the embodiment illustrated above preferably uses a bad pixel routine to disqualify bad pseudo-pixels. It was noted already that this can create problems in certain situations. Accordingly, in a preferred embodiment of the present invention the following alternative algorithm can instead be used: In this embodiment for the computation of CMN Pcount x corresponds to the number of common pseudo-pixels found between the REAL IMAGE and the vector Z x . Note that 30 Pcount x can be different for each CMN correlation. For example, if the REAL IMAGE has 400 pseudo-pixels, all good, and REFERENCE IMAGE for Al has 399 pseudo-pixels (e.g., one bad pseudo-pixel identified in the bad pixel routine), then Pcount A] is 399. If however the REFERENCE IMAGE for B4 has 256 pseudo-pixels, then Pcount B4 is 256. If in the same example the REAL IMAGE has 256 valid pseudo-pixels - and in the unlikely event 35 that the disqualified REAL IMAGE pseudo-pixels overlap with the coordinates of disqualified pseudo-pixels in the REFERENCE IMAGE - then Pcount B4 is still 256; however Pcount A1 is also 256 (assuming that the one bad pixel of REFERENCE IMAGE Al corresponds to one of the disqualified pseudo-pixels in the REAL IMAGE. If the one bad pseudo-pixel in REFERENCE IMAGE Al does not correspond to coordinates of one of the disqualified pseudo-pixels of the REAL IMAGE, a more likely event, then Pcount A1 is also 255. Those skilled in the art will appreciate that isolating the measure of closeness CMN in one of the above equations can also be determined without the square root operation - as a minimum composite match number will still be identified for the same functional conditions and/or data. In accordance with the specific embodiment described above, the process of determining Pcount x can be made at any point. In a preferred embodiment, this process is initiated only after a certain percentage of pseudo-pixels are disqualified. For example, if after the completion of the bad pixel routine there remain 300 pseudo-pixels for comparison (in the example that 400 pseudo-pixels exist in each of the REFERENCE and REAL IMAGES), then a straight comparison can be made without the use of the Pcount x adjustment, because a significant percentage of the images can be compared (defining 75% as "significant"; other percentages can be used). Note that it is likely that many of the bad pixel areas in images will overlap, such as at the edge of the image, where tooth shape variations occur often, and at locations such as reflection areas (e.g., areas which specularly reflect light energy to the camera), which are likely to be similar given that the illumination source is generally fixed for each image acquisition. Those skilled in the art will appreciate that variations to the above-described methodology may occur without departing from the scope of the invention. For example, other color detection techniques can be used to characterize tooth color within a pseudo- pixel. In one example, colorimetric "laser-diode" measurements can be used to generate a reflection trace for each pseudo-pixel. In such measurements, a laser diode is "scanned" in wavelength so that a laser beam, scanned through a range of wavelengths, reflects off of each pseudo-pixel. This spectrophotometric-like trace information (for example containing reflectance per wavelength) can be collated with other such traces for other pseudo-pixels to generate a vector of such information. As above, correlation between real and reference vectors is used to determine a best- fit color match. In accordance with another embodiment of the present invention, the camera used for capturing images has a focal plane array with fewer detector elements as compared to typical high resolution arrays (for example those arrays with 640x480 elements, or megapixel digital cameras). For example, in one embodiment of the invention an array has a relatively small number of detectors, i.e., 20x20, 60x40 or others. Such a camera can alleviate the need for pseudo-pixels, as defined above, since each real pixel generated from each detector covers a relatively large area of the tooth image. In effect, such a camera generates "pseudo-pixels" in each digital frame image. Since fewer detector elements are used in this embodiment, it will be appreciated that the camera's overall cost can be reduced. Those skilled in the art will appreciate that a similar effect may be obtained in an alternative embodiment by using magnification optics that only utilizes a small portion of the camera's array in obtaining the image; however such an approach wastes pixel information which has already been collected. Those skilled in the art will appreciate that other closeness measures can be used instead of the algorithms described above to achieve a similar result, without departing from the scope of the invention. By way of example, other techniques of measuring similarity between two data sets can be used in determining a measure of how similar or close two data sets are. For example, one can arrange a data set as a vector so that the correlation coefficient is determined as the cosine of the angle between data vectors. Cross-correlation functions or matched filtering can also be used beneficially. The interested reader is directed to any number of books on digital image and signal processing, such as, for example, Netravali and Haskell, "Digital Pictures, Representation and Compression," Plenum Press, 1988. Sections 1.1; 1.2; 1.3; 1.8; 1.9; 2.2; 3.2; and 3.3 of this book are incorporated herewith by reference for background purposes. In still another embodiment of the present invention, the shape of the grid of pseudo- pixels defining each tooth is selected in a manner dependent upon how the tooth is positioned in the mouth. For example, an incisor tooth very nearly maps to a shade guide; however, with reference to Fig. 14, a posterior tooth does not, particularly relative to the image capture position of the camera. Further, it will be appreciated that for purposes of improving the appearance of a smile, anterior teeth are considerably more important than those in the posterior of the mouth. Thus, in a preferred embodiment it is desirable to provide more close matches, and correspondingly more dense and accurate grid patterns for the anterior teeth. Accordingly, in a specific embodiment, grid shapes and correlation algorithms can depend upon tooth orientation within the mouth and/or upon generalized tooth shape. In particular, anterior teeth will have a (proportionately) larger number of pseudo-pixels than teeth in the back of the mouth for the same surface area. In another aspect, an image of a tooth or tooth shade may be analyzed by a flood fill algorithm to find the edges of the target tooth or tooth shade. Using this algorithm, from a point in the image (e.g., in the SNAPSHOT) known to be in the tooth or tooth shade, adjacent pixels are considered only if that pixel is in a valid color range. The maximum extent is then recorded for the search in the X and Y directions, forming the outer limits of the grid. In addition, contrast changes in groups of pixels can be considered and used to determine the extent; but a black border is easy to find. In accordance with another important embodiment of the present invention, "tooth shades", as used above, are not used per se in defining a patient's tooth color. Rather, in a specific embodiment, a grid of pseudo-pixels is generated for the patient's tooth; and these (pseudo-)pixels define the porcelain for respective regions of the tooth. Pseudo-pixels are not actually required; and actual pixels can also be used in this manner to define porcelain characteristics for each spatial location in the mouth. Reconstructive tooth material is then specified per pixel or pseudo-pixel. A data file generated from the SNAPSHOT or REAL IMAGE is then processed to specify reconstructive materials with spatial precision, as defined by pixels or pseudo-pixels. An acceptable quantification of RGB values, for example, can be used to tolerance both the measurement and materials specification. For example, by associating error bars with each measure - e.g., R +/- ΔR, G +/- ΔG, B +/- ΔB, where the Δ quantities are defined within certain practical tolerance limits - reasonable tolerances can be achieved. Tooth shades operate similarly in that each shade results in a quantized color difference from every other shade; and thus the aforementioned tolerancing technique provides similar accuracy to the above-described correlation algorithm. Unlike the tooth shade approach, however, spatial accuracy for any given reconstructive tooth is generally determined only by the number of pixels or pseudo-pixels used in the reconstructive tooth manufacture; whereas a tooth shade has predefined color gradients defining the tooth shade regardless of the numbers of pixels or pseudo-pixels used. It will be appreciated that this approach avoids the use of tooth shades at all, along with the possible confusion created by the existence of alternate tooth shade guides. The System and its Components Cameras of the type required for use with this invention are generally known in the art and include, for example: INSIGHT™, manufactured in San Carlos, California; CYGNASCOPE™ offered by Cygnus Instruments, Inc., Goleta, California; VISTACAM™ and others. In a preferred embodiment, the system of this invention uses a Welch- Allyn brand camera. Generally, it is desired to use camera systems offering full- color imagery, which are capable of capturing a range of sizes, i.e., from the size of a typical patient's tooth preferably to images of the patient's whole smile. In the preferred embodiment, it is advantageous for the camera to supply a minimum 640 x 480 pixel image to the PC software 24 bits per pixel (i.e., 8 bits for each of the red, green and blue (RGB) components), or preferably 30 bits per pixel. In a specific example, the system of this invention uses ALARIS QUICK VIDEO TRANSPORT frame grabber, providing digitized images with at least 24 bits resolution. More specifically, the software can use a Twain protocol interface, as known in the art, which allows other cameras and frame grabbers to be tested without the need for a change of software. Preferably, images captured by the camera are displayed on a monitor screen to provide instantaneous feedback to the system operator. In a preferred embodiment, the resolution of the camera is specified in terms of the Minimum Resolvable Color Difference that the complete system is able to achieve. This can be specified, for example, as the two RGB values of the two closest shades the system is required to differentiate. For example, the Chromoscop Shades 430 and 440 can be used to this end. In general, it is envisioned that the system should be able to differentiate between about 80 or more different shades. Another requirement is that the system should be able to produce repeatable images. That is to say that images of the same tooth taken at the same session should not have a Δi of not more than 0J, which is the amount needed for the eye to perceive a difference. In a specific embodiment, the camera used in the system of this invention is a CMOS imager. In terms of its physical setup, in a preferred embodiment, a stand-alone camera containing its own light source can be used, as explained below. A number of alternate embodiments are available in this regard. For example, in one embodiment the camera can be battery powered. In this embodiment, the camera can sits on a holder containing an inductive battery charger when it is not in use. In another embodiment, when mounted on the charger the camera can be coupled via an isolation sleeve (to be explained below) to a calibration target, for example, made of porcelain. In a specific embodiment the output of the camera is supplied to a digitizer (such as a Sony digitizer) enabling convenient digital storage of the image. As noted above, the output of the camera can also be supplied to a frame grabber in a PC. Both options can be used in a specific embodiment. In another embodiment, the output of the camera can be supplied directly to a monitor (preferably positioned close to a surgery chair) and provide a digital output to a PC, which then need not be close to the patient. As known in the art, the output could be USB-type, or IEEE 1394. In accordance with a preferred embodiment the digital output of the camera also provides the opportunity to control the camera from a PC. Finally, in a preferred embodiment it is desirable to control the camera so as to use it in two modes, i.e., normal image - for the mouth and full face shots; and analysis image - in which color balance and automatic functions are disabled for tooth and calibration image, as described below. Turning now to the drawings, FIG. 1 shows a system 10 constructed according to a preferred embodiment of the invention. A solid state (or intra-oral) camera 12 connects to a computer 14 via a PC card 16 to capture images through a wand 18. The solid state camera 12 includes a detector array 12a including an array of detector elements 12b, which generate pixels in the digital images (e.g., SNAPSHOTS) captured by the camera 12. Through one of several known mechanisms, internal optics within the wand 18 and/or camera 12 permit the capture of an image of a target object 20 (for purposes of illustration, target object 20 is shown grossly over-sized as compared to other elements in FIG. 1) by the array 12a. By way of example, relay optics 18a within the wand relays an image to the array 12a. A protection sleeve 22, discussed in further detail below (also grossly oversized for purposes of illustration), preferably extends from the wand 18. As shown, the optics provide an optical conjugate between the array 12a and the target object 20 through well-known imaging techniques. Light captured from the target object 20 enters the wand 18 for transfer to the camera 12 through an entrance aperture window 26. The wand 18 generates light 19 to illuminate the target object 20 through light ports 28. Preferably, light from the outside 30 of a sleeve 22 is not permitted to illuminate the object 20 so that control is maintained; and thus the sleeve 22 shields the target area 20 from illumination by outside sources 30 (e.g., ambient room lighting). An aperture 32 within the center of the end piece 34 of the sleeve 22 is where the tooth or tooth shade are placed so that a SNAPSHOT (i.e., a digital image of the tooth or tooth shade) can be made. As discussed above, these SNAPSHOTS are processed to form REAL IMAGES (from real teeth) or REFERENCE IMAGES (from tooth shades or porcelains, etc.). A black border 36 around the aperture 23 provides a good reference around which the tooth or tooth shade are discernible within the digital image of the target area 20. The remaining area 38 about the border 36 and within the end piece 34 is preferably a white reference sample, equally reflecting all light 19 from the light ports 28. Finally, again with reference to FIG. 1, digital images from the camera 12 are sent to the computer 14; and processing software 50 within the computer 14 processes these images to generate, i.e., a CMN for each REAL IMAGE relative to the REFERENCE IMAGES. As discussed above, the software 50 processes the CMNs to locate the lowest value CMN, indicating a match; and communicates the associated shade of that lowest CMN to the user via signal line 52. As mentioned, other processing algorithms can be developed to determine a best-fit match without departing from the scope of the invention. A representative digital image 30 captured by the camera 12 is illustrated in FIG. 2, showing an image 36' of the border 36, an image 38' of the reference sample 38, and a tooth image 40. The entire image 30 covers the target area 20 of FIG. 1. FIG. 2 also illustrates obvious regions 41 of the image 30 that would generate bad pixels since such regions do not contain tooth imagery but rather other background imagery (e.g., the patient's gum). FIG. 3 shows a blow up image of the pixels 42 (only representative pixels 42 are shown), which make up the tooth image 40 of FIG. 2. In accord with the invention, these pixels are transformed into pseudo-pixels 44 of FIG. 4. Each pseudo-pixel 44 is made up of all real pixels within the area of the associated pseudo-pixel 44. Two pseudo-pixels 44b illustrate, for example, how a pseudo-pixel can be generated from nine real pixels 42. FIG. 4 also illustrates that an image can be made from either a real tooth 40 (resulting in a REAL IMAGE) or a reference shade 40 (resulting in a REFERENCE IMAGE). REAL IMAGES and REFERENCE IMAGES are correlated to find the composite match number (CMN) as described above. FIG. 5 shows another embodiment of an end piece 98 used in accordance with a specific embodiment, that mounts to, or is made integrally with, the end of the sleeve (e.g., the sleeve 22, FIG. 1) and which has a series of tooth shades 100 disposed in the end plate 98, so that for each target 102 (e.g., the tooth or tooth shade), all relevant manufacturing shades are provided in the same digital image, thereby preventing color contamination or other anomalies caused by time delay. As discussed above, when using the end piece 98 of this embodiment each shade 100 is processed as a REFERENCE IMAGE and the tooth 102 is processed as a REAL IMAGE relative to those REFERENCE IMAGES to find a CMN. Preferably, a black border 104 surrounds the tooth aperture 106 and tooth 102. Also preferably, the remaining area 106 about the border 104 and in the end piece 98 is a reference area. By way of example, the reference area 106 is a white reflecting region with can be sampled by detectors that image that region 106. Further examples of the use of reference area are discussed below. Isolation Sleeve In a preferred embodiment, the system of the invention has an isolation sleeve serving to reduce variations in the images captured and processed by the system, and in particular to eliminate light contamination from external sources. In addition, the isolation sleeve preferably keeps the reference shade and the actual tooth at a set distance from the illumination source and the camera optics. The sleeve also preferably sets the angle of illumination between the source and the tooth so as to reduce reflections. More particularly, the REFERENCE IMAGES and the REAL IMAGE are preferably taken at the same illumination intensities, at approximately the same distance, and without substantial specular reflections from the source. To this end, in a preferred embodiment the sleeve shields the camera detector from imaging outside light and instead utilizes internally generated light (i.e., internal to the camera, for example, or associated with an intra-oral wand attached to the camera) that can be controlled. The sides (or side) of the sleeve are coated in a specific embodiment with a black material (e.g., a paint or a black mat paper, or black felt), which reduces reflections along the sleeve to the tooth or reference shade. As used herein, "target area" refers to the image gathering location that the system of the invention (i.e., that region captured by the camera's detectors), including the REAL or REFERENCE IMAGE, as defined above. FIG. 6 shows one end of wand 130 and a sleeve 132 constructed according to a specific embodiment of the invention. As in the example shown in FIG. 1 above, the wand 103 connects to a solid state camera (not shown, for purposes of illustration) to collect digital images of the target region 134 at the end of the sleeve 132. By way of example, the target region 134 includes an aperture (not shown) for imaging a tooth therein. Light 135 from the camera or wand 130 exits the wand 130 at optical aperture 136 to illuminate the target region 134. In a specific embodiment illustrated in FIG. 6, the sleeve 132 used in the camera system of the present invention includes an accordion-like exterior, which permits soft placement of the end of the sleeve onto the patient's tooth. Preferably, such a sleeve is not entirely rigid so that the sleeve 132 can make contact without concerns about damaging the tooth. The outer portion of the sleeve 132 in this embodiment thus acts similar to a spring, and an inner structural member within the sleeve sets the final source-to-tooth distance once the outer sleeve/spring compresses to the desired location. As shown in FIG. 6, the accordion- like sleeve 132 compresses between the target region 134 and the wand 130, as shown by compression arrow 138. In operation, a user of the wand/sleeve 130/132 pushes the sleeve 132 to the patient's tooth, and the sleeve 132 compresses to provide comfortable (i.e., non-rigid contact). In a preferred embodiment, the sleeve 132 is spring-like to provide some force opposing to compression. This force increases until there is an interaction between the sleeve 132, and/or the end piece of the sleeve 132 (i.e., the part of the sleeve at the target region 134), and the rigid structural member 140 within the sleeve 132. The member 140 stops compression at a fixed location so that a set distance is achieved from the aperture 136 and the target region 140; and so that a repeatable image size is attained. Illumination As noted, in a preferred embodiment, the camera system of this invention includes a light source that illuminates the target area. In a specific embodiment the sleeve 132 can be made to rotate so that images are gathered from difficult locations in the mouth. Preferably, the light source is tied to fiber optics which rotate with the sleeve so that regardless of sleeve position the source-to-target area remains approximately fixed. In another aspect, the camera includes optics, such as image collection optics and/or an entrance window. In system embodiment including this feature, the camera optics is tied to fiber optics, so that images are captured effectively regardless of the position of the sleeve. In another aspect, the sleeve used with the dental camera system of the present invention incorporates imaging optics which relay the tooth image through a Lyot stop, to prevent passage of unwanted light energy to the camera detectors. In a specific embodiment, the sleeve incorporates baffling - such as "two-bounce" optical stray light baffling - to reduce or substantially eliminate stray light from external sources to the desired tooth image area. FIG. 7 shows illumination arrangement in a preferred embodiment of the system of the invention. In FIG. 7, the source 150 of the illuminating wand 152 (connected to the solid state camera, not shown) is angled from the target area 154. As shown, the sleeve 156 connected to the wand 152 is arranged adjacent to a patient's tooth 158, so that digital images can be taken of the tooth 158 (according to the practices discussed herein) through the wand's optical entrance aperture 160. For purposes of illustration, FIG. 7 also shows how light 162 emitting from the source 150 travels in a generally specular direction 164, reflecting off the tooth 158 into a direction 166 that is away from the aperture 160. Those skilled in the art will appreciate that scattering does occur off the tooth 158 and into the aperture 160, but that the arrangement eliminates some unwanted reflections into the aperture. Light captured through the aperture 160 is relayed by optics (e.g., fibers and/or relay lenses) to the camera's focal plane (not shown) to generate digital images of the tooth 158. FIG. 8 shows another embodiment of a sleeve 168 constructed according to the invention to reduce passage of light 171 into the wand's entrance aperture 169 from sources 170 away from the target object (e.g., the tooth 172). The sleeve 168 is especially useful in imaging the tooth 172 without adjacent proximity to the sleeve 168, as illustrated in FIG. 8. The sleeve 168 includes baffles 168a known in the art, which require at least one "bounce" and preferably two bounces of the light 171 prior to gaining access to the entrance aperture 169, thereby significantly attenuating "out of field" sources 170 (i.e., those unwanted sources which might influence the color measure, e.g., room lighting). For simplicity, in this illustration the wand and solid state camera are not shown. Baffles 168a can be placed within other sleeves shown herein to improve out-of-field stray light rejection. As noted above, in order to ensure high-quality images which do not depend on the specific lightning conditions at the time the pictures are taken, in accordance with this invention it is important to mimmize the influence of such factors. Accordingly, in another specific embodiment, the sleeve used in the dental camera system of this invention includes a reference sample disposed at the end of the sleeve, near the target area, so that: (a) color comparison information can be obtained; and/or (b) the camera has sufficient reflective surfaces from which to effectively trigger the camera's auto-brightness and/or auto-color features. Specifically, as to feature (b), certain cameras available on the market include electronics and software which automatically adjust brightness and/or color in a digital image. Preferably, in this embodiment such features are disabled. However, in the event they are operating, the reference sample is sized so that a sufficient reflection area is generated at the end of the sleeve, whereby the camera can operate to capture good color images. By way of example, as to feature (b) above, the sample should be sized so that RGB values vary in a controlled or calibrated manner throughout the reasonable tooth shade reflections (e.g., throughout all Vita Shades). As to feature (a) above, one preferred embodiment of the invention utilizes the reference sample to obtain a color reference used to reduce variations in the digital image. "Color" is based on "reflection" - that is, what the camera sees at the target area is based on reflection of whatever source illuminates the target. With the sleeve used in a preferred embodiment, the source is limited to the camera's illuminating source, thereby eliminating other sources and color variations that are not controllable (e.g., the ambient lighting in a building). It is well known that a black body absorbs visible light; and a white reflects the light. In one embodiment, therefore, the reference sample is as white as possible so that it exhibits very little color (and particularly, the sample reflects light equally in the visible light range from between about 400nm to 800nm). When using a white reference sample in accordance with this embodiment of the invention, the following process occurs: 1) Compute average RGB values (and/or other image variables such as hue) for several or all pixels imaged of the reference sample. This computed average is referred to as REF RGB. 2) For each digital image (i.e., for both REFERENCE IMAGES and REAL IMAGES), subtract REF RGB from RGB pixel values for that image. Keep track of the sign (i.e., positive or negative) of the result. The result is referred to as "REF RELATIVE RGB" (i.e., image RGB - REF RGB). 3) Utilize a correlation algorithm, such as described above, (i.e., for the CMN) on REF RELATIVE RGBs as opposed to absolute RGB values (for the pseudo- pixels). Note that when the RSS (i.e., subtract and square) of the CMN algorithm is computed, the sign of the REF RELATIVE RGB matters. For example, if the REFERENCE IMAGE RGB is -J,-.5,-.6, and the REAL IMAGE RGB is J, .7, .9, then this REAL IMAGE has quite a bit more color difference (compared to the REF IMAGE, which is the important quantity) than, e.g., a REAL IMAGE with -.05, .2, J. Afterwards, the square of the RSS destroys the sign importance. The reference sample compensation algorithm described above is used in a specific embodiment to compensate for certain variations. Thus, the auto-brightness feature of certain cameras changes the color of the light emitted from the camera (this is sometimes referred to in the art as the color temperature). Unfortunately, the emitted RGB is not known except for the reference sample, which reflects the source light back to the camera detectors. A good reference sample will thus reflect nearly all colors equally. Since on is interested in differences between REAL IMAGES and REFERENCE IMAGES, the real concern involves differences and not absolute colors. The reference sample compensation thus also compensates for image acquisition changes which occur over time. For example, the source may emit more or less light, over time, even over several minutes or hours; and it would be desirable to eliminate such variations to increase the sensitivity to color comparisons. The passage of time during an image acquisition sequence only adds to the variability in the measurement: the source color temperature may change, the detector sensitivity or gain may change, etc. With the above reference sample adjustment, if for example one has a perfect white tooth, then its REF RELATIVE RGB is 0,0,0. Assuming that a tooth shade exists that was also perfectly white, it would have a REF RELATIVE RGB of 0,0,0 - creating a match. In another embodiment, the white reference is integrated to find REF RGB, per frame. REF RGB is then subtracted from each pixel RGB in the image (or the other way, i.e., image RGB subtracted from REF RGB, as long as consistent throughout every measurement). In another embodiment, REF RGB is subtracted from pseudo-pixels; but preferably REF RGB is subtracted from real pixel RGBs. In another embodiment, the sleeve used with the dental camera system of the present invention is formed in the following way. At the end of the sleeve, a central aperture exists preferably in the middle of the target area (e.g., an object such as a tooth or shade is placed at the aperture). Surrounding the central aperture is a black border, to provide high contrast at the edges of the target object. A target object such as a tooth is thus readily defined and discerned within the black border. The aperture also fixes the size of the image for the tooth or tooth shade. Some or all of the remaining area at the end of the sleeve (captured by the camera detectors) in the target area is a white reference sample. The amount of white reference sample in the target area can be chosen experimentally. By way of example, the average mid point in the auto-brightness (if operating) is obtained so that on average REF RGB changes little. The size of the white sample in the target area is adjusted in area until REF RGB is minimized for all shade values, e.g., A1-A4, B1-B4 and so on. With more black in the image due to less reference sample area, the auto brightness control on the camera (if applicable) adjusts to higher gain to 'balance' the intensity of the image, causing the reference and sample parts to saturate in the red and green. As noted above, in a specific embodiment, the walls of the sleeve are selected mat black to eliminate reflections, but the facing plate containing the target area is bright to force the camera gain downwards, out of non-linear color operability. In this embodiment preferably the camera's auto features are turned off (and at least any white balance is set to manual). In one specific embodiment, the reference sample is made of a light colored felt material. In alternative embodiments, the sleeve walls are made of a felt material. In these embodiments, the felt material has elements which extend away from the material producing more of a lambertian surface. Such surfaces are preferred as they reduce unwanted specular reflections. Also, the sample reference produces an excellent image when it is not specular. Alternatively, a black velour paper can be used in the sleeve, such as by JL Hammett Co. FIG. 10 illustrates a non-contact re-imaging system 250 used in accordance with another embodiment of the present invention to image a target tooth 252 without contact between the tooth 252 and a sleeve 254. Optics 255 reimage the tooth 252 internal to the sleeve 254, at internal image 256, and a Lyot stop 258 is used to reduce unwanted stray light entering the aperture 260 to the camera (not shown). FIG. 11 illustrates a non-contact re-imaging system 300 used to image a target tooth 302 to a digital camera 304, and without contact between the tooth 302 and the system 300 or camera 304. Although this reimaging system 300 can be made in several forms, in one embodiment the system 300 includes a sleeve 306 that permits hand-held manipulation into a patient's mouth to capture the digital image of the tooth 302. By way of example, optics 308 reimage the tooth 302 internal to the sleeve 306, at internal image 310, and a stop 312 is used for color referencing in analyzing the tooth color. Stop 312 forms an aperture defined by edge 312a. FIG. 12 illustrates one digital image 320, as taken by camera 304, of the tooth 302 and the inside view of stop 312. The region 322 defines that region inside the patient's mouth that is not the patient's tooth 310. Region 324 consists of a color reference which is used as described herein to relate and compare to color pixels of the digital image of the tooth image 310, so as to better define tooth color. Those skilled in the art will appreciate that a reimaging system such as in FIG. 11 can be made in several ways. By way of example, system 350 of FIG. 13 shows one system of the invention to reimage a tooth 352 to an internal image 354 for reimaging into a digital camera 356. As above, camera 356 takes SNAPSHOTS of the tooth 352, for color analysis. Optical element 358 images the tooth into optical fiber bundle 360, which relays the image from one side 360a to the other side 360b of the bundle 360, as known in the art. Optical elements 362 provide for reimaging to form the internal image 354 at the stop 364. As above, the stop 364 has a reference color disposed thereon, facing camera 356, so that a reference color image is attained such as in FIG. 12. Fiber optic bundle 366 relays the image 354 from side 366a to 366b, and exit optics 368 provides for relaying the tooth image to the camera 356. One convenient feature of system 350 is that fibers 366, 360 can be flexible; and a sleeve 370 can support these elements to provide a hand-held wand that can be inserted into a patient's mouth to acquire the image. Camera 356 can provide its own light source 356a which generates light 356b back along the optical path taken by tooth image 354. The advantage of this is that source 356a can be carefully selected for its color characteristics to facilitate tooth color detection; and further light 356b can illuminate stop 364 inside the sleeve or wand 370 so that the camera 356 can detect and compare its color to the tooth's color image 354. Tooth Restorative Processing FIG. 14 shows certain tooth restorations and decays, which illustrations can help understand more fully aspects of the invention discussed above. A healthy tooth, free from any decay with no current restoration ("restoration" is any part of a tooth that is replaced with a material that allows the tooth to remain in the mouth as a functioning and whole structure) is referred to as a "virgin" tooth. Despite advances in preventative treatment and services (fluoridated water, fluoride treatments, sealants - which are unfilled resins that are bonded into deep grooves of posterior or back teeth to prevent decay in those areas), 50% of American children by age 12 have occlusal decay ( decay in the top, or biting surface) in permanent molars which erupted or came into their mouths at age 6. Typical progression of decay in a tooth is as follows: Following C.V. Black's classifications, a tooth can require a restoration in the following positions: CLASS 1 - occlusal area, that is, within only the top or biting surface of the tooth, usually beginning in the groove or crevice. This term is used only for posterior (back) teeth, i.e., molars and premolars. CLASS 2 - area made up of occlusal and one or more sides of the tooth, either mesial (wall towards front) and/or distal (wall towards back) and or buccal(wall towards cheek) and or lingual(wall towards tongue) so that a class 2 restoration may be termed "MO" (mesial-occlusal), "MOD", "OB", etc. CLASS 3 - area of an anterior, or front, tooth involving only an interproximal wall, that is mesial or distal, areas that face neighboring teeth. CLASS 4 - area of an anterior tooth involving the incisal (bottom) edge and an interpoximal wall. CLASS 5 - area of any tooth on only the buccal or lingual wall CLASS 6 - area of a tooth involving the cusp tip ( cusp being the highest point of the tooth , like the mountain peak; this would apply to canines, premolars, and molars) Once decay is detected, through clinical examination, radiographs, etc., the decayed portion of the tooth needs to be removed. This is achieved through the use of a handpiece (drill). Once excavation of decay is complete, the remaining tooth structure is evaluated for restoration possibilities. A "filling" is placed if 50% or more of the tooth remains, with the stress-bearing areas of the tooth remaining intact (such as cusps and walls of the tooth which are active in biting and chewing process). If these areas of the tooth are compromised, a laboratory-processed restoration is required. Consider a specific example, in which it is assumed that the tooth needs a restoration, which will be placed right in the office, say a MO on a molar. The choice of materials is made, which could be either amalgam (silver, not done much anymore), or composite or ceromer, which are tooth-colored direct materials (Matrix of ground plastic and /or glass in a bis- GMA resin). A shade needs to be selected for the material, such as described herein in accord with the invention. The tooth is cleaned and isolated from saliva and blood by use of cotton rolls, matrix bands, possibly a rubber dam. The tooth surface is etched with a cleanser (typically 37% hydrophosphuric acid), rinsed, and treated with an adhesive, which is bonded to the tooth by use of a curing light - a light with a wand attachment that is about 11 - 13 cm in width and emits a light in the range of 400-500 nanometers. The material is then placed into the cavity by hand instruments or via dispensing through a carpule/cartridge system in a syringe. The material is somewhat condensed into place at 2-3 mm intervals, and light cured in between. Upon final filling, the restoration is polished and contoured using finishing burs (tips) on the handpiece (drill). If the tooth requires a lab fabricated restoration, such as an inlay, onlay or crown, further steps need to be taken (Inlay being a Class 2 restoration NOT including cusps, onlay being a Class 2 restoration including cusps, crown being full, or total coverage of the tooth). The tooth is shaped to make the final shape not have any undercuts, with walls as parallel as possible for retention purposes. Then an impression, or mold is taken of the tooth, which is in a material that remains accurate despite temperature changes, moisture, pouring stone into the mold and removing it several times. An impression of the opposite arch of teeth, or opposing arch, is taken also so that the technician can articulate, or put together the two arches and simulate the patient's mouth or bite. A registration of such a bite can be taken also and sent with the case. So that the things sent to the lab for such a case are: impression of the tooth to be restored and adjacent teeth, model or impression of opposing teeth, and possibly a bite registration. Those skilled in the art should appreciate that the invention to determine the appropriate color shades of the tooth as illustrated in FIG. 14 can be accomplished by the methods herein, and/or by systems disclosed in the several figures. Using a wand of the invention, furthermore, various teeth (as in FIG. 14) can be acquired for digital evaluation. In accord with the invention, digital files of patients' teeth can be stored in memory of computer 14, FIG. 1, for a permanent record. A patient can then be evaluated over time for color changes. MISCELLANEOUS ASPECTS Although the VITA™ Shade guide is often discussed herein, it should be apparent that other shade guides and porcelains can be stored as REFERENCE IMAGES and compared to REAL IMAGES in alternative embodiments of this invention. Computer memory can store a large number of images, even from different manufacturers, so as to provide the optimum color fit to a patient's tooth. By way of example, IVOCLAR has one suitable shade guide, as well as various materials of porcelains, ceromers, polymers, and others. In accord with the invention, a database can store REFERENCE IMAGES for match correlation to REAL IMAGES. Alternatively, in one aspect, the invention performs a conversion to other manufacturer shades and or porcelains so that alternative laboratories can be used without undue concern for manufacturer alliance. Specifically, in accord with one aspect of the invention, a conversion between known shade guides is provided for increased lab selectivity. It will be appreciated that the conversion of digital images involves mapping from one set of color coordinates to another, which procedure is well known in the art and need not be considered in further detail. As described, one major problem due to auto brightness is that if there is not enough light material in the image, the auto brightness turns the gain up too high, and the R and G values saturate in the sample. By adding sufficient light colored reference area, the balance of light to dark is better, but the reference can saturate in places. This can be compensated some by using an end plate at the end of the sleeve that will be all white but with the black border round the sample aperture. A reference color area can be included in one corner so that the camera adjusts brightness for the constant white area leaving the reference and sample somewhere in the middle of the operable RGB ranges. In still another aspect, instead of subtracting the RGB from the reference sample, an average of the reference sample is used. Specifically, over the range of images taken, an average REF RGB (denoted "AVE REF RGB") is determined for the reference sample. For each individual image, the difference is calculated between the REF RGB and the AVE REF RGB. This delta RGB is then added to the image RGB to correct for any compensation in the camera. Thus if the image is brighter than the average image, the difference is subtracted from the sample values and vice versa. In still another aspect, the reference sleeve has an end plate which contains all tooth shades for a given manufacturer (so that one sleeve is used for a particular manufacturer). Any image therefore acquires the sample tooth as well as all the tooth shades; and image processing commences on the one digital image. This is advantageous in that camera color drift is compensated for since all images are taken at the same time. Finally, the contents of U.S. Patents 5,766,006 and 5,961,324can be reviewed to the extent needed to understand the related embodiments described herein. Furthermore, while the invention has been described with reference to the preferred embodiments, it will be appreciated by those of ordinary skill in the art that various modifications can be made to the structure, form and operation of the various embodiments of the invention without departing from its spirit and scope, which is defined in the following claims. APPENDIX A contains, for disclosure purposes, non-limiting source code for use with certain aspects of the invention. Appendix A Software Modules Number of Module Title Pages About l page ImageDisplay 3 pages RefDisplay 4 pages SampleLocator 4 pages Sdimain 8 pages ShadeData 8 pages SplashScreen 3 pages ToothObject 6 pages unit About; interface uses Windows, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ExtCtrls; type TAboutBox = class (TForm) Panell: TPanel; OKButton: TButton; Programlcon: TI age; ProductName: TLabel; Version: TLabel; Copyright: TLabel; Comments: TLabel; private ( Private declarations } public { Public declarations } end; var AboutBox: TAboutBox; implementation {$R +.DFM} end. About - page 1 unit ImageDisplay; interface uses Windows, Messages, SysUtils , Classes, Graphics, Controls , Forms, Dialogs, TMultiP, ExtCtrls; type Tfr lmageDisplay = class (TForm) pnllmage: TPanel; pmilmage: TPMultilmage; procedure FormCreate (Sender : TObject); procedure pmilmagePaint (Sender : TObject); private { Private declarations } RefA : TRect; RefR : integer; RefC : integer; SampleA : TRect; SampleR : integer; SampleC : integer; DisplayGrid : boolean; procedure DrawGrid (Area TRect; Rows, Columns : integer); procedure DrawGrids; public { Public declarations } procedure DefmeGrids (RefArea: TRect; RefRo s : integer; RefCols : integer; SampleArea TRect; SampleRows integer; SampleCols integer) procedure HideGrid; end; var f rmlmageDisplay: TfrmlmageDisplay; implementation { $R * . DFM} procedure TfrmlmageDisplay . DrawGrid (Area TRect; Rows, Columns : integer); var Spacing : real; index : integer; ScaleX : real; ScaleY : real; Left, Right, Top, Bottom : integer; begin ScaleX := pmilmage.Width/640; ScaleY := pmilmage. Height/480; Left := Round (Area. Left * ScaleX); Right := Round (Area . Right * ScaleX); Top := Round (Area. Top * ScaleY); Bottor := Round (Area. Bottor * ScaleY); ImageDisplay - page 1 with pmilmage. Canvas do begin moveto(Left, Top); lineto(Left, Bottom); lineto (Right, Bottom); lineto (Right, Top) ; lineto (Left, Top); if Rows > 1 then begin Spacing := (Bottom - Top) / Rows; for index := 1 to Rows - 1 do begin moveto (Left+1, Top + trunc (Spacing * index)); lineto (Right-1, Top + trunc (Spacing * index)); end; end; if Columns > 1 then begin Spacing := (Right - left) / Columns; for index := 1 to Columns - 1 do begin moveto(Left + trunc (Spacing * index), Top+1); lineto(Left + trunc (Spacing * index), Bottom-1); end; end; end; end; // DrawGrid procedure TfrmlmageDisplay. DrawGrids; begin SetR0P2 (pmilmage. Canvas. Handle, R2_N0T) ; if DisplayGrid then begin DrawGrid (RefA, RefR, RefC) ; DrawGrid (SampleA, SampleR, SampleC) ; end; end; // DrawGrids procedure TfrmlmageDisplay. ormCreate (Sender: TObject); begin DisplayGrid := false; end; procedure TfrmlmageDisplay. DefineGrids (RefArea: TRect; RefRows : integer; RefCols : integer; SampleArea TRect; SampleRows integer; SampleCols integer) ; begin RefA := RefArea; RefR := RefRows; ImageDisplay - page 2 RefC RefCols; SampleA SampleArea; SampleR : = SampleRows; SampleC := SampleCols; DisplayGrid := true ; pmilmage. Repaint; end; procedure TfrmlmageDisplay .HideGrid; begin DisplayGrid := false, Repaint; end; end; end. ImageDisplay - page 3 unit RefDisplay; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, ShadeData, ComCtrls, StdCtrls, ExtCtrls; type TfrmReferenceDisplay = class (TForm) Panell: TPanel; sgAnalysis: TStringGrid; Panel2: TPanel; edGridCol: TEdit; udGridCol: TUpDown; edGridRow: TEdit; udGridRow: TUpDown; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure FormCreate (Sender : TObject); procedure InsertShadeData (Shade : TShadeColours) ; procedure edGridColChange (Sender : TObject); procedure LoadShades (Shades : TShadeReferences); procedure edGridRowChange (Sender : TObject); private { Private declarations } Rowlnsertlndex : integer; DisplayRow : integer; DisplayColumn : integer; DisplayShades : TShadeReferences; procedure ShowShades; public ( Public declarations } end; var frmReferenceDisplay: TfrmReferenceDisplay; implementation {$R *.DFM) const TitleRow = 0; NameColumn = 0; RedColumn = NameColumn + 1; GreenColumn = RedColumn + 1; BlueColumn = GreenColumn + 1; VariationColumn = BlueColumn + 1; RedMaxColumn = VariationColumn + 1; RedMinColumn = RedMaxColumn + 1; GreenMaxColumn = RedMinColumn + 1; GreenMinColumn = GreenMaxColumn + 1; BlueMaxColumn = GreenMinColumn + 1; BlueMinColu n = BlueMaxColumn + 1; RefDisplay - page 1 Precision = 6; Digits = 4; procedure TfrmReferenceDisplay . FormCreate (Sender: TObject); begin { Configure the Grid to Display the Reference Set } DisplayColumn := GridWidth div 2; DisplayRow := GridHeight div 2; udGridCol.Min := 1; udGridCol.Max := GridWidth; udGridRow.Min := 1; udGridRow.Max := GridHeight; udGridRow. Position := DisplayRow; udGridCol. Position := DisplayColumn; edGridCol.Text := IntToStr (DisplayColumn) ; edGridRow.Text := IntToStr (DisplayRow) ; sgAnalysis,. ColCount := 11; sgAnalysis.RowCount := 17; // may change Rowlnsertlndex : = TitleRow + 1; sgAnalysis. Cells [NameColumn, TitleRow] := 'Shade'; sgAnalysis. Cells [RedColumn, TitleRow] := 'Red'; sgAnalysis. Cells [GreenColumn, TitleRow] := 'Green'; sgAnalysis. Cells [BlueColumn, TitleRow] := 'Blue'; sgAnalysis. Cells [VariationColumn, TitleRow] := 'Variation'; sgAnalysis. Cells [RedMaxColumn, TitleRow] := 'Max Red' ; sgAnalysis. Cells [GreenMaxColumn, TitleRow] := 'Max Green'; sgAnalysis. Cells [BlueMaxColumn, TitleRow] := 'Max Blue ' ; sgAnalysis. Cells [RedMinColumn, TitleRow] := 'Min Red' ; sgAnalysis. Cells [GreenMinColumn, TitleRow] := 'Min Green'; sgAnalysis. Cells [BlueMinColumn, TitleRow] := 'Min Blue'; DisplayShades := TShadeReferences .Create; end; procedure TfrmReferenceDisplay . InsertShadeData (Shade : TShadeColours) ; var Variation : real; begin with Shade. GridColours [DisplayColumn, DisplayRow] do begin sgAnalysis. Cells [NameColumn, Rowlnsertlndex] := Shade. ame; sgAnalysis. Cells [RedColumn, Rowlnsertlndex] := FloatToStrF (Red, ff ixed, Precision, Digits) ; sgAnalysis .Cells [GreenColumn, Rowlnsertlndex] := FloatToStrF (Green, ffFixed, Precision, Digits) ; sgAnalysis .Cells [BlueColumn, Rowlnsertlndex] := FloatToStrF (Blue, ffFixed, Precision, Digits) ; sgAnalysis .Cells [RedMaxColumn, Rowlnsertlndex] := FloatToStrF (RedMax, ffFixed, Precision, Digits) ; RefDisplay - page 2 sgAnalysis.Cells [GreenMaxColumn, Rowlnsertlndex] := FloatToStrF (GreenMax, ffFixed, Precision, Digits) ; sgAnalysis. Cells [BlueMaxColumn, Rowlnsertlndex] := FloatToStr (BlueMax, ffFixed, Precision, Digits) ; sgAnalysis. Cells [RedMinColumn, Rowlnsertlndex] := FloatToStrF (RedMin, ffFixed, Precision, Digits); sgAnalysis. Cells [GreenMinColumn, Rowlnsertlndex] := FloatToStrF (GreenMin, ffFixed, Precision, Digits) ; sgAnalysis. Cells [BlueMinColumn, Rowlnsertlndex] := FloatToStrF (BlueMin, ffFixed, Precision, Digits); Variation := (RedMax - RedMin) + (GreenMax - GreenMin) + (BlueMax - BlueMin) ; sgAnalysis. Cells [VariationColumn, Rowlnsertlndex] := FloatToStrF (Variation, ffFixed, Precision, Digits) ; end; inc (Rowlnsertlndex) ; end; procedure TfrmReferenceDisplay . ShowShades; var Shadelndex : integer; CurrentShade : TShadeColours; begin Rowlnsertlndex := TitleRow + 1; for Shadelndex := 0 to DisplayShades . ShadeList .Count - 1 do begin CurrentShade := DisplayShades .ShadeList . Items [Shadelndex] ; InsertShadeData (CurrentShade) ; end; end; procedure TfrmReferenceDisplay . LoadShades (Shades : TShadeReferences); var IDisplayRow : integer; Degin { First Clear Old list } if DisplayShades. ShadeList. Count > 0 then for IDisplayRow := 1 to DisplayShades. ShadeList .Count do sgAnalysis. ows [IDisplayRow] .Clear; //DisplayShades . ree; DisplayShades := Shades; sgAnalysis. RowCount : = Shades . ShadeList .Count + 1; ShowShades; end; procedure TfrmReferenceDisplay .edGridColChange (Sender: TObject) ; Degin if Visible then begin DisplayColumn := StrToInt (edGridCol .Text) ; ShowShades; end; end; procedure TfrmReferenceDisplay.edGridRowChange (Sender : TObject) ; RefDisplay - page 3 begin if Visible then begin DisplayRow := StrToInt (edGridRow. Text ) ShowShades; end; end; end. RefDisplay - page 4 unit SampleLocator; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, TMultiP, ExtCtrls, StdCtrls; type TfrmSampleLocator = class (TForm) Panel1: TPanel; pmilmage: TPMultilmage; OpenDialog: TOpenDialog; btnLoadSample: TButton; edXPos: TEdit; Labell: TLabel; edYPos: TEdit; Label2: TLabel; rgLocation: TRadioGroup; Panel2: TPanel; Label3: TLabel; Label : TLabel; edRefX: TEdit; Label5: TLabel; edRefY: TEdit; Label6: TLabel; edSa pleX: TEdit; Label7: TLabel; edSampleY: TEdit; Label8: TLabel; btnSave: TButton; btnCancel: TButton; procedure pmilmageMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer) ; procedure FormCreate (Sender : TObject); procedure btnSaveClic (Senαer : TObject); procedure btnLoadSampleClic (Sender: TObject); procedure pmilmageClic (Sender: TObject); procedure FormSho (Sender: TObject); procedure btnCancelClick (Sender: TObject); private { Private declarations } public { Public declarations ) ReferenceLocation : TPoint; SampleLocation : TPoint; end; var frmSampleLocator: TfrmSampleLocator; implementation {SR *.DFM) SampleLocator - page 1 uses SDIMain, IniFiles; procedure TfrmSampleLocator .pmilmageMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin edXPos.Text := IntToStr (X) ; edYPos.Text := IntToStr (Y) ; end; procedure TfrmSampleLocator .FormCreate (Sender: TObject); var IniFile : TIniFile; begin { Load The Saved Sample Location From Ini File ) { Set Default for now ) ReferenceLocation := Point (170, 40); SampleLocation := Point(300, 160); if FileExists (frmShadeAnalyzer .DiskDrive + 'AnalyseX' + IniFileName) then begin try IniFile : = TIniFile .Create (frmShadeAnalyzer .DiskDrive + 'AnalyseX' + IniFileName) ; with ReferenceLocation do begin X := StrToInt (IniFile. ReadString (IniReferenceSection, IniRefX, 'ERROR')); Y := StrToInt (IniFile. ReadString (IniReferenceSection, IniRefY, 'ERROR')); end; with SampleLocation do begin X := StrToInt (IniFile . ReadString (IniSampleSection, IniSampleX, 'ERROR' ) ) ; Y := StrToInt (IniFile. ReadString (IniSampleSection, IniSampleY, 'ERROR')); end; finally IniFile . Free; end; end; end; procedure TfrmSampleLocator . btnSaveClic (Sender : TObject) ; var IniFile : TIniFile; begin ReferenceLocation : = point (StrToInt (edRefX. Text) , StrToInt (edRefY. Text) ) ; SampleLocation : = point (StrToInt (edSampleX. Text) , StrToInt (edSampleY . Text) ) ; if FileExists ( frmShadeAnalyzer . DiskDrive + 'AnalyseX ' + IniFileName) then begin try IniFile : = TIniFile . Create ( frmShadeAnalyzer . DiskDrive + ' AnalyseX ' + IniFileName) ; with ReferenceLocation do SampleLocator - page 2 begin IniFile .WriteString (IniReferenceSection, IniRefX, IntToStr (X) ) ; IniFile. riteString (IniReferenceSection, IniRefY, IntToStr (Y) ) ; end; with SampleLocation do begin IniFile.WriteString (IniSampleSection, IniSampleX, IntToStr (X) ) ; IniFile.WriteString (IniSampleSection, IniSampleY, IntToStr (Y) ) ; end; finally IniFile . ree; end; end; Close; end; procedure TfrmSampleLocator. btnLoadSampleClick (Sender : TObject) ; begin OpenDialog. Title := 'Sample Imade To Display'; OpenDialog.InitialDir := Copy (ParamStr (0) , 0, 3) + 'AnalyseXPicturesV ; OpenDialog. DefaultExt := GraphicExtension (TBitmap) ; OpenDialog. Filter := GraphicFilter (TBitmap) ; OpenDialog.Options := [ofPathMustExist, ofFileMustExist] ; if OpenDialog. Execute then begin pmilmage . Picture . LoadFromFile (OpenDialog . Filename) ; end; end; procedure TfrmSampleLocator.pmilmageClic (Sender: TObject); begin ( Check Location Option and Update The Location Co Ords ) if rgLocation. Itemlndex = 0 then begin edRefX.Text := edXPos .Text; edRefY.Text := edYPos .Text; end else begin edSampleX.Text := edXPos.Text; edSampleY.Text := edYPos.Text; end; end; procedure TfrmSampleLocator . FormShdw (Sender: TObject); begin edRefX.Text := IntToStr (ReferenceLocation.x) ; edRefY.Text := IntToStr (ReferenceLocation. y) ; edSampleX.Text := IntToStr (SampleLocation.x) ; edSampleY.Text := IntToStr (SampleLocation. y) ; end; procedure TfrmSampleLocator .btnCancelClick (Sender : TObject); begin Close; SampleLocator - page 3 end; end. SampleLocator - page 4 unit Sdimain; interface uses Windows , Classes , Graphics , Forms , Controls, Menus , Dialogs , StdCtrls, Buttons , ExtCtrls , ComCtrls, ShadeData; const IniFilename = 'ShadeAnalyse.ini'; IniReferenceSection = ' EFERENCE AREA' ; IniRefX = 'RefAreaX'; IniRefY = ' RefAreaY'; IniSampleSection = ' SAMPLE ARE ' ; IniSampleX = ' SampleAreaX' ; IniSampleY = ' SampleAreaY' ; IniShadeSetSection = 'DEFAULT GUIDE'; IniDefaultGuide = 'GuideFilename' ; Startup : Boolean = true; // used for splash screen type TfrmShadeAnalyzer = class (TForm) SDIAppMenu: TMainMenu; FileMenu: TMenuItem; Exitltem: TMenuItem; Nl : TMenuItem; OpenDialog: TOpenDialog; Helpl: TMenuItem; About1: TMenuItem; StatusBar: TStatusBar; Calibrate: TMenuItem; Optionsl: TMenuItem; Showlmagel: TMenuItem; ShowReferencel: TMenuItem; SetSampleLocl : TMenuItem; Analysel: TMenuItem; gbShadeSet: TGroupBox; btnLoad: TButton; btnSave: TButton; edShadeSetName: TEdit; gbSampleAnalysis: TGroupBox; btnMatch: TButton; Label1: TLabel; edNearest: TEdit; SaveDialog: TSaveDialog; procedure ShowHint (Sender : TObject); procedure AboutlClick (Sender : TObject); procedure FormCreate (Sender : TObject); procedure CalibrateClick (Senαer : TObject); procedure ShowImagelClick (Sender : TObject); procedure ShowReferencelClic (Sender : TObject); procedure SetSampleLoclClick (Sender: TObject); procedure AnalyselClick (Senαer : TObject); Sdimain - page 1 procedure btnSaveClic (Sender : TObject); procedure btnLoadClick (Sender: TObject); procedure FormClose (Sender : TObject; var Action: TCloseAction); procedure FormActivate (Sender : TObject); private { Private declarations } Shades : TShadeReferences; function Analyselmage (FileName : string; ShadeName : string) : TShadeColours; function FindNearestShade (Sample : tShadeColours) : string; procedure LoadShadeSet (Filename : string); public { Public declarations } DiskDrive : string; NewCalibration : boolean; end; var frmShadeAnalyzer : TfrmShadeAnalyzer; implementation uses SysUtils, About, IniFiles, ToothObject, ImageDisplay, RefDisplay, SampleLocator, ΞplashScreen; {$R * . DFM) const RefRedMedian = 0.5432; RefGreenMedian = 0.6308; RefBlueMedian = 0.3355; RefRows = 1; RefColumns = 1; SampleRows = GridHeight; // To change see Shade Data SampleColumns = GridWidth; procedure TfrmShadeAnalyzer . ShowHint (Sender : TObject); begin StatusBar. SimpleText := Application. Hint; end; procedure TfrmShadeAnalyzer . AboutlClickfSender: TObject); begin AboutBox. ShowModal; end; procedure TfrmShadeAnalyzer . FormCreate (Sender: TObject); var IniFile : TIniFile; DefaultShadeFilename : string; Degin Application. OnHint := ShowHint; DiskDrive := Copy (ParamStr (0) , 0, 3) ; Shades := TShadeReferences .Create; // we will build a new list Sdimain - page 2 NewCalibration := false; try IniFile := TIniFile . Create (DiskDrive + 'AnalyseX' + IniFilename) ; DefaultShadeFilename := IniFile . ReadString ( IniShadeSetSection, IniDefaultGuide, 'ERROR'); DefaultShadeFilename := DiskDrive + 'AnalyseX' + DefaultShadeFilename; LoadShadeSet (DefaultShadeFilename) ; finally IniFile. Free; end; end; function TfrmShadeAnalyzer .Analyselmage (FileName : string; ShadeName : string) TShadeColours; var ShadeColours : TShadeColours; Tooth : TTooth; DeltaRed : real; DeltaGreen : real; DeltaBlue : real; PixelPercent : real; RefArea : TRect; SampleArea : TRect; begin Tooth := TTooth. Create; ( Analyse The Reference Area } frmlmageDisplay . HideGrid; Tooth. LoadBitmapFromFile (FileName) ; frmlmageDisplay.pmilmage. Picture .Bitmap. Assign (Tooth. ToothBitmap) ; Application . ProcessMessages; RefArea := Tooth. FillSearchSampleLimits (frmSampleLocator .ReferenceLocation) ; frmlmageDisplay. DefineGrids (RefArea, RefRows, RefColumns, Rect (0, 0, 0, 0) , SampleRows, SampleColumns); Application. ProcessMessages; / Tooth. RemoveMask (RefArea) ; frmlmageDisplay.pmilmage . Picture . Bitmap.Assign (Tooth.ToothBitmap) ; Application . ProcessMessages ; Tooth.Analyse (0, 0, RefArea, RefRows, RefColumns, DeltaRed, DeltaGreen, DeltaBlue, PixelPercent); DeltaRed := RefRedMedian - DeltaRed; DeltaGreen := RefGreenMedian - DeltaGreen; DeltaBlue := RefBlueMedian - DeltaBlue; f Now Analyse the Sample Area } frmlmageDisplay . HideGrid; Tooth . LoadBitmapFromFile ( FileName) ; frmlmageDisplay .pmilmage. Picture . Bitmap.Assign (Tooth . ToothBitmap) ; Application . ProcessMessages; SampleArea := Tooth. FillSearchSampleLimits (frmSampleLocator . SampleLocation) ; frmlmageDisplay. DefineGrids (Rect (0, 0, 0, 0) , RefRows, RefColumns, SampleArea, SampleRows, SampleColumns) ; Sdimain - page 3 Application. ProcessMessages; Tooth. RemoveReflection (SampleArea) ; frmlmageDisplay.pmilmage. Picture. Bitmap.Assign (Tooth. ToothBitmap) ; Application. ProcessMessages; ShadeColours := Tooth. AnalyseGrid (SampleArea, SampleRows, SampleColumns, DeltaRed, DeltaGreen, DeltaBlue) ; ShadeColours. Name := ShadeName; Result := ShadeColours; Tooth. Free; end; procedure TfrmShadeAnalyzer .CalibrateClick (Sender : TObject); var FilePath : string; Filelndex : integer; lFilena e : string; ShadeName : string; ProgressBar : TProgressBar; ShadeColours : TShadeColours; begin OpenDialog. Title := 'Files To Analyse'; OpenDialog. InitialDir := DiskDrive + 'Analyse\Pictures\ ' ; OpenDialog. DefaultExt := GraphicExtension (TBitmap) ; OpenDialog. Filter := GraphicFilter (TBitmap) ; OpenDialog. Options := [ofAllowMultiSelect, ofPathMustExist, ofFileMustExist] ; if OpenDialog. Execute then with OpenDialog. Files do begin edShadeSetName.Text := 'New Calibration'; NewCalibration := true; StatusBar .SimpleText := 'Loading Calibration Bitmaps'; Shades . Free; Shades := TShadeReferences . Create; // we will build a new list FilePath := ExtractFilePath (OpenDialog. FileName) ; ProgressBar := TProgressBar .Create (self) ; ProgressBar. Parent := self; ProgressBar .Align := alBottom; ProgressBar .Min := 0; ProgressBar .Max := Count+2; ProgressBar. Step := 1; // the amount to move with the Steplt method for Filelndex := 0 to Count - 1 do begin lFileName := Strings [Filelndex] ; ( Get the Shade Name from the filename } ShadeName := ExtractFilename (lFilename) ; StatusBar .SimpleText := 'Loading Calibration Bitmap : ' +ShadeName; ShadeName := Uppercase (Copy (ShadeName, 1, Pos ( ' . ' , ShadeName) - 2)); // remove the letter ShadeColours := Analyselmage (lFileName, ShadeName); Shades.AddSample (ShadeColours) ; Sdimain - page 4 ProgressBar .Stepit; // Move one Step amount end; Application. ProcessMessages; { Get the Shades into alphabetical order ) StatusBar. SimpleText := 'Sorting Shade Samples'; Shades . SortList; ProgressBar. Stepit; // Move one Step amount { Process the Shades Data to get average sets } StatusBar. SimpleText := 'Reducing Shades to Reference Set'; Shades . ReduceList; ProgressBar .Stepit; // Move one Step amount Shades . SortList ; ProgressBar . Free; StatusBar. SimpleText := ' Done ' ; end; end; procedure TfrmShadeAnalyzer. ShowImagelClick (Sender : TObject); begin frmlmageDisplay. Show; end; function TfrmShadeAnalyze . FindNearestShade (Sample : tShadeColours) : string; var CurrentShade : TShadeColours; ShadeName : string; ShadeDifference : real; CurrentDifference : real; Shadelndex : integer; begin ShadeDifference := 1000000; ShadeName : = ' one ' ; for Shadelndex := 0 to Shades . ShadeList .Count - 1 do begin CurrentShade : = Shades . ShadeList . Items [Shadelndex] ; CurrentDifference : = CurrentShade . ColourDif ference ( Sample) ; if CurrentDifference < ShadeDif ference then begin ShadeName : = CurrentShade . Name ; ShadeDif ference : = CurrentDifference ; end; end; result : = ShadeName; end; procedure TfrmShadeAnalyzer . ShowReferencelClick (Sender : TObj ect ) ; begin f rmRef erenceDisplay . LoadShades ( Shades ) ; frmRef erenceDisplay . ShowModal ; end; Sdimain - page 5 proce d ure T f rmShadeAnalyzer . SetSampleLoclClick (Sender : TObj ect) ; begin frmSampleLocator. ShowModal; end; procedure TfrmShadeAnalyzer .AnalyselClick (Sender : TObject); var lFilename : string; SampleColours : TShadeColours; ProgressBar : TProgressBar; begin OpenDialog. Title := 'Files To Analyse'; OpenDialog. InitialDir := DiskDrive + 'AnalyseXPicturesX ' ; OpenDialog. DefaultExt := GraphicExtension (TBitmap) ; OpenDialog. Filter := GraphicFilter (TBitmap) ; OpenDialog. Options := [ofPathMustExist, ofFileMustExist] ; if OpenDialog. Execute then begin edNearest.Text := ' ' ; StatusBar. SimpleText := 'Analyzing Sample'; ProgressBar := TProgressBar .Create (self) ; ProgressBar. Parent := self; ProgressBar.Align := alBottom; ProgressBar.Min := 0; ProgressBar.Max := 3; ProgressBar. Step := 1; // the amount to move with the Stepit method lFilename := OpenDialog . Filename; ProgressBar. Stepit; Application . ProcessMessages ; SampleColours := Analyselmage (lFileName, 'Unknown'); ProgressBar . Stepit; Application. ProcessMessages ; StatusBar .SimpleText := 'Searching for Nearest Shade'; edNearest.Text := FindNearestShade (SampleColours) ; ProgressBar . Stepit ; Application . ProcessMessages ; StatusBar. SimpleText := ' Done ' ; ProgressBar . Free; end; end; procedure TfrmShadeAnalyzer .btnSaveClick (Sender : TObject); var lFilename : string; OutStream : TFileStream; IniFile : TIniFile; begin SaveDialog. Title := 'Shade Guide Filename to Save'; SaveDialog. InitialDir := DiskDrive + 'AnalyseX'; Sdimain - page 6 SaveDialog. DefaultExt := 'SDS'; SaveDialog. Filter := 'Shade Guides I *. SDS ' ; SaveDialog. Options := [ofPathMustExist] ; if SaveDialog. Execute then with SaveDialog do begin if not FileExists (Filename) or (MessageDlg (Format ( Overwrite %s? ' , [ExtractFilename (Filename) ] ) , mtConfirmation, [mbYes, mbNo] , 0) = mrYes) then begin try OutStream := TFileStream. Create (Filename, fmCreate or fmShareCompat); Shades . SaveToStream (OutStream) ; lFilename := ExtractFilename (SaveDialog. Filename) ; edShadeSetName.Text := copy (lFilename, 1, Length (lFilename) - 4 ) ; NewCalibration := false; try IniFile := TIniFile . Create (DiskDrive + 'AnalyseX' + IniFilename) ; IniFile. WriteString (IniShadeSetSection, IniDefaultGuide, lFilename) ; finally IniFile. Free; end; finally OutStream . Free; end; end; end; end; procedure TfrmShadeAnalyzer .LoadShadeSet (Filename : string); var InStream : TFileStream; IniFile : TIniFile; lFilename : string; begin try edShadeSetName.Text := 'Loading...'; InStream := TFileStream. Create (Filename, fmOpenRead or fmShareCompat); Shades. Free; Shades := TShadeReferences .Create; // we will build a new list Shades . LoadFromStream ( InStream) ; lFilename := ExtractFilename (Filename) ; edShadeSetName.Text := copy (lFilename, 1, Length (lFilename) - 4); try IniFile := TIniFile . Create (DiskDrive + 'AnalyseX' + IniFilename); IniFile. riteString (IniShadeSetSection, IniDefaultGuide, lFilename) ; finally IniFile. Free; end; finally InStream. Free; end; end; procedure TfrmShadeAnalyzer .btnLoadClick (Sender : TObject); begin OpenDialog. Title := 'Shade Guide Set to Load'; Sdimain - page 7 OpenDialog. InitialDir := DiskDrive + 'AnalyseX'; OpenDialog. DefaultExt := 'SDS'; OpenDialog. Filter := 'Shade Guides | *. SDS ' ; OpenDialog. Options := [ofPathMustExist, ofFileMustExist] ; if OpenDialog. Execute then LoadShadeSet (OpenDialog. Filename) ; end; procedure TfrmShadeAnalyzer . FormClose (Sender : TObject; var Action: TCloseAction); begin ( Closing Program - Check for unsaved Calibration Set ) if (NewCalibration) and (MessageDlg ( 'Calibration Load Not Saved. Save Now?', mtConfirmation, [mbYes, mbNo] , 0) = rYes) then btnSaveClick (self) ; end; procedure TfrmShadeAnalyzer . FormActivate (Sender : TObject); begin if Startup then begin Startup := false; frmSplashScreen. Show; Application. ProcessMessages; {$IFDEF SLIDELOGO) frmSplashScreen. Timer1. Interval := 1000; ($ELSE) frmSplashScreen. Timer1. Interval := 3000; {$ENDIF} end; end; end. Sdimain - page 8 unit ShadeData; { The Shade reference is divided into a grid. Each area of the grid is analysed, and the average Red, Green and Blue values are stored. If there is an edge element in the sample, the valid flag is set to ignore the area in correlation matches. ) interface uses Classes; const GridWidth = 10; GridHeight = 10; type PShadeColourElement = "TShadeColourElement; TShadeColourElement = class (TObject ) Red : real48; // Average red content Green : real48; // Average green content Blue : real48; // Average blue content Valid : boolean; // Valid for comparison ValidPixelPercent : real48; // 0..1 (1 = all pixels used) RedDev : real48; GreenDev : real48; BlueDev : real48; RedMax : real48; RedMin : real48; GreenMax : real48; GreenMin : real48; BlueMax : real48; BlueMin : real48; constructor Create; function ColourDifference (ShadeColour : TShadeColourElement) : real48; procedure StoreColour (R, G, B : real48; Percent : real) ; procedure AddColour (R,G, B : real48; Percent : real); function ValidCell : boolean; procedure SaveToStream (OutStream : TStream); procedure LoadFromStream( InStream : TStream); private end; PShadeColours = "TShadeColours; TShadeColours = class (TObject) Name : string; // Name of the Shade reference etc. GridColours : array [1..GridWidth, 1..GridHeight] of TShadeColourElement; function ColourDifference (ShadeColours : TShadeColours) : real48; procedure SaveToStream (OutStream : TStream); ShadeData - page 1 procedure LoadFromStream (InStream : TStream); private end; TShadeReferences = class (TObject ) ShadeList : TList; constructor Create; procedure AddSample (Sample : TShadeColours); procedure Clear; procedure SortList; procedure ReduceList; procedure SaveToStream (OutStream : TStream); procedure LoadFromStream (InStream : TStream); private end; implementation uses SysUtils, Dialogs , Controls ; const ValidityLimit = 0.95; // 95% of pixels must be used constructor TShadeColourElement . Create; begin Red := 0; Green := 0; Blue := 0; ValidPixelPercent := 0; Valid := false; RedDev := 0; GreenDev := 0; BlueDev := 0; RedMax := 0; RedMin := 1000; GreenMax := 0; GreenMin := 1000; BlueMax := 0; BlueMin := 1000; end; procedure TShadeColourElement. StoreColour (R,G,B : real48; Percent : real) ; begin Red := R; Green := G; Blue := B; ValidPixelPercent := Percent; Valid := (Percent >= ValidityLimit); end; procedure TShadeColourElement .AddColour (R, G, B : real48; Percent : real) ; begin if R > RedMax then RedMax := R; if G > GreenMax then GreenMax := G; if B > BlueMax then BlueMax := B; ShadeData - page 2 if R < RedMin then RedMin := R; if G < GreenMin then GreenMin := G; if B < BlueMin then BlueMin := B; Red := Red + R; Green := Green + G; Blue := Blue + B; end; function TShadeColourElement .ValidCell : boolean; begin Result := Valid; end; function TShadeColourElement .ColourDifference (ShadeColour : TShadeColourElement) : real48; var DistanceRed : real48; DistanceGreen : real48; DistanceBlue : real48; begin if (Valid) and (ShadeColour .Valid) then begin DistanceRed: = (Red - ShadeColour .Red) ; DistanceGreen := (Green - ShadeColour .Green) ; DistanceBlue := (Blue - ShadeColour . Blue) ; Result := sqrt (sqr (DistanceRed) + sqr (DistanceGreen) + sqr (DistanceBlue) ) ; end else Result := -1; // cannot compare if any element is invalid end; procedure TShadeColourElement . SaveToStream (OutStream : TStream); begin OutStream. riteBuffer (Red, SizeOf (Red) ) ; OutStream.WriteBuffer (Green, SizeOf (Green) ) ; OutStream. riteBuffer (Blue, SizeOf (Blue) ) ; OutStream. WriteBuffer (Valid, SizeOf (Valid) ) ; OutStream.WriteBuffer (ValidPixelPercent, SizeOf (ValidPixelPercent) ) ; OutStream. riteBuffer (RedDev, SizeOf (RedDev) ) ; OutStream. WriteBuffer (GreenDev, SizeOf (GreenDev) ) ; OutStream. riteBuffer (BlueDev, SizeOf (BlueDev) ) ; OutStream. riteBuffer (RedMax, SizeOf (RedMax) ) ; OutStream.WriteBuffer (RedMin, SizeOf (RedMin) ) ; OutStream. riteBu fer (GreenMax, SizeOf (GreenMax) ) ; OutStream.WriteBuffer (GreenMin, SizeOf (GreenMin) ) ; OutStream. riteBuffer (BlueMax, SizeOf (BlueMax) ) ; OutStream. WriteBuffer (BlueMin, SizeOf (BlueMin) ) ; end; procedure TShadeColourElement . LoadFromStream (InStream : TStream); begin InStream. ReadBuffer (Red, SizeOf (Red) ) ; InStream. ReadBuffer (Green, SizeOf (Green) ) ; InStream. ReadBuffer (Blue, SizeOf (Blue) ) ; InStream. ReadBuffer (Valid, SizeOf (Valid) ) ; ShadeData - page 3 InStream. ReadBuffer (ValidPixelPercent, SizeOf (ValidPixelPercent) ) ; InStream. ReadBuffer (RedDev, SizeOf (RedDev) ) ; InStream. ReadBuffer (GreenDev, SizeOf (GreenDev) ) ; InStream. ReadBuffer (BlueDev, SizeOf (BlueDev) ) ; InStream. ReadBuffer (RedMax, SizeOf (RedMax) ) ; InStream. ReadBuffer (RedMin, SizeOf (RedMin) ) ; InStream.ReadBuffer (GreenMax, SizeOf (GreenMax) ) ; InStream. ReadBuffer (GreenMin, SizeOf (GreenMin) ) ; InStream. ReadBuffer (BlueMax, SizeOf (BlueMax) ) ; InStream. ReadBuffer (BlueMin, SizeOf (BlueMin) ) ; end; function TShadeColours .ColourDifference (ShadeColours . TShadeColours) : real48; var DifferenceGrid : array [ 1.. GridWidth, 1.. GridHeight] of real48; Widthlndex : integer; Heightlndex : integer; MatchedCells : integer; begin Result := 0; MatchedCells := 0; { Compare each grid positions colour } for Widthlndex := 1 to GridWidth do for Heightlndex := 1 to GridHeight do begin DifferenceGrid [Widthlndex, Heightlndex] := GridColours [Widthlndex, Heightlndex] .ColourDifference (ShadeColours .GridColours [Widthlndex, Heightlndex] ) ; end; < Calculate the Colour Difference for the whole Shade initially just sum the differences Possibly ust return the standard deviation or something. } for Widthlndex := 1 to GridWidth do for Heightlndex := 1 to GridHeight do if DifferenceGrid [Widthlndex, Heightlndex] <> -1 then begin Result := Result + Sqr (DifferenceGrid [Widthlnαex, Heightlndex]); mc (MatchedCells) ; end; Result := Sqrt (Result/MatchedCells) ; end; procedure TShadeColours . SaveToStream (OutStream : TStream); var Widthlndex : integer; Heightlndex : integer; StringLength : integer; begin StringLength := Length (Name) ; OutStream. riteBuffer (StringLength, SizeOf (StringLergth) ) ; OutStream. riteBuffer (Name [1] , StringLength) ; for Widthlndex := 1 to GridWidth do for Heightlndex := 1 to GridHeight do ShadeData - page 4 GridColours [Widthlndex, Heightlndex] . SaveToStream (OutStream) ; end; procedure TShadeColours . oadFromStream (InStream : TStream); var Widthlndex : integer; Heightlndex : integer; StringLength : integer; begin InStream. ReadBuffer (StringLength, SizeOf (StringLength) ) ; SetLength(Name, StringLength); InStream. ReadBuffer (Name [1] , StringLength) ; for Widthlndex := 1 to GridWidth do for Heightlndex := 1 to GridHeight do begin GridColours [Widthlndex, Heightlndex] := TShadeColourElement .Create; GridColours [Widthlndex, Heightlndex] .LoadFromStrea (InStream) ; end; end; procedure TShadeReferences .AddSample (Sample : TShadeColours); begin ShadeList .Add (Sample) ; end; procedure TShadeReferences . Clear; begin ShadeList . Clear; end; constructor TShadeReferences . Create ; begin ShadeList := TList .Create; end; function SortCompare (Iteml, Item2: pointer): Integer; begin if TShadeColours (Iteml) .Name < TShadeColours (Item2) .Name then Result := -1 else if TShadeColours (Iteml) .Name > TShadeColours (Item2) .Name then Result := 1 else Result := 0; end; procedure TShadeReferences . SortList ; begin ShadeList. Sort (SortCompare) ; end; procedure TShadeReferences . ReduceList ; var AverageShadeColours : TShadeColours; AveragedShades : TList; CurrentShade : TShadeColours; Shadelndex : integer; Row, Col : integer; ShadeData - page 5 AverageCount : array [ 1.. GridWidth, 1.. GridHeight] of integer; begin ( For each individually Named shade, average all values into one ShadeColours ) // New (AverageShadeColours ) ; AveragedΞhades := TList . Create; //New (CurrentShade) ; CurrentShade := TShadeColours . Create; CurrentShade. Name := ''; for Shadelndex := 1 to ShadeList . Count do begin if CurrentShade. Name <> TShadeColours (ShadeList . Items [Shadelndex-l] ) .Name then begin if Shadelndex <> 1 then begin { Save the last shade and start a new one ) for Col := 1 to GridWidth do for Row := 1 to GridHeight do if AverageCount [Col, Row] <> 0 then with AverageShadeColours. GridColours [Col, Row] do begin Red := Red / AverageCount [Col, Row]; Green := Green / AverageCount [Col, Row]; Blue := Blue / AverageCount [Col, Row]; ValidPixelPercent := ValidPixelPercent / AverageCountJCol, Row]; end; AveragedShades . Add (AverageShadeColours ) ; end; {This is a new Shade} AverageShadeColours := TShadeColours .Create; for Col := 1 to GridWidth do for Row := 1 to GridHeight do begin AverageShadeColours. GridColours [Col, Row] := TShadeColourElement . Create; AverageCount [Col, Row] := 0; end; AverageShadeColours . Name:= TShadeColours (ShadeList . Items [Shadelndex- 1] ) .Name; end; CurrentShade := ShadeList . Items [Shadelndex-l] ; for Col := 1 to GridWidth do for Row := 1 to GridHeight do begin with AverageShadeColours. GridColours [Col, Row] do begin if CurrentShade. GridColours [Col, Row] .Valid then begin Valid := true; ShadeData - page 6 AddColour (CurrentShade .GridColours [Col, Row] .Red, CurrentShade . GridColours [Col, Row] .Green, CurrentShade. GridColours [Col, Row] .Blue, CurrentShade. GridColours [Col, Row] .ValidPixelPercent) ; // ValidPixelPercent := ValidPixelPercent + CurrentShade. GridColours [Col, Row] .ValidPixelPercent; // Red := Red + CurrentShade. GridColours [Col, Row]. Red; // Green := Green + CurrentShade. GridColours [Col, Row] .Green; // Blue := Blue + CurrentShade. GridColours [Col, Row]. Blue; inc (AverageCount [Col, Row] ) ; end; end; end; end; ( Save the last shade } for Col := 1 to GridWidth do for Row := 1 to GridHeight do if AverageCount [Col, Row] <> 0 then with AverageShadeColours .GridColours [Col, Row] do begin Red := Red / AverageCount [Col, Row]; Green := Green / AverageCount [Col, Row]; Blue := Blue / AverageCount [Col, Row]; ValidPixelPercent := ValidPixelPercent / AverageCount [Col, Row] ; end; AveragedShades .Add (AverageShadeColours) ; ShadeList . Free; ShadeList := AveragedShades; end; procedure TShadeReferences . SaveToStream (OutStream : TStream); var Shadelndex : integer; CurrentShade : TShadeColours; begin Shadelndex := ShadeList .Count; // First write the number of Shade in the set OutStream.WriteBuffer (Shadelndex, SizeOf (Shadelndex) ) ; for Shadelndex := 0 to ShadeList .Count - 1 do begin CurrentShade : = ShadeList . Items [Shadelndex] ; CurrentShade . SaveToStream (OutStream) ; end; end; procedure TShadeReferences . LoadFromStream (InStream : TStream); var NumberOfShades : integer; Shadelndex : integer; CurrentShade : TShadeColours; begin InStream. eadBuffer (NumberOfShades , SizeOf (NumberOfShades ) ) ; for Shadelndex := 0 to NumberOfShades - 1 do begin CurrentShade := TShadeColours .Create ; ShadeData - page 7 CurrentShade. oadFromStream (InStream ) ; AddSample (CurrentShade) ; end; end; end. ShadeData - page 8 unit SplashScreen; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, TMultiP; type TSplashState = (splCenter, splMovmg, splDone) ; TfrmSplashScreen = class (TForm) Timerl: TTimer; pnlLogo: TPanel; Image 1: TImage; procedure TimerlTimer (Sender : TObject); procedure FormCreate (Sender : TObject); procedure FormPamt (Sender : TObject); private { Private declarations } SplashState : TSplashState; StartPosition : TPoint; StartSize : TPoint; VirticalStep : integer; HoπzontalStep : integer; WidthStep : integer; HeightStep : integer; CanPamt : boolean; public ( Public declarations } end; var f rmSplashScreen: TfrmSplashScreen; implementation {$R *.DFM} const FimshPosition : TPoint = (x:580; y:700); FinishSize : TPoint = (x:430; y:50); Duration = 2000; // ms Movelnterval = 50; // ms procedure TfrmSplashScreen.TimerlTimer (Sender : TObject); begin (5IFDEF SLIDELOGO} if abs (FimshPosition.x - Left) < abs (HorizontalStep) then HorizontalStep := HorizontalStep div abs (HorizontalStep) ; if abs (FimshPosition. Y - Top) < abs (VirticalStep) then VirticalStep := VirticalStep div abs (VirticalStep) ; f abs (FmishSize.x - Width) < abs (WidthStep) then WidthStep := WidthStep div abs (WidthStep) ; _f abs(FιnιshSιze.Y - Height) < abs (HeightStep) then HeightStep := HeightStep div abs (HeightStep) ; SplashScreen - page 1 CanPaint := false; case SplashState of splCenter: begin Timer1. Interval : = Movelnterval; SplashState := splMoving; end; splMoving: begin if (Top = FinishPosition.y) and (Left = FinishPosition.x) and (Height = FinishSize. y) and (Width = FinishSize.x) then SplashState := splDone else begin if Top <> FinishPosition.y then Top := Top + VirticalStep; if Left <> FinishPosition.x then Left := Left + HorizontalStep; if Height <> FinishSize. y then Height := Height + HeightStep; if Width <> FinishSize.x then Width := Width + WidthStep; end; end; splDone: begin Timerl. Enabled := false; end; end; CanPaint := true; {$ELSE} Height := FinishSize. y; Width := FinishSize.x; Top := FinishPosition.y; Left := FinishPosition.x; pnlLogo.BevelWidth := 2; {5ENDIF} end; procedure TfrmSplashScreen. FormCreate (Sender : TObject); begin SplashState := splCenter; StartPosition.x := Left; StartPosition.y := Top; StartSize.x := Width; StartSize.y := Height; //VirticalStep := (FinishPosition.y - StartPosition.y) div (Duration div Movelnterval) ; //HorizontalStep := (FinishPosition.x - StartPosition.x) div (Duration div Movelnterval) ; //HeightStep := (FinishSize. y - StartSize.y) div (Duration div Movelnterval); //WidthStep := (FinishSize.x ■ - StartSize.x) div (Duration div Movelnterval); VirticalStep := 1; HorizontalStep := 1; HeightStep := -1; SplashScreen - page 2 WidthStep := -1; CanPaint := true; end; procedure TfrmSplashScreen. For Paint (Sender : TObject) begin if CanPaint then Image1. Repaint ; end; end. -61- SplashScreen - a e 3 unit ToothObject; interface uses Windows, SysUtils, Classes, Graphics, ShadeData; type TTooth = class (TObject) private Referencelnitialised : boolean; function CalculateTestArea (Row, Col : integer; Area : TRect; NoRows, NoCols : integer) : TRect; public Red : real; Green : real; Blue : real; Hue : real; Saturation : real; Intensity : real; RefRed : real; RefGreen : real; RefBlue : real; RefHue : real; RefSaturation : real; Reflntensity : real; ToothBitmap : TBitmap; ToothBitmapMask : TBitmap; constructor Create; procedure Free; procedure LoadBitmapFromFile (Filename : String); procedure RemoveReflection (TestArea : TRect); procedure RemoveMask (TestArea : TRect); function FillSearchSampleLimits (StartPoint : TPoint) : TRect; procedure Analyse (Row, Col : integer; Area : TRect; NoRows, NoCols : integer; var R, G, B : real; var PixelPercentage : real) ; function AnalyseGrid (Area : TRect;NoRows, NoCols : integer; DeltaRed, DeltaGreen, DeltaBlue : real) : TShadeColours; procedure CalculateHSI (R, G, B : real; var Hue, Sat, Int : real) end; implementation uses Dialogs, Math; const RedMask : longint = $000000FF; GreenMask : longint = 50000FF00; ToothObject - page 1 FillSearch ( StartpointX+x, StartpointY+y) ; end end; end; begin Result : = Rect ( 640 , 480 , 0 , 0 ) ; FillSearch (StartPoint . X, StartPoint . Y) ; end; function TTooth . CalculateTestArea (Row, Col : integer; Area : TRect ; NoRows, NoCols : integer) : TRect; var TestArea : TRect; ColSpacing : real; RowSpacing : real; begin with Area do begin ColSpacing := (Right - Left) / NoCols; RowSpacing := (Bottom - Top) / NoRows; TestArea. Top := Top + Trunc (RowSpacing * Row); TestArea. Bottom := Top + Trunc (RowSpacing * (Row + 1)); TestArea. Left := Left + Trunc (ColSpacing * Col); TestArea. Right := Left + Trunc (ColSpacing * (Col + 1)); end; CalculateTestArea := TestArea; end; // CalculateTestArea procedure TTooth . RemoveReflection (TestArea : TRect); var i : integer; j : integer; Red, Green, Blue : integer; begin with TestArea do for i := Left to Right do for j := Top to Bottom do begin if (ToothBitMapMask. Canvas. Pixels [i, j] <> 0) then ToothBitMap. Canvas. Pixels [i, j] := 0 else begin Red := ToothBitMap. Canvas . Pixels [i, j ] and RedMask; Green := (ToothBitMap. Canvas . Pixels [i, j ] and GreenMask) shr 8; Blue := (ToothBitMap . Canvas . Pixels [i, j ] and BlueMask) shr 16; if ((Red + Green + Blue) / 255 > Reflectionlntensity) then ToothBitMap. Canvas. Pixels [i, j] := 0; end; end; end; // RemoveReflection procedure TTooth. RemoveMask (TestArea : TRect); ToothObject - page 3 BlueMask : longint = $00FF0000 ; Boundrylntensity = 0.58 ; // sum of RGB Ref lectionlntensity = 1. 86; type TDirection = (Up, Down, Left, Right); constructor TTooth. Create; begin ToothBitmap := TBitmap. Create; ToothBitmap. Width := 640; ToothBitmap. Height := 480; ToothBitmapMask := TBitmap. Create; ToothBitmapMask.Width := 640; ToothBitmapMask. Height := 480; Referencelnitialised := false; end; procedure TTooth. Free; begin ToothBitmap. Free; ToothBitmapMask . Free; Inherited Free; end; function TTooth. FillSearchSampleLimits (StartPoint : TPoint) : TRect; procedure FillSearch (StartpointX, StartpointY : integer); var Red, Green, Blue : integer; x, y : integer; begin if StartPointX > Result. Right then Result. Right := StartpointX; if StartpointX < Result. Left then Result. eft := StartpointX; if StartpointY > Result .Bottom then Result. Bottom := StartpointY; if StartpointY < Result. Top then Result. Top := StartpointY; for x : = -1 to 1 do for y : = -1 to 1 do if (StartpointX+x < 640 ) and (StartpointX+x > 0 ) and (StartpointY+y < 480 ) and (StartpointY+y > 0 ) and (ToothBitmapMask . Canvas . Pixels [StartpointX+x, StartpointY+y] <> 0) then begin Red := ToothBitmap. Canvas . Pixels [StartpointX+x, StartpointY+y] and RedMask; Green := (ToothBitmap. Canvas . Pixels [StartpointX+x, StartpointY+y] and GreenMask) shr 8; Blue := (ToothBitmap . Canvas . Pixels [StartpointX+x, StartpointY+y] and BlueMask) shr 16; if ((Red + Green + Blue)/255) > Boundrylntensity then begin ToothBitmapMask. Canvas. Pixels [StartpointX+x, StartpointY+y] := 0; ToothObject - page 2 var i : integer; j : integer; begin with TestArea do for i := Left to Right do for j := Top to Bottom do if (ToothBitMapMask. Canvas. Pixels [i, j] <> 0) then ToothBitMap. Canvas . Pixels [i, j] := 0; end; // RemoveReflection procedure TTooth.Analyse (Row, Col : integer; Area : TRect; NoRows, NoCols : integer; var R, G, B : real; var PixelPercentage : real); var TestArea : TRect; PixelCount : longint; i : integer; j : integer; RedTotal : longint; GreenTotal : longint; BlueTotal : longint; Red, Green, Blue : integer; begin TestArea := CalculateTestArea (Row, Col, Area, NoRows, NoCols) ; with TestArea do PixelCount := (Right - Left + 1) * (Bottom - Top + 1); // Now average ignoring reflections and blemishes RedTotal := 0; GreenTotal := 0; BlueTotal := 0; with TestArea do for i := Left to Right do for j := Top to Bottom do begin if ToothBitMap. Canvas . Pixels [i, j] <> 0 then begin Red := ToothBitMap . Canvas . Pixels [i, j ] and RedMask; Green := (ToothBitMap. Canvas . Pixels [i, j ] and GreenMask) shr 8; Blue := (ToothBitMap. Canvas. Pixels [i, j] and BlueMask) shr 16; RedTotal := RedTotal + Red; GreenTotal := GreenTotal + Green; BlueTotal := BlueTotal + Blue; end else begin PixelCount := PixelCount - 1; // Ignored this pixel end; end; ToothObject - page 4 // Normalised RGB if PixelCount > 0 then begin R := RedTotal / PixelCount / 255; G := GreenTotal / PixelCount / 255; B := BlueTotal / PixelCount / 255; with TestArea do PixelPercentage := PixelCount / ( (Bottom-Top+1) * (Right - Left+1)); end else begin R := 0; G := 0; B := 0; PixelPercentage := 0; end; end; // Analyse function TTooth. AnalyseGrid (Area : TRect; NoRows, NoCols : integer; DeltaRed, DeltaGreen, DeltaBlue : real) : TShadeColours; var Row, Col : integer; Red, Green, Blue, PixelPercent : real; begin Result := TShadeColours .Create; for Row := 0 to NoRows - 1 do for Col := 0 to NoCols - 1 do begin Analyse (Row, Col, Area, NoRows, NoCols, Red, Green, Blue, PixelPercent) ; Result .GridColours [Col+1, Row+1] := TShadeColourElement .Create; Result. GridColours [Col+1, Row+1] . StoreColour (Red + DeltaRed, Green + DeltaGreen, Blue + DeltaBlue, PixelPercent) ; end; end; procedure TTooth. CalculateHSI (R, G, B : real; var Hue, Sat, Int : real); function Minimum (vl, v2, v3 : real) : real; begin if (vl <= v2) and (vl <= v3) then minimum : = vl else if (v2 <= vl) and (v2 <= v3) then Minimum := v2 else Minimum := v3; end; function Maximum (vl, v2, v3 : real) : real; begin if (vl >= v2) and (vl >= v3) then ToothObject - page 5 Maximum := vl else if (v2 >= vl) and (v2 >= v3) then Maximum := v2 else Maximum : = v3; end; begin // Calculation using Gonzalez and Woods Int := (R + G + B) / 3; if Int > 0 then begin Sat := 1 - (3 / (R + G + B) ) * Minimum (R, G, B) ; Hue := arccos((((R-G)+(R-B))/2)/sqrt(sqr(R-G)+((R-B)*(G-B)))) /(2*pi); if (B / Int) > (G / Int) then Hue := 1 - Hue; end else begin Sat := 0; Hue : = 0 ; end; end; // CalculateHSI procedure TTooth . LoadBitmapFromFile ( Filename : String) ; begin ToothBitmap . LoadFromFile ( Filename ) ; ToothBitmap . Dormant ; ToothBitmapMask . Assign (ToothBitmap) ; end; // LoadBitmapFromFile end. ToothObject - page 6

Claims: THE CLAIMS What is claimed is: 1. A method for associating a tooth shade relative to a tooth, comprising: providing a digital image of the tooth, the digital image having pixels; processing the digital image to generate a REAL IMAGE formed of pseudo-pixels, at least one of said pseudo-pixels comprising two or more pixels of the digital image; and correlating the generated REAL IMAGE with two or more REFERENCE IMAGES representing tooth shades to determine which tooth shade most closely matches visual characteristics of the tooth. 2. The method of claim 1 further comprising the steps of capturing digital images of two or more tooth shades, and processing the captured digital images to form said two or more REFERENCE IMAGES. 3. The method of claim 1 wherein the REAL IMAGE and said REFERENCE IMAGES are color images. 4. The method of claim 3, further comprising the step of storing RGB values for pseudo-pixels in the REAL and said REFERENCE IMAGES. 5. The method of claim 1 wherein the step of processing the digital image of the tooth comprises dividing the digital image into segments forming said pseudo-pixels. 6. The method of claim 5 wherein the formed pseudo-pixels are not contiguous. 7. The method of claim 6, wherein the formed pseudo-pixels are based on the shape of the tooth. 8. The method of claim 5 wherein the pseudo-pixels are formed of equal-size segments. 9. The method of claim 5 wherein values associated with said pseudo-pixels are determined by averaging similar values for the pixels in the corresponding segment of the digital image. 10. The method of claim 9 wherein said values are RGB values. 11. The method of claim 1 wherein the step of processing the digital image of the tooth further comprises scaling the image to a pre-defined size. 12. The method of claim 1 further comprising displaying REAL and REFERENCE IMAGES in a humanly-readable form. 13. The method of claim 12 wherein said IMAGES are displayed on a monitor. 14. The method of claim 1 further comprising the step of communicating the determined tooth shade to a user. 15. The method of claim 1 wherein the step of processing the digital image comprises determining pixels, the values for which are outside a pre-determined range compared with values of adjacent pixels. 16. The method of claim 2 further comprising the step of capturing two or more images for each tooth shade, and combining said captured images to obtain an image representative of each tooth shade. 17. The method of claim 16 wherein the step of averaging further comprises determining pixels in each captured image, the values for which are outside a predetermined range compared with values of adjacent pixels, and excluding said determined pixels in the step of combining. 18. The method of claim 16 wherein the step of combining comprises averaging corresponding pixel values over said two or more images. 19. The method of claim 1 wherein the step of correlating comprises computing a closeness measure. 20. The method of claim 19 wherein the step of computing a closeness measure comprises determining a composite match number (CMN) from the RGB values utilizing the following expression: 2 R x,g — /? i,q ( n -x,q r G V ( R R A '..1 B CMN X = ∑ + x,q B •, ,q g=ϊ υ v P count x ) P count x Pcount x r J where R-. q , G x q and B x q denote the R,G and B components for the q-th pseudo-pixel of the x-th tooth shade, and R j q , G i>q and B i q are the corresponding components of the REAL image, and Pcount x corresponds to the number of common pseudo-pixels between the REAL IMAGE and the REFERENCE IMAGE for the x-th tooth shade. 21. The method of claim 20 wherein Pcount x = 1. 22. The method of claim 20 wherein the Pcount x number is different for at least two separate tooth shades. 23. The method of claim 1 wherein the step of providing a digital image of the tooth comprises capturing the image using a digital camera. 24. The method of claim 23 wherein the step of capturing is performed using a sleeve attached to the camera. 25. The method of claim 24 further comprising the steps of illuminating the tooth from the camera and shielding the tooth from illumination not generated by the camera. 26. The method of claim 25 further comprising the step of providing stray-light rejection to reduce stray light captured by the camera. 27. A method for determining color characteristics a patient's tooth, comprising: providing a digital image of the tooth, the digital image having pixels; dividing the digital image into segments, each segment forming a pseudo-pixel comprising one or more pixels of the digital image; computing color characteristics of each pseudo-pixel based on the corresponding one or more pixels of the original image; and storing the computed color characteristics in a computer memory. 28. The method of claim 27 further comprising the step of communicating said computed color characteristics associated with each pseudo-pixel to a user. 29. The method of claim 27 wherein the formed pseudo-pixels are not contiguous. 30. The method of claim 27, wherein the formed pseudo-pixels are based on the shape of the tooth. 31. The method of claim 27 wherein the pseudo-pixels are formed of equal-size segments. 32. The method of claim 31 wherein values associated with said pseudo-pixels are determined by averaging similar values for the pixels in the corresponding segment of the digital image. 33. The method of claim 27 wherein said computed color characteristics are RGB values. 34. A system for associating a tooth shade relative to a tooth, comprising: a digital camera for capturing digital images of human teeth, the digital images having pixels; a processor for converting digital images captured by the camera to REAL IMAGES formed of pseudo-pixels, at least one of said pseudo-pixels comprising two or more pixels of the digital image; and means for correlating the generated REAL IMAGE with two or more REFERENCE IMAGES representing tooth shades to determine which tooth shade most closely matches visual characteristics of the tooth. 35. The system of claim 34 further comprising means for illuminating the tooth when capturing a digital image. 36. The system of claim 34 further comprising a sleeve for shielding a tooth from light not generated by said means for illuminating. 37. The system of claim 36 wherein the insides of the sleeve are coated with material which reduces light reflections along the length of the sleeve. 38. The system of claim 36 wherein the sleeve has an end and an accordion-like exterior to permit a soft placement of the end of the sleeve onto the tooth. 39. The system of claim 36 wherein the sleeve is adapted to keep the distance between the tooth and the camera constant.

Inventors: LEHMANN MARYANN, VOCK CURTIS A, YOUNGS PERRY, LEHMANN, MARYANN, VOCK, CURTIS, A., YOUNGS, PERRY
Applicants: LEHMANN MARYANN, SHADE ANALYZING TECHNOLOGIES I, VOCK CURTIS A, YOUNGS PERRY, LEHMANN, MARYANN, SHADE ANALYZING TECHNOLOGIES, INC., VOCK, CURTIS, A., YOUNGS, PERRY
Application year: 1999
Main classification: G06K9
IPC codes: A61C19, G01J3, G01N21, G06F19, G06K9, G06T1, G06T7