(57)【要約】【課題】ハーフトーン処理で用いられるテーブルのサイズを削減する。【解決手段】プリンタ１００の画像処理ＡＳＩＣ１５５は、ＲＡＭ１５２に記憶されたエンコードテーブルＥＴと第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとポストデコードテーブルＤＴ２と順序値テーブルＳＴとを順次参照することで、画像データを構成する各画素についてハーフトーン処理を行う。このうち、第１サブテーブルＤＴ１ａに記録されているインデックス値は、ブロック内に発生するドットの個数をエンコード値毎に固有の値で表すものであるため、対応するドットの個数が異なる場合であってもブロック間で重複した値を利用することができる。従って、ドットの個数を表す値を表現するためのビット数を低減することが可能になり、テーブルのサイズを低減することができる。【選択図】図３
2008099188.tif 000002
【特許請求の範囲】
【請求項１】
画像データに基づいて印刷媒体上に形成するドットの配置を決定する画像処理装置であって、
前記画像データを入力する画像データ入力手段と、
所定個数の閾値のまとまりからなるブロックを複数種類用意しておき、前記入力した画像データを構成する各画素の階調値を、該階調値と該画素に対応する前記ブロックの閾値とに基づき該ブロック内に発生するドットの配置を間接的に表したエンコード値に変換するエンコード手段と、
前記ブロック毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記ブロック内に前記エンコード値に応じて発生するドットの個数を前記エンコード値毎に固有に表したインデックス値を、関連付けた第１のテーブルを記憶する第１記憶手段と、
前記インデックス値毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記インデックス値と前記エンコード値とに応じて一意に表される前記ドットの個数を、関連付けた第２のテーブルを記憶する第２記憶手段と、
前記エンコード手段によって変換されたエンコード値を、該エンコード値と該エンコード値が生じた前記ブロックとに基づき、前記第１のテーブルを参照して、前記インデックス値に変換する第１デコード手段と、
前記第１デコード手段によって変換されたインデックス値を、該インデックス値と該インデックス値が生じた前記エンコード値とに基づき、前記第２のテーブルを参照して、前記ドットの個数に変換する第２デコード手段と、
前記第２デコード手段によって変換されたドットの個数に基づき、該ドットの個数が生じた前記ブロック内の前記閾値に応じて、該ブロック内に該個数分のドットを配置する第３デコード手段と
を備える画像処理装置。
【請求項２】
請求項１に記載の画像処理装置であって、
更に、前記ブロック毎に、該ブロック内の閾値の並び順を表す順序値データを記憶する順序値データ記憶手段を備え、
前記第３デコード手段は、前記ブロックに対応する前記順序値データを用いて、該順序値データが表す閾値の並び順に従って、前記ドットの配置を行う
画像処理装置。
【請求項３】
請求項１に記載の画像処理装置であって、
更に、前記ブロック毎に、前記階調値と前記エンコード値の対応関係を記録したエンコードテーブルを記憶するエンコードテーブル記憶手段を備え、
前記エンコード手段は、前記エンコードテーブルを参照して、前記各画素の階調値を、前記エンコード値に変換する
画像処理装置。
【請求項４】
請求項１に記載の画像処理装置であって、
前記第１デコード手段は、前記エンコード値を、前記画像データの所定のライン数分に相当する数だけ入力し、該ライン内の画素に対応する前記ブロックの範囲を前記第１のテーブルから部分的に入力して一時的に記憶する一時記憶手段を備え、
前記第１デコード手段は、前記一時記憶手段に記憶された部分的な第１のテーブルを用いて前記インデックス値を求める
画像処理装置。
【請求項５】
請求項４に記載の画像処理装置であって、
前記第１デコード手段は、前記部分的な第１のテーブル内のインデックス値を、前記第２デコード手段を用いて前記ドットの個数に変換した上で、前記一時記憶手段に入力し、
前記第１デコード手段は、前記一時記憶手段に記憶された前記変換後の部分的な第１のテーブルに基づき、前記エンコード値を、前記ドットの個数に直接変換する
画像処理装置。
【請求項６】
請求項１ないし請求項５のいずれかに記載の画像処理装置であって、
前記各ブロックは、画像データの階調値に応じてドットの発生の有無を決定するための閾値が記録された大域的なディザマトリックスを複数に分割することで用意されている
画像処理装置。
【請求項７】
請求項６に記載の画像処理装置であって、
前記ディザマトリックス内の閾値は、低い値ほど分散性よく配置されており、
前記第２記憶手段が記憶する前記第２のテーブルには、前記ドットの個数として、濃度の異なる複数種類のドットの各個数を表すプレデコード値が記録され、
前記第３デコード手段は、前記プレデコード値に基づき、前記ブロック内の低い閾値から順に、濃度の高いドットから濃度の低いドットにかけて各ドットを配置する
画像処理装置。
【請求項８】
画像データに基づいて印刷媒体上に形成するドットの配置を決定する画像処理方法であって、
前記画像データを入力する画像データ入力工程と、
所定個数の閾値のまとまりからなるブロックを複数種類用意しておき、前記入力した画像データを構成する各画素の階調値を、該階調値と該画素に対応する前記ブロックの閾値とに基づき該ブロック内に発生するドットの配置を間接的に表したエンコード値に変換するエンコード工程と、
前記ブロック毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記ブロック内に前記エンコード値に応じて発生するドットの個数を前記エンコード値毎に固有に表したインデックス値を、関連付けた第１のテーブルを記憶する第１記憶工程と、
前記インデックス値毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記インデックス値と前記エンコード値とに応じて一意に表される前記ドットの個数を、関連付けた第２のテーブルを記憶する第２記憶工程と、
前記エンコード手段によって変換されたエンコード値を、該エンコード値と該エンコード値が生じた前記ブロックとに基づき、前記第１のテーブルを参照して、前記インデックス値に変換する第１デコード工程と、
前記第１デコード手段によって変換されたインデックス値を、該インデックス値と該インデックス値が生じた前記エンコード値とに基づき、前記第２のテーブルを参照して、前記ドットの個数に変換する第２デコード工程と、
前記第２デコード手段によって変換されたドットの個数に基づき、該ドットの個数が生じた前記ブロック内の前記閾値に応じて、該ブロック内に該個数分のドットを配置する第３デコード工程と
を有する画像処理方法。
【請求項９】
画像データに基づき、印刷媒体上にドットを形成して印刷を行う印刷装置であって、
前記画像データを入力する画像データ入力手段と、
所定個数の閾値のまとまりからなるブロックを複数種類用意しておき、前記入力した画像データを構成する各画素の階調値を、該階調値と該画素に対応する前記ブロックの閾値とに基づき該ブロック内に発生するドットの配置を間接的に表したエンコード値に変換するエンコード手段と、
前記ブロック毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記ブロック内に前記エンコード値に応じて発生するドットの個数を前記エンコード値毎に固有に表したインデックス値を、関連付けた第１のテーブルを記憶する第１記憶手段と、
前記インデックス値毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記インデックス値と前記エンコード値とに応じて一意に表される前記ドットの個数を、関連付けた第２のテーブルを記憶する第２記憶手段と、
前記エンコード手段によって変換されたエンコード値を、該エンコード値と該エンコード値が生じた前記ブロックとに基づき、前記第１のテーブルを参照して、前記インデックス値に変換する第１デコード手段と、
前記第１デコード手段によって変換されたインデックス値を、該インデックス値と該インデックス値が生じた前記エンコード値とに基づき、前記第２のテーブルを参照して、前記ドットの個数に変換する第２デコード手段と、
前記第２デコード手段によって変換されたドットの個数に基づき、該ドットの個数が生じた前記ブロック内の前記閾値に応じて、該ブロック内に該個数分のドットを配置する第３デコード手段と、
前記印刷媒体に、前記配置されたドットを形成するドット形成手段と
を備える印刷装置。
【請求項１０】
画像データに基づいて印刷媒体上に形成するドットの配置を決定するコンピュータプログラムであって、
前記画像データを入力する画像データ入力機能と、
所定個数の閾値のまとまりからなるブロックを複数種類用意しておき、前記入力した画像データを構成する各画素の階調値を、該階調値と該画素に対応する前記ブロックの閾値とに基づき該ブロック内に発生するドットの配置を間接的に表したエンコード値に変換するエンコード機能と、
前記ブロック毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記ブロック内に前記エンコード値に応じて発生するドットの個数を前記エンコード値毎に固有に表したインデックス値を、関連付けた第１のテーブルを記憶する第１記憶機能と、
前記インデックス値毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記インデックス値と前記エンコード値とに応じて一意に表される前記ドットの個数を、関連付けた第２のテーブルを記憶する第２記憶機能と、
前記エンコード手段によって変換されたエンコード値を、該エンコード値と該エンコード値が生じた前記ブロックとに基づき、前記第１のテーブルを参照して、前記インデックス値に変換する第１デコード手段と、
前記第１デコード手段によって変換されたインデックス値を、該インデックス値と該インデックス値が生じた前記エンコード値とに基づき、前記第２のテーブルを参照して、前記ドットの個数に変換する第２デコード機能と、
前記第２デコード手段によって変換されたドットの個数に基づき、該ドットの個数が生じた前記ブロック内の前記閾値に応じて、該ブロック内に該個数分のドットを配置する第３デコード機能と
をコンピュータに実現させるコンピュータプログラム。
【請求項１１】
請求項１０に記載のコンピュータプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、印刷媒体上にドットを形成して画像を印刷する技術に関する。
【背景技術】
【０００２】
コンピュータで作成した画像や、デジタルカメラで撮影した画像などを出力する装置として、印刷媒体上にドットを形成して画像を印刷する印刷装置が広く利用されている。このような印刷装置において、組織的ディザ法や濃度パターン法、サイズの異なる複数種類のドットを配置する手法（特許第３２９２１０４号）等の技術を発展させて極めて高速に高画質な印刷を行うことができる技術が本願の出願人によって提案されている（例えば、特許文献１参照）。
【０００３】
【特許文献１】特開２００６−１４０３６号公報
【０００４】
上記特許文献１に記載の画像処理技術では、大域的なディザマトリックスを４×２個の閾値を有するブロックに分割し、入力画像の各画素が、このディザマトリックス内のどのブロックに該当するかに基づき、特許文献１の図３４に記載された多値化用テーブルや、図３８の中間データ用の変換テーブル、図３９の順序値マトリックス等の種々のテーブルを順次参照していくことで、入力画像に対するハーフトーン処理を行っている。
【０００５】
このような従来技術において処理の高速化を図るためには、上述した種々のテーブルをＲＯＭ等の記憶手段からＲＡＭに予め展開して記憶しておく必要がある。一般的にＲＯＭよりもＲＡＭの方がアクセス速度が速いからである。しかし、例えば、上述したハーフトーン処理を印刷装置単体で実現しようとすると、搭載しているＲＡＭが低容量であることが多く、このような場合には、全てのテーブルをＲＡＭに展開すること困難となり、高速化を図ることができないという問題が生じていた。こうした問題に対して、ＲＡＭの搭載容量を増加させることも考えられるが、コストアップの要因となり、合理的であるとは言えなかった。
【発明の開示】
【発明が解決しようとする課題】
【０００６】
種々のテーブルを参照してハーフトーン処理を行う際に生じる上記のような問題を考慮し、本発明が解決しようとする課題は、ハーフトーン処理で用いられるテーブルのサイズを削減することにある。
【課題を解決するための手段】
【０００７】
上記課題を踏まえ、本発明の画像処理装置を次のように構成した。すなわち、
画像データに基づいて印刷媒体上に形成するドットの配置を決定する画像処理装置であって、
前記画像データを入力する画像データ入力手段と、
所定個数の閾値のまとまりからなるブロックを複数種類用意しておき、前記入力した画像データを構成する各画素の階調値を、該階調値と該画素に対応する前記ブロックの閾値とに基づき該ブロック内に発生するドットの配置を間接的に表したエンコード値に変換するエンコード手段と、
前記ブロック毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記ブロック内に前記エンコード値に応じて発生するドットの個数を前記エンコード値毎に固有に表したインデックス値を、関連付けた第１のテーブルを記憶する第１記憶手段と、
前記インデックス値毎に、前記エンコード値が取り得る範囲内の各エンコード値に対して、前記インデックス値と前記エンコード値とに応じて一意に表される前記ドットの個数を、関連付けた第２のテーブルを記憶する第２記憶手段と、
前記エンコード手段によって変換されたエンコード値を、該エンコード値と該エンコード値が生じた前記ブロックとに基づき、前記第１のテーブルを参照して、前記インデックス値に変換する第１デコード手段と、
前記第１デコード手段によって変換されたインデックス値を、該インデックス値と該インデックス値が生じた前記エンコード値とに基づき、前記第２のテーブルを参照して、前記ドットの個数に変換する第２デコード手段と、
前記第２デコード手段によって変換されたドットの個数に基づき、該ドットの個数が生じた前記ブロック内の前記閾値に応じて、該ブロック内に該個数分のドットを配置する第３デコード手段と
を備えることを要旨とする。
【０００８】
本発明の画像処理装置では、画像データを構成する各画素の階調値をエンコード値に変換した上で、このエンコード値を第１のテーブルに基づきインデックス値に変換し、更に、このインデックス値を第２のテーブルに基づきドットの個数に変換し、最終的に、この個数のドットを、ブロック内の閾値に基づいて配置することでハーフトーン処理を行う。このうち、第１のテーブルに記録されるインデックス値は、ブロック内に発生するドットの個数をエンコード値毎に固有の値で表すものであるため、実際の個数が異なる場合であっても、ブロック間で重複した値を利用することができる。従って、ドットの個数を表す値を表現するためのビット数を低減することが可能になり、テーブルのサイズを低減することができる。一方、第２のテーブルには、このインデックス値とエンコード値とに対応付けて本来のドットの個数が記録されているが、有限個の閾値からなるブロック内に生じるドットの個数は、それほどバリエーションがあるわけではないので、このテーブルのサイズは、第１のテーブルのサイズに比べて極めて小さなサイズとなる。そのため、第１のテーブルと第２のテーブルとを合わせて見れば、全体として、ハーフトーン処理に用いるテーブルのサイズを低減することが可能になる。
【０００９】
上記構成の画像処理装置において、
更に、前記ブロック毎に、該ブロック内の閾値の並び順を表す順序値データを記憶する順序値データ記憶手段を備え、
前記第３デコード手段は、前記ブロックに対応する前記順序値データを用いて、該順序値データが表す閾値の並び順に従って、前記ドットの配置を行うものとしてもよい。
【００１０】
このような構成であれば、順序値データが示すドットの配置順に従ってドットを配置すればよいので、容易かつ迅速にドットの配置を行うことができる。
【００１１】
上記構成の画像処理装置において、
更に、前記ブロック毎に、前記階調値と前記エンコード値の対応関係を記録したエンコードテーブルを記憶するエンコードテーブル記憶手段を備え、
前記エンコード手段は、前記エンコードテーブルを参照して、前記各画素の階調値を、前記エンコード値に変換するものとしてもよい。
【００１２】
このような構成であれば、エンコードテーブルを参照するだけで、階調値をエンコード値に変換することができるので、処理の高速化を図ることができる。
【００１３】
上記構成の画像処理装置において、
前記第１デコード手段は、前記エンコード値を、前記画像データの所定のライン数分に相当する数だけ入力し、該ライン内の画素に対応する前記ブロックの範囲を前記第１のテーブルから部分的に入力して一時的に記憶する一時記憶手段を備え、
前記第１デコード手段は、前記一時記憶手段に記憶された部分的な第１のテーブルを用いて前記インデックス値を求めるものとしてもよい。
【００１４】
このような構成であれば、一時記憶手段に記憶された部分的な第１のテーブルを参照することで、所定のライン数毎に効率的にドットの配置を行うことが可能になる。所定のライン数とは、第１のテーブルから一時記憶手段へのデータの転送速度や一時記憶手段の記憶容量に応じて、例えば、１ラインや２ライン、あるいは、それ以上の数を単位とすることができる。
【００１５】
上記構成の画像処理装置において、
前記第１デコード手段は、前記部分的な第１のテーブル内のインデックス値を、前記第２デコード手段を用いて前記ドットの個数に変換した上で、前記一時記憶手段に入力し、
前記第１デコード手段は、前記一時記憶手段に記憶された前記変換後の部分的な第１のテーブルに基づき、前記エンコード値を、前記ドットの個数に直接変換するものとしてもよい。
【００１６】
このような構成であれば、一時記憶手段に記憶された第１のテーブルを用いることで、エンコード値を直接ドットの個数に変換することができるので、処理の高速化を図ることができる。
【００１７】
上記構成の画像処理装置において、
前記各ブロックは、画像データの階調値に応じてドットの発生の有無を決定するための閾値が記録された大域的なディザマトリックスを複数に分割することで用意されているものとしてもよい。
【００１８】
このような構成であれば、周知のディザマトリックスに基づいて各ブロックを容易に用意することができる。このようなディザマトリックスとしては、例えば、ブルーノイズ特性を有するマトリックスを利用することができる。
【００１９】
上記構成の画像処理装置において、
前記ディザマトリックス内の閾値は、低い値ほど分散性よく配置されており、
前記第２記憶手段が記憶する前記第２のテーブルには、前記ドットの個数として、濃度の異なる複数種類のドットの各個数を表すプレデコード値が記録され、
前記第３デコード手段は、前記プレデコード値に基づき、前記ブロック内の低い閾値から順に、濃度の高いドットから濃度の低いドットにかけて各ドットを配置するものとしてもよい。
【００２０】
このような構成であれば、濃度の高いドットほど、分散性よく配置することができるため、印刷画像の粒状感を低減し、高画質化を図ることが可能になる。
【００２１】
なお、本発明は、上述した画像処理装置としての構成のほか、画像処理方法や、印刷装置、コンピュータプログラムとしても構成することができる。かかるコンピュータプログラムは、コンピュータが読取可能な記録媒体に記録されていてもよい。記録媒体としては、例えば、フレキシブルディスクやＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、光磁気ディスク、メモリカード、ハードディスク等の種々の媒体を利用することができる。
【発明を実施するための最良の形態】
【００２２】
以下、上述した本発明の作用・効果を一層明らかにするため、本発明の実施の形態を実施例に基づき次の順序で説明する。
（Ａ）プリンタの構成：
（Ｂ）印刷処理：
（Ｃ）初期化処理：
（Ｄ）ハーフトーン処理：
（Ｄ−１）エンコード処理：
（Ｄ−２）デコード処理：
（Ｅ）第１，第２サブテーブルを用いたデコード処理：
（Ｅ−１）第１，第２サブテーブルの生成方法： 
（Ｅ−２）第１，第２サブテーブルの他の生成方法：
（Ｆ）効果：
（Ｇ）変形例：
【００２３】
（Ａ）プリンタの構成：
図１は、本発明の実施例としてのプリンタ１００を示す説明図である。プリンタ１００は、いわゆる複合機タイプのプリンタであり、光学的に画像を読み込むスキャナ１１０や、画像データの記録されたメモリカードＭＣを挿入するためのメモリカードスロット１２０、デジタルカメラ等の機器を接続するＵＳＢインタフェース１３０等を備えている。プリンタ１００は、スキャナ１１０によって取り込んだ画像や、メモリカードＭＣから読み込んだ画像、ＵＳＢインタフェース１３０を介してデジタルカメラから読み込んだ画像等を印刷用紙Ｐに印刷することができる。また、プリンタケーブル等によって接続された図示していないパーソナルコンピュータから入力した画像の印刷も行うことができる。
【００２４】
プリンタ１００は、印刷対象の画像の選択や、印刷用紙の種類、用紙サイズの設定など、印刷に関する種々の設定操作を行うための操作パネル１４０を備えている。操作パネル１４０の中央部には、液晶モニタ１４５が備えられている。液晶モニタ１４５には、メモリカードＭＣ等から入力した画像の一覧や種々のグラフィカルインタフェース（ＧＵＩ）が表示される。
【００２５】
図２は、プリンタ１００の内部構成を示す説明図である。図示するように、プリンタ１００は、印刷用紙Ｐに印刷を行う機構として、インクカートリッジ２１２を搭載したキャリッジ２１０や、キャリッジ２１０を主走査方向に駆動するキャリッジモータ２２０、印刷用紙Ｐを副走査方向に搬送する紙送りモータ２３０等を備えている。
【００２６】
キャリッジ２１０には、シアン（Ｃ）、ライトシアン（Ｌｃ）、マゼンタ（Ｍ）、ライトマゼンタ（Ｌｍ）、イエロ（Ｙ）、ブラック（Ｋ）、の各インクが収容されたインクカートリッジ２１２が搭載されている。キャリッジ２１０は、これらの色に対応して計６種類のインクヘッド２１１を備えている。インクカートリッジ２１２からインクヘッド２１１に供給されたインクは、図示しないピエゾ素子を駆動することで印刷用紙Ｐに吐出される。
【００２７】
本実施例のプリンタ１００は、制御ユニット１５０によってインクヘッド２１１のピエゾ素子に印加する電圧波形を制御することにより、印刷用紙Ｐに４種類のサイズのドットを形成することができる。以下では、４種類のサイズのドットを、ドットの形成されない場合も含め、サイズの小さい順に、「ドット無し」、「Ｓドット」、「Ｍドット」、「Ｌドット」というものとする。各サイズのドットは、１ドット当たり、それぞれ、１．５ｐｌ（ピコリットル）、３ｐｌ、７ｐｌのインク量によって表現される。なお、本実施例では、４種類のサイズのドットを形成可能であるものとしたが、２種類や３種類、あるいは５種類以上のドットを形成可能としてもよい。
【００２８】
キャリッジ２１０は、プラテン２７０の軸方向と並行に設置された摺動軸２８０に移動自在に保持されている。キャリッジモータ２２０は、制御ユニット１５０からの指令に応じて駆動ベルト２６０を回転させることで、プラテン２７０の軸方向と平行に、すなわち、主走査方向にキャリッジ２１０を往復運動させる。紙送りモータ２３０は、制御ユニット１５０からの指令に応じてプラテン２７０を回転させることで、プラテン２７０の軸方向と垂直に印刷用紙Ｐを搬送する。つまり、紙送りモータ２３０は、キャリッジ２１０を相対的に副走査方向に移動させることができる。
【００２９】
プリンタ１００は、上述したインクヘッド２１１やキャリッジモータ２２０、紙送りモータ２３０の動作を制御するための制御ユニット１５０を備えている。制御ユニット１５０には、図１に示したスキャナ１１０やメモリカードスロット１２０、ＵＳＢインタフェース１３０、操作パネル１４０、液晶モニタ１４５が接続されている。
【００３０】
制御ユニット１５０は、ＣＰＵ１５１とＲＡＭ１５２とＲＯＭ１５３と画像処理ＡＳＩＣ１５５とによって構成されている。
【００３１】
ＲＯＭ１５３には、プリンタ１００の動作を全般的に制御するための制御プログラムが記憶されている。ＣＰＵ１５１はプリンタ１００の電源投入時に、この制御プログラムをＲＡＭ１５２に読み出して実行する。ＣＰＵ１５１は、この制御プログラムの実行により、後述する印刷処理や初期化処理等を行う。
【００３２】
ＲＯＭ１５３には、制御プログラムの他、後述する初期化処理時に使用されるディザマトリックスデータＤＭやドット発生量テーブルＤＧＴが記憶されている。ＲＡＭ１５２には、この初期化処理によって生成される種々のテーブルが記憶される。
【００３３】
画像処理ＡＳＩＣ１５５は、メモリカードＭＣ等から入力した画像データに対して、色変換処理やハーフトーン処理を施し、印刷機構（インクヘッド２１１、キャリッジモータ２２０、紙送りモータ２３０）を制御して印刷を行うための集積回路である。画像処理ＡＳＩＣ１５５内の論理回路は、以下で説明する機能を実現するためのプログラムが所定のハードウェア記述言語によって記述されることで設計されている。
【００３４】
図３は、画像処理ＡＳＩＣ１５５の詳細な構成を示す説明図である。図示するように、本実施例の画像処理ＡＳＩＣ１５５は、色変換ユニット３００と、ハーフトーン処理ユニット４００と、インク吐出制御ユニット５００とを備えている。
【００３５】
色変換ユニット３００は、Ｒ，Ｇ，Ｂの階調値の組み合わせによって表現されている画像データの色を、キャリッジ２１０に備えられたインクの各色についての階調値の組み合わせによって表現された色に変換する回路である。前述したように、プリンタ１００は、Ｃ，Ｍ，Ｙ，Ｋ，Ｌｃ，Ｌｍの最大６色のインクを用いて画像を印刷する。そこで、色変換ユニット３００は、ＲＧＢ各色によって表現された画像データを、これら６色の階調値によって表現された画像データに変換する。
【００３６】
色変換ユニット３００は、ＲＡＭ１５２に記憶された色変換テーブルＬＵＴと呼ばれるテーブルを参照することで前述した色変換を行う。この色変換テーブルＬＵＴには、ＲＧＢの階調値とＣＭＹＫＬｃＬｍの階調値とが予め対応付けて記憶されている。色変換ユニット３００は、この色変換テーブルＬＵＴを参照することにより、ＲＧＢ形式によって表された画像データを、迅速にＣＭＹＫＬｃＬｍ形式（以下、「ＣＭＹ形式」という）の画像データに変換することができる。色変換後の画像データは、各色、２５６段階（０〜２５５）の階調値を有するものとする。
【００３７】
ハーフトーン処理ユニット４００は、色変換ユニット３００によって色変換されたＣＭＹ形式の画像データを入力し、この画像データを、印刷媒体上に形成されるドットの配置表すドット配置データに変換する回路である。
【００３８】
プリンタ１００は、吐出するインク滴のサイズを最大４段階に調整することができるにすぎず、各色２５６階調のＣＭＹ形式のデータをそのまま用いることはできない。そのため、プリンタ１００は、ハーフトーン処理ユニット４００によって、ＣＭＹ形式の階調値を、単位面積あたりのドットの粗密を表すドット配置データに変換することで中間調の色を表現する。
【００３９】
図４は、ドット配置データの一例を示す説明図である。この図では、ＣＭＹ形式の画像データの最も左上の画素（１，１）の色（例えばシアン）の階調値が「５２」の場合に、これをドット配置データに変換した例を図の左下に示した。このように、本実施例では、１つの画素の階調値が入力されると、４×２ドットのドット群の中で、ＳドットやＭドット、Ｌドットなどを配置してその階調値が表す色を印刷用紙上に表現する。なお、前述したドット群のことを、以下では「ブロック」と呼ぶことがある。
【００４０】
ここで、ドット配置データの生成方法を簡単に説明する。ドット配置データ内の各ドットの配置は、大域的なディザマトリックスデータＤＭ（図７（ａ）参照）からハーフトーン処理対象の画素の位置に応じて切り出された局所的な閾値群（図７（ｂ）参照）と、その画素の階調値ＴＤに対応する各サイズのドットの発生量（図９参照）との関係から決定される。つまり、図９に示したドット発生量テーブルＤＧＴによって、入力階調値ＴＤに応じた各サイズのドットの発生量を求め、その各ドットの発生量と閾値群内の閾値とを比較していき、１ブロック内に配置する各サイズのドットの個数を求める。そして、その個数分のドットを大きなサイズのドットから閾値群内の閾値の低い場所に配置していくことでドット配置データが生成される。本実施例では、このような一連の処理を行うために、エンコードテーブルＥＴや、プレデコードテーブルＤＴ１、ポストデコードテーブルＤＴ２、順序値テーブルＳＴと呼ばれる種々のテーブルを予め生成しておき、これらのテーブルを順次参照することで、ドット配置データの生成を効率的に行う。ドット配置データを生成するための詳細な処理内容については後で説明する。
【００４１】
本実施例では、ＣＭＹ画像中の画素の階調値が同一の場合であっても、その画素の位置が異なれば、図７（ａ）に示したディザマトリックスデータＤＭ内で参照される閾値群が異なるため、異なるドット配置データが生成される。例えば、図４において、ＣＭＹ画像の最も左上の画素以外に、もう一つ、「５２」の階調値を有する画素（ｊ，１）を示している。この画素に対応するドット配置データの例を図の右下に示したが、かかるドット配置データは、先に示したドット配置データとは異なるドット配置を有している。つまり、本実施例では、階調値の値が同じであっても、ハーフトーン処理対象となる画素の位置に応じて生成するドット配置データを変化させるので、従来の組織的ディザ法や濃度パターン法等よりも高画質な画像の出力を行うことが可能になる。
【００４２】
上述したように、本実施例では、出力画像のドット群の単位を４×２としたため、例えば、入力画像の解像度が、３６０ｄｐｉ×３６０ｄｐｉであれば、印刷用紙に出力される出力解像度は、１４４０ｄｐｉ×７２０ｄｐｉとなる。ドット群の横方向の解像度が縦方向の解像度よりも高いものとしたのは、階調変化に対する人間の目の追従性が縦方向よりも横方向に敏感であるためである。また、印刷用紙Ｐを副走査方向に移動させる制御よりも、キャリッジ２１０を主走査方向に移動させる制御の方が比較的容易であるため、横方向の解像度を縦方向の解像度よりも高くしている。しかし、もちろん、ドット群のサイズは、４×２以外にも、縦横比が同一となる４×４や２×２などとすることも可能である。なお、本実施例では、ＲＧＢ形式あるいはＣＭＹ形式の画像の構成要素の最小単位を「画素」といい、印刷用紙Ｐに形成される出力画像の構成要素の最小単位を「ドット」というものとする。ここで、ＲＧＢ形式あるいはＣＭＹ形式の入力画像を、例えば、３６０ｄｐｉ×３６０ｄｐｉから１４４０ｄｐｉ×７２０ｄｐｉに高解像度化した上で、その中の複数の画素を４×２や２×２のブロックとしてまとめ、その複数の画素を代表する画素（例えば、ブロック内の画素の階調値を平均化したもの）を１つの「画素」として扱うものとしてもよい。
【００４３】
説明を図３に戻す。ハーフトーン処理ユニット４００は、エンコードユニット４１０とデコードユニット４２０とを備えている。
【００４４】
ハーフトーン処理ユニット４００は、色変換ユニット３００からＣＭＹ形式の画像データを入力すると、この画像データをエンコードユニット４１０に入力する。エンコードユニット４１０は、このとき、ＣＭＹ画像を１ライン単位で入力する。
【００４５】
エンコードユニット４１０は、入力された画像データを構成する各画素の階調値（８ビット）を、ＲＡＭ１５２に記憶されたエンコードテーブルＥＴ（図１０参照）を参照して、各色５ビットのデータで表されるエンコード値ＥＶに変換する。かかる変換処理を、以下、「エンコード処理」という。エンコード処理によって得られるエンコード値ＥＶは、印刷用紙上に、どのようなドット配置データ（図４参照）を形成するかを間接的に指し示す値である。「間接的」というのは、このエンコード値ＥＶを後述するデコード処理によって、対応するデコードテーブルに基づき変換した結果、最終的にドット配置データに変換されるからである。こうしたエンコード処理の過程で参照されるエンコードテーブルＥＴの生成方法や、エンコード処理の詳細な方法については後で説明する。
【００４６】
画像処理ＡＳＩＣ１５５は、その内部に、図２に示したＲＡＭ１５２よりも高速に読み書きを行うことのできるＳＲＡＭ１５６を備えている。エンコードユニット４１０は、１ライン分のＣＭＹ画像をエンコード値ＥＶに変換するにあたり、ＲＡＭ１５２内のエンコードテーブルＥＴからその１ライン分のエンコード処理に必要なデータのみをこのＳＲＡＭ１５６に一時的に入力し、この部分的なエンコードテーブルＥＴを参照することでエンコード処理を行う。詳細は後述するが、例えば、ＣＭＹ画像の最上部のラインをエンコード処理する場合には、図１０に示したエンコードテーブルＥＴのブロック番号０から１２７（ブロック番号の最大値は、「８１９１」）までのデータが入力される（図１８参照）。１ライン分のエンコード処理においては、エンコードテーブルＥＴ内の一部のブロックが繰り返し使用されることになるため、画像処理ＡＳＩＣ１５５内のＳＲＡＭ１５６に予め必要なデータだけを入力することで、効率的にエンコード処理を行うことが可能になる。なお、本実施例では、エンコードユニット４１０は、１ライン単位でエンコード処理を行うものとするが、ＳＲＡＭ１５６の記憶容量やＳＲＡＭ１５６へのデータの転送速度に応じて、２ライン単位やそれ以上の単位、あるいは、画像全体について一括してエンコード処理を行うものとしてもよい。
【００４７】
エンコードユニット４１０は、８ビットで表されるＣＭＹ階調値を５ビットのエンコード値ＥＶに変換すると、このエンコード値ＥＶを、ＲＡＭ１５２の所定領域に確保した中間バッファＢＦに格納する。このように、本実施例では、メモリカードＭＣ等から入力した画像データを、８ビットのデータから５ビットのデータに変換してＲＡＭ１５２に記憶することができるので、ＲＡＭ１５２の使用容量が削減され、コストダウンを図ることが可能になる。
【００４８】
デコードユニット４２０は、中間バッファＢＦからエンコード値ＥＶを読み込み、ＲＡＭ１５２に記憶されたプレデコードテーブルＤＴ１（図１２参照）、ポストデコードテーブルＤＴ２（図８参照）、および、順序値テーブルＳＴ（図７（ｄ）参照）を順次参照することで、このエンコード値ＥＶを、図４に示したような４×２ドットのドット配置データに変換する。かかる変換処理のことを、「デコード処理」という。デコードユニット４２０は、エンコード値ＥＶをドット配置データに変換すると、そのドット配置データをインク吐出制御ユニット５００に出力する。デコード処理の過程で参照される上述した各テーブルの生成方法や、デコード処理の詳細については後で説明する。なお、かかるデコード処理もエンコード処理と同様、１ライン単位で行われるため、プレデコードテーブルＤＴ１や順序値テーブルＳＴ内の必要なデータのみが、ＳＲＡＭ１５６に入力される。
【００４９】
ところで、本実施例では、デコードユニット４２０は、実際には上述したプレデコードテーブルＤＴ１に代えて、第１サブテーブルＤＴ１ａおよび第２サブテーブルＤＴ１ｂという２種類のテーブルを参照してデコード処理を行う。しかし、以下では、説明の便のため、まず、プレデコードテーブルＤＴ１を用いてデコード処理を行う方法を説明し、その後、第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとを用いてデコード処理を行う方法を説明する。
【００５０】
インク吐出制御ユニット５００は、図２に示したインクヘッド２１１、キャリッジモータ２２０、紙送りモータ２３０を制御して、ハーフトーン処理ユニット４００から入力したドット配置データに基づき印刷用紙上にインク滴を吐出してドットを形成する。ドット配置データには、各サイズのドットの大きさを、それぞれ、「００（ドット無し）」、「０１（Ｓドット）」、「１０（Ｍドット）」、「１１（Ｌドット）」という２ビットのデータによって表した値（以下、「ドットサイズ値」という）が設定されている。従って、インク吐出制御ユニット５００は、このドットサイズ値に応じて、インクヘッド２１１内のピエゾ素子に印加する電圧波形を調整することで、サイズの異なるドットの打ち分けを行う。こうすることで、本実施例のプリンタ１００は、印刷用紙に対してカラー印刷を行う。
【００５１】
（Ｂ）印刷処理：
図５は、プリンタ１００が実行する印刷処理のフローチャートである。この印刷処理は、ユーザによる操作パネル１４０の操作によって所定の印刷操作がなされた場合に、ＣＰＵ１５１によって実行される処理である。
【００５２】
この印刷処理が実行されると、ＣＰＵ１５１は、まず、図３に示したエンコードテーブルＥＴやプレデコードテーブルＤＴ１、ポストデコードテーブルＤＴ２、順序値テーブルＳＴを生成するための初期化処理を行う（ステップＳ１０）。かかる初期化処理の詳細な説明は後述する。
【００５３】
初期化処理が完了すると、ＣＰＵ１５１は、ユーザによって指定された画像データをメモリカードＭＣ等から入力する（ステップＳ２０）。そして、入力した画像データを、画像処理ＡＳＩＣ１５５に出力する。すると、画像処理ＡＳＩＣ１５５では、色変換ユニット３００による色変換処理（ステップＳ３０）、および、ハーフトーン処理ユニット４００によるハーフトーン処理（ステップＳ４０）が行われ、入力画像の画素毎にドット配置データが生成される。
【００５４】
ハーフトーン処理ユニット４００によってドット配置データが生成されると、インク吐出制御ユニット５００によってインクの吐出制御が行われる（ステップＳ５０）。この結果、印刷用紙に対してカラー画像が印刷される。画像処理ＡＳＩＣ１５５が行うハーフトーン処理の詳細な説明は後述する。
【００５５】
（Ｃ）初期化処理：
図６は、上述した印刷処理のステップＳ１０で実行される初期化処理の詳細を示すフローチャートである。上述したように、この初期化処理は、ハーフトーン処理ユニット４００がハーフトーン処理時に参照する種々のテーブルを生成するための処理である。
【００５６】
この初期化処理が実行されると、まず、ＣＰＵ１５１は、ＲＯＭ１５３から、ディザマトリックスデータＤＭをＲＡＭ１５２に入力し（ステップＳ１００）、このディザマトリックスデータＤＭに基づき、順序値テーブルＳＴの生成を行う（ステップＳ１１０）。順序値テーブルＳＴは、後述するデコード処理において、４×２個の要素を有するブロック内に、各サイズのドットを配置する順序を決定するためのテーブルである。
【００５７】
図７は、ディザマトリックスデータＤＭのデータ構造および順序値テーブルＳＴの生成方法を示す説明図である。図７（ａ）には、ディザマトリックスデータＤＭのデータ構造を示している。本実施例のディザマトリックスデータＤＭには、横５１２×縦１２８の配列内に０から６５５３５までの計６５５３６個の閾値が万遍なく記録されている（各閾値の図示は省略）。このディザマトリックスデータＤＭは、従来のハーフトーン技術として知られた組織的ディザ法で用いられるディザマトリックスと同種のテーブルである。そのため図示したディザマトリックスデータＤＭにおいても、画像データが０から６５５３５までの階調値を有すると仮定した場合において、この画像データを２値化する際に、白黒ドットの分散性が高まるように各閾値が配置されている。このようなディザマトリクスデータＤＭとしては、例えば、ブルーノイズ特性を有するマトリックスを採用することができる。なお、本実施例では、ディザマトリックスデータＤＭのサイズを、５１２×１２８としたが、１２８×３２や１０２４×２５６など、種々のサイズを適用することができる。
【００５８】
上記ステップＳ１１０では、このディザマトリックスデータＤＭから、順序値テーブルＳＴの生成を行う。まず、ＣＰＵ１５１は、ディザマトリックスデータＤＭを、４×２個の閾値を１つのブロックとして、計８１９２（＝（５１２／４）×（１２８／２））個のブロックに分割し、各ブロックに対してブロック番号を与える。本実施例では、図７（ａ）に示すように、ディザマトリックスデータＤＭの最も左上に位置するブロックにブロック番号「０」を与え、その右隣に位置するブロックにブロック番号「１」、以下、右下端のブロックにかけて、順にブロック番号を与える。
【００５９】
図７（ｂ）には、ブロック番号「０」のブロックに記録された各閾値を閾値群として示している。図７（ｃ）には、この閾値群を元に生成される順序値データを示している。ＣＰＵ１５１は、図７（ｂ）に示した閾値群内のすべての要素について同時に、階調値を０から６５５３５まで上げていき、その階調値が、閾値を上回った順序を０から７までの値によって記録することで、図７（ｃ）の順序値データを生成する。図７（ｂ）の場合には、２３，４７２，１０１０，１３２２、…、の順に、階調値が閾値を超えることになるため、ブロック番号「０」に対応する順序値データは、図７（ｃ）のようになる。
【００６０】
ＣＰＵ１５１は、すべてのブロックについて順序値データを生成すると、これを、ブロック番号毎に記録して順序値テーブルＳＴを生成する。図７（ｄ）には、最終的に生成された順序値テーブルＳＴの一例を示している。ＣＰＵ１５１は、こうして生成した順序値テーブルＳＴをＲＡＭ１５２に記憶する。
【００６１】
説明を図６に戻す。ＣＰＵ１５１は、順序値テーブルＳＴを生成すると、次に、後述するデコード処理において用いられるポストデコードテーブルＤＴ２の生成を行う（ステップＳ１２０）。
【００６２】
図８は、ポストデコードテーブルＤＴ２の一例を示す説明図である。図示するように、このポストデコードテーブルＤＴ２には、０から１６４までのプレデコード値に対応付けて、１６ビットのドット数データが記録されている。ドット数データは、２ビットのドットサイズ値を、サイズの大きなドットから右詰めに８つ連結させたデータである。この１６５個のドット数データは、１ブロック内に発生する各サイズのドットの数の組み合わせのすべてを表している。
【００６３】
ここで、１つのブロック内に発生する各サイズのドットの組み合わせの数が１６５個に収まる理由を説明する。ブロック内の１つのドットのサイズは、上述したように、「ドット無し」、「Ｓドット」、「Ｍドット」、「Ｌドット」の４つの状態を取り得る。従って、１ブロック内におけるこれらのドットの組合せは、これら４つの状態を、重複を許容して８回選択した時の組合せの数に等しくなるから、重複組み合わせの演算式を表す下記式（１）によってドットの組み合わせの数を求めることができる。このことから、最大でも１６５通り（０〜１６４）の組合せしか出現しないことになる。従って、ドット数データに対応するプレデコード値は、０から１６４までの値となる。
【００６４】
4Ｈ8（＝4+8-1Ｃ8）＝１６５  ・・・（１）
（nＨrは、ｎ個の物の中から重複を許してｒ回選択するときの重複組合せ数を求める演算子であり、nＣrは、ｎ個の物の中から重複を許さずにｒ回選択するときの組合せ数を求める演算子である。）
【００６５】
ＣＰＵ１５１は、図８に示したポストデコードテーブルＤＴ２を次のように生成する。すなわち、まず、ＣＰＵ１５１は、１ブロック内に発生するＳドット、Ｍドット、Ｌドットの各サイズのドットの数をすべて「０」とし、これを、プレデコード値「０」に対応するドット数データとしてプレデコードテーブルＤＴ１に記録する。この場合、１ブロック内の８つのドットのサイズがすべて「ドット無し（００）」となるから、ドット数データとしては、「００００００００００００００００」となる。
【００６６】
次に、ＣＰＵ１５１は、Ｓドットの数を１から８まで順番に増やし、それぞれの発生個数をドット数データとしてプレデコード値１から８までに記録する。つまり、Ｓドットの数が１の場合は、ドット数データは、「０００００００００００００００１」となり、Ｓドットの数が８の場合は、「０１０１０１０１０１０１０１０１」となる。
【００６７】
続いて、ＣＰＵ１５１は、Ｍサイズのドットの数を「１」とし、発生するドットの合計が８個以内になるように、Ｓサイズのドットの数を、０から７まで増加させる。そして、それぞれのドットの発生個数の組み合わせをプレデコード値「９」以降に記録する。
【００６８】
更に、ＣＰＵ１５１は、Ｍサイズのドットの数を「２」とし、Ｓサイズのドットの数を０から６まで増加させる。そして、それぞれの発生個数をプレデコードテーブルＤＴ１に記録する。以下、同様にして、Ｌサイズのドットの数が「８」になるまで、各サイズのドットの数を変化させることにより、ポストデコードテーブルＤＴ２の生成を行う。ＣＰＵ１５１は、こうして生成したポストデコードテーブルＤＴ２をＲＡＭ１５２に記憶する。なお、ドット数データには、それぞれ固有のプレデコード値が割り当てられていればよく、その対応関係については特に規定はない。
【００６９】
ここで、説明を再び図６に戻す。ＣＰＵ１５１は、ポストデコードテーブルＤＴ２の生成を完了すると、後述するエンコードテーブルＥＴやプレデコードテーブルＤＴ１の生成で用いられるドット発生量テーブルＤＧＴをＲＯＭ１５３からＲＡＭ１５２に入力する（ステップＳ１３０）。
【００７０】
図９は、ドット発生量テーブルＤＧＴの一例を示す説明図である。図示するように、このドット発生量テーブルＤＧＴには、横軸に示した入力階調値ＴＤに応じて、Ｓドット、Ｍドット、Ｌドットの発生量がそれぞれ縦軸に定義されている。この図によれば、入力階調値ＴＤが０から７０程度までは、Ｓドットのみが発生し、その後、入力階調値ＴＤが１２０程度までは、ＳドットとＭドットの両者が発生することがわかる。また、入力階調値ＴＤが１１０程度になると、ＳドットとＭドットに加えて、Ｌドットが発生するようになり、入力階調値ＴＤが概ね１８０以降になると、Ｌドットのみが発生することがわかる。なお、縦軸に示すドット発生量は、図７に示したディザマトリックスデータＤＭ内の各閾値との比較が可能なように、０から６５５３５までの値をとる。
【００７１】
図９には、Ｓドット，Ｍドット，Ｌドットの発生量とともに、これらのドットが印刷媒体に形成される際に吐出されるインクの総重量の変化を示した。図示したインク総重量の変化によれば、入力階調値ＴＤが増加するにつれ、インクの総重量が徐々に増加していくことになる。各サイズのドット発生量は、かかる総重量の変化にあわせて、それぞれの発生量が設定されている。なお、このドット発生量テーブルＤＧＴは、プリンタ１００がサポートしている印刷用紙の種類に応じて複数種類のテーブルがＲＯＭ１５３に記憶されている。印刷用紙は、その材質によってインクの吸収率や光の反射率が異なり、このような特性に応じてインクのドット発生量が設定されているためである。従って、ＣＰＵ１５１は、ユーザによって設定された印刷用紙Ｐの種類に応じて、その種類に応じたドット発生量テーブルＤＧＴをＲＯＭ１５３から入力する。こうすることで、選択された印刷用紙Ｐに適した印刷を行うことが可能になる。
【００７２】
説明を図６に戻す。上記ステップＳ１３０によってドット発生量テーブルＤＧＴを入力すると、ＣＰＵ１５１は、このドット発生量テーブルＤＧＴとステップＳ１００で入力したディザマトリックスデータＤＭとを用いて、エンコードテーブルＥＴとプレデコードテーブルＤＴ１を生成するテーブル生成処理を行う（ステップＳ１４０）。
【００７３】
テーブル生成処理は複雑な処理であるため、詳細な説明は後に記述するものとし、ここでは、このテーブル生成処理によって生成されるエンコードテーブルＥＴとプレデコードテーブルＤＴ１のデータ構造について説明する。
【００７４】
図１０は、エンコードテーブルＥＴのデータ構造を示す説明図である。図示するように、このエンコードテーブルＥＴには、０から８１９１までのブロック番号と、０から３１までの５ビットのエンコード値ＥＶとに対応付けて、０から２５５までのいずれかの階調値が記録されている。以下では、エンコードテーブルＥＴに記録されている階調値を、「階調閾値」というものとする。上述したように、このエンコードテーブルＥＴは、図３に示したエンコードユニット４１０が、ＣＭＹ画像の８ビットの階調値を、その画素の位置、すなわち、ブロック番号に応じて、５ビットのエンコード値ＥＶに変換するためのテーブルである。
【００７５】
ここで、このエンコードテーブルＥＴを用いた階調値からエンコード値ＥＶへの変換方法を簡単に説明する。まず、エンコードユニット４１０は、エンコード処理の対象とするＣＭＹ画像中の画素が、ディザマトリックスデータＤＭ中のどのブロックに該当するかを計算する。そして、そのブロック番号に該当するエンコードテーブルＥＴの中の行を参照し、その行の階調閾値とその画素の階調値とを階調閾値の低い方から順に比較していく。この比較の結果、順に参照した階調閾値が、その画素の階調値を初めて超えた場合のその階調閾値に対応するエンコード値ＥＶが、変換後のエンコード値ＥＶとなる。例えば、ブロック番号が「３」で、処理対象の画素の階調値が「１９９」であれば、図１０の場合には、エンコード値ＥＶは、「１６」となる。つまり、このエンコードテーブルＥＴには、各エンコード値に対応付けて、そのエンコード値に対応する階調値の範囲が階調閾値というパラメータにより記録されていることになる。
【００７６】
図１１は、ＣＭＹ画像の階調値に応じてエンコードテーブルＥＴから取得されるエンコード値ＥＶの変化の例を模式的に示す説明図である。図１１には、ブロック番号が「Ｘ１」から「Ｘ５」までの５つのブロックについて、階調値に応じたエンコード値ＥＶの変化の例を示している。図示の便宜のため、エンコード値の変化は、ブロック毎に縦軸をずらして描いている。図示するように、各ブロックとも、階調値が増加すれば、エンコード値ＥＶの値も増加しているが、その増加の態様や変化数（ステップ数）は、ブロック毎に異なっている。各ブロックにおけるエンコード値ＥＶの値は、ドット配置データ（図４参照）を間接的に示す値である。そのため、ＣＭＹ画像の中で、同じ階調値を有する画素があっても、その画素の位置が異なれば、適用するブロック番号も異なり、異なるエンコード値ＥＶが取得される。この結果、それらの画素に対応する印刷媒体上の位置には、異なる配置のドットが形成されることになる。
【００７７】
図１２は、プレデコードテーブルＤＴ１のデータ構造を示す説明図である。図示するように、このプレデコードテーブルＤＴ１には、ブロック番号とエンコード値ＥＶとに対応付けて、図８に示したポストデコードテーブルＤＴ２のプレデコード値が記録されている。図３に示したデコードユニット４２０は、そのデコード処理時に、中間バッファＢＦに記憶されたエンコード値ＥＶを読み込み、このポストデコードテーブルＤＴ２を参照することで、エンコード値ＥＶをプレデコード値に変換する。
【００７８】
ここでデコード処理の内容を簡単に説明する。デコードユニット４２０は、図１２に示したプレデコードテーブルＤＴ１を参照してエンコード値ＥＶをプレデコード値に変換すると、図８のポストデコードテーブルＤＴ２を参照することで、プレデコード値に対応するドット数データを取得し、このドット数データと、図７に示した順序値テーブルＳＴとに基づき図４に示したドット配置データを生成する。こうすることで、デコードユニット４２０は、エンコード値ＥＶに基づきドット配置データを生成することができる。このデコード処理についての詳細な説明は後述する。
【００７９】
以上、本実施例における初期化処理の流れについて説明した。以下では、上述したステップＳ１４０におけるテーブル生成処理の詳細について説明する。
【００８０】
図１３は、図６のステップＳ１４０で実行されるテーブル生成処理の詳細を示すフローチャートである。このテーブル生成処理は、エンコードテーブルＥＴとプレデコードテーブルＤＴ１とを生成する処理である。この処理が実行されると、ＣＰＵ１５１は、まず、ＲＡＭ１５２に、すべての要素を「０」に設定したエンコードテーブルＥＴとプレデコードテーブルＤＴ１を用意する（ステップＳ２００）。
【００８１】
具体的には、図１０に示したように、エンコードテーブルＥＴには、エンコード値ＥＶが０から３１までの範囲について、各要素に、０から２５５までの８ビットの階調閾値が記録され、それが、ブロック８１９２個分格納される。従って、ＲＡＭ１５２には、これらの積である２５６Ｋバイト（＝３２×８ビット×８１９２個）の容量をエンコードテーブルＥＴのために用意する。一方、プレデコードテーブルＤＴ１については、図１２に示したように、エンコード値が０から３１までの範囲について、各要素に、０から１６４までの８ビットのプレデコード値が記録され、それが、ブロック８１９２個分格納される。従って、ＲＡＭ１５２には、エンコードテーブルＥＴと同様に、２５６Ｋバイトの容量をプレデコードテーブルＤＴ１のために用意する。
【００８２】
すべての要素を「０」に設定したエンコードテーブルＥＴとプレデコードテーブルＤＴ１を用意すると、次に、ＣＰＵ１５１は、現在の処理対象とするブロック番号Ｎを「０」とし（ステップＳ２１０）、更に、以降の処理で用いられる変数として、エンコード値ＥＶを「０」とし、現在のブロック内に発生する各サイズ（Ｓドット，Ｍドット，Ｌドット）のドット数をそれぞれ「０」とする（ステップＳ２２０）。そして、更に、現在の入力階調値ＴＤを「０」とする（ステップＳ２３０）。
【００８３】
続いて、ＣＰＵ１５１は、上記ステップＳ２２０で設定した入力階調値ＴＤに基づき、現在のブロック内に発生する各サイズのドット数を決定するドット数カウント処理を実行する（ステップＳ２４０）。
【００８４】
図１４は、上記ステップＳ２４０において実行されるドット数カウント処理の詳細を示すフローチャートである。かかる処理では、まず、ＣＰＵ１５１は、上記ステップＳ２３０で設定された入力階調値ＴＤに対応する各サイズのドット発生量をドット発生量テーブルＤＧＴ（図９参照）から取得する（ステップＳ４００）。
【００８５】
各サイズのドット発生量を取得すると、ＣＰＵ１５１は、現在のブロック番号Ｎに対応する閾値群をディザマトリックスデータＤＭ（図７参照）から取得する。そして、これからカウントを行う各サイズのドットのカウント数（ｄｏｔＬ，ｄｏｔＭ，ｄｏｔＳ）をそれぞれ「０」とし、すべてのドットの総カウント数ｎを「０」とする（ステップＳ４１０）。
【００８６】
カウント数および総カウント数を設定すると、ＣＰＵ１５１は、現在の総カウント数ｎに応じて、ｎ番目に低い閾値を閾値群から読み込む。そして、上記ステップＳ４００で取得したＬドットのドット発生量が、この閾値よりも大きいか否かを判断する（ステップＳ４２０）。この判断の結果、Ｌドットの発生量が、ｎ番目に低い閾値よりも大きければ（ステップＳ４２０：Ｙｅｓ）、Ｌドットのカウント数ｄｏｔＬをインクリメントする（ステップＳ４３０）。すなわち、この場合、４×２のドット配置データ内に発生するＬドットの数が１つ増加することになる。
【００８７】
Ｌドットのカウント数ｄｏｔＬをインクリメントすると、ＣＰＵ１５１は、現在の総カウント数ｎが「７」であるかを判断する（ステップＳ４４０）。その結果、総カウント数ｎが「７」であれば、閾値群内の閾値を全て参照したことになり、ドット数のカウントが終了したと判断できるので、処理を後述するステップＳ５００に進める。一方、ステップＳ４４０において、総カウント数ｎが「７」でなければ、次に低い閾値とドット発生量との比較を続行するため、総カウント数ｎをインクリメントし（ステップＳ４５０）、処理を上記ステップＳ４２０に戻す。
【００８８】
上記ステップＳ４２０において、Ｌドットの発生量が、ｎ番目に低い閾値以下であれば（ステップＳ４２０：Ｎｏ）、ＣＰＵ１５１は、次に、ドット発生量テーブルＤＧＴから取得したＭサイズとＬサイズのドット発生量の累積値が、ｎ番目に低い閾値を超えたか否かを判断する（ステップＳ４６０）。その結果、ＭサイズとＬサイズのドット発生量の累積値が、ｎ番目に低い閾値よりも大きいと判断した場合には（ステップＳ４６０：Ｙｅｓ）、Ｍドットのカウント数ｄｏｔＭをインクリメントする（ステップＳ４７０）。すなわち、この場合、４×２のドット配置データ内に配置するＭドットの数が１つ増加することになる。
【００８９】
Ｍドットのカウント数ｄｏｔＭをインクリメントすると、ＣＰＵ１５１は、上述したステップＳ４４０に処理を移行する。こうすることで、総カウント数ｎが「７」に達していない場合には、総カウント数ｎがインクリメントされ（ステップＳ４５０）、上記ステップＳ４２０に処理が戻されることになる。
【００９０】
上記ステップＳ４６０において、ＭドットとＬドットのドット発生量の累積値が、ｎ番目に低い閾値以下であると判断されれば（ステップＳ４６０：Ｎｏ）、次に、ＣＰＵ１５１は、ドット発生量テーブルＤＧＴから取得したＳドットとＭドットとＬドットのドット発生量の累積値が、ｎ番目に低い閾値を超えたか否かを判断する（ステップＳ４８０）、その結果、かかるドット発生量の累積値が、ｎ番目に低い閾値よりも大きいと判断した場合には（ステップＳ４８０：Ｙｅｓ）、Ｓドットのカウント数ｄｏｔＳをインクリメントする（ステップＳ４９０）。すなわち、この場合、４×２のドット配置データ内に配置するＳドットの数が１つ増加することになる。
【００９１】
Ｓドットのカウント数をインクリメントすると、ＣＰＵ１５１は、上述したステップＳ４４０に処理を移行する。こうすることで、総カウント数ｎが「７」に達していない場合には、総カウント数ｎが１つインクリメントされ（ステップＳ４５０）、上記ステップＳ４２０に処理が戻されることになる。
【００９２】
上記ステップＳ４８０において、ＳドットとＭドットとＬドットのドット発生量の累積値が、ｎ番目に低い閾値以下であると判断された場合（ステップＳ４８０：Ｎｏ）、もしくは、上記ステップＳ４４０において、総カウント数が「７」であり、８個の閾値をすべて参照したと判断した場合には（ステップＳ４４０：Ｙｅｓ）、ＣＰＵ１５１は、最後に、各サイズのドットの数を、これまでカウントした値に確定する（ステップＳ５００）。
【００９３】
図１５は、上述したドット数カウント処理の具体例を示す説明図である。図１５（ａ）に示すように、ここでは、ドット発生量テーブルＤＧＴにおいて、現在の入力階調値ＴＤに対応するＬドットのドット発生量が「４０９」、Ｍドットが「１５５０」、Ｓドットが「１３０４」だとし、現在のブロックに対応する閾値群が、図７（ｂ）に示した閾値群であったとする。
【００９４】
この場合、まず、図１４のステップＳ４２０では、閾値群内の最も低い閾値「２３」と、Ｌドットのドット発生量「４０９」とが比較される。そうすると、このドット発生量「４０９」の方が、閾値「２３」よりも大きいので、ステップＳ４２０では、「Ｙｅｓ」と判定され、ステップＳ４３０によってＬドットのカウント数がインクリメントされて「１」になる。そうすると、ステップＳ４５０によって、総カウント数ｎがインクリメントされるため、続くステップＳ４２０では、２番目に低い閾値「４７２」とＬドットのドット発生量「４０９」が比較される。この場合、閾値「４７２」よりもドット発生量「４０９」の方が小さくなるので、ステップＳ４２０では、「Ｎｏ」と判定され、処理がステップＳ４６０に進む。この時点で、Ｌドットのカウント数は、図１５（ｂ）に示すように「１」で確定することになる。
【００９５】
ステップＳ４６０では、Ｌドットのドット発生量とＭドットのドット発生量の累積値「１９５９（＝４０９＋１５５０）」と、２番目に低い閾値「４７２」とが比較される。この結果、ＬドットとＭドットのドット発生量の累積値「１９５９」の方が、閾値「４７２」よりも大きいため、ステップＳ４６０では「Ｙｅｓ」と判断され、ステップＳ４７０によってＭドットのカウント数がインクリメントされ「１」となる。そうすると、更に、次の閾値「１０１０」が参照される。しかし、この場合においても、依然として、閾値「１０１０」より、ドット発生量の累積値「１９５９」の方が大きいため、結局、７番目に低い閾値「２２４０」が参照されるまで、Ｍサイズのカウント数はインクリメントされる。この結果、Ｍサイズのカウント数は、図１５（ｃ）に示すように「５」で確定する。
【００９６】
７番目に低い閾値「２２４０」が参照されると、ステップＳ４６０では、「Ｎｏ」と判定されるため、次に、ステップＳ４８０において、ＬドットとＭドットとＳドットのドット発生量の累積値「３２６３（＝４０９＋１５５０＋１３０４）」と、７番目に低い閾値「２２４０」とが比較される。この結果、ドット発生量の累積値「３２６３」の方が７番目に低い閾値よりも大きいため、ステップＳ４８０では「Ｙｅｓ」と判定され、ステップＳ４９０によってＳドットのカウント数がインクリメントされて「１」になる。そうすると、次に、最も値の高い閾値「３２６２」が参照される。
【００９７】
ＬドットとＭドットとＳドットのドット発生量の累積値「３２６３」は、８番目の閾値「３２６２」よりも依然として大きい。そのため、ステップＳ４８０では、再度、「Ｙｅｓ」と判定されて、ステップＳ４９０によってＳサイズのドットのカウント数がインクリメントされ、図１５（ｄ）に示すように「２」となる。すると、現在の総カウント数ｎは「７」であるため、ステップＳ４４０において、「Ｙｅｓ」と判定され、各サイズのドットのカウント数が確定する。すなわち、以上で示した例では、Ｌドットが１個、Ｍドットが５個、Ｓドットが２個となる。
【００９８】
以上、図１５を用いて説明したように、上述したドット数カウント処理では、最初に、Ｌドットの発生数が決定され、つづいて、Ｍサイズ、Ｓサイズのドットの発生数が決定される。各サイズの発生数を決定する際には、各サイズのドット発生量を加算しつつ閾値との比較を行っていくので、最終的には、図１５（ｄ）に示すように、各サイズのドットの数は、ブロック内に各サイズのドットが重複せずにＬドットから順に配置することが可能な数になる。
【００９９】
ここで、ドット数カウント処理の他の具体例について検討する。例えば、現在の入力階調値ＴＤに対応するＬドット、Ｍドットのドット発生量がともに「０」であり、Ｓドットのドット発生量が「１５００」とする。また、現在のブロックに対応する閾値群が図７（ｂ）に示した閾値群だとする。そうすると、図１４に示したフローチャートのステップＳ４２０、ステップＳ４６０では、Ｌドットの発生量もＭドットの発生量も「０」であり、最も低い閾値「２３」よりも小さいため、「Ｎｏ」と判断され、ステップＳ４８０に処理が進む。そして、このステップＳ４８０では、ドット発生量「１５００」を超える５番目に低い閾値「１６５９」が参照された時点で、ステップＳ４８０では、「Ｎｏ」と判定され、Ｓドットのカウント数が「５」で確定し、カウント処理が終了する。すなわち、本実施例では、閾値の低い順から比較を行うため、全サイズのドット発生量の累積値を超えた閾値が参照された時点で、次の閾値を参照する必要が無くなる。従って、各サイズのドットのカウント処理が高速化され、ひいては、初期化処理を高速に行うことが可能になる。
【０１００】
説明を図１３に戻す。図１３のステップＳ２４０、すなわち、図１４に示したドット数カウント処理が実行されて、各サイズのドット数が確定すると、次に、ＣＰＵ１５１は、前回の入力階調値ＴＤにおける各サイズのドット数に対して、今回の入力階調値ＴＤにおける各サイズのドット数のいずれかが変化したかを判定する（ステップＳ２５０）。例えば、前回のカウント処理によって、Ｓドットが２個、Ｍドットが５個、Ｌドットが１個であった場合に、今回のカウント処理によって、Ｓドットが２個、Ｍドットが４個、Ｌドットが２個となれば、ＭドットとＬドットのカウント数が変化していることになるので、上記ステップＳ２５０では、変化あり（Ｙｅｓ）と判定される。
【０１０１】
上記ステップＳ２５０において、変化ありと判定されれば（ステップＳ２５０：Ｙｅｓ）、現在のブロック番号Ｎおよびエンコード値ＥＶに対応する各サイズのドット数を、上記ステップＳ２４０でカウントされた値に更新する（ステップＳ２６０）。そして、ステップＳ２００において用意したエンコードテーブルＥＴの現在のブロック番号Ｎおよびエンコード値ＥＶに対応する要素に、階調閾値として、現在の入力階調値ＴＤをセットする（ステップＳ２７０）。
【０１０２】
エンコードテーブルＥＴに階調閾値をセットすると、続いて、ＣＰＵ１５１は、予め作成しておいたポストデコードテーブルＤＴ２（図８参照）を参照し、上記ステップＳ２６０で更新した各サイズのドットの数と同数のドット数を有するプレデコード値を取得する。例えば、上記ステップＳ２６０において、Ｓドットが０個、Ｍドットが２個、Ｌドットが６個であるとされれば、取得されるプレデコード値は、図８を参照すると「１６０」になる。こうして、プレデコード値を取得すると、ＣＰＵ１５１は、ステップＳ２００において用意したプレデコードテーブルＤＴ１の現在のブロック番号Ｎおよびエンコード値ＥＶに対応する要素に、そのプレデコード値をセットする（ステップＳ２８０）。
【０１０３】
エンコードテーブルＥＴへの階調閾値の記録、および、プレデコードテーブルＤＴ１へのプレデコード値の記録を完了すると、ＣＰＵ１５１は、現在のエンコード値ＥＶをインクリメントする（ステップＳ２９０）。つまり、このステップＳ２９０では、上記ステップＳ２５０においていずれかのサイズのドットの数が変化したと判断される毎にエンコード値ＥＶが変化していくことになる。換言すれば、１ブロック内に発生するドットの態様が変化する度にエンコード値ＥＶが変化していくことになる。
【０１０４】
上記ステップＳ２９０によって、エンコード値ＥＶをインクリメントした後、もしくは、上記ステップＳ２５０において、いずれのサイズのドット数も変化していないと判断された場合には（ステップＳ２５０：Ｎｏ）、ＣＰＵ１５１は、現在の入力階調値ＴＤが「２５５」を超えたか否かを判断する（ステップＳ３００）。その結果、入力階調値ＴＤが「２５５」を超えていなければ（ステップＳ３００：Ｎｏ）、現在の入力階調値ＴＤをインクリメントした上で（ステップＳ３１０）、処理を上記ステップＳ２４０に戻す。こうすることで、現在のブロックについて入力階調値ＴＤを０から２５５まで変化させながら、入力階調値ＴＤとエンコード値ＥＶの対応関係をエンコードテーブルＥＴに記録することができる。また、これと同時に、エンコード値ＥＶとプレデコード値の対応関係をプレデコードテーブルＤＴ１に記録することができる。
【０１０５】
一方、上記ステップＳ３００において、現在の入力階調値ＴＤが「２５５」を超えていれば（ステップＳ３００：Ｙｅｓ）、全てのブロックについて上述した処理が完了したかを判断し（ステップＳ３２０）、完了していなければ（ステップＳ３２０：Ｎｏ）、現在のブロック番号Ｎをインクリメントした上で（ステップＳ３４０）、処理を上記ステップＳ２２０に戻す。こうすることで、全てのブロックについて、入力階調値ＴＤとエンコード値ＥＶの対応関係をエンコードテーブルＥＴに記録し、エンコード値とプレデコード値の対応関係をプレデコードテーブルＤＴ１に記録することができる。全てのブロックについて上述した処理が完了していれば（ステップＳ３２０：Ｙｅｓ）、当該テーブル生成処理は終了する。
【０１０６】
以上、図６のステップＳ１４０に示したテーブル生成処理の詳細について説明した。ＣＰＵ１５１は、このテーブル生成処理を実行することにより、図１０に示したエンコードテーブルＥＴと、図１２に示したプレデコードテーブルＤＴ１とを生成することができる。かかるテーブル生成処理が終了すると、図６に示した初期化処理全体が終了することになる。
【０１０７】
（Ｄ）ハーフトーン処理：
図１６は、図５に示した印刷処理のステップＳ４０で実行されるハーフトーン処理のフローチャートである。このハーフトーン処理は、上述した初期化処理において生成した各テーブル（エンコードテーブルＥＴ、プレデコードテーブルＤＴ１、ポストデコードテーブルＤＴ２、順序値テーブルＳＴ）を順次参照することで、ＣＭＹ画像の各画素について、それぞれドット配置データを生成する処理である。
【０１０８】
画像処理ＡＳＩＣ１５５は、まず、このハーフトーン処理を実行すると、図３に示したエンコードユニット４１０を用いて、処理対象の画素の各色（Ｃ，Ｍ，Ｙ，Ｋ，Ｌｃ、Ｌｍ）の階調値をそれぞれエンコード値ＥＶに変換するエンコード処理を行う（ステップＳ８００）。
【０１０９】
（Ｄ−１）エンコード処理：
図１７は、エンコード処理の詳細な処理内容を示すフローチャートである。このエンコード処理は、入力画素の階調値を、エンコード値ＥＶに変換するための処理である。
【０１１０】
このエンコード処理が実行されると、エンコードユニット４１０は、まず、ＣＭＹ画像をライン毎に色変換ユニット３００から入力し、その中から１画素ずつＸ方向（右方向）に階調値ＧＶを取得する（ステップＳ８０２）。
【０１１１】
階調値ＧＶを取得すると、エンコードユニット４１０は、その画素が属するブロック番号の計算を行う（ステップＳ８０４）。ここで、本実施例では、図４に示したように、１つの階調値ＧＶを、４×２個のドットで表現するものとした。この４×２個のドットは、図７に示したディザマトリックスＤＭの４×２の要素、すなわち、１ブロックに相当する。従って、ＣＭＹ画像内の処理対象の画素の位置がわかれば、その画素の位置に対応するディザマトリックスＤＭ内のブロックの位置を容易に求めることができる。
【０１１２】
図１８は、ブロック番号の計算方法の概念を示す説明である。図７（ａ）に示したディザマトリックスデータＤＭは、横方向に１２８ブロック、縦方向に６４ブロックの計８１９２個のブロックを有するものとした。そのため、１枚の入力画像データを、１２８画素×６４画素を単位として分割し、かかる単位内の各画素に対して、ブロック番号が０から８１９１まで割り振られるように、ブロック番号の計算を行う。すなわち、図１８のように、１枚の入力画像データのなかに、ディザマトリックスＤＭがタイル状に並べられているものとして、ブロック番号の計算を行うのである。
【０１１３】
具体的には、エンコード処理を行おうとする現在の画素の座標を（Ｘ，Ｙ）とした場合に、現在の画素のＹ座標が「０」であり、Ｘ座標が、「０」から「１２７」までの間は、ブロック番号が「０」から「１２７」まで、順番に割り振られることになる。その後、Ｙ座標が変化せず、現在の画素のＸ座標が、「１２８」になった時点で、ブロック番号は、再び、「０」となる。このように、画像のＸ方向に対して、ブロック番号が「０」から「１２７」まで繰り返して適用された後に、現在の画素の座標が、（０，１）になった時点で、ブロック番号は「１２８」となる。そして、その後、Ｙ座標が「１」の間は、「１２８」から「２５５」までのブロック番号が繰り返して割り振られることになる。つまり、ブロック番号Ｎは、エンコード処理を行う対象画素の座標を（Ｘ，Ｙ）とすると、下記式（２）によって求めることができる。ただし、下記式（２）において、「％」は、剰余を求める演算子であるものとする。
【０１１４】
Ｎ＝（Ｘ％１２８）＋（Ｙ％６４）＊１２８  …（２）
【０１１５】
図１９は、ブロック番号の他の計算方法の概念を示す説明図である。図１８に示したブロック番号の計算例では、１枚の画像データ内に複数のディザマトリックスＤＭがタイル状に等しく並べられることを想定してブロック番号の計算を行っている。これに対して、図２１では、タイル状に配置されたディザマトリックスデータＤＭのうち、偶数行のディザマトリックスデータＤＭを、奇数行のディザマトリックスデータＤＭに対してＸ方向に６４画素ずらして並べている。このように、ディザマトリックスＤＭをずらして画像内に配置するものとすれば、ディザマトリックスＤＭの繰り返しパターンの傾向が出力画像に現れることを抑制できるため、画質を向上させることができる。
【０１１６】
本実施例では、エンコードユニット４１０は、１ライン単位でＣＭＹ画像を入力するものとしたため、図１８や図１９を参照すれば、最初のラインについては、ブロック番号が０から１２７が繰り返して適用されることになる（２ライン単位とすれば、０から２５５までのブロックが繰り返して適用される）。従って、本実施例では、エンコードユニット４１０がエンコード処理を実行するに当たり、入力したラインのＹ座標に応じて予めエンコードテーブルＥＴの必要な部分についてのみＳＲＡＭ１５６に入力しておく。こうすることで、各画素の階調値を取得する度に、ＳＲＡＭ１５６よりもアクセス速度の遅いＲＡＭ１５２にエンコードテーブルＥＴを読みに行く必要が無くなり、処理を高速化することが可能になる。
【０１１７】
図１７のステップＳ８０４によって、ブロック番号の計算が完了すると、エンコードユニット４１０は、これから求めようとするエンコード値ＥＶの値を「０」に初期化する（ステップＳ８０６）。そして、図１２に示したエンコードテーブルＥＴ（実際には、ＳＲＡＭ１５６に読み込まれた部分的なエンコードテーブルＥＴ）を参照して、ステップＳ８０４で算出されたブロック番号および現在のエンコード値ＥＶに対応する階調閾値ＧＶｔを取得する（ステップＳ８０８）。
【０１１８】
階調閾値ＧＶｔを取得すると、エンコードユニット４１０は、この階調閾値ＧＶｔと、ステップＳ８０２で入力した処理対象の画素の階調値ＧＶとを比較し、この階調値ＧＶが階調閾値ＧＶｔ以上であるかを判定する（ステップＳ８１０）。この判定の結果、階調値ＧＶが階調閾値ＧＶｔ以上であれば（ステップＳ８１０：Ｙｅｓ）、現在のエンコード値ＥＶに「１」を加算し（ステップＳ８１２）、加算後のエンコード値ＥＶがその最大値ＥＶｍａｘ（本実施例では「３１」）以上となったかを判定する（ステップＳ８１４）。エンコード値ＥＶが最大値ＥＶｍａｘ以上となれば（ステップＳ８１４：Ｙｅｓ）、その時点で、エンコード値ＥＶは最大値ＥＶｍａｘに確定する（ステップＳ８１６）。
【０１１９】
上記ステップＳ８１４において、エンコード値ＥＶがその最大値ＥＶｍａｘ未満であると判定されれば（ステップＳ８１４：Ｎｏ）、エンコードユニット４１０は、処理をステップＳ８０８に戻し、加算後のエンコード値ＥＶに対応する階調閾値ＧＶｔを取得して、再び、階調閾値ＧＶｔと階調値ＧＶとの比較を行う。こうして、比較を繰り返した結果、ステップＳ８１０において、初めて階調値ＧＶが、階調閾値ＧＶｔ未満となれば（ステップＳ８１０：Ｎｏ）、そのときのエンコード値ＥＶの値が、エンコード結果のエンコード値ＥＶとして確定する（ステップＳ８１６）。
【０１２０】
以上で説明したエンコード処理によれば、図１０に示したエンコードテーブルＥＴを参照することにより、入力画素の階調値を、その画素が属するブロックに応じて、５ビットのエンコード値に変換することができる。エンコードユニット４１０は、このエンコード処理を、ＣＭＹ画像の全画素について実行する。
【０１２１】
説明を図１６に戻す。上述したエンコード処理によって、エンコードユニット４１０は階調値をエンコード値ＥＶに変換すると、その値を、ＲＡＭ１５２内の中間バッファＢＦにバッファリングする（ステップＳ８２０）。上述したエンコード処理の結果、この中間バッファＢＦには、８ビットの階調値ではなく、５ビットのエンコード値ＥＶが格納されることになるため、ＲＡＭ１５２の記憶容量を大幅に削減することができる。
【０１２２】
エンコードユニット４１０によってエンコード値ＥＶが中間バッファＢＦにバッファリングされると、次に、デコードユニット４２０が、このエンコード値ＥＶに基づき、図４に示したドット配置データを生成するデコード処理を実行する（ステップ８４０）。このデコード処理は、画像データを構成する全ての画素についてエンコード値ＥＶがバッファリングされることを待つことなく、１つでもエンコード値ＥＶがバッファリングされるとデコードユニット４２０によって実行される。つまり、エンコード処理とデコード処理とは、同時並列的に実行されることになる。
【０１２３】
（Ｄ−２）デコード処理：
図２０は、デコード処理の詳細なフローチャートである。このデコード処理が実行されると、デコードユニット４２０は、まず、中間バッファＢＦに蓄積されたエンコード値ＥＶを読み出す（ステップＳ８２２）。このデコード処理においても、１ライン分に相当するエンコード値ＥＶをライン単位で中間バッファＢＦから読み出す。
【０１２４】
エンコード値ＥＶを読み出した後、デコードユニット４２０は、処理対象のエンコード値ＥＶの生成元である画素が属するブロック番号の計算を行う（ステップＳ８２４）。エンコード値ＥＶは、エンコード処理された順序で中間バッファＢＦにバッファリングされているため、この順序通りにエンコード値ＥＶを読み出せば、そのエンコード値ＥＶに対応するブロック番号も上述した計算方法によって自ずと算出することができる。なお、デコード処理においても、エンコード処理の際と同様にライン単位でデコードを行うため、ＲＡＭ１５２に記憶されたプレデコードテーブルＤＴ１および順序値テーブルＳＴの中から、デコード処理に必要なブロック番号に該当する部分のみを予めＳＲＡＭ１５６に入力しておくものとする。
【０１２５】
ブロック番号の計算を行うと、デコードユニット４２０は、図１２に示したプレデコードテーブルＤＴ１（実際には、ＳＲＡＭ１５６に入力された部分的なプレデコードテーブルＤＴ１）を参照して、ステップＳ８２２において取得したエンコード値ＥＶと、ステップＳ８２４によって求めたブロック番号とに対応したプレデコード値を取得する（ステップＳ８２６）。そして、更に、ポストデコードテーブルＤＴ２を参照して、このプレデコード値に対応するドット数データを取得する（ステップＳ８２８）。このポストデコードテーブルＤＴ２については、テーブル全体を予めＳＲＡＭ１５６に入力しておくものとする。ポストデコードテーブルＤＴ２は比較的容量が少ないため（１６５×１６ビット＝３３０バイト）、ＳＲＡＭ１５６の容量を圧迫することはないからである。ポストデコードテーブルＤＴ２からドット数データを取得すると、デコードユニット４２０は、各サイズのドットをブロック内に配置するドット配置処理を実行する（ステップＳ８３０）。
【０１２６】
図２１は、ドット配置処理の詳細なフローチャートである。図２２は、このドット配置処理によるドットの配置工程を模式的に示す説明図である。図２１に示すように、このドット配置処理が実行されると、デコードユニット４２０は、まず、現在のブロックに対応する順序値データ（図７（ｃ）参照）を、ＳＲＡＭ１５６に部分的に記憶された順序値テーブルＳＴ（図７（ｄ）参照）から取得する（ステップＳ９００）。そして、これからドットを配置するブロック内の全要素に対して、「ドット無し」を表すドットサイズ値「００」を設定して初期化し（ステップＳ９１０）、これからドットを配置しようとするブロック内の位置を、図２２（ａ）に示す「ａ」の位置（最も左上の位置）に設定する（ステップＳ９２０）。
【０１２７】
ドットを配置しようとする位置を設定すると、デコードユニット４２０は、現在のドット位置に対応する順序値を順序値データから取得する（ステップＳ９３０）。図２２（ｂ）には、順序値テーブルＳＴから入力した順序値データの一例を示している。図示した例では、現在の位置「ａ」に対応する順序値は、「５」となるため、上記ステップＳ９３０では、この値「５」が取得される。
【０１２８】
次に、デコードユニット４２０は、ポストデコードテーブルＤＴ２から取得したドット数データから、ステップＳ９３０で取得した順序値に対応するドットサイズ値を取得する（ステップＳ９４０）。具体的には、ドット数データの下位ビット側から２ビット毎に、ステップＳ９３０で取得した順序値の値分だけ数え、その位置に記録されたドットサイズ値を取得する。図２２（ｃ）には、ポストデコードテーブルＤＴ２から取得したドット数データの一例を示している。かかる図において、順序値「５」に対応するドットサイズ値は、ドットサイズデータの下位ビットから数えて６つめのドットサイズ値「０１」である。ドットサイズ値「０１」は、Ｓサイズのドットであることを表す。
【０１２９】
ドットサイズ値を取得すると、ＣＰＵ１５１は、取得したドットサイズ値を、ブロック内の現在の位置に設定する（ステップＳ９５０）。つまり、図２２（ｄ）に示すように、現在の位置が「ａ」の位置であれば、かかる位置に、図２２（ｃ）のドット数データから取得されたドットサイズ値「０１」を設定する。
【０１３０】
現在の位置にドットサイズ値を設定すると、ＣＰＵ１５１は、全ての位置についてドットサイズ値の設定が終了したか否かを判断する（ステップＳ９６０）。その結果、全ての位置についてドットサイズ値の設定が終了していれば（ステップＳ９６０：Ｙｅｓ）、当該ドット配置処理を終了する。一方、終了していなければ、ブロック内の現在の位置をａ，ｂ，ｃ，ｄ，・・・の順（図２２（ａ）参照）に移動し（ステップＳ９７０）、処理を上記ステップＳ９３０に戻すことで、他の位置についてドットサイズ値の設定を行う。
【０１３１】
以上で説明したドット配置処理が、中間バッファＢＦにバッファリングされたすべてのエンコード値ＥＶについて完了すれば、デコードユニット４２０によるデコード処理が完了する。このデコード処理によって生成された各ドット配置データは、その生成の都度、インク吐出制御ユニット５００に引き渡され、インクヘッド２１１によるドットの形成に供されることになる。なお、本実施例では、順序値テーブルを参照することで、ドットの配置を行うものとしたが、ディザマトリックスデータＤＭ内の該当するブロックを直接参照し、閾値の低い要素から順にドットを発生させることで、ドットの配置を行うものとしてもよい。
【０１３２】
（Ｅ）第１，第２サブテーブルを用いたデコード処理：
上述したハーフトーン処理時におけるデコード処理では、図１２に示したプレデコードテーブルＤＴ１を参照することで、中間バッファＢＦから入力したエンコード値をプレデコード値に変換する例を説明した。これに対して、以下では、ＲＡＭ１５２のデータ容量を削減するために、プレデコードテーブルＤＴ１に代えて、「第１サブテーブルＤＴ１ａ」と「第２サブテーブルＤＴ１ｂ」という２つのテーブルを用意して、これらを参照することで、エンコード値をプレデコード値に変換する方法について説明する。
【０１３３】
図２３は、第１サブテーブルＤＴ１ａのデータ構造を示す説明図である。図１２に示したプレデコードテーブルＤＴ１では、ブロック番号とエンコード値とに対応付けて、プレデコード値が記録されているものとしたが、図２３に示す第１サブテーブルＤＴ１ａでは、ブロック番号とエンコード値とに対応付けて、インデックス値という値が記録されている。このインデックス値は、後述する第２サブテーブルＤＴ１ｂからプレデコード値を取得するために、エンコード値毎に固有に定められた値である。このように、インデックス値は、プレデコード値をエンコード値毎に固有に指し示す値であるため、対応するプレデコード値が異なる場合であっても、ブロック間で重複した値を利用することができる。
【０１３４】
図２４は、第２サブテーブルＤＴ１ｂのデータ構造を示す説明図である。この第２サブテーブルＤＴ１ｂには、上述したインデックス値とエンコード値とに対応付けて、プレデコード値が記録されている。この第２サブテーブルＤＴ１ｂは、図１２に示したプレデコードテーブルＤＴ１において、エンコード値毎に、すべてのブロックについてプレデコード値を調べて重複した値を取り除き、残存した各プレデコード値に対して、固有のインデックス値を割り当てて生成されるテーブルである。つまり、各エンコード値に対応付けられた各プレデコード値には、固有のインデックス値が割り当てられていればよいため、図２４に示すように、第２サブテーブルＤＴ１ｂには、プレデコード値が、特に、昇順あるいは降順にソートされて記録されているわけではない。このように、無作為にプレデコード値が並べられていても、固有のインデックス値が割り当てられていれば、後述するデコード処理を適切に行うことができる。
【０１３５】
図２４に示すように、例えば、第２サブテーブルＤＴ１ｂのエンコード値「１」には、１つのプレデコード値「１」しか対応付けられていない。これは、図１２のプレデコードテーブルＤＴ１において、エンコード値「１」に対応するブロックには、どのブロックにも、プレデコード値として「１」しか対応付けられていないことを表す。また、図２４を見れば、エンコード値「１３」には、２６個のプレデコード値が対応付けられていることがわかる。このことは、プレデコードテーブルＤＴ１において、エンコード値が「１３」に対応する８１９２個の各ブロックには、この２６種類のプレデコード値のうち、いずれかの値が対応付けられていることを表している。
【０１３６】
図２５は、上述した第１サブテーブルＤＴ１ａおよび第２サブテーブルＤＴ１ｂを用いて行うデコード処理のフローチャートである。このデコード処理は、図２０に示したデコード処理と使用するテーブルが異なるだけで、他の処理は同じ処理である。従って、図２５には、図２０と同じ処理については同じステップ番号を付している。
【０１３７】
このデコード処理が開始されると、デコードユニット４２０は、ＲＡＭ１５２からエンコード値を読み出し（ステップＳ８２２）、該当するブロック番号を計算する（ステップＳ８２４）。そして、このエンコード値とブロック番号とに基づき、第１サブテーブルＤＴ１ａを参照してインデックス値を取得する（ステップＳ８２６ｂ）。更に、ＣＰＵ１５１は、このインデックス値と、先に使用したエンコード値を再び使用し、これらに基づき、第２サブテーブルＤＴ１ｂを参照して、プレデコード値を取得する（ステップＳ８２７ｂ）。その後、ステップＳ８２７ｂで取得したプレデコード値に対応するドット数データをポストデコードテーブルＤＴ２から取得して（ステップＳ８２８）、図２１に示したドット配置処理を実行することで、ドット配置データを生成する（ステップＳ８３０）。以上により、第１サブテーブルＤＴ１ａおよび第２サブテーブルＤＴ１ｂを用いて行うデコード処理は終了する。
【０１３８】
なお、上述したデコード処理において、デコードユニット４２０は、第１サブテーブルＤＴ１ａについては、ライン単位の処理に必要なブロックの範囲をＳＲＡＭ１５６に入力してデコード処理を行うものとすることができる。また、第２サブテーブルＤＴ１ｂについては、全てのデータを予めＳＲＡＭ１５６に入力しておくものとすることができる。後述するように、第２サブテーブルＤＴ１ｂのデータ容量は１Ｋバイト未満であり、ＳＲＡＭ１５６のデータ容量をそれほど圧迫することがないためである。このように、第１サブテーブルＤＴ１ａや第２サブテーブルＤＴ１ｂを予めＳＲＡＭ１５６に入力することにより、デコードユニット４２０は、デコード処理を迅速に行うことが可能になる。
【０１３９】
また、第１サブテーブルＤＴ１ａの必要なブロックの範囲を予めＳＲＡＭ１５６に入力する場合には、第１サブテーブルＤＴ１ａのその範囲のインデックス値を、第２サブテーブルＤＴ１ｂを参照することで、予めプレデコード値に変換し、この変換後の第１サブテーブルＤＴ１ａをＳＲＡＭ１５６に入力するものとすることができる。こうして変換された第１サブテーブルＤＴ１ａの内容は、図１２に示したプレデコードテーブルＤＴ１と同じ内容となる。そのため、デコードユニット４２０は、プレデコードテーブルＤＴ１を用いたデコード処理と同等に、第１サブテーブルＤＴ１ａから直接的にプレデコード値を取得することが可能になる。
【０１４０】
ここで、第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとを用いることにより使用するデータ容量が削減される理由を説明する。図１２に示したプレデコードテーブルＤＴ１では、８１９２個のブロック番号と３２個のエンコード値とに対応付けて、「０」から「１６４」までのプレデコード値が記録されている。「１６４」という値は、８ビットのデータ長で表すことができるから、プレデコードテーブルＤＴ１全体では、２５６Ｋバイト（＝８１９２個×３２個×８ビット）のデータ量を有することになる。
【０１４１】
これに対して、図２３に示した第１サブテーブルＤＴ１ａは、８１９２個のブロック番号と３２個のエンコード値とに対応付けて、「０」から「２５」までのインデックス値が記録されている。「２５」という値は、５ビットのデータ長で表すことができるから、第１サブテーブルＤＴ１ａ全体では、１６０Ｋバイト（＝８１９２個×３２個×５ビット）のデータ量を有することになる。つまり、第１サブテーブルＤＴ１ａには、ブロック番号とエンコード値とに対応付けて、エンコード値毎に固有に定められたインデックス値が記録されているため、対応するプレデコード値が異なる場合であってもブロック間で重複した値を記録することができる。この結果、プレデコード値よりも少ないデータ長で、各要素に値を記録することができるため、テーブルのデータ容量を削減することができる。
【０１４２】
また、図２４に示した第２サブテーブルＤＴ１ｂは、２６個のインデックス値と３２個のエンコード値（図２４には図示の便宜のため、エンコード値は「２１」までしか示していない）とに対応付けて、「０」から「１６４」までのプレデコード値が記録されている。そのため、第２サブテーブルＤＴ１ｂは、８３２バイト（＝２６個×３２個×８ビット）という１Ｋバイトにも満たないデータ量を有することになる。従って、第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとのデータ量を合わせても、１６１Ｋバイト程度のデータ量となり、図１２に示したプレデコードテーブルＤＴ１に比べて、概ね、４割程度のデータ量を削減することができる。この結果、プレデコード値を求めるために必要なＲＡＭ１５２のデータ容量を削減することができる。
【０１４３】
なお、上述した第２サブテーブルＤＴ１ｂのデータ容量の計算では、エンコード値が３２個まで用意されているものとしたが、ディザマトリックスデータＤＭとドット発生量テーブルＤＧＴの種類によっては、その最大値は２１程度となる場合がある。このような場合には、第２サブテーブルＤＴ１ｂは、図２４に示すように、エンコード値を２１まで用意すればよいから、そのデータ容量を５７２バイト（＝２６個×２２個×８ビット）まで削減することが可能になる。
【０１４４】
更に、第２サブテーブルＤＴ１ｂは、図２４の下段に示すように、エンコード値に応じて、対応付けられているプレデコード値の個数が異なっている。そのため、エンコード値に応じて、テーブル中に用意する要素の数を可変とすれば、より少ないデータ容量とすることができる。
【０１４５】
また、図２４に示すように、第２サブテーブルＤＴ１ｂは、エンコード値に応じて、記録されているプレデコード値の範囲が異なっている。そのため、プレデコード値を表すのに必要なビット数をエンコード値に応じて可変とすれば、更に、少ないデータ容量とすることができる。
【０１４６】
また、第２サブテーブルＤＴ１ｂは、図２４に示すように、１つのエンコード値に対して、プレデコード値が、最大２６種類対応付けられているが、例えば、エンコード値が０や１の場合には、プレデコード値は、それぞれ１つずつしか対応付けられていない。そこで、このような場合には、複数のエンコード値をひとまとめにして、その中で、各インデックス値とプレデコード値の組み合わせを定義するものとしてもよい。このようにすれば、効率的に、第２サブテーブルＤＴ１ｂを構成することが可能になる。
【０１４７】
（Ｅ−１）第１，第２サブプレデコードテーブルの生成方法： 
次に、第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとを用いたデコード処理を実現するために、これらのテーブルを生成する方法を以下に説明する。
【０１４８】
図２６は、図１２に示したプレデコードテーブルＤＴ１を、第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとに変換するテーブル変換処理のフローチャートである。この処理は、図６に示した初期化処理のステップＳ１４０によって、図１２に示したプレデコードテーブルＤＴ１が生成された後にＣＰＵ１５１が実行する処理である。
【０１４９】
この処理が実行されると、ＣＰＵ１５１は、まず、全ての要素を「０」とした第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとをＲＡＭ１５２に用意する（ステップＳ１０００）。そして、プレデコードテーブルＤＴ１内で参照するエンコード値ＥＶを「０」とするとともに（ステップＳ１０１０）、これから参照するブロック番号Ｎを「０」、現時点でのインデックス値ＩＶを「０」とする（ステップＳ１０２０）。
【０１５０】
続いて、ＣＰＵ１５１は、ＲＡＭ１５２に記憶されたプレデコードテーブルＤＴ１を参照して、現在のエンコード値ＥＶおよびブロック番号Ｎに対応するプレデコード値を取得する（ステップＳ１０３０）。そして、取得したプレデコード値が、プレデコードテーブルＤＴ１内の現在のエンコード値ＥＶにおいて、初めて出現した値であるかを判断する（ステップＳ１０４０）。初めて出現したかどうかは、第２サブテーブルＤＴ１ｂの現在のエンコード値に対応する各要素に、既にそのプレデコード値が記録されているかを調べることで判別することができる。
【０１５１】
上記ステップＳ１０４０において、初めて出現したプレデコード値であると判断された場合には（ステップＳ１０４０：Ｙｅｓ）、ＣＰＵ１５１は、第２サブテーブルＤＴ１ｂ内の、現在のエンコード値ＥＶおよびインデックス値ＩＶに対応する要素に、ステップＳ１０３０で取得したプレデコード値をセットする（ステップＳ１０５０）。
【０１５２】
第２サブテーブルＤＴ１ｂにプレデコード値をセットすると、続いて、ＣＰＵ１５１は、第１サブテーブルＤＴ１ａ内の、現在のエンコード値ＥＶおよびブロック番号Ｎに対応する要素に、現在のインデックス値ＩＶをセットする（ステップＳ１０６０）。
【０１５３】
第１サブテーブルＤＴ１ａにインデックス値ＩＶをセットすると、ＣＰＵ１５１は、現在のインデックス値ＩＶに「１」を加え（ステップＳ１０７０）、現在のブロック番号Ｎが、その最大値Ｎｍａｘ（本実施例では、「８１９１」）以上になったかを判断する（ステップＳ１０８０）。その結果、ブロック番号Ｎが、未だ最大値Ｎｍａｘまで達していなければ、現在のブロック番号Ｎに「１」を加え（ステップＳ１０９０）、処理をステップＳ１０３０に戻す。こうすることで、プレデコードテーブルＤＴ１内のエンコード値毎に、各ブロック番号に対応付けられたプレデコード値を調べることができ、そのプレデコード値が初めて出現する値であれば、その値を、第２サブテーブルＤＴ１ｂに記録することができる。
【０１５４】
上記ステップＳ１０４０において、プレデコードテーブルＤＴ１から取得したプレデコード値が、初めて出現した値ではないと判断されれば（ステップＳ１０４０：Ｎｏ）、ＣＰＵ１５１は、取得したプレデコード値に対応するインデックス値を第２サブテーブルＤＴ１ｂ内の現在のエンコード値に対応する要素から検索して、検索された値を、第１サブテーブルＤＴ１ａの現在のエンコード値およびブロック番号に対応する要素にセットする（ステップＳ１１００）。こうすることにより、ステップＳ１０３０で取得されたプレデコード値が既に出現した値であっても、そのプレデコード値に対応するインデックス値を第２サブテーブルＤＴ１ｂから探し出し、これを、第１サブテーブルＤＴ１ａに記録することができる。なお、この場合には、インデックス値ＩＶの加算を行うことなく、処理を上述したステップＳ１０８０に進める。
【０１５５】
上記ステップＳ１０８０において、ブロック番号Ｎが、最大値Ｎｍａｘ以上であると判断されると、ＣＰＵ１５１は、続いて、現在のエンコード値ＥＶが、その最大値ＥＶｍａｘ（本実施例では「３１」）以上であるかを判断する（ステップＳ１１１０）。この結果、エンコード値ＥＶが最大値ＥＶｍａｘに達していないと判断されれば（ステップＳ１１１０：Ｎｏ）、現在のエンコード値ＥＶに「１」を加え（ステップＳ１１２０）、処理を上記ステップＳ１０２０に戻す。こうすることで、プレデコードテーブルＤＴ１内で参照するエンコード値を順次移動させながら、第１サブテーブルＤＴ１ａおよび第２サブテーブルＤＴ１ｂを生成することができる。ＣＰＵ１５１は、第１サブテーブルＤＴ１ａおよび第２サブテーブルＤＴ１ｂの生成が完了すれば、ＲＡＭ１５２からプレデコードテーブルＤＴ１を消去する。
【０１５６】
以上で説明したテーブル変換処理によれば、一旦生成したプレデコードテーブルＤＴ１に基づいて、第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとを容易に生成することができる。
【０１５７】
（Ｅ−２）第１，第２サブテーブルの他の生成方法：
次に、プレデコードテーブルＤＴ１を生成することなく、第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとを直接的に生成する方法を説明する。
【０１５８】
図２７は、エンコードテーブルＥＴと第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとを同時に生成するためのテーブル生成処理のフローチャートである。この処理は、図６に示した初期化処理のステップＳ１４０におけるテーブル生成処理に代えて実行される処理である。
【０１５９】
この処理が実行されると、ＣＰＵ１５１は、まず、ＲＡＭ１５２内に、初期値としてすべての要素を「０」に設定したエンコードテーブルＥＴと、第１サブテーブルＤＴ１ａと、第２サブテーブルＤＴ１ｂとを用意し、更に、全ての要素を「２５５」に設定したテンポラリテーブルＴＴを用意する（ステップＳ１２００）。
【０１６０】
図２８は、テンポラリテーブルＴＴの一例を示す説明図である。図示するように、このテンポラリテーブルＴＴには、エンコード値とプレデコード値とに対応付けてインデックス値が記録される。このテーブルは、プレデコード値に対応付けるインデックス値の決定や、第１サブテーブルＤＴ１ａに対して記録するインデックス値の決定に用いるテーブルであり、当該テーブル生成処理実行時にのみ用いられるテーブルである。
【０１６１】
説明を図２７に戻す。ＣＰＵ１５１は、上述した各テーブルを用意すると、現在の処理対象とするブロック番号Ｎを「０」とし（ステップＳ１２１０）、「０」から「３１」までの各エンコード値に対応させて、初期値を「０」とした３２個のカウンタを用意する（ステップＳ１２１５）。このカウンタは、第２サブテーブルＤＴ１ｂの作成時において、プレデコード値を記録する要素のインデックス値を決定するためのカウンタである。以下では、このカウンタのことを「インデックス値カウンタ」という。
【０１６２】
インデックス値カウンタを用意すると、ＣＰＵ１５１は、更に、以降の処理で用いられる変数として、エンコード値ＥＶを「０」とし、現在のブロック内に発生する各サイズ（Ｓドット，Ｍドット，Ｌドット）のドット数をそれぞれ「０」とする（ステップＳ１２２０）。そして、更に、現在の入力階調値ＴＤを「０」とする（ステップＳ１２３０）。
【０１６３】
続いて、ＣＰＵ１５１は、上記ステップＳ２２０で設定した入力階調値ＴＤに基づき、現在のブロック内に発生する各サイズのドット数を決定するドット数カウント処理を実行する（ステップＳ２４０）。このドット数カウント処理の処理内容は既に説明した通りである。
【０１６４】
ドット数カウント処理が実行されて、各サイズのドット数が確定すると、次に、ＣＰＵ１５１は、前回の入力階調値ＴＤにおける各サイズのドット数に対して、今回の入力階調値ＴＤにおける各サイズのドット数のいずれかが変化したかを判定する（ステップＳ１２５０）。
【０１６５】
上記ステップＳ１２５０において、変化ありと判定されれば（ステップＳ１２５０：Ｙｅｓ）、現在のブロック番号Ｎおよびエンコード値ＥＶに対応する各サイズのドット数を、上記ステップＳ１２４０でカウントされた値に更新する（ステップＳ１２６０）。そして、ステップＳ１２００において用意したエンコードテーブルＥＴ内の現在のブロック番号Ｎおよびエンコード値ＥＶに対応する要素に、階調閾値として、現在の入力階調値ＴＤをセットする（ステップＳ１２７０）。こうすることで、エンコードテーブルＥＴが生成されていくことになる。
【０１６６】
エンコードテーブルＥＴに階調閾値をセットすると、続いて、ＣＰＵ１５１は、サブテーブル生成処理を実行する（ステップＳ１２８０）。この処理は、現在のエンコード値ＥＶおよびブロック番号に応じて、第１サブテーブルＤＴ１ａに対して、インデックス値を記録すると共に、第２サブテーブルＤＴ１ｂに対して、プレデコード値を記録するための処理である。かかる処理の詳細については後述する。
【０１６７】
サブテーブル生成処理の実行後、ＣＰＵ１５１は、現在のエンコード値ＥＶをインクリメントする（ステップＳ１２９０）。つまり、このステップＳ１２９０によれば、上記ステップＳ１２５０においていずれかのサイズのドットの数が変化したと判断される毎にエンコード値ＥＶが変化していくことになる。換言すれば、１ブロック内に発生するドットの態様が変化する度にエンコード値ＥＶが変化していくことになる。
【０１６８】
上記ステップＳ１２９０によって、エンコード値ＥＶをインクリメントした後、もしくは、上記ステップＳ１２５０において、いずれのサイズのドット数も変化していないと判断された場合には（ステップＳ１２５０：Ｎｏ）、ＣＰＵ１５１は、現在の入力階調値ＴＤが「２５５」を超えたか否かを判断する（ステップＳ１３００）。その結果、入力階調値ＴＤが「２５５」を超えていなければ（ステップＳ１３００：Ｎｏ）、現在の入力階調値ＴＤをインクリメントした上で（ステップＳ１３１０）、処理を上記ステップＳ１２４０に戻す。
【０１６９】
一方、上記ステップＳ１３００において、現在の入力階調値ＴＤが「２５５」を超えていると判断されれば（ステップＳ１３００：Ｙｅｓ）、全てのブロックについて上述した処理が完了したかを判断し（ステップＳ１３２０）、完了していなければ（ステップＳ１３２０：Ｎｏ）、現在のブロック番号Ｎをインクリメントした上で（ステップＳ１３４０）、処理を上記ステップＳ１２２０に戻す。全てのブロックについて上述した処理が完了していれば（ステップＳ３２０：Ｙｅｓ）、当該テーブル生成処理は終了する。
【０１７０】
図２９は、上記ステップＳ１２８０において実行されるサブテーブル生成処理の詳細なフローチャートである。このサブテーブル生成処理が実行されると、まず、ＣＰＵ１５１は、ＲＡＭ１５２に記憶されたポストデコードテーブルＤＴ２を参照して、上記ドット数カウント処理においてカウントされた各ドットの数に応じたプレデコード値を取得する（ステップＳ１４００）。そして、図２８に示したテンポラリテーブルＴＴを参照して、ポストデコードテーブルＤＴ２から取得したプレデコード値と現在のエンコード値とに対応するインデックス値ＩＶを取得する（ステップＳ１４１０）。テンポラリテーブルＴＴは、初期状態では、すべての値が「２５５」であるため、このステップＳ１４１０が最初に実行された場合には、常に、インデックス値ＩＶとして「２５５」が取得されることになる。
【０１７１】
テンポラリテーブルＴＴからインデックス値ＩＶを取得すると、ＣＰＵ１５１は、このインデックス値ＩＶが「２５５」であるかを判断する（ステップＳ１４２０）。インデックス値ＩＶが「２５５」であれば（ステップＳ１４２０：Ｙｅｓ）、ＣＰＵ１５１は、テンポラリテーブルＴＴ内で、現在のエンコード値およびプレデコード値に対応する要素を初めて参照したことになる。この場合、ＣＰＵ１５１は、上記ステップＳ１４１０でインデックス値ＩＶとして「２５５」を取得した要素に、新たなインデックス値ＩＶとして現在のエンコード値に対応するインデックス値カウンタの値をセットする（ステップＳ１４３０）。
【０１７２】
テンポラリテーブルＴＴにインデックス値カウンタの値をセットすると、ＣＰＵ１５１は、続いて、第２サブテーブルＤＴ１ｂ内の、現在のエンコード値および上記ステップＳ１４３０においてセットしたインデックス値ＩＶに対応する要素に、上記ステップＳ１４００で取得したプレデコード値をセットする（ステップＳ１４４０）。
【０１７３】
テンポラリテーブルＴＴへのインデックス値ＩＶのセット、および、第２サブテーブルＤＴ１ｂへのプレデコード値のセットを行うと、ＣＰＵ１５１は、現在のエンコード値に対応するインデックス値カウンタに「１」を加算する（ステップＳ１４５０）。つまり、上記ステップＳ１４１０においてテンポラリテーブルＴＴから取得したインデックス値ＩＶが「２５５」である度に、エンコード値毎に用意したインデックス値カウンタの値をインクリメントするのである。こうすることで、第２サブテーブルＤＴ１ｂ内の現在のエンコード値に対応する要素に新たなプレデコード値を記録するたびに、次にプレデコード値を記録すべきインデックス値が増加していくことになる。
【０１７４】
インデックス値カウンタに「１」を加算すると、ＣＰＵ１５１は、ステップＳ１４３０でテンポラリテーブルＴＴに記録したインデックス値を、第１サブテーブルＤＴ１ａの現在のブロック番号およびエンコード値ＥＶに対応する要素にセットする（ステップＳ１４７０）。こうすることで、第１サブテーブルＤＴ１ａにインデックス値が記録されていくことになる。
【０１７５】
上記ステップＳ１４２０において、テンポラリテーブルＴＴから取得したインデックス値ＩＶが「２５５」ではないと判断された場合には（ステップＳ１４２０：Ｎｏ）、現在のエンコード値において、同じインデックス値ＩＶが既に出現し、これを第１サブテーブルＤＴ１ａに記録したことがあることになる。そこで、ＣＰＵ１５１は、ステップＳ１４１０で取得したインデックス値を、そのまま第１サブテーブルＤＴ１ａ内の現在のブロック番号およびエンコード値に対応する要素にセットする（ステップＳ１４６０）。このように、テンポラリテーブルＴＴを利用すれば、ポストデコードテーブルＤＴ２から取得したプレデコード値に対して既にインデックス値が対応付けられているかを容易に判別することができるため、第１サブテーブルＤＴ１ａの生成を迅速に行うことが可能になる。
【０１７６】
以上の処理により、サブテーブル生成処理が終了すると、ＣＰＵ１５１は、図２７に示したテーブル生成処理のステップＳ１２９０に処理を進める。図２７に示したテーブル生成処理が完了した後には、ＣＰＵ１５１は、ＲＡＭ１５２からテンポラリテーブルＴＴを消去する。かかるテーブルは、初期化処理時にのみ用いられ、ハーフトーン処理では参照されないテーブルだからである。
【０１７７】
以上で説明したテーブル生成処理によれば、プレデコードテーブルＤＴ１を予め生成することなく、エンコードテーブルＥＴの生成と同時に第１サブテーブルＤＴ１ａと第２サブテーブルＤＴ１ｂとを生成することができる。従って、初期化処理を迅速に行うことが可能になる。
【０１７８】
（Ｆ）効果：
以上で説明した実施例によれば、次のような効果が生じる。すなわち、図２４（ｄ）に示したドット配置データの生成結果と、図２４（ｂ）に示した４×２の順序値データとを対比してみると、サイズの大きなドットから順に、ドットが重複無く順序値の低い位置に配置されていることがわかる。順序値が低いということは、その順序値に対応する閾値の値が低いということになる（図７（ｂ）参照）。図７（ａ）に示したディザマトリックスデータＤＭは、組織的ディザ法におけるディザパターンとしての性質上、閾値は、その値が低いほど分散性よく配置されており、その値が高くなるほど、既に配置された閾値の場所を避けるように配置されている。そのため、図２４（ｄ）に示したドット配置データでは、最も大きなサイズのドットから優先的に、低い順序値、すなわち、低い閾値の場所に配置されることになり、大きなサイズのドットほど、分散性がよく配置されることになる。従って、本実施例におけるドットの配置方法によれば、印刷用紙上で目立つことになる大きなドットの分散性を最も高めることができるため、出力画像の画質を大幅に向上させることが可能になる。
【０１７９】
また、本実施例において、ディザマトリックスデータＤＭとしてドットを良好に分散させることのできるブルーノイズ特性を有するマトリックスを用いれば、マトリックス内のどのブロックが何階調になるのか特別な規則性がないことになり、図１１に示したように、ブロック毎にエンコード値の取り得る値が異なることになる。そのため、従来の濃度パターン法などでは、階調値に応じて画一的に多値化を行うため、実質的な階調数が低減してしまう可能性があったが、本実施例では、ハーフトーン処理を４×２ドットのブロック単位で行いながらも、ディザマトリックス内におけるそのブロックの位置に応じて、ドットの発生パターンが様々に変化することになり、従来の多値化手法よりも大幅に出力画像の画質を向上させることができる。
【０１８０】
また、本実施例では、ハーフトーン処理に用いる各種テーブルを、ディザマトリックスデータＤＭとドット発生量テーブルＤＧＴとに基づき生成するものとしたため、ディザマトリックスデータＤＭ内の閾値の配置について適宜最適化を図ることにより、比較的容易に出力画像の画質を向上させることができる。つまり、本実施例のように、ブロック毎にそのブロックの位置に応じたハーフトーン処理を行うことのできるテーブルの構造を用いれば、従来の多値化で用いられていた画一的な変換テーブルよりも柔軟に画質の向上を図ることが可能になる。
【０１８１】
また、本実施例のハーフトーン処理によれば、エンコードテーブルＥＴと、プレデコードテーブルＤＴ１（第１サブテーブルＤＴ１ａ、第２サブテーブルＤＴ１ｂ）と、ポストデコードテーブルＤＴ２と、順序値テーブルＳＴとを順次参照していくことで、ＣＭＹ画像に対するハーフトーン処理が完了する。従って、誤差拡散法などの他のハーフトーン処理のように、誤差を分散させるような複雑な演算を行うことなく極めて高速なハーフトーン処理を実現することができる。
【０１８２】
また、本実施例では、ハーフトーン処理を、エンコード処理とデコード処理との２段階の処理に分割し、エンコード処理の結果生成されたエンコード値ＥＶを、ＲＡＭ１５２内の中間バッファＢＦに一時的に蓄積するものとした。従って、デコード処理以降に、印刷機構によるドットの形成に時間を要する場合であっても、エンコード処理の結果得られたエンコード値ＥＶを、ＲＡＭ１５２にバッファリングすることで、早期にエンコード処理のみを終了させることができる。この結果、ＣＰＵ１５１を印刷に関する処理から迅速に解放することが可能になる。また、この中間バッファＢＦには、各色８ビット（２５５階調）のデータ容量を有するＣＭＹ画像のデータが、エンコード処理によって、各色５ビットのエンコード値ＥＶに減縮されて記憶されるため、ＲＡＭ１５２の記憶容量を大幅に削減することができ、コストダウンを図ることが可能になる。
【０１８３】
また、本実施例では、プレデコードテーブルＤＴ１の代わりに、第１サブテーブルＤＴ１ａおよび第２サブテーブルＤＴ１ｂを用いることで、使用するテーブルのデータ量を削減することができる。この結果、ＲＡＭ１５２の記憶容量を節減することが可能になる。
【０１８４】
なお、本実施例では、図５に示したように、印刷処理が実行される度に初期化処理を実行するものとして説明したが、初期化処理は、その他のタイミングで実行するものとしてもよい。例えば、プリンタ１００の電源投入時に実行されるものとしてもよいし、ユーザによって、印刷用紙や印刷モードの設定が変更された際に実行されるものとしてもよい。
【０１８５】
（Ｇ）変形例：
以上、本発明の実施例について説明したが、本発明はこのような実施例に限定されず、その趣旨を逸脱しない範囲で種々の構成を採ることができることはいうまでもない。例えば、画像処理ＡＳＩＣ１５５によってハードウェアによって実現した機能を、ＣＰＵ１５１による所定のプログラムの実行によってソフトウェア的に実現するものとしてもよい。
【０１８６】
また、上記実施例では、エンコード処理時に用いるエンコードテーブルＥＴには、各ブロック番号と各エンコード値とに対して階調閾値が対応付けられているものとした。これに対して、エンコードテーブルＥＴには、各ブロック番号と、「０」から「２５５」までの各階調値とに対して、それぞれエンコード値が対応付けられているものとしてもよい。このようなエンコードテーブルであれば、階調閾値と階調値とを順次比較する処理を行うことなく、ブロック番号と階調値とから直接的にエンコード値を導き出すことができる。そのため、処理の高速化を図ることが可能になる。
【０１８７】
また、上記実施例では、プリンタ１００は、複合機タイプであるものとし、単体で、画像データの入力からハーフトーン処理、インクの吐出制御まで行うものとした。これに対して、プリンタ１００にコンピュータを接続し、コンピュータにおいて、画像データの入力と、ハーフトーン処理の一部、すなわち、エンコード処理までを実行するものとしてもよい。このような構成では、コンピュータに所定のプログラムをインストールすることで、実施例に記載した初期化処理やハーフトーン処理と同様の処理を実現することができる。プリンタ１００は、コンピュータからプリンタケーブル等を経由してエンコード値ＥＶを受信すると、そのエンコード値ＥＶに応じてデコード処理を行い、印刷機構を制御して、印刷用紙への印刷を行う。
【０１８８】
このように、コンピュータでエンコード処理までを実行するものとすれば、Ｃ，Ｍ，Ｙ，Ｋの各色毎に、８ビット（２５５階調）のデータサイズを有する画像データが、５ビットのエンコード値ＥＶに変換されるため、コンピュータとプリンタ１００間の通信量を削減することができる。この結果、全体として印刷速度を向上させることが可能になる。
【０１８９】
また、データの通信速度よりも、プリンタ１００内における処理速度が問題となるような場合にあっては、エンコード処理だけではなくデコード処理もコンピュータで行わせるものとすることができる。こうすることにより、プリンタ１００の処理負担を軽減させることができるので、全体として印刷速度を向上させることが可能になる。また、このように、コンピュータで、エンコード処理とデコード処理の両者を実行するものとすれば、ハーフトーン処理に要するハードウェアが不要となるため、プリンタ１００の製造コストを削減することが可能になる。
【図面の簡単な説明】
【０１９０】
【図１】本発明の実施例としてのプリンタ１００を示す説明図である。
【図２】プリンタ１００の内部構成を示す説明図である。
【図３】画像処理ＡＳＩＣ１５５の詳細な構成を示す説明図である。
【図４】ドット配置データの一例を示す説明図である。
【図５】印刷処理のフローチャートである。
【図６】初期化処理の詳細を示すフローチャートである。
【図７】ディザマトリックスデータＤＭのデータ構造および順序値テーブルＳＴの生成方法を示す説明図である。
【図８】ポストデコードテーブルＤＴ２の一例を示す説明図である。
【図９】ドット発生量テーブルＤＧＴの一例を示す説明図である。
【図１０】エンコードテーブルＥＴのデータ構造を示す説明図である。
【図１１】ＣＭＹ画像の階調値に応じてエンコードテーブルＥＴから取得されるエンコード値ＥＶの変化の例を模式的に示す説明図である。
【図１２】プレデコードテーブルＤＴ１のデータ構造を示す説明図である。
【図１３】テーブル生成処理の詳細を示すフローチャートである。
【図１４】ドット数カウント処理の詳細を示すフローチャートである。
【図１５】ドット数カウント処理の具体例を示す説明図である。
【図１６】ハーフトーン処理のフローチャートである。
【図１７】エンコード処理の詳細な処理内容を示すフローチャートである。
【図１８】ブロック番号の計算方法の概念を示す説明である。
【図１９】ブロック番号の他の計算方法の概念を示す説明図である。
【図２０】デコード処理の詳細なフローチャートである。
【図２１】ドット配置処理の詳細なフローチャートである。
【図２２】ドットの配置工程を模式的に示す説明図である。
【図２３】第１サブテーブルＤＴ１ａのデータ構造を示す説明図である。
【図２４】第２サブテーブルＤＴ１ｂのデータ構造を示す説明図である。
【図２５】デコード処理のフローチャートである。
【図２６】テーブル変換処理のフローチャートである。
【図２７】テーブル生成処理のフローチャートである。
【図２８】テンポラリテーブルＴＴの一例を示す説明図である。
【図２９】サブテーブル生成処理の詳細なフローチャートである。
【符号の説明】
【０１９１】
１００…プリンタ
１１０…スキャナ
１２０…メモリカードスロット
１４０…操作パネル
１４５…液晶モニタ
１５０…制御ユニット
１５１…ＣＰＵ
１５２…ＲＡＭ
１５３…ＲＯＭ
１５６…ＳＲＡＭ
２１０…キャリッジ
２１１…インクヘッド
２１２…インクカートリッジ
２２０…キャリッジモータ
２３０…モータ
２６０…駆動ベルト
２７０…プラテン
２８０…摺動軸
３００…色変換ユニット
４００…ハーフトーン処理ユニット
４１０…エンコードユニット
４２０…デコードユニット
５００…インク吐出制御ユニット
ＢＦ…中間バッファ
ＤＭ…ディザマトリックスデータ
ＤＧＴ…ドット発生量テーブル
ＡＴ…アドレステーブル
ＬＵＴ…色変換テーブル
ＥＴ…エンコードテーブル
ＤＴ１…プレデコードテーブル
ＤＴ１ａ…第１サブテーブル
ＤＴ１ｂ…第２サブテーブル
ＤＴ２…ポストデコードテーブル
ＳＴ…順序値テーブル
【図１】
2008099188.tif 000003
【図２】
2008099188.tif 000004
【図３】
2008099188.tif 000005
【図４】
2008099188.tif 000006
【図５】
2008099188.tif 000007
【図６】
2008099188.tif 000008
【図７】
2008099188.tif 000009
【図８】
2008099188.tif 000010
【図９】
2008099188.tif 000011
【図１０】
2008099188.tif 000012
【図１１】
2008099188.tif 000013
【図１２】
2008099188.tif 000014
【図１３】
2008099188.tif 000015
【図１４】
2008099188.tif 000016
【図１５】
2008099188.tif 000017
【図１６】
2008099188.tif 000018
【図１７】
2008099188.tif 000019
【図１８】
2008099188.tif 000020
【図１９】
2008099188.tif 000021
【図２０】
2008099188.tif 000022
【図２１】
2008099188.tif 000023
【図２２】
2008099188.tif 000024
【図２３】
2008099188.tif 000025
【図２４】
2008099188.tif 000026
【図２５】
2008099188.tif 000027
【図２６】
2008099188.tif 000028
【図２７】
2008099188.tif 000029
【図２８】
2008099188.tif 000030
【図２９】
2008099188.tif 000031