AU2004226970B2 - Inkjet printer having compensation for overlapping printhead elements - Google Patents
Inkjet printer having compensation for overlapping printhead elements Download PDFInfo
- Publication number
- AU2004226970B2 AU2004226970B2 AU2004226970A AU2004226970A AU2004226970B2 AU 2004226970 B2 AU2004226970 B2 AU 2004226970B2 AU 2004226970 A AU2004226970 A AU 2004226970A AU 2004226970 A AU2004226970 A AU 2004226970A AU 2004226970 B2 AU2004226970 B2 AU 2004226970B2
- Authority
- AU
- Australia
- Prior art keywords
- const
- print head
- overlap
- pct
- segments
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Ceased
Links
Landscapes
- Ink Jet (AREA)
Description
z INKJET PRINTER HAVING COMPENSATION FOR OVERLAPPING PRINTITEAD
ELEMENTS
FIELD OF THE INVENTION The present invention relates to the field of ink jet printing and in particular discloses a method and apparatus for the compensation for the time varying nozzle misalignment of a print head assembly having overlapping segments.
CO-PENDING APPLICATIONS Various methods, systems and apparatus relating to the present invention are disclosed in the following copending applications filed by the applicant or assignee of the present invention simultaneously with the present application: CN2I PCT/AUOO/005 18, PCTIAUOOIO05 19, PCT/AUOO/00520, PCT/AUOO/00521, PCT/AU0O/00522, PCT/AUOO/00523, PCT/AUOO/00524, PCT/AU0O/00525, PCT/AUOO/00526, PCT/AUO0/00527, PCT/AUOO/00528, PCT/AUOO/00529, PCT/AUOO/00530, PCT/AUO0/0053 1, PCT/AUOO/00532, PCT/AU0O/00533, PCT/AUO0/00534, PGT/AUOO/00535, PCT/AUOO/00536, PCTIAUOOIOO537, PCTAUOOIOO538, PCT/AUOO/00539, PCT/AU00/00540, PCT/AU00/00541, PCT/AUOO/00542, PCT/AUOO/00543, PCT/AUOO/00544, PCT/AUOO/00545, PCT/AUOO/00547, PCT/AUOO/00546, PCT/AU0O/00554, PCT/AUOO/00556, PCT/AU0O/00557, PCT/AUOO/00558, PCT/AUOO/00559, PCT/AUOO/00560, PCT/AU0O/00561, PCT/AUO0/00562, PCT/AUOO/00563, PCT/AU0O/00564, PCT/AUOO/00565, PCT/AUOO/005 66, PCT/AUOO/00567, PCT/AUOO/00568, PCT/AUOO/00569, PCT/AUOO/00570, PCT/AUOO/00571, PCTAUOOIOO572, PCT/AUOO/00573, PCT/AUOO/00574, PCT/AUO0/00575, PCT/AUOO/00576, PCT/AUOO/00577, PCT/AU00/00578, PCTIAUOOO579, PCTAUOOOO58 1, PCT/AU0O/00580, PCT/AUOO/00582, PCT/AUOO/00587, PCT/AUOO/00588, PCT/AUOO/005 89, PCT/AUOO/005 83, PCT/AUOO/00593, PCT/AUO0/00590, PCT/AUOO/00591, PCT/AUOO/00592, PCT/AUOO/00584, PCT/AUO0/005 85, PCT/AUOO/00586, PCT/AU0O/00594, PCT/AUOO/005 95, PCT/AUOO/00596, PCT/AUOO/00597, PCT/AUOO/00598, PCT/AU0O/005 16, PCT/AUOO/005 17, PCT/AUOO/0051 1, PCT/AUOO/00501, PCT/AU0O/00502, PCT/AUOO/00503, PCT/AUO0/00504, PCT/AU00/00505, PGT/AUO0/00506, PCT/AUOO/00507, PCT/AUO0/00508, PCT/AU0O/00509, PCT/AUOO/005 10, PCT/AUOO/005 12, PCT/AUOO/005 13, PCT/AUOO/005 14, and PCT/AUOO/005 The disclosures of these co-pending applications are incorporated herein by cross-reference.
BACKGROUND OF THE INVENTION In the applicant's co-pending application PCT/AU98/00550, a series of ink jet printing arrangements were proposed for printing at high speeds across a page width employing novel ink ejection mechanisms. The disclosed arrangements utilized a thermal bend actuator built as part of a monolithic structure.
In such arrangements, it is desirable to form larger arrays of ink ejection nozzles so as to provide for a page width drop on demand print head. Desirably, a very high resolution of droplet size is required. For example, common competitive printing systems such as offset printing allow for resolutions of one thousand six hundred dots per inch (1l600dpi). Hence, by way of example, for an A4 page print head which is eight inches wide, to print at that resolution would require the equivalent of around 12800 ink ejection nozzles for each colour. Assuming a standard four colour process, this equates to approximately fifty one thousand ink ejection nozzles. For a six colour process including the standard four colours plus a fixative and an LR ink this results in 76800 ink ejection nozzles. Unfortunately, it is impractical to make large monolithic print heads from a contiguous segment of substrate such as a silicon wafer substrate.
MJ149-AU O This is primarily a result of the substantial reduction in yield with increasing size of construction. The problem of Z yield is a well studied problem in the semi-conductor industry and the manufacture of inkjet devices often utilizes semiconductor or analogous semi-conductor processing techniques. In particular, the field is generally known as Micro Electro Mechanical Systems (MEMS). A survey on the MEMS field is made in the December 1998 IEEE Spectrum article by S Tom Picraux and Paul J McWhorter entitled "The Broad Sweep of Integrated Micro Systems".
One solution to the problem of maintaining high yields is to manufacture a lengthy print head in a number of segments and to abut or overlap the segments together. Unfortunately, the extremely high pitch of ink ejection nozzles N required for a print head device means that the spacing between adjacent print head segments must be extremely accurately N, controlled even in the presence of thermal cycling under normal operational conditions. For example, to provide a resolution of one thousand six hundred dots per inch a nozzle to nozzle separation of about sixteen microns is required.
Ambient conditions and the operational environment of a print head may result in thermal cycling of the print head in the overlap region resulting in expansion and contraction of the overlap between adjacent print head segments which may in turn lead to the production of artifacts in the resultant output image. For example, the temperature of the print head may rise above ambient when in operation. The assembly of the print head may also be made of materials having different thermal characteristics to the print head segments resulting in a differential thermal expansion between these components. The silicon substrate may be packaged in elastomer for which the respective thermal expansion coefficients are 2.6 x 10 6 and 20 x 10-6 per degree Celsius.
Artifacts are produced due to the limited resolution of the print head to represent a continuous tone image in a binary form and the ability of the human eye to detect 0.5% differences in colour of adjacent dots in an image.
SUMMARY OF THE INVENTION It is an object of the present invention to provide for a mechanism for compensating for relative displacement of overlapping print head segments during operation in an effective and convenient manner.
In accordance with a first aspect of the invention there is provided in an ink ejection print head comprising a plurality of overlapping print head segments, wherein the spatial relationship between adjacent segments is variable with time, a method for controlling the firing of nozzles within the overlapped segments comprising the steps of: determining a measure of the overlap between adjacent print head segments; creating a half toning pattern for the nozzles in the region of overlap of the overlapping segments; and adjusting said half toning pattern as a function of said measure in the overlapping regions of said print head segments to reduce artifacts produced by the overlapping of said print head segments.
Preferably, the step for determining a measure of overlap employs a measure of temperature of the print head segments The half toning patterns are preferably produced by means of a dither matrix or dither volume and the alteration can comprise adding an overlap value to a current continuous tone pixel output value before utilizing the dither matrix or dither volume. In place of a measure of temperature a measure of distance can be provided by the use of fiduciary strips on each of the segments and using an interferometric technique to determine the degree of relative movement between the segments.
In accordance with a further aspect of the present invention, there is provided an ink ejection print head system comprising: a plurality of spaced apart spatially overlapping print head segments; at least one means for measurement of the degree of overlap between adjacent print head segments; means for providing a half toning of a continuous tone image and means for adjusting said half toning means in a region of overlap between adjacent print head segments to reduce artifacts between said adjacent segments.
The means for adjusting the half toning means can include a continuous tone input, a spatial overlap input and a binary input, the half toning means utilizing the spatial overlap input to vary the continuous tone input to produce a varied MJ149-AU O continuous tone input for utilization in a look-up table of a dither matrix or dither volume so as to produce output binary values Z to adjust for the regions of overlap of print head segments. The means for adjusting the halftone or dither matrix may be implemented in hardware or by means of software employing an algorithm.
BRIEF DESCRIPTION OF THE DRAWINGS This invention is pointed out with particularity in the appended claims. The above and further advantages of this invention may be better understood by referring to the following description taken in conjunction with the accompanying IDdrawings, in which: ,I Fig. 1 shows a schematic of a pair of adjacent print head segments according to the invention; Fig. 2 illustrates the process for printing dots from adjacent print head segments as shown in Fig. 1; Fig. 3 illustrates a process of blending dots between adjacent print head segments according to the invention; Fig. 4 illustrates a process of dither matrix variational control according to an embodiment of the invention; Fig. 5 illustrates a process of dither matrix variational control according to another embodiment of the invention; and Fig. 6 illustrates graphically an algorithm implementing a further process of dither matrix variational control according to a further embodiment of the invention.
DETAILED DESCRIPTION OF THE EMBODIMENTS In a first embodiment, a method of compensation for the temperature varying relative displacement of adjacent print head segments is provided by the utilization of a digital processing mechanism which adjusts for the overlap between adjacent segments.
In a print head covering an A4 page width there may be 10 segments having 9 overlapping portions arranged in a repeating sequence of staggered pairs. Initial alignment of segments can be made within 10 microns using techniques well known in the art of monolithic fabrication techniques. The width of a segment for a 6 colour ink arrangement would be approximately 225 microns assuming the nozzles of a segment are arranged on 16 micron centres in a zig-zag pattern longitudinally.
In this embodiment, a temperature sensor is placed on each print head segment so as to provide for a measure of the current temperature characteristics of each print head segment. The current temperature measurement can then be utilized to determine the amount of overlap between adjacent print head segments.
Alternatively, only a single temperature sensor can be used if it can be assumed that the segments of the print head are sufficiently similar to one another in physical characteristics and performance and that the ambient milieu of each pair of overlapped segment is substantially the same.
The degree of overlap is then used to provide a mechanism for controlling the half toning between adjacent print head segments. It is assumed that outputting of an image in the instant invention is by means of digital half toning employing any method or technique well known in the art. Many different half toning techniques can be utilized and reference is made to the text by Ulichney entitled "Digital Half Toning" published by MIT Press.
MJ149-AU O As shown in Fig. 1 adjacent print head segments 2, 3 overlap in the respective regions 12, 13. The overlap region Z may extend approximately 40 thou providing an overlap of 64 nozzles spaced at 16 microns for 1600dpi resolution.
In the region 10 of the segment 2 the nozzles of this segment are used exclusively for the ejection of ink. Similarly in the region 11 of the segment 3 the nozzles of this segment are used exclusively for the ejection of ink. In the overlapping regions 12, 13 a "blend" is provided between the two print head segments 2, 3 such that along the edge 14 of the print head segment 2 nozzles are used exclusively in the region 12 to print and similarly along the edge 15, the nozzles of the segment 3 are used almost exclusively for printing. In between, an interpolation, which can be linear or otherwise, is provided between these two Iextreme positions. Hence, as shown in Fig. 2, when printing a full colour output on a page the area on the side 17 is printed CN, exclusively by the print head segment 10 while the area 18 is printed exclusively by the print head segment 11 (as illustrated by the black dots) with the area 19 comprising a blend between the nozzles of the two segments. The printing process utilizes O any well known half toning matrix such as disclosed in the aforementioned references. While a known half toning matrix is utilized, the actual print head segment utilized will depend upon the blending ratio provided by the measure of overlap between the overlapping segments.
One such method is illustrated in Fig. 3 where a linear interpolation within the overlapped regions is shown. In the region corresponding to the overlapped section 12 at the edge 14 there is 100% utilization of the nozzles of print head segment 2, whereas in the equivalent region, edge 7, of the print head segment 3 there is zero output. 'As the distance of the overlap region from the line 14 of the segment 2 is increased towards the line 15 of the segment 3 the proportion of utilization of the nozzles of the section 12 is gradually decreased (linearly), being zero at edge 9 while the utilization of the nozzles of the section 13 is progressively increased to unity by the time the edge 15 is reached. In a first embodiment, where there is an increased overlap between nozzles, the half toning thresholds utilized are increased in the overlap region. This reduces the number of dots printed in the blend region. Conversely, if there is a reduced overlap with the print head segments being spaced apart slightly more than normally acceptable, the dot frequency can be increased by reducing the half toning threshold.
An overall general half toning arrangement can be provided as shown in Fig. 4 with a dither matrix 25 outputting a current dither value 26 to a summation means 27 with summation means 27 having another input 28, an overlap signal, which varies in either a positive or a negative sense depending on the degree of overlap between the adjacent segments. The output value 29 of summation means or adder 27 is compared to the input continuous tone data 32 via a comparator 30 so as to output halftone data 31. An alternative arrangement allows that the data value 28 can be subtracted from the continuous tone data 29 before dithering is applied producing similar results. This arrangement is shown in Fig. As shown in Fig. 5, a halftone data output 52 can be generated by combining the output 42 of dither matrix 40 in an adder 46 with the overlap signal 44, and then taking the difference of the output 54 of adder 46 and the continuous tone data 48 in subtracter 50. This is an equivalent arrangement to that of Fig. 4.
Through the utilization of an arrangement such as described above with respect to Figs. 3 and 4, a degree of control of the overlap blending can be provided so as to reduce the production of streak artifacts between adjacent print head segments.
As each overlap signal 28 can be multiplied by a calibration factor and added to a calibration offset factor, the degree of accuracy of placement of adjacent print head segments can also be dramatically reduced. Hence, adjacent print head segments can be roughly aligned during manufacture with one another. Test patterns can then be printed out at known temperatures to determine the degree of overlap between nozzles of adjacent segments. Once a degree of overlap has been determined for a particular temperature range a series of corresponding values can be written to a programmable ROM storage device so as to provide full offset values on demand which are individually factored to the print head segment overlap.
MJ149-AU O A further embodiment of the invention involves the use of a software solution for reducing the production of artifacts Z between overlapped segments of the print heads. A full software implementation of a dither matrix including the implementation of an algorithm for adjusting variable overlap between print head segments is attached as appendix A. The program is written in the programming language C. The algorithm may be written in some other code mutatis mutandis within the knowledge of a person skilled in the art. The basis of the algorithm is explained as follows.
SA dispersed dot stochastic dithering is used to reproduce the continuous tone pixel values using bi-level dots.
Dispersed dot dithering reproduces high spatial frequency, that is, image detail, almost to the limits of the dot resolution, while N simultaneously reproducing lower spatial frequencies to their full intensity depth when spatially integrated by the eye. A Sstochastic dither matrix is designed to be free of objectionable low frequency patterns when tiled across the page.
Dot overlap can be modelled using dot gain techniques. Dot gain refers to any increase firom the ideal intensity of a pattern of dots to the actual intensity produced when the pattern is printed. In ink jet printing, dot gain is caused mainly by ink Cbleed. Bleed is itself a function of the characteristics of the ink and the printing medium. Pigmented inks can bleed on the surface but do not diffuse far inside the medium. Dye based inks can diffuse along cellulose fibres inside the medium. Surface coatings can be used to reduce bleed.
Because the effect of dot overlap is sensitive to the distribution of the dots in the same way that dot gain is, it is useful to model the ideal dot as perfectly tiling the page with no overlap. While an actual ink jet dot is approximately round and overlaps its neighbours, the ideal dot can be modelled by a square. The ideal and actual dot shapes thus become dot gain parameters.
Dot gain is an edge effect, that is it is an effect which manifests itself along edges between printed dots and adjacent unprinted areas. Dot gain is proportional to the ratio between the edge links of a dot pattern and the area of the dot pattern.
Two techniques for dealing with dot gain are dispersed dot dithering and clustered dot dithering. In dispersed dot dithering the dot is distributed uniformly over an area, for example for a dot of 50% intensity a chequer board pattern is used. In clustered dot dithering the dot is represented with a single central "coloured" area and an "uncoloured" border with the ratio of the area of "coloured" to "uncoloured" equalling the intensity of the dot to be printed. Dispersed dot dithering is therefore more sensitive to dot gain than clustered dot dithering.
Two adjacent print head segments have a number of overlapping nozzles. In general, there will not be perfect registration between corresponding nozzles in adjacent segments. At a local level there can be a misregistration of plus or minus half the nozzle spacing, that is plus or minus about 8 microns at 1600 dpi. At a higher level, the number of overlapping nozzles can actually vary.
The first approach to smoothly blending the output across the overlap bridge and from one segment to the next consists of blending the continuous tone input to the two segments from one to the other across the overlap region. As output proceeds across the overlap region, the second segment receives an increasing proportion of the input continuous tone value and the first segment receives a correspondingly decreasing proportion as described above with respect to Fig. 3. A linear or higher order interpolation can be used. The dither matrices used to dither the output through the two segments are then registered at the nozzle level.
The first approach has two drawbacks. Firstly, if the dither threshold at a particular dot location is lower than both segments' interpolated continuous tone values then both segments will produce a dot for that location. Since the two dots will overlap, the intensities promised by the two dither matrices will be only partially reproduced, leading to a loss of overall intensity. This can be remedied by ensuring that corresponding nozzles never both produce a dot. This can also be achieved by using the inverse of the dither matrix for alternating segments, or dithering the continuous tone value through a single dither MJ149-AU O matrix and then assigning the output dot to one or the other nozzle stochastically, according to a probability given by the Z current interpolation factor.
Secondly, adjacent dots printed by different segments will overlap again leading to a loss of overall intensity.
As shown in Fig. 6, the value for each overlapped segment is plotted along the horizontal axes 60, 62 as VA and VB respectively between the values of 0.0 and 1.0. The calculated output 66 is plotted with respect to the vertical axis 64 as a function, IA+B, for values ranging from 0.0 to 1.0. A contour plane 68 shows the resultant values for IA+B= 0 Fig. 6 shows the qualitative shape of the three dimensional function linking the two segments' input continuous tone I values VA and VB to the observed output intensity IA+B. For the first approach, an input continuous tone value V and an C< interpolation factor f together yield VA= V and VB f V. The closer the interpolation factor is to 0.5 the greater the difference between the input continuous tone value and the observed output intensity. For V=1.0, this is illustrated in Fig. 6 by Sthe curve 200 on the vertical VA+VB= 1.0 plane. By definition this curve lies on the function surface. Fig. 6 indicates that when any kind of mixing occurs, that is 0.0 f<l.0, the output intensity is attenuated, and to achieve the desired output intensity the sum of the two segments' input values must exceed the desired output value, that is VA+VB This forms the basis for the algorithm in appendix A.
The function shows a linear response when only one segment contributes to the output, that is f=0.0 or f=l.0. This assumes of course that the dither matrix includes the effects of dot gain.
The foregoing description has been limited to specific embodiments of this invention It will be apparent, however, that variations and modifications may be made to the invention, with the attainment of some or all of the advantages of the invention. For example, it will be appreciated that the invention may be embodied in either hardware or software in a suitably programmed digital data processing system, both of which are readily accomplished by those of ordinary skill in the respective arts. Therefore, it is the object of the appended claims to cover all such variations and modifications as come within the true spirit and scope of the invention.
static void ObtainMisregistrationTransferFunction int dotsPerPixel, int subdotsPerDot, BI_Image const& dotImage, char const* pDotImageName, char const* pRefDotImageName, int const overlapSize, int const overlapIndex, 0 overlapSize-1 int const misregFactor, BI_Image const& ditherMatrix, BI_LUT& lutv, BILUT& lutO, BI LUT& lutl MJ149-AU class RLEDotLine public: RLEDotLine() :m whiteRun(O), m-blackRun(O) RLEDotLine(int whiteRun, int blackRun) :m whiteRun(whiteRun), m-blackRun(blackRun) whiteRun() const {return m-whiteRun; BlackRun() const {return m-blackRun; m_whiteRun; m blackRun; private: typedef vector<RLEDotLine, allocator<RLE DotLine> RLEDot; static void Usage f fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, fprintf (stderr, exit (1) "usage: SegmentDither\n"); inputlmage\n"); dotsPerpixel\n"); subdotsPerDot\n"); dotlmage\n"); refDotlmage\n"); overlapCenter\n"); overlapSize\n"); misregFactor\n"); ditherMatrix\n"); outputlmage\n"); outputResolution\n"); static void BadAryument (char const* pErrorMsg) fprintf(stderr, "SegmentDither: argument error: pErrorMsg); exit (l) MJ 149-AU -8- Z #define CHECKARGUMENT(cond) if (cond) BadArgument(#cond) static double MisregDots(int const risregFactor) return (double)misregFactor /1000; static int risregSubdots(int const misregFactor, mnt const subdotsPerDot) return (int)BtTRound(MisregDots(misregFactor) +subdotsPerDot); static void PutDot mnt const subdotsPerDot, RLEDot const& rieDot, mnt const dotRow, mnt const dotCol, mnt const misregFactor, BI_Image& outputlmage mnt const misregSubdots MisregSubdots(misreg~actor, subdotsPerDot); int const subdotRow dotRow subdotsPerDot; mnt const subdotCol dotCol subdotsPerDot; mnt const dotOverlap rleDot.size() subdotsPerDot; mnt const dotMargin dotOverlap 2; RLEDot::const-iterator ii rleDot.begino; for (mnt i 0; i rleDot.sizeo; ii++) mnt const row subdotRow dotMargin i if (row 0 11row outputlmage.Heighto) continue; MJ 149-AU -9- Z mnt const whiteRun .WhiteRuno; int blackRui .BlackRuno; int col subdotCol dotMargin whiteRun misregSubdots; if (Col 0) blackRun. cal; (N2~col 0; if (col blackRun outputImage.Widtho).
blackRun. outputlmage.Width() col; if (blackRun. 0) continue; BU-ExpandBi tRun outputlmage.Image (raw), col, outputlmage.Width 9, blackRun, 1 static void MergeScale dauble canst scale, int& v, dauble& f 0, dauble& fl daouble canst vScaled =(dauble)v *scale; if (vScaled 255.0) v (int)BURaund(vScaled); else MJ149-AU double const fScale =vScaled /255.0; fO ~=fScale; fl =f Scale; c~K1 static void Dither BI_Image const& inputlmage, BILUTY const& lutDotGain, int const dotsPerPixel, int const subdotsPerDot, BI_Image const& dotlmage, char const* pDotlmageName, char const* pRefDotlmageName, int const overlapCenter, int const overlapSize, mnt const misregFactor, BI_Image const& ditherMatrix, BI_Image& outputlmage, int const outputResolution, bool const bRetain, bool const bSkipLHS, bool const bSkipRHS, bool const bFixedlnterp false, double const fixedFO 0, double const fixedFl 0 Icompute overlap interval int const overlapStart overlapCenter -(overlapSize int const overlapEnd overlapStart overlapSize 1; copy and invert dither matrix BI_Image ditherMatrix2; ditherMatrix2 ditherMatrix; BIInvert(ditherMatrix2); MJ149-AU initialise and clear output image mnt const subdotsPerPixel dotsPerPixel subdotsPerDot; mnt const bilevelHeight =inputlmage.Height() subdotsPerPixel; mnt const bilevelWidth =inputlmage.Width() subdotsPerPixel; if (!bRetain) //initialise outputlmage. Initialise BIColorModel(BI_-ColorGrayscale, 1), bilevelHeight, bilevelWidth, outputResolution, outputResolution IIclear BICC* pOutputRow outputlmage. Image 0; for (mt j 0; j outputImage.Heighto; BUClearLine (pOutputRow, output Image. Width 0); pOutputRow outputlmage.RowSize 0; Iconvert dot image to RLE RLEDot rleDot; for (mnt i 0; i dotlmage.Heighto; mnt const whiteRun BUGetBitRun dotlmage.Image 0, dotlmage.Width 0, o white mnt blackRun; if (whiteRun dotlmage.Widtho) blackRun 0; else MJ149-AU 12 ZblackRun BUGtitu dotlmage.Image (14, whi teRun, dotImage.Widtho, 1 black rleDot.push-back(RLEDotLine(whiteRun, blackRun)); 1dither contone input image to bi-level output image BICC const* plmage =inputImage.Imageo; BICC const* pRow plmage; BICC const* pDither ditherMatrix.Imageo; BICC const* pDitherRow pDither; BICC const* pDither2 ditherMatrix2.Imageo; BICC const* pDitherRow2 pDither2; mnt ditherRow =0; for (mnt row row inputImage.Heighto; row++) for (mt dotRow 0; dotRow dotsPerPixel; dotRow++) mnt const globalDotRow (row dotsPerPixel) dotRow; BICC const* pPixel pRow; BICC const* pDitherPixel =pDitherRow; BICC const* pDitherPixel2 =pDitherRow2; mnt ditherCol =0; for (mt col col ifputImage.Widtho; col++) mnt const vRaw *pPixel++; int const vDotGain lutDotGain~vRaw].
for (mt dotCol 0; dotCol dotsPerPixel; dotCol++) int vRawDot =vRaw; mnt const tO =*pflitherPixel; mnt const ti tO; //*pDitherPixel2; mnt const globalDotCol (col dotsPerPixel) dotCol; MJ149-AU 13 o II interpolate intensities in overlap region and Z dither /one or the other or both if (!bFixedlnterp &&globalDotcol overlapStart) int const t =tO; if ((vDotGain 255) I(vDotGain t IDvDotGain 0)) if (!bSkipLHS) PutDot subdotsPerDot, rleDot, globalDotRow, globalDotCol, 0, outputlmage else if (!bFixedlnterp overlapEnd <globalDotCol) mnt const t (overlapSize tO :t1; if ((vDotGain 255) (vDotGain t vDotGain if (!bSkipRiS) PutDot subdotsPerDot, rleDot, globalDotRow, globalDotCol, misregFactor, output Image MJ 149-AU -14-
I
else
I
#if 1 MisregDots (misregFactor); overlapSize misregDots; newOverlapSize overlapSize; overlapScale); fO, fi); #endif #if 1 account for stretch or shrink if (!bFixedlnterp) double const misregDots double const newoverlapSize= double const overlapScale vRawDot (int)BURound(vRawDot* if (VRawDot 255) vRawDot 255; I/MergeScale (overlapScale, vRawDot, Icompute interpolation factors double fO, fl; if (bFixedlnterp) fO fixedFO; fl fixedFl; else Icompute overlap index mnt const overlaplndex globalDotCol overlapStart; IIobtain misregistration. LtTs B1_LUT lutv; B1_LUT lutO; BILtJT lutl; MJ 149-AU 15 dotsPerPixel, subdotsPerDot, dotlmage, pDotlmageName, pRefDot ImageName, overlapSize, overlaplndex, misregFactor, ditherMatrix, lutv, luto, lut 1 Iretrieve interpolation factors fO (doubJle)luto[vRawDot] 255; fl (double)lutljvRawDot] 255; if (globalDotCol >overlapCenter) EUSwap (fO0, f1) Iadjust intensity for attenuation vRawDot lutv[vRawDot]; #endif IIdiagnostics fl=%5.llf vRaw=%d II fO, fl, fO fl, vRaw, vRawDot); Iinterpolate dither with jitter mnt vd =0; mnt vOd =0; mnt vld =0; if ((vRawDot 255) 11 (vRawDot tO vRawDot vd 1; MJ149-AU -16o double const rr (double)rand()
RANDMAX;
Zif (vd rr< o vOd 1; if (!bSkipLHS) PutDot subdotsPerDot, rleDot, globalDotRow, globalDotCol, 0, outputImage if (vd -rr) fl) vid 1; if (!bSkipRHS) PutDot subdotsPerDot, rleDot, globalDotRow, globalDotCol, misregFactor, output Image #if 0 if (globalDotRow ==864) printf(%ld %ld %1d (%3d %3d %3d %3d) vd, v~d, vid, vRawDot, vo, vi, vo v1); if (vOd vid vd) MJ149-AU 17printf(I,?,,); if (vOd vid vd) printf (1#11) printf #endif }~te~xl+ pDitherPixel++; ditherCol++; if (ditherCol ditherMatrix.Widtho) pDitherPixel =pDitherRow; pDitherPixel2 =pDitherRow2; ditherCol 0; pflitherRow ditherMatrix.RowSizeo; pDitherRow2 ditherMatrix2.RowSizeo; ditherRow++; if (ditherRow ditherMatrix.Heighto) ~t e R W p i h r pDitherRow2 pDither; ditherRow 0; pRow ifputImage.RowSizeo; static void ChangeFi leSuff ix char const* pPath, char const* psuff ix, char const* pExt, char path[_MAXPATH] MJ 149-AU -18- Z char drive (_MAXDRIVE]; char dir [_MAXDIR) char f name F_MAXFNAmEJ; char ext [_MAX EXTJ; -splitpath(pPath, drive, dir, fname, ext); strcat(fname, pSuff ix); IND _makepath(path, drive, dir, fname, pExt); static void LogTransferFunction(char const* pType, double const intensity(], mnt const v) printf('%ts: t03d 5.llf (t5.1lf)\n", pType, v, intensity~v], v -intensity[v]); static void ComputeMi sregistrationTransfer~unction mnt dotsPerPixel, mnt subdotsPerDot, BI_Image const& dotlmage, char const* pDotlmageName, double const f 0, double const fl1, mnt const misregFactor, BI_Image const& ditherMatrix, BILUTr& lutv, BILUT& lutO, BILUT& luti Icreate test image BI_Image testlmage; testlmage. Initialise BIColorModel (BI ColorGrayscale), ditherMatrix. Height 0, ditherMatrix. Widtho( MJ149-AU -19- Ibuild identity transfer function BILUT identityLut; for (int v 0; v 256; identityLut v Icreate output image BI_Image outputlmage; Icompute intensity for each gray level CK1 double intensity[512]; mnt vLast; for (v V 512; Icompute extended interpolation factors double fox, fix; mnt vx; if (v 255) VX V; fox =fO; flx =fl; else VX 255; double const fScale =(double)v /255.0; fox fO fScale; flx fl fScale; /set test image to next intensity testlmage BIColor((BICC)vx); Idither test image to bi-level output Dither testlmage, identityLut, dotsPerPixel, subdotsPerDot, MJ149-AU 20 dot Image, pDotlmageName, pDotlmageName, 0, 0, misregFactor, ditherMatrix, output Image, 72, false, false, false, true, fox, fix Ino explicit overlap output resolution Idon't retain output image Idon't skip LHS Idon't skip RHS Ifixed interpolation determine intensity of dithered bi-level output long nDots 0; BICC const* pRow outputImage.Imageo; for (int row 0; row outputlmage.Heighto; row+.+) nDots EUCountBits(pRow, 0, outputlmage.Widthofl; pRow outputlmage.RowSize 0; intensity[v] 255 (double)nnots outputImage.PixelCounto; //LogTransferFunction "misreg", intensity, v); vLast v; if (intensity[v] 255) break; LogTransferFunction(Ilmisreg:, intensity, 1); LogTransferFunction(ITmisreg, intensity, vLast); //create LU'rs for (mnt x 0; x 256; double d=-1 for (v 0; v vLast; double const d2 BUAbs(intensity~v] x) if (d 0 11d2 d) MJ149-AU -21d d2; if (v 255) lutV (XI V; mnt coflst kO =(int)BURound(fO 255); lutO~x] (BICC)BU_Min(kO, 255); int const k1 (int)BURound(fl 255); lutlix] (BICC)BtY_Min(kl, 255); else lutv[xJ 255; int const ko (int)BURound(fO v); lutO(x] (BICC)BU_Min(kO, 255); int const ki (int)BURound(fl *v) lutljx] (BICC)BUMin(kl, 255); if (kO 255 11k1 255) fprintf(stderr, "kO=%d kl=36d V=%d kO, k1, x, v, fO, fl); static void SimplifyFraction(int& n, int& d) for (int i fl; i 1 nl 1; i) if i) 0) if i) n =i d 1= MJ149-AU 22 static void ObtainiMisregi strationTransferFunction mnt dotsPerPixel, mnt subdotsPerDot, BI_Image const& dotlmage, char const* pDotlmageName, char const* pRefDotlmageName, int COnst overlapSize, int const rawOverlaplndex, int const misregFactor, BI_Image const& ditherMatrix, ElLUT& lutv, BILUT& lutO, BILUT& luti 0 overlapSize-1 normalize overlap index int overlaplndex rawOverlaplndex; if (overlaplndex ((overlapSize 1) overlaplndex (overlapSize 1) -overlaplndex; char lutvName[ [_MAXPATH]; char lutOName [_MAX_PATH]; char lutlName[_MAXPATH]; char suffixEMAXFNAME]; mnt interpNum overlaplndex 1; mnt interpDenom overlapSize 1; SimplifyFraction (interpNum, interpDenom); sprintf(suffix, II_%03d_%k02d_%602dI", BUAbs (misregFactor), interpNum, interpDenom); ChangeFilesuffixcpRefDotmageNane, suffix, lutvName); sprintf(suffix, _1-%03d_%02d_%02d_0"- EUAbs (misregFactor), interpNum, interpDenom); MJ149-AU 23 0 ChangeFileSuff ix (pRefDotlmageName, suffix, lutOName); sprintf(suffix, "_%?03d_%02d_%-02d_1"I, BtJAbs (misregFactor), interpNum, interpDenom); Change~ileSuff ix (pRefDotlmageName, suffix, lutiName); try BUFile lutvFile(lutvName, -0_BINARY ORDONLY); lutv.Load(lutvFile); BtJ File lutOFile(lutOName, _BINARY
_ORDONLY);
CK1 lutO.Load(lutOFile); BUFile lutlFile(lutlName, _BINARY 0y.RDONLY); lutl.Load(lutlFile); catch(.) Iif using a reference dot image, LUTs must already exist if (strcmp(pDotlmageName, pRefDotlmageName) fprintf(stderr, "can't load ts or %s or ts\n", lutvName, lutOName, lutiName); exit (1) Idetermine interpolation factors double fl (double)interpNum interpDenom; double fO 1.0 fl; Copt~seitaio~ase~nto dotsPerPixel, subdotsPerDot, dot Image, pDotlmageName, fo' fi, BUAbs (misregFactor), ditherMatrix, lutv, luto, lut 1 MJ149-AU -24- Z U File lutvFile (lutvName, _BINARY j OWRONLY _OCREAT); lutv.Save(lutvFile); 0 UFile lutOFile(lutOName, -0_BINARY j OWRONLY j OCREAT); lutO.Save(lutoFile); OBUFile lutlFile(lutlName, _BINARY j OWR0NLY j 0_CREAT); lutl.Save(lutlFile); o static Cl void ComputeDotGainTransfer'uiction int dotsPerPixel, mnt subdotsPerDot, ElImage const& dotlmage, char const* pDotlmageName, El_Image const& ditherMatrix, ElLUT& lutDotoain /create test image El_Image testlmage; testlmage. Initialise ElColorModel(BIlColor~rayscale), ditherMatrix.Height
U,
ditherMatrix. WidthoC Ibuild identity transfer function ElLUT identity'rransferFunction; for (mnt v 0; v 256; identityTransferpunction~vj v; Icreate output image El_Image outputlmage; compute intensity for each gray level double intensity[256]; for (v 0; v 256; MJ149-AU set test image to next intensity testlmage BI_Color((BICC)v); dither test image to bi-level output Dither testlmage, identityTransferFunction, dot sPerPixel, subdotsPerDot, dot Image, pDot ImageName, pDotlmageName, 0, 0, 0, ditherMatrix, output Image, 72, false, false, false IIno overlap Ino misregistration Ioutput resolution Idon't retain output image Idon't skip LHS IIdon't skip RHS determine intensity of dithered bi-level output long nflots 0; BICC const* pRow outputImage.Imageoi; for (int row 0; row outputImage.Heighto; row++) nflots BUCountBits(pRow, 0, outputImage.Widtho); pRow outputImage.RowSizeo; intensity[v] 255 (double)rifots outputlmage.PixelCounto; //LogTransferFunction("'dot gain", intensity, v); LogTransferFunction(I"dot gain", intensity, 1); LogTransferFunction("'dot gain", intensity, 255); create LuT for (mnt x 0; x 256; f double d -1 MJ 149-AU -26for (v 0; v 256; double const d2 BU_-Abs(intensity~v] -x) if (d 0 11 d2 d) d =d2; lutDotGain[x] v static void ObtainflotGainTransferFunction mnt dotsPerPixel, mnt subdotsPerDot, BI_Image const& dotlmage, char const* pDotlmageName, char const* pRefDotlmageName, BI_Image const& ditherMatrix, BILUT& lutDotGain char lutName [_MAXPATH]; ChangeFileSuff ix (pRefDotlmageName, try lutName); BUFile lutFile(lutName, -0_-BINARY I Q3 DNY); lutDotGain. Load (lutFile); catch(.) /if using a reference dot image, LUlT must already exist if (strcmp (pDotlmageName, pRefDotlmageName) 0) fprintf (stderr, "can't load lutName); exit (1) ComputeDotGainTransferFunction MJ 149-AU 27 0 dotsPerPixel, Z subdotsPerDot, dotlmage, pDot ImageName, ditherMatrix, lutDotGain IDBUFile lutFile(lutName, 0_BINARY j _WRONLY _0_REAT); lutDotGain.Save(lutFile); static void SegmentDither(int argc, char* argv[]) Iparse arguments if (argc 12) Usage 0; char const* plnputlmageName argv[1]; mnt const dotsPerPixel =atoi(argv[2]); int const subdotsPerDot =atoi(argv[3]); char const* pDotlmageName argv(4J; char const* pRefDotlmageName mnt const overlapCenter atoi(argv[61); int const overlapSize =atoi(arqv[7]); mnt const misregFactor =atoi(argv[8]); mnt const misregSubdots =MisregSubdots(misregFactor, subdotsPerDot); char const* pDitherMatrixName =argv[9]; char const* p~utputlmageName =argv[1O]; mnt const outputResolution atoi(argv[ll]); open input image BI_Image inputlmage; BI_LoadImage (inputlmage, plnputlmageName); CHECKARGUMENT(inputlmage.Colormodel() !=BIColorModel(BI_ColorGrayscale)); BIInvert(inputlmage); max is black BITIFFSetMinIsBlack(false); max is black Icheck arguments CHECKARGUMENT(dotsperpixel 1); CHECKARGUMENT(dotsPerpixel 16); MJ149-AU -28- CHECKARGUDENT(subdotsperDot 1); CHECKARGUMENT(subdotsPerDot 32); CHECKARGUMENT(overlapCenter 1); CHECKARGUMENT(overlapCenter inputl' CHECKARGUNENT(overlapSize 0); CHECKARGUMENT (misregsubdots -subdot CHECKARGUMENT (misregSubdots subdots CHECKARGUMENT(outputResolution 0); mage.Width() dotsPerPixel); sPerDot PerDot diagnostics printf("'misregSubdots=%d\n", misregSubdots); open dot image BI_Image dotlmage; BlLoadlmage (dotlmage, pDotlmageName); CHECKARGUMENT(dotlmage.ColorModel() !=BI_-ColorModel(BI_ColorGrayscale, CHECKARGUMENT (dotlmage .Heighto( subdotsPerDot); CHECKARGUMENT(dotlmage.width() subdotsPerDot); CHECKARGUMENT(dotlmage.Heighto dotlmage.Widtho); mnt const dotorverlap dotlmage.Width() subdotsPerDot; CHECKARGUMENT((dotOverlap 2) open dither matrix BI_Image ditherMatrix; BI_LoadImage (ditherMatrix, pDitherMatrixName); CHECKARGUMENT(ditherMatrix.ColorModel() !=BI ColorModel (BIColorGrayscale, CHECKARGUMENT(ditherMatrix.Height() 16); CHECKARGUMENT(ditherMatrix.Width) 16); create output image BI_Image outputlmage; obtain dot gain transfer function for particular dot shape BILUT lutDotGain; ObtainDotGainTransferFunction dotsPerPixel, subdotsPerDot, dot Image, pDotlmageName, pRefDotlmageName, MJ149-AU ditherMatrix, lutDotGain dither input to bi-level output Dither input Image, lutDotGain, dotsPerPixel, subdotsPerDot, dot Image, pDotlmageName, pRefDot ImageName, overlapCenter, overlapSize, misregFactor, ditherMatrix, outputlmage, outputResolution, false, false, false Idon't retain output image Idon't skip LHS Idon't skip RHS BI_SaveImage (outputlmage, pOutputlmageName); dither input to bi-level output (LHS only) BI_Image outputlmageLHS; Dither inputlmage, lutDotGain, dotsPerPixel, subdotsPerDot, dot Image, pDotlmageName, pRefDot ImageName, overlapCenter, overlapS ize, misregFactor, ditherMatrix, output Image LHS, MJ149-AU outputResolution, false, false, true Idon't retain output image Idon't skip LHS IIskip RHS El_SaveImage (outputlmageLHS, "OutLHS. tif"l); Idither input to bi-level output (RHS only) BI_Image outputlmageRHS; Dither input Image, lutDotGain, dotsPerPixel, subdotsPerDot, dot Image, pDotlmageName, pRefDotlmageName, overlapCenter, overlapSize, misregFactor, ditherMatrix, output ImageRHS, outputResolution, false, true, false Idon't retain output image IIskip LHS IIdon't skip RHS El_SaveImage (outputlmageRHS, "OutRHS .tif"l); dither input to bi-level output (no interp) El_Image outputlmageNolnterp; Dither input Image, lutDotGain, dot sPerPixel, subdotsPerDot, dot Image, pDotlmageName, pRefDotlmageName, overlapCenter, MJ149-AU overlapSize, misregFactor, ditherMatrix, output ImageNolnterp, outputResolut ion, false, false, false, true, 0, 0 Idon't retain output image IIskip LHS Idon't skip RHS Ifixed interp IIfO IIfi void main BI_SaveImage (outputlmageNolnterp, "OutNolnterp. tif'); (mt argc, char* argvfl) SegmentDither(argc, argv); catch (BUError error) error. Print exit(0); MJ149-AU
Claims (7)
1. A printer comprising an inkjet printhead comprising a plurality of spaced apart spatially overlapping 0 print head segments; the printer further comprising at least one means for measurement of the degree of overlap between adjacent print head segments; means for providing a half toning of a continuous tone image and means for adjusting said half toning means in a region of overlap between adjacent print head segments to reduce artifacts between said adjacent segments.
2. A printer as claimed in claim 1 wherein said at least one means for measurement of the degree of overlap O between adjacent print head segments includes a means for measuring the temperature of said adjacent print head Ssegments.
3. A printer as claimed in claim 1 wherein said at least one means of measurement of the degree of overlap between adjacent print head segments includes a means for measuring the relative displacement of said adjacent print head segments.
4. A printer as claimed in claim 2 wherein said means for providing the half toning of a continuous tone image includes a dither matrix and said means for adjusting said half toning means includes a summation means having two inputs, one input being the output of said dither matrix and said other input being an overlap signal derived from said at least one means for measurement of the degree of overlap between adjacent print head segments.
A printer as claimed in claim 4 further including a comparator means for comparing the output of said summation means and a continuous tone data input, the output of said comparator means being the half tone data for corresponding nozzles of adjacent print head segments.
6. Printer as claimed in claim 2 wherein said means for adjusting said half toning means in a region of overlap between adjacent print head segments includes means for inverting the dither matrix for alternate segments.
7. A printer as claimed in claim 4 further including a means for subtracting the output of said summation means from a continuous tone data input signal to produce a half tone data value for driving the nozzles of adjacent print head segments. MJ149-AU
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
AU2000247328A AU2000247328B2 (en) | 2000-05-24 | 2000-05-24 | Method and apparatus for compensation for time varying nozzle misalignment in a drop on demand printhead |
PCT/AU2000/000593 WO2001089845A1 (en) | 2000-05-24 | 2000-05-24 | Method and apparatus for compensation for time varying nozzle misalignment in a drop on demand printhead |
AU2000247328 | 2000-05-24 |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
AU2000247328A Division AU2000247328B2 (en) | 2000-05-24 | 2000-05-24 | Method and apparatus for compensation for time varying nozzle misalignment in a drop on demand printhead |
Publications (2)
Publication Number | Publication Date |
---|---|
AU2004226970A1 AU2004226970A1 (en) | 2004-11-25 |
AU2004226970B2 true AU2004226970B2 (en) | 2006-08-17 |
Family
ID=34382942
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
AU2004226970A Ceased AU2004226970B2 (en) | 2000-05-24 | 2004-11-04 | Inkjet printer having compensation for overlapping printhead elements |
Country Status (1)
Country | Link |
---|---|
AU (1) | AU2004226970B2 (en) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0034060A1 (en) * | 1980-02-08 | 1981-08-19 | The Mead Corporation | Ink jet printer |
EP0677388A2 (en) * | 1994-04-14 | 1995-10-18 | Hewlett-Packard Company | Ink jet printhead with adress and data bus |
EP0709213A2 (en) * | 1994-10-28 | 1996-05-01 | Canon Kabushiki Kaisha | Method and apparatus for correcting printhead and printer using this printhead |
EP0914950A2 (en) * | 1997-11-06 | 1999-05-12 | Xerox Corporation | An ink jet printhead assembled from partial width array printheads |
EP0960737A2 (en) * | 1998-05-28 | 1999-12-01 | Toshiba Tec Kabushiki Kaisha | Ink jet recording apparatus |
-
2004
- 2004-11-04 AU AU2004226970A patent/AU2004226970B2/en not_active Ceased
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0034060A1 (en) * | 1980-02-08 | 1981-08-19 | The Mead Corporation | Ink jet printer |
EP0677388A2 (en) * | 1994-04-14 | 1995-10-18 | Hewlett-Packard Company | Ink jet printhead with adress and data bus |
EP0709213A2 (en) * | 1994-10-28 | 1996-05-01 | Canon Kabushiki Kaisha | Method and apparatus for correcting printhead and printer using this printhead |
EP0914950A2 (en) * | 1997-11-06 | 1999-05-12 | Xerox Corporation | An ink jet printhead assembled from partial width array printheads |
EP0960737A2 (en) * | 1998-05-28 | 1999-12-01 | Toshiba Tec Kabushiki Kaisha | Ink jet recording apparatus |
Also Published As
Publication number | Publication date |
---|---|
AU2004226970A1 (en) | 2004-11-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6464332B1 (en) | Method and apparatus for the compensation for time varying nozzle misalignment in a drop on demand printhead | |
US8393703B2 (en) | Generating half tone print data for overlapping consecutive printhead segments | |
US7517037B2 (en) | Method for controlling nozzle firing in overlapped printhead segments | |
AU2000247328A1 (en) | Method and apparatus for compensation for time varying nozzle misalignment in a drop on demand printhead | |
AU2004226970B2 (en) | Inkjet printer having compensation for overlapping printhead elements | |
KR100790616B1 (en) | Method and apparatus for compensating time-varying nozzle misalignment in drop-on-demand printheads | |
KR100235987B1 (en) | Nonlinear Quantization Method for Color Printers | |
Ha | Color Image Quantization and Dithering Method based on HVS Characteristics | |
JPH0453352A (en) | Picture processing unit |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
FGA | Letters patent sealed or granted (standard patent) | ||
PC | Assignment registered |
Owner name: ZAMTEC LIMITED Free format text: FORMER OWNER WAS: SILVERBROOK RESEARCH PTY LTD |
|
MK14 | Patent ceased section 143(a) (annual fees not paid) or expired |