以下、上述した本発明の作用・効果を一層明らかにするため、本発明の実施の形態を実施例に基づき次の順序で説明する。
(A)プリンタの構成:
(B)印刷処理:
(C)初期化処理:
(D)ハーフトーン処理:
(D−1)エンコード処理:
(D−2)デコード処理:
(E)第1,第2サブテーブルを用いたデコード処理:
(E−1)第1,第2サブテーブルの生成方法:
(E−2)第1,第2サブテーブルの他の生成方法:
(F)効果:
(G)変形例:
(A)プリンタの構成:
図1は、本発明の実施例としてのプリンタ100を示す説明図である。プリンタ100は、いわゆる複合機タイプのプリンタであり、光学的に画像を読み込むスキャナ110や、画像データの記録されたメモリカードMCを挿入するためのメモリカードスロット120、デジタルカメラ等の機器を接続するUSBインタフェース130等を備えている。プリンタ100は、スキャナ110によって取り込んだ画像や、メモリカードMCから読み込んだ画像、USBインタフェース130を介してデジタルカメラから読み込んだ画像等を印刷用紙Pに印刷することができる。また、プリンタケーブル等によって接続された図示していないパーソナルコンピュータから入力した画像の印刷も行うことができる。
プリンタ100は、印刷対象の画像の選択や、印刷用紙の種類、用紙サイズの設定など、印刷に関する種々の設定操作を行うための操作パネル140を備えている。操作パネル140の中央部には、液晶モニタ145が備えられている。液晶モニタ145には、メモリカードMC等から入力した画像の一覧や種々のグラフィカルインタフェース(GUI)が表示される。
図2は、プリンタ100の内部構成を示す説明図である。図示するように、プリンタ100は、印刷用紙Pに印刷を行う機構として、インクカートリッジ212を搭載したキャリッジ210や、キャリッジ210を主走査方向に駆動するキャリッジモータ220、印刷用紙Pを副走査方向に搬送する紙送りモータ230等を備えている。
キャリッジ210には、シアン(C)、ライトシアン(Lc)、マゼンタ(M)、ライトマゼンタ(Lm)、イエロ(Y)、ブラック(K)、の各インクが収容されたインクカートリッジ212が搭載されている。キャリッジ210は、これらの色に対応して計6種類のインクヘッド211を備えている。インクカートリッジ212からインクヘッド211に供給されたインクは、図示しないピエゾ素子を駆動することで印刷用紙Pに吐出される。
本実施例のプリンタ100は、制御ユニット150によってインクヘッド211のピエゾ素子に印加する電圧波形を制御することにより、印刷用紙Pに4種類のサイズのドットを形成することができる。以下では、4種類のサイズのドットを、ドットの形成されない場合も含め、サイズの小さい順に、「ドット無し」、「Sドット」、「Mドット」、「Lドット」というものとする。各サイズのドットは、1ドット当たり、それぞれ、1.5pl(ピコリットル)、3pl、7plのインク量によって表現される。なお、本実施例では、4種類のサイズのドットを形成可能であるものとしたが、2種類や3種類、あるいは5種類以上のドットを形成可能としてもよい。
キャリッジ210は、プラテン270の軸方向と並行に設置された摺動軸280に移動自在に保持されている。キャリッジモータ220は、制御ユニット150からの指令に応じて駆動ベルト260を回転させることで、プラテン270の軸方向と平行に、すなわち、主走査方向にキャリッジ210を往復運動させる。紙送りモータ230は、制御ユニット150からの指令に応じてプラテン270を回転させることで、プラテン270の軸方向と垂直に印刷用紙Pを搬送する。つまり、紙送りモータ230は、キャリッジ210を相対的に副走査方向に移動させることができる。
プリンタ100は、上述したインクヘッド211やキャリッジモータ220、紙送りモータ230の動作を制御するための制御ユニット150を備えている。制御ユニット150には、図1に示したスキャナ110やメモリカードスロット120、USBインタフェース130、操作パネル140、液晶モニタ145が接続されている。
制御ユニット150は、CPU151とRAM152とROM153と画像処理ASIC155とによって構成されている。
ROM153には、プリンタ100の動作を全般的に制御するための制御プログラムが記憶されている。CPU151はプリンタ100の電源投入時に、この制御プログラムをRAM152に読み出して実行する。CPU151は、この制御プログラムの実行により、後述する印刷処理や初期化処理等を行う。
ROM153には、制御プログラムの他、後述する初期化処理時に使用されるディザマトリックスデータDMやドット発生量テーブルDGTが記憶されている。RAM152には、この初期化処理によって生成される種々のテーブルが記憶される。
画像処理ASIC155は、メモリカードMC等から入力した画像データに対して、色変換処理やハーフトーン処理を施し、印刷機構(インクヘッド211、キャリッジモータ220、紙送りモータ230)を制御して印刷を行うための集積回路である。画像処理ASIC155内の論理回路は、以下で説明する機能を実現するためのプログラムが所定のハードウェア記述言語によって記述されることで設計されている。
図3は、画像処理ASIC155の詳細な構成を示す説明図である。図示するように、本実施例の画像処理ASIC155は、色変換ユニット300と、ハーフトーン処理ユニット400と、インク吐出制御ユニット500とを備えている。
色変換ユニット300は、R,G,Bの階調値の組み合わせによって表現されている画像データの色を、キャリッジ210に備えられたインクの各色についての階調値の組み合わせによって表現された色に変換する回路である。前述したように、プリンタ100は、C,M,Y,K,Lc,Lmの最大6色のインクを用いて画像を印刷する。そこで、色変換ユニット300は、RGB各色によって表現された画像データを、これら6色の階調値によって表現された画像データに変換する。
色変換ユニット300は、RAM152に記憶された色変換テーブルLUTと呼ばれるテーブルを参照することで前述した色変換を行う。この色変換テーブルLUTには、RGBの階調値とCMYKLcLmの階調値とが予め対応付けて記憶されている。色変換ユニット300は、この色変換テーブルLUTを参照することにより、RGB形式によって表された画像データを、迅速にCMYKLcLm形式(以下、「CMY形式」という)の画像データに変換することができる。色変換後の画像データは、各色、256段階(0〜255)の階調値を有するものとする。
ハーフトーン処理ユニット400は、色変換ユニット300によって色変換されたCMY形式の画像データを入力し、この画像データを、印刷媒体上に形成されるドットの配置表すドット配置データに変換する回路である。
プリンタ100は、吐出するインク滴のサイズを最大4段階に調整することができるにすぎず、各色256階調のCMY形式のデータをそのまま用いることはできない。そのため、プリンタ100は、ハーフトーン処理ユニット400によって、CMY形式の階調値を、単位面積あたりのドットの粗密を表すドット配置データに変換することで中間調の色を表現する。
図4は、ドット配置データの一例を示す説明図である。この図では、CMY形式の画像データの最も左上の画素(1,1)の色(例えばシアン)の階調値が「52」の場合に、これをドット配置データに変換した例を図の左下に示した。このように、本実施例では、1つの画素の階調値が入力されると、4×2ドットのドット群の中で、SドットやMドット、Lドットなどを配置してその階調値が表す色を印刷用紙上に表現する。なお、前述したドット群のことを、以下では「ブロック」と呼ぶことがある。
ここで、ドット配置データの生成方法を簡単に説明する。ドット配置データ内の各ドットの配置は、大域的なディザマトリックスデータDM(図7(a)参照)からハーフトーン処理対象の画素の位置に応じて切り出された局所的な閾値群(図7(b)参照)と、その画素の階調値TDに対応する各サイズのドットの発生量(図9参照)との関係から決定される。つまり、図9に示したドット発生量テーブルDGTによって、入力階調値TDに応じた各サイズのドットの発生量を求め、その各ドットの発生量と閾値群内の閾値とを比較していき、1ブロック内に配置する各サイズのドットの個数を求める。そして、その個数分のドットを大きなサイズのドットから閾値群内の閾値の低い場所に配置していくことでドット配置データが生成される。本実施例では、このような一連の処理を行うために、エンコードテーブルETや、プレデコードテーブルDT1、ポストデコードテーブルDT2、順序値テーブルSTと呼ばれる種々のテーブルを予め生成しておき、これらのテーブルを順次参照することで、ドット配置データの生成を効率的に行う。ドット配置データを生成するための詳細な処理内容については後で説明する。
本実施例では、CMY画像中の画素の階調値が同一の場合であっても、その画素の位置が異なれば、図7(a)に示したディザマトリックスデータDM内で参照される閾値群が異なるため、異なるドット配置データが生成される。例えば、図4において、CMY画像の最も左上の画素以外に、もう一つ、「52」の階調値を有する画素(j,1)を示している。この画素に対応するドット配置データの例を図の右下に示したが、かかるドット配置データは、先に示したドット配置データとは異なるドット配置を有している。つまり、本実施例では、階調値の値が同じであっても、ハーフトーン処理対象となる画素の位置に応じて生成するドット配置データを変化させるので、従来の組織的ディザ法や濃度パターン法等よりも高画質な画像の出力を行うことが可能になる。
上述したように、本実施例では、出力画像のドット群の単位を4×2としたため、例えば、入力画像の解像度が、360dpi×360dpiであれば、印刷用紙に出力される出力解像度は、1440dpi×720dpiとなる。ドット群の横方向の解像度が縦方向の解像度よりも高いものとしたのは、階調変化に対する人間の目の追従性が縦方向よりも横方向に敏感であるためである。また、印刷用紙Pを副走査方向に移動させる制御よりも、キャリッジ210を主走査方向に移動させる制御の方が比較的容易であるため、横方向の解像度を縦方向の解像度よりも高くしている。しかし、もちろん、ドット群のサイズは、4×2以外にも、縦横比が同一となる4×4や2×2などとすることも可能である。なお、本実施例では、RGB形式あるいはCMY形式の画像の構成要素の最小単位を「画素」といい、印刷用紙Pに形成される出力画像の構成要素の最小単位を「ドット」というものとする。ここで、RGB形式あるいはCMY形式の入力画像を、例えば、360dpi×360dpiから1440dpi×720dpiに高解像度化した上で、その中の複数の画素を4×2や2×2のブロックとしてまとめ、その複数の画素を代表する画素(例えば、ブロック内の画素の階調値を平均化したもの)を1つの「画素」として扱うものとしてもよい。
説明を図3に戻す。ハーフトーン処理ユニット400は、エンコードユニット410とデコードユニット420とを備えている。
ハーフトーン処理ユニット400は、色変換ユニット300からCMY形式の画像データを入力すると、この画像データをエンコードユニット410に入力する。エンコードユニット410は、このとき、CMY画像を1ライン単位で入力する。
エンコードユニット410は、入力された画像データを構成する各画素の階調値(8ビット)を、RAM152に記憶されたエンコードテーブルET(図10参照)を参照して、各色5ビットのデータで表されるエンコード値EVに変換する。かかる変換処理を、以下、「エンコード処理」という。エンコード処理によって得られるエンコード値EVは、印刷用紙上に、どのようなドット配置データ(図4参照)を形成するかを間接的に指し示す値である。「間接的」というのは、このエンコード値EVを後述するデコード処理によって、対応するデコードテーブルに基づき変換した結果、最終的にドット配置データに変換されるからである。こうしたエンコード処理の過程で参照されるエンコードテーブルETの生成方法や、エンコード処理の詳細な方法については後で説明する。
画像処理ASIC155は、その内部に、図2に示したRAM152よりも高速に読み書きを行うことのできるSRAM156を備えている。エンコードユニット410は、1ライン分のCMY画像をエンコード値EVに変換するにあたり、RAM152内のエンコードテーブルETからその1ライン分のエンコード処理に必要なデータのみをこのSRAM156に一時的に入力し、この部分的なエンコードテーブルETを参照することでエンコード処理を行う。詳細は後述するが、例えば、CMY画像の最上部のラインをエンコード処理する場合には、図10に示したエンコードテーブルETのブロック番号0から127(ブロック番号の最大値は、「8191」)までのデータが入力される(図18参照)。1ライン分のエンコード処理においては、エンコードテーブルET内の一部のブロックが繰り返し使用されることになるため、画像処理ASIC155内のSRAM156に予め必要なデータだけを入力することで、効率的にエンコード処理を行うことが可能になる。なお、本実施例では、エンコードユニット410は、1ライン単位でエンコード処理を行うものとするが、SRAM156の記憶容量やSRAM156へのデータの転送速度に応じて、2ライン単位やそれ以上の単位、あるいは、画像全体について一括してエンコード処理を行うものとしてもよい。
エンコードユニット410は、8ビットで表されるCMY階調値を5ビットのエンコード値EVに変換すると、このエンコード値EVを、RAM152の所定領域に確保した中間バッファBFに格納する。このように、本実施例では、メモリカードMC等から入力した画像データを、8ビットのデータから5ビットのデータに変換してRAM152に記憶することができるので、RAM152の使用容量が削減され、コストダウンを図ることが可能になる。
デコードユニット420は、中間バッファBFからエンコード値EVを読み込み、RAM152に記憶されたプレデコードテーブルDT1(図12参照)、ポストデコードテーブルDT2(図8参照)、および、順序値テーブルST(図7(d)参照)を順次参照することで、このエンコード値EVを、図4に示したような4×2ドットのドット配置データに変換する。かかる変換処理のことを、「デコード処理」という。デコードユニット420は、エンコード値EVをドット配置データに変換すると、そのドット配置データをインク吐出制御ユニット500に出力する。デコード処理の過程で参照される上述した各テーブルの生成方法や、デコード処理の詳細については後で説明する。なお、かかるデコード処理もエンコード処理と同様、1ライン単位で行われるため、プレデコードテーブルDT1や順序値テーブルST内の必要なデータのみが、SRAM156に入力される。
ところで、本実施例では、デコードユニット420は、実際には上述したプレデコードテーブルDT1に代えて、第1サブテーブルDT1aおよび第2サブテーブルDT1bという2種類のテーブルを参照してデコード処理を行う。しかし、以下では、説明の便のため、まず、プレデコードテーブルDT1を用いてデコード処理を行う方法を説明し、その後、第1サブテーブルDT1aと第2サブテーブルDT1bとを用いてデコード処理を行う方法を説明する。
インク吐出制御ユニット500は、図2に示したインクヘッド211、キャリッジモータ220、紙送りモータ230を制御して、ハーフトーン処理ユニット400から入力したドット配置データに基づき印刷用紙上にインク滴を吐出してドットを形成する。ドット配置データには、各サイズのドットの大きさを、それぞれ、「00(ドット無し)」、「01(Sドット)」、「10(Mドット)」、「11(Lドット)」という2ビットのデータによって表した値(以下、「ドットサイズ値」という)が設定されている。従って、インク吐出制御ユニット500は、このドットサイズ値に応じて、インクヘッド211内のピエゾ素子に印加する電圧波形を調整することで、サイズの異なるドットの打ち分けを行う。こうすることで、本実施例のプリンタ100は、印刷用紙に対してカラー印刷を行う。
(B)印刷処理:
図5は、プリンタ100が実行する印刷処理のフローチャートである。この印刷処理は、ユーザによる操作パネル140の操作によって所定の印刷操作がなされた場合に、CPU151によって実行される処理である。
この印刷処理が実行されると、CPU151は、まず、図3に示したエンコードテーブルETやプレデコードテーブルDT1、ポストデコードテーブルDT2、順序値テーブルSTを生成するための初期化処理を行う(ステップS10)。かかる初期化処理の詳細な説明は後述する。
初期化処理が完了すると、CPU151は、ユーザによって指定された画像データをメモリカードMC等から入力する(ステップS20)。そして、入力した画像データを、画像処理ASIC155に出力する。すると、画像処理ASIC155では、色変換ユニット300による色変換処理(ステップS30)、および、ハーフトーン処理ユニット400によるハーフトーン処理(ステップS40)が行われ、入力画像の画素毎にドット配置データが生成される。
ハーフトーン処理ユニット400によってドット配置データが生成されると、インク吐出制御ユニット500によってインクの吐出制御が行われる(ステップS50)。この結果、印刷用紙に対してカラー画像が印刷される。画像処理ASIC155が行うハーフトーン処理の詳細な説明は後述する。
(C)初期化処理:
図6は、上述した印刷処理のステップS10で実行される初期化処理の詳細を示すフローチャートである。上述したように、この初期化処理は、ハーフトーン処理ユニット400がハーフトーン処理時に参照する種々のテーブルを生成するための処理である。
この初期化処理が実行されると、まず、CPU151は、ROM153から、ディザマトリックスデータDMをRAM152に入力し(ステップS100)、このディザマトリックスデータDMに基づき、順序値テーブルSTの生成を行う(ステップS110)。順序値テーブルSTは、後述するデコード処理において、4×2個の要素を有するブロック内に、各サイズのドットを配置する順序を決定するためのテーブルである。
図7は、ディザマトリックスデータDMのデータ構造および順序値テーブルSTの生成方法を示す説明図である。図7(a)には、ディザマトリックスデータDMのデータ構造を示している。本実施例のディザマトリックスデータDMには、横512×縦128の配列内に0から65535までの計65536個の閾値が万遍なく記録されている(各閾値の図示は省略)。このディザマトリックスデータDMは、従来のハーフトーン技術として知られた組織的ディザ法で用いられるディザマトリックスと同種のテーブルである。そのため図示したディザマトリックスデータDMにおいても、画像データが0から65535までの階調値を有すると仮定した場合において、この画像データを2値化する際に、白黒ドットの分散性が高まるように各閾値が配置されている。このようなディザマトリクスデータDMとしては、例えば、ブルーノイズ特性を有するマトリックスを採用することができる。なお、本実施例では、ディザマトリックスデータDMのサイズを、512×128としたが、128×32や1024×256など、種々のサイズを適用することができる。
上記ステップS110では、このディザマトリックスデータDMから、順序値テーブルSTの生成を行う。まず、CPU151は、ディザマトリックスデータDMを、4×2個の閾値を1つのブロックとして、計8192(=(512/4)×(128/2))個のブロックに分割し、各ブロックに対してブロック番号を与える。本実施例では、図7(a)に示すように、ディザマトリックスデータDMの最も左上に位置するブロックにブロック番号「0」を与え、その右隣に位置するブロックにブロック番号「1」、以下、右下端のブロックにかけて、順にブロック番号を与える。
図7(b)には、ブロック番号「0」のブロックに記録された各閾値を閾値群として示している。図7(c)には、この閾値群を元に生成される順序値データを示している。CPU151は、図7(b)に示した閾値群内のすべての要素について同時に、階調値を0から65535まで上げていき、その階調値が、閾値を上回った順序を0から7までの値によって記録することで、図7(c)の順序値データを生成する。図7(b)の場合には、23,472,1010,1322、…、の順に、階調値が閾値を超えることになるため、ブロック番号「0」に対応する順序値データは、図7(c)のようになる。
CPU151は、すべてのブロックについて順序値データを生成すると、これを、ブロック番号毎に記録して順序値テーブルSTを生成する。図7(d)には、最終的に生成された順序値テーブルSTの一例を示している。CPU151は、こうして生成した順序値テーブルSTをRAM152に記憶する。
説明を図6に戻す。CPU151は、順序値テーブルSTを生成すると、次に、後述するデコード処理において用いられるポストデコードテーブルDT2の生成を行う(ステップS120)。
図8は、ポストデコードテーブルDT2の一例を示す説明図である。図示するように、このポストデコードテーブルDT2には、0から164までのプレデコード値に対応付けて、16ビットのドット数データが記録されている。ドット数データは、2ビットのドットサイズ値を、サイズの大きなドットから右詰めに8つ連結させたデータである。この165個のドット数データは、1ブロック内に発生する各サイズのドットの数の組み合わせのすべてを表している。
ここで、1つのブロック内に発生する各サイズのドットの組み合わせの数が165個に収まる理由を説明する。ブロック内の1つのドットのサイズは、上述したように、「ドット無し」、「Sドット」、「Mドット」、「Lドット」の4つの状態を取り得る。従って、1ブロック内におけるこれらのドットの組合せは、これら4つの状態を、重複を許容して8回選択した時の組合せの数に等しくなるから、重複組み合わせの演算式を表す下記式(1)によってドットの組み合わせの数を求めることができる。このことから、最大でも165通り(0〜164)の組合せしか出現しないことになる。従って、ドット数データに対応するプレデコード値は、0から164までの値となる。
4H8(=4+8-1C8)=165 ・・・(1)
(nHrは、n個の物の中から重複を許してr回選択するときの重複組合せ数を求める演算子であり、nCrは、n個の物の中から重複を許さずにr回選択するときの組合せ数を求める演算子である。)
CPU151は、図8に示したポストデコードテーブルDT2を次のように生成する。すなわち、まず、CPU151は、1ブロック内に発生するSドット、Mドット、Lドットの各サイズのドットの数をすべて「0」とし、これを、プレデコード値「0」に対応するドット数データとしてプレデコードテーブルDT1に記録する。この場合、1ブロック内の8つのドットのサイズがすべて「ドット無し(00)」となるから、ドット数データとしては、「0000000000000000」となる。
次に、CPU151は、Sドットの数を1から8まで順番に増やし、それぞれの発生個数をドット数データとしてプレデコード値1から8までに記録する。つまり、Sドットの数が1の場合は、ドット数データは、「0000000000000001」となり、Sドットの数が8の場合は、「0101010101010101」となる。
続いて、CPU151は、Mサイズのドットの数を「1」とし、発生するドットの合計が8個以内になるように、Sサイズのドットの数を、0から7まで増加させる。そして、それぞれのドットの発生個数の組み合わせをプレデコード値「9」以降に記録する。
更に、CPU151は、Mサイズのドットの数を「2」とし、Sサイズのドットの数を0から6まで増加させる。そして、それぞれの発生個数をプレデコードテーブルDT1に記録する。以下、同様にして、Lサイズのドットの数が「8」になるまで、各サイズのドットの数を変化させることにより、ポストデコードテーブルDT2の生成を行う。CPU151は、こうして生成したポストデコードテーブルDT2をRAM152に記憶する。なお、ドット数データには、それぞれ固有のプレデコード値が割り当てられていればよく、その対応関係については特に規定はない。
ここで、説明を再び図6に戻す。CPU151は、ポストデコードテーブルDT2の生成を完了すると、後述するエンコードテーブルETやプレデコードテーブルDT1の生成で用いられるドット発生量テーブルDGTをROM153からRAM152に入力する(ステップS130)。
図9は、ドット発生量テーブルDGTの一例を示す説明図である。図示するように、このドット発生量テーブルDGTには、横軸に示した入力階調値TDに応じて、Sドット、Mドット、Lドットの発生量がそれぞれ縦軸に定義されている。この図によれば、入力階調値TDが0から70程度までは、Sドットのみが発生し、その後、入力階調値TDが120程度までは、SドットとMドットの両者が発生することがわかる。また、入力階調値TDが110程度になると、SドットとMドットに加えて、Lドットが発生するようになり、入力階調値TDが概ね180以降になると、Lドットのみが発生することがわかる。なお、縦軸に示すドット発生量は、図7に示したディザマトリックスデータDM内の各閾値との比較が可能なように、0から65535までの値をとる。
図9には、Sドット,Mドット,Lドットの発生量とともに、これらのドットが印刷媒体に形成される際に吐出されるインクの総重量の変化を示した。図示したインク総重量の変化によれば、入力階調値TDが増加するにつれ、インクの総重量が徐々に増加していくことになる。各サイズのドット発生量は、かかる総重量の変化にあわせて、それぞれの発生量が設定されている。なお、このドット発生量テーブルDGTは、プリンタ100がサポートしている印刷用紙の種類に応じて複数種類のテーブルがROM153に記憶されている。印刷用紙は、その材質によってインクの吸収率や光の反射率が異なり、このような特性に応じてインクのドット発生量が設定されているためである。従って、CPU151は、ユーザによって設定された印刷用紙Pの種類に応じて、その種類に応じたドット発生量テーブルDGTをROM153から入力する。こうすることで、選択された印刷用紙Pに適した印刷を行うことが可能になる。
説明を図6に戻す。上記ステップS130によってドット発生量テーブルDGTを入力すると、CPU151は、このドット発生量テーブルDGTとステップS100で入力したディザマトリックスデータDMとを用いて、エンコードテーブルETとプレデコードテーブルDT1を生成するテーブル生成処理を行う(ステップS140)。
テーブル生成処理は複雑な処理であるため、詳細な説明は後に記述するものとし、ここでは、このテーブル生成処理によって生成されるエンコードテーブルETとプレデコードテーブルDT1のデータ構造について説明する。
図10は、エンコードテーブルETのデータ構造を示す説明図である。図示するように、このエンコードテーブルETには、0から8191までのブロック番号と、0から31までの5ビットのエンコード値EVとに対応付けて、0から255までのいずれかの階調値が記録されている。以下では、エンコードテーブルETに記録されている階調値を、「階調閾値」というものとする。上述したように、このエンコードテーブルETは、図3に示したエンコードユニット410が、CMY画像の8ビットの階調値を、その画素の位置、すなわち、ブロック番号に応じて、5ビットのエンコード値EVに変換するためのテーブルである。
ここで、このエンコードテーブルETを用いた階調値からエンコード値EVへの変換方法を簡単に説明する。まず、エンコードユニット410は、エンコード処理の対象とするCMY画像中の画素が、ディザマトリックスデータDM中のどのブロックに該当するかを計算する。そして、そのブロック番号に該当するエンコードテーブルETの中の行を参照し、その行の階調閾値とその画素の階調値とを階調閾値の低い方から順に比較していく。この比較の結果、順に参照した階調閾値が、その画素の階調値を初めて超えた場合のその階調閾値に対応するエンコード値EVが、変換後のエンコード値EVとなる。例えば、ブロック番号が「3」で、処理対象の画素の階調値が「199」であれば、図10の場合には、エンコード値EVは、「16」となる。つまり、このエンコードテーブルETには、各エンコード値に対応付けて、そのエンコード値に対応する階調値の範囲が階調閾値というパラメータにより記録されていることになる。
図11は、CMY画像の階調値に応じてエンコードテーブルETから取得されるエンコード値EVの変化の例を模式的に示す説明図である。図11には、ブロック番号が「X1」から「X5」までの5つのブロックについて、階調値に応じたエンコード値EVの変化の例を示している。図示の便宜のため、エンコード値の変化は、ブロック毎に縦軸をずらして描いている。図示するように、各ブロックとも、階調値が増加すれば、エンコード値EVの値も増加しているが、その増加の態様や変化数(ステップ数)は、ブロック毎に異なっている。各ブロックにおけるエンコード値EVの値は、ドット配置データ(図4参照)を間接的に示す値である。そのため、CMY画像の中で、同じ階調値を有する画素があっても、その画素の位置が異なれば、適用するブロック番号も異なり、異なるエンコード値EVが取得される。この結果、それらの画素に対応する印刷媒体上の位置には、異なる配置のドットが形成されることになる。
図12は、プレデコードテーブルDT1のデータ構造を示す説明図である。図示するように、このプレデコードテーブルDT1には、ブロック番号とエンコード値EVとに対応付けて、図8に示したポストデコードテーブルDT2のプレデコード値が記録されている。図3に示したデコードユニット420は、そのデコード処理時に、中間バッファBFに記憶されたエンコード値EVを読み込み、このポストデコードテーブルDT2を参照することで、エンコード値EVをプレデコード値に変換する。
ここでデコード処理の内容を簡単に説明する。デコードユニット420は、図12に示したプレデコードテーブルDT1を参照してエンコード値EVをプレデコード値に変換すると、図8のポストデコードテーブルDT2を参照することで、プレデコード値に対応するドット数データを取得し、このドット数データと、図7に示した順序値テーブルSTとに基づき図4に示したドット配置データを生成する。こうすることで、デコードユニット420は、エンコード値EVに基づきドット配置データを生成することができる。このデコード処理についての詳細な説明は後述する。
以上、本実施例における初期化処理の流れについて説明した。以下では、上述したステップS140におけるテーブル生成処理の詳細について説明する。
図13は、図6のステップS140で実行されるテーブル生成処理の詳細を示すフローチャートである。このテーブル生成処理は、エンコードテーブルETとプレデコードテーブルDT1とを生成する処理である。この処理が実行されると、CPU151は、まず、RAM152に、すべての要素を「0」に設定したエンコードテーブルETとプレデコードテーブルDT1を用意する(ステップS200)。
具体的には、図10に示したように、エンコードテーブルETには、エンコード値EVが0から31までの範囲について、各要素に、0から255までの8ビットの階調閾値が記録され、それが、ブロック8192個分格納される。従って、RAM152には、これらの積である256Kバイト(=32×8ビット×8192個)の容量をエンコードテーブルETのために用意する。一方、プレデコードテーブルDT1については、図12に示したように、エンコード値が0から31までの範囲について、各要素に、0から164までの8ビットのプレデコード値が記録され、それが、ブロック8192個分格納される。従って、RAM152には、エンコードテーブルETと同様に、256Kバイトの容量をプレデコードテーブルDT1のために用意する。
すべての要素を「0」に設定したエンコードテーブルETとプレデコードテーブルDT1を用意すると、次に、CPU151は、現在の処理対象とするブロック番号Nを「0」とし(ステップS210)、更に、以降の処理で用いられる変数として、エンコード値EVを「0」とし、現在のブロック内に発生する各サイズ(Sドット,Mドット,Lドット)のドット数をそれぞれ「0」とする(ステップS220)。そして、更に、現在の入力階調値TDを「0」とする(ステップS230)。
続いて、CPU151は、上記ステップS220で設定した入力階調値TDに基づき、現在のブロック内に発生する各サイズのドット数を決定するドット数カウント処理を実行する(ステップS240)。
図14は、上記ステップS240において実行されるドット数カウント処理の詳細を示すフローチャートである。かかる処理では、まず、CPU151は、上記ステップS230で設定された入力階調値TDに対応する各サイズのドット発生量をドット発生量テーブルDGT(図9参照)から取得する(ステップS400)。
各サイズのドット発生量を取得すると、CPU151は、現在のブロック番号Nに対応する閾値群をディザマトリックスデータDM(図7参照)から取得する。そして、これからカウントを行う各サイズのドットのカウント数(dotL,dotM,dotS)をそれぞれ「0」とし、すべてのドットの総カウント数nを「0」とする(ステップS410)。
カウント数および総カウント数を設定すると、CPU151は、現在の総カウント数nに応じて、n番目に低い閾値を閾値群から読み込む。そして、上記ステップS400で取得したLドットのドット発生量が、この閾値よりも大きいか否かを判断する(ステップS420)。この判断の結果、Lドットの発生量が、n番目に低い閾値よりも大きければ(ステップS420:Yes)、Lドットのカウント数dotLをインクリメントする(ステップS430)。すなわち、この場合、4×2のドット配置データ内に発生するLドットの数が1つ増加することになる。
Lドットのカウント数dotLをインクリメントすると、CPU151は、現在の総カウント数nが「7」であるかを判断する(ステップS440)。その結果、総カウント数nが「7」であれば、閾値群内の閾値を全て参照したことになり、ドット数のカウントが終了したと判断できるので、処理を後述するステップS500に進める。一方、ステップS440において、総カウント数nが「7」でなければ、次に低い閾値とドット発生量との比較を続行するため、総カウント数nをインクリメントし(ステップS450)、処理を上記ステップS420に戻す。
上記ステップS420において、Lドットの発生量が、n番目に低い閾値以下であれば(ステップS420:No)、CPU151は、次に、ドット発生量テーブルDGTから取得したMサイズとLサイズのドット発生量の累積値が、n番目に低い閾値を超えたか否かを判断する(ステップS460)。その結果、MサイズとLサイズのドット発生量の累積値が、n番目に低い閾値よりも大きいと判断した場合には(ステップS460:Yes)、Mドットのカウント数dotMをインクリメントする(ステップS470)。すなわち、この場合、4×2のドット配置データ内に配置するMドットの数が1つ増加することになる。
Mドットのカウント数dotMをインクリメントすると、CPU151は、上述したステップS440に処理を移行する。こうすることで、総カウント数nが「7」に達していない場合には、総カウント数nがインクリメントされ(ステップS450)、上記ステップS420に処理が戻されることになる。
上記ステップS460において、MドットとLドットのドット発生量の累積値が、n番目に低い閾値以下であると判断されれば(ステップS460:No)、次に、CPU151は、ドット発生量テーブルDGTから取得したSドットとMドットとLドットのドット発生量の累積値が、n番目に低い閾値を超えたか否かを判断する(ステップS480)、その結果、かかるドット発生量の累積値が、n番目に低い閾値よりも大きいと判断した場合には(ステップS480:Yes)、Sドットのカウント数dotSをインクリメントする(ステップS490)。すなわち、この場合、4×2のドット配置データ内に配置するSドットの数が1つ増加することになる。
Sドットのカウント数をインクリメントすると、CPU151は、上述したステップS440に処理を移行する。こうすることで、総カウント数nが「7」に達していない場合には、総カウント数nが1つインクリメントされ(ステップS450)、上記ステップS420に処理が戻されることになる。
上記ステップS480において、SドットとMドットとLドットのドット発生量の累積値が、n番目に低い閾値以下であると判断された場合(ステップS480:No)、もしくは、上記ステップS440において、総カウント数が「7」であり、8個の閾値をすべて参照したと判断した場合には(ステップS440:Yes)、CPU151は、最後に、各サイズのドットの数を、これまでカウントした値に確定する(ステップS500)。
図15は、上述したドット数カウント処理の具体例を示す説明図である。図15(a)に示すように、ここでは、ドット発生量テーブルDGTにおいて、現在の入力階調値TDに対応するLドットのドット発生量が「409」、Mドットが「1550」、Sドットが「1304」だとし、現在のブロックに対応する閾値群が、図7(b)に示した閾値群であったとする。
この場合、まず、図14のステップS420では、閾値群内の最も低い閾値「23」と、Lドットのドット発生量「409」とが比較される。そうすると、このドット発生量「409」の方が、閾値「23」よりも大きいので、ステップS420では、「Yes」と判定され、ステップS430によってLドットのカウント数がインクリメントされて「1」になる。そうすると、ステップS450によって、総カウント数nがインクリメントされるため、続くステップS420では、2番目に低い閾値「472」とLドットのドット発生量「409」が比較される。この場合、閾値「472」よりもドット発生量「409」の方が小さくなるので、ステップS420では、「No」と判定され、処理がステップS460に進む。この時点で、Lドットのカウント数は、図15(b)に示すように「1」で確定することになる。
ステップS460では、Lドットのドット発生量とMドットのドット発生量の累積値「1959(=409+1550)」と、2番目に低い閾値「472」とが比較される。この結果、LドットとMドットのドット発生量の累積値「1959」の方が、閾値「472」よりも大きいため、ステップS460では「Yes」と判断され、ステップS470によってMドットのカウント数がインクリメントされ「1」となる。そうすると、更に、次の閾値「1010」が参照される。しかし、この場合においても、依然として、閾値「1010」より、ドット発生量の累積値「1959」の方が大きいため、結局、7番目に低い閾値「2240」が参照されるまで、Mサイズのカウント数はインクリメントされる。この結果、Mサイズのカウント数は、図15(c)に示すように「5」で確定する。
7番目に低い閾値「2240」が参照されると、ステップS460では、「No」と判定されるため、次に、ステップS480において、LドットとMドットとSドットのドット発生量の累積値「3263(=409+1550+1304)」と、7番目に低い閾値「2240」とが比較される。この結果、ドット発生量の累積値「3263」の方が7番目に低い閾値よりも大きいため、ステップS480では「Yes」と判定され、ステップS490によってSドットのカウント数がインクリメントされて「1」になる。そうすると、次に、最も値の高い閾値「3262」が参照される。
LドットとMドットとSドットのドット発生量の累積値「3263」は、8番目の閾値「3262」よりも依然として大きい。そのため、ステップS480では、再度、「Yes」と判定されて、ステップS490によってSサイズのドットのカウント数がインクリメントされ、図15(d)に示すように「2」となる。すると、現在の総カウント数nは「7」であるため、ステップS440において、「Yes」と判定され、各サイズのドットのカウント数が確定する。すなわち、以上で示した例では、Lドットが1個、Mドットが5個、Sドットが2個となる。
以上、図15を用いて説明したように、上述したドット数カウント処理では、最初に、Lドットの発生数が決定され、つづいて、Mサイズ、Sサイズのドットの発生数が決定される。各サイズの発生数を決定する際には、各サイズのドット発生量を加算しつつ閾値との比較を行っていくので、最終的には、図15(d)に示すように、各サイズのドットの数は、ブロック内に各サイズのドットが重複せずにLドットから順に配置することが可能な数になる。
ここで、ドット数カウント処理の他の具体例について検討する。例えば、現在の入力階調値TDに対応するLドット、Mドットのドット発生量がともに「0」であり、Sドットのドット発生量が「1500」とする。また、現在のブロックに対応する閾値群が図7(b)に示した閾値群だとする。そうすると、図14に示したフローチャートのステップS420、ステップS460では、Lドットの発生量もMドットの発生量も「0」であり、最も低い閾値「23」よりも小さいため、「No」と判断され、ステップS480に処理が進む。そして、このステップS480では、ドット発生量「1500」を超える5番目に低い閾値「1659」が参照された時点で、ステップS480では、「No」と判定され、Sドットのカウント数が「5」で確定し、カウント処理が終了する。すなわち、本実施例では、閾値の低い順から比較を行うため、全サイズのドット発生量の累積値を超えた閾値が参照された時点で、次の閾値を参照する必要が無くなる。従って、各サイズのドットのカウント処理が高速化され、ひいては、初期化処理を高速に行うことが可能になる。
説明を図13に戻す。図13のステップS240、すなわち、図14に示したドット数カウント処理が実行されて、各サイズのドット数が確定すると、次に、CPU151は、前回の入力階調値TDにおける各サイズのドット数に対して、今回の入力階調値TDにおける各サイズのドット数のいずれかが変化したかを判定する(ステップS250)。例えば、前回のカウント処理によって、Sドットが2個、Mドットが5個、Lドットが1個であった場合に、今回のカウント処理によって、Sドットが2個、Mドットが4個、Lドットが2個となれば、MドットとLドットのカウント数が変化していることになるので、上記ステップS250では、変化あり(Yes)と判定される。
上記ステップS250において、変化ありと判定されれば(ステップS250:Yes)、現在のブロック番号Nおよびエンコード値EVに対応する各サイズのドット数を、上記ステップS240でカウントされた値に更新する(ステップS260)。そして、ステップS200において用意したエンコードテーブルETの現在のブロック番号Nおよびエンコード値EVに対応する要素に、階調閾値として、現在の入力階調値TDをセットする(ステップS270)。
エンコードテーブルETに階調閾値をセットすると、続いて、CPU151は、予め作成しておいたポストデコードテーブルDT2(図8参照)を参照し、上記ステップS260で更新した各サイズのドットの数と同数のドット数を有するプレデコード値を取得する。例えば、上記ステップS260において、Sドットが0個、Mドットが2個、Lドットが6個であるとされれば、取得されるプレデコード値は、図8を参照すると「160」になる。こうして、プレデコード値を取得すると、CPU151は、ステップS200において用意したプレデコードテーブルDT1の現在のブロック番号Nおよびエンコード値EVに対応する要素に、そのプレデコード値をセットする(ステップS280)。
エンコードテーブルETへの階調閾値の記録、および、プレデコードテーブルDT1へのプレデコード値の記録を完了すると、CPU151は、現在のエンコード値EVをインクリメントする(ステップS290)。つまり、このステップS290では、上記ステップS250においていずれかのサイズのドットの数が変化したと判断される毎にエンコード値EVが変化していくことになる。換言すれば、1ブロック内に発生するドットの態様が変化する度にエンコード値EVが変化していくことになる。
上記ステップS290によって、エンコード値EVをインクリメントした後、もしくは、上記ステップS250において、いずれのサイズのドット数も変化していないと判断された場合には(ステップS250:No)、CPU151は、現在の入力階調値TDが「255」を超えたか否かを判断する(ステップS300)。その結果、入力階調値TDが「255」を超えていなければ(ステップS300:No)、現在の入力階調値TDをインクリメントした上で(ステップS310)、処理を上記ステップS240に戻す。こうすることで、現在のブロックについて入力階調値TDを0から255まで変化させながら、入力階調値TDとエンコード値EVの対応関係をエンコードテーブルETに記録することができる。また、これと同時に、エンコード値EVとプレデコード値の対応関係をプレデコードテーブルDT1に記録することができる。
一方、上記ステップS300において、現在の入力階調値TDが「255」を超えていれば(ステップS300:Yes)、全てのブロックについて上述した処理が完了したかを判断し(ステップS320)、完了していなければ(ステップS320:No)、現在のブロック番号Nをインクリメントした上で(ステップS340)、処理を上記ステップS220に戻す。こうすることで、全てのブロックについて、入力階調値TDとエンコード値EVの対応関係をエンコードテーブルETに記録し、エンコード値とプレデコード値の対応関係をプレデコードテーブルDT1に記録することができる。全てのブロックについて上述した処理が完了していれば(ステップS320:Yes)、当該テーブル生成処理は終了する。
以上、図6のステップS140に示したテーブル生成処理の詳細について説明した。CPU151は、このテーブル生成処理を実行することにより、図10に示したエンコードテーブルETと、図12に示したプレデコードテーブルDT1とを生成することができる。かかるテーブル生成処理が終了すると、図6に示した初期化処理全体が終了することになる。
(D)ハーフトーン処理:
図16は、図5に示した印刷処理のステップS40で実行されるハーフトーン処理のフローチャートである。このハーフトーン処理は、上述した初期化処理において生成した各テーブル(エンコードテーブルET、プレデコードテーブルDT1、ポストデコードテーブルDT2、順序値テーブルST)を順次参照することで、CMY画像の各画素について、それぞれドット配置データを生成する処理である。
画像処理ASIC155は、まず、このハーフトーン処理を実行すると、図3に示したエンコードユニット410を用いて、処理対象の画素の各色(C,M,Y,K,Lc、Lm)の階調値をそれぞれエンコード値EVに変換するエンコード処理を行う(ステップS800)。
(D−1)エンコード処理:
図17は、エンコード処理の詳細な処理内容を示すフローチャートである。このエンコード処理は、入力画素の階調値を、エンコード値EVに変換するための処理である。
このエンコード処理が実行されると、エンコードユニット410は、まず、CMY画像をライン毎に色変換ユニット300から入力し、その中から1画素ずつX方向(右方向)に階調値GVを取得する(ステップS802)。
階調値GVを取得すると、エンコードユニット410は、その画素が属するブロック番号の計算を行う(ステップS804)。ここで、本実施例では、図4に示したように、1つの階調値GVを、4×2個のドットで表現するものとした。この4×2個のドットは、図7に示したディザマトリックスDMの4×2の要素、すなわち、1ブロックに相当する。従って、CMY画像内の処理対象の画素の位置がわかれば、その画素の位置に対応するディザマトリックスDM内のブロックの位置を容易に求めることができる。
図18は、ブロック番号の計算方法の概念を示す説明である。図7(a)に示したディザマトリックスデータDMは、横方向に128ブロック、縦方向に64ブロックの計8192個のブロックを有するものとした。そのため、1枚の入力画像データを、128画素×64画素を単位として分割し、かかる単位内の各画素に対して、ブロック番号が0から8191まで割り振られるように、ブロック番号の計算を行う。すなわち、図18のように、1枚の入力画像データのなかに、ディザマトリックスDMがタイル状に並べられているものとして、ブロック番号の計算を行うのである。
具体的には、エンコード処理を行おうとする現在の画素の座標を(X,Y)とした場合に、現在の画素のY座標が「0」であり、X座標が、「0」から「127」までの間は、ブロック番号が「0」から「127」まで、順番に割り振られることになる。その後、Y座標が変化せず、現在の画素のX座標が、「128」になった時点で、ブロック番号は、再び、「0」となる。このように、画像のX方向に対して、ブロック番号が「0」から「127」まで繰り返して適用された後に、現在の画素の座標が、(0,1)になった時点で、ブロック番号は「128」となる。そして、その後、Y座標が「1」の間は、「128」から「255」までのブロック番号が繰り返して割り振られることになる。つまり、ブロック番号Nは、エンコード処理を行う対象画素の座標を(X,Y)とすると、下記式(2)によって求めることができる。ただし、下記式(2)において、「%」は、剰余を求める演算子であるものとする。
N=(X%128)+(Y%64)*128 …(2)
図19は、ブロック番号の他の計算方法の概念を示す説明図である。図18に示したブロック番号の計算例では、1枚の画像データ内に複数のディザマトリックスDMがタイル状に等しく並べられることを想定してブロック番号の計算を行っている。これに対して、図21では、タイル状に配置されたディザマトリックスデータDMのうち、偶数行のディザマトリックスデータDMを、奇数行のディザマトリックスデータDMに対してX方向に64画素ずらして並べている。このように、ディザマトリックスDMをずらして画像内に配置するものとすれば、ディザマトリックスDMの繰り返しパターンの傾向が出力画像に現れることを抑制できるため、画質を向上させることができる。
本実施例では、エンコードユニット410は、1ライン単位でCMY画像を入力するものとしたため、図18や図19を参照すれば、最初のラインについては、ブロック番号が0から127が繰り返して適用されることになる(2ライン単位とすれば、0から255までのブロックが繰り返して適用される)。従って、本実施例では、エンコードユニット410がエンコード処理を実行するに当たり、入力したラインのY座標に応じて予めエンコードテーブルETの必要な部分についてのみSRAM156に入力しておく。こうすることで、各画素の階調値を取得する度に、SRAM156よりもアクセス速度の遅いRAM152にエンコードテーブルETを読みに行く必要が無くなり、処理を高速化することが可能になる。
図17のステップS804によって、ブロック番号の計算が完了すると、エンコードユニット410は、これから求めようとするエンコード値EVの値を「0」に初期化する(ステップS806)。そして、図12に示したエンコードテーブルET(実際には、SRAM156に読み込まれた部分的なエンコードテーブルET)を参照して、ステップS804で算出されたブロック番号および現在のエンコード値EVに対応する階調閾値GVtを取得する(ステップS808)。
階調閾値GVtを取得すると、エンコードユニット410は、この階調閾値GVtと、ステップS802で入力した処理対象の画素の階調値GVとを比較し、この階調値GVが階調閾値GVt以上であるかを判定する(ステップS810)。この判定の結果、階調値GVが階調閾値GVt以上であれば(ステップS810:Yes)、現在のエンコード値EVに「1」を加算し(ステップS812)、加算後のエンコード値EVがその最大値EVmax(本実施例では「31」)以上となったかを判定する(ステップS814)。エンコード値EVが最大値EVmax以上となれば(ステップS814:Yes)、その時点で、エンコード値EVは最大値EVmaxに確定する(ステップS816)。
上記ステップS814において、エンコード値EVがその最大値EVmax未満であると判定されれば(ステップS814:No)、エンコードユニット410は、処理をステップS808に戻し、加算後のエンコード値EVに対応する階調閾値GVtを取得して、再び、階調閾値GVtと階調値GVとの比較を行う。こうして、比較を繰り返した結果、ステップS810において、初めて階調値GVが、階調閾値GVt未満となれば(ステップS810:No)、そのときのエンコード値EVの値が、エンコード結果のエンコード値EVとして確定する(ステップS816)。
以上で説明したエンコード処理によれば、図10に示したエンコードテーブルETを参照することにより、入力画素の階調値を、その画素が属するブロックに応じて、5ビットのエンコード値に変換することができる。エンコードユニット410は、このエンコード処理を、CMY画像の全画素について実行する。
説明を図16に戻す。上述したエンコード処理によって、エンコードユニット410は階調値をエンコード値EVに変換すると、その値を、RAM152内の中間バッファBFにバッファリングする(ステップS820)。上述したエンコード処理の結果、この中間バッファBFには、8ビットの階調値ではなく、5ビットのエンコード値EVが格納されることになるため、RAM152の記憶容量を大幅に削減することができる。
エンコードユニット410によってエンコード値EVが中間バッファBFにバッファリングされると、次に、デコードユニット420が、このエンコード値EVに基づき、図4に示したドット配置データを生成するデコード処理を実行する(ステップ840)。このデコード処理は、画像データを構成する全ての画素についてエンコード値EVがバッファリングされることを待つことなく、1つでもエンコード値EVがバッファリングされるとデコードユニット420によって実行される。つまり、エンコード処理とデコード処理とは、同時並列的に実行されることになる。
(D−2)デコード処理:
図20は、デコード処理の詳細なフローチャートである。このデコード処理が実行されると、デコードユニット420は、まず、中間バッファBFに蓄積されたエンコード値EVを読み出す(ステップS822)。このデコード処理においても、1ライン分に相当するエンコード値EVをライン単位で中間バッファBFから読み出す。
エンコード値EVを読み出した後、デコードユニット420は、処理対象のエンコード値EVの生成元である画素が属するブロック番号の計算を行う(ステップS824)。エンコード値EVは、エンコード処理された順序で中間バッファBFにバッファリングされているため、この順序通りにエンコード値EVを読み出せば、そのエンコード値EVに対応するブロック番号も上述した計算方法によって自ずと算出することができる。なお、デコード処理においても、エンコード処理の際と同様にライン単位でデコードを行うため、RAM152に記憶されたプレデコードテーブルDT1および順序値テーブルSTの中から、デコード処理に必要なブロック番号に該当する部分のみを予めSRAM156に入力しておくものとする。
ブロック番号の計算を行うと、デコードユニット420は、図12に示したプレデコードテーブルDT1(実際には、SRAM156に入力された部分的なプレデコードテーブルDT1)を参照して、ステップS822において取得したエンコード値EVと、ステップS824によって求めたブロック番号とに対応したプレデコード値を取得する(ステップS826)。そして、更に、ポストデコードテーブルDT2を参照して、このプレデコード値に対応するドット数データを取得する(ステップS828)。このポストデコードテーブルDT2については、テーブル全体を予めSRAM156に入力しておくものとする。ポストデコードテーブルDT2は比較的容量が少ないため(165×16ビット=330バイト)、SRAM156の容量を圧迫することはないからである。ポストデコードテーブルDT2からドット数データを取得すると、デコードユニット420は、各サイズのドットをブロック内に配置するドット配置処理を実行する(ステップS830)。
図21は、ドット配置処理の詳細なフローチャートである。図22は、このドット配置処理によるドットの配置工程を模式的に示す説明図である。図21に示すように、このドット配置処理が実行されると、デコードユニット420は、まず、現在のブロックに対応する順序値データ(図7(c)参照)を、SRAM156に部分的に記憶された順序値テーブルST(図7(d)参照)から取得する(ステップS900)。そして、これからドットを配置するブロック内の全要素に対して、「ドット無し」を表すドットサイズ値「00」を設定して初期化し(ステップS910)、これからドットを配置しようとするブロック内の位置を、図22(a)に示す「a」の位置(最も左上の位置)に設定する(ステップS920)。
ドットを配置しようとする位置を設定すると、デコードユニット420は、現在のドット位置に対応する順序値を順序値データから取得する(ステップS930)。図22(b)には、順序値テーブルSTから入力した順序値データの一例を示している。図示した例では、現在の位置「a」に対応する順序値は、「5」となるため、上記ステップS930では、この値「5」が取得される。
次に、デコードユニット420は、ポストデコードテーブルDT2から取得したドット数データから、ステップS930で取得した順序値に対応するドットサイズ値を取得する(ステップS940)。具体的には、ドット数データの下位ビット側から2ビット毎に、ステップS930で取得した順序値の値分だけ数え、その位置に記録されたドットサイズ値を取得する。図22(c)には、ポストデコードテーブルDT2から取得したドット数データの一例を示している。かかる図において、順序値「5」に対応するドットサイズ値は、ドットサイズデータの下位ビットから数えて6つめのドットサイズ値「01」である。ドットサイズ値「01」は、Sサイズのドットであることを表す。
ドットサイズ値を取得すると、CPU151は、取得したドットサイズ値を、ブロック内の現在の位置に設定する(ステップS950)。つまり、図22(d)に示すように、現在の位置が「a」の位置であれば、かかる位置に、図22(c)のドット数データから取得されたドットサイズ値「01」を設定する。
現在の位置にドットサイズ値を設定すると、CPU151は、全ての位置についてドットサイズ値の設定が終了したか否かを判断する(ステップS960)。その結果、全ての位置についてドットサイズ値の設定が終了していれば(ステップS960:Yes)、当該ドット配置処理を終了する。一方、終了していなければ、ブロック内の現在の位置をa,b,c,d,・・・の順(図22(a)参照)に移動し(ステップS970)、処理を上記ステップS930に戻すことで、他の位置についてドットサイズ値の設定を行う。
以上で説明したドット配置処理が、中間バッファBFにバッファリングされたすべてのエンコード値EVについて完了すれば、デコードユニット420によるデコード処理が完了する。このデコード処理によって生成された各ドット配置データは、その生成の都度、インク吐出制御ユニット500に引き渡され、インクヘッド211によるドットの形成に供されることになる。なお、本実施例では、順序値テーブルを参照することで、ドットの配置を行うものとしたが、ディザマトリックスデータDM内の該当するブロックを直接参照し、閾値の低い要素から順にドットを発生させることで、ドットの配置を行うものとしてもよい。
(E)第1,第2サブテーブルを用いたデコード処理:
上述したハーフトーン処理時におけるデコード処理では、図12に示したプレデコードテーブルDT1を参照することで、中間バッファBFから入力したエンコード値をプレデコード値に変換する例を説明した。これに対して、以下では、RAM152のデータ容量を削減するために、プレデコードテーブルDT1に代えて、「第1サブテーブルDT1a」と「第2サブテーブルDT1b」という2つのテーブルを用意して、これらを参照することで、エンコード値をプレデコード値に変換する方法について説明する。
図23は、第1サブテーブルDT1aのデータ構造を示す説明図である。図12に示したプレデコードテーブルDT1では、ブロック番号とエンコード値とに対応付けて、プレデコード値が記録されているものとしたが、図23に示す第1サブテーブルDT1aでは、ブロック番号とエンコード値とに対応付けて、インデックス値という値が記録されている。このインデックス値は、後述する第2サブテーブルDT1bからプレデコード値を取得するために、エンコード値毎に固有に定められた値である。このように、インデックス値は、プレデコード値をエンコード値毎に固有に指し示す値であるため、対応するプレデコード値が異なる場合であっても、ブロック間で重複した値を利用することができる。
図24は、第2サブテーブルDT1bのデータ構造を示す説明図である。この第2サブテーブルDT1bには、上述したインデックス値とエンコード値とに対応付けて、プレデコード値が記録されている。この第2サブテーブルDT1bは、図12に示したプレデコードテーブルDT1において、エンコード値毎に、すべてのブロックについてプレデコード値を調べて重複した値を取り除き、残存した各プレデコード値に対して、固有のインデックス値を割り当てて生成されるテーブルである。つまり、各エンコード値に対応付けられた各プレデコード値には、固有のインデックス値が割り当てられていればよいため、図24に示すように、第2サブテーブルDT1bには、プレデコード値が、特に、昇順あるいは降順にソートされて記録されているわけではない。このように、無作為にプレデコード値が並べられていても、固有のインデックス値が割り当てられていれば、後述するデコード処理を適切に行うことができる。
図24に示すように、例えば、第2サブテーブルDT1bのエンコード値「1」には、1つのプレデコード値「1」しか対応付けられていない。これは、図12のプレデコードテーブルDT1において、エンコード値「1」に対応するブロックには、どのブロックにも、プレデコード値として「1」しか対応付けられていないことを表す。また、図24を見れば、エンコード値「13」には、26個のプレデコード値が対応付けられていることがわかる。このことは、プレデコードテーブルDT1において、エンコード値が「13」に対応する8192個の各ブロックには、この26種類のプレデコード値のうち、いずれかの値が対応付けられていることを表している。
図25は、上述した第1サブテーブルDT1aおよび第2サブテーブルDT1bを用いて行うデコード処理のフローチャートである。このデコード処理は、図20に示したデコード処理と使用するテーブルが異なるだけで、他の処理は同じ処理である。従って、図25には、図20と同じ処理については同じステップ番号を付している。
このデコード処理が開始されると、デコードユニット420は、RAM152からエンコード値を読み出し(ステップS822)、該当するブロック番号を計算する(ステップS824)。そして、このエンコード値とブロック番号とに基づき、第1サブテーブルDT1aを参照してインデックス値を取得する(ステップS826b)。更に、CPU151は、このインデックス値と、先に使用したエンコード値を再び使用し、これらに基づき、第2サブテーブルDT1bを参照して、プレデコード値を取得する(ステップS827b)。その後、ステップS827bで取得したプレデコード値に対応するドット数データをポストデコードテーブルDT2から取得して(ステップS828)、図21に示したドット配置処理を実行することで、ドット配置データを生成する(ステップS830)。以上により、第1サブテーブルDT1aおよび第2サブテーブルDT1bを用いて行うデコード処理は終了する。
なお、上述したデコード処理において、デコードユニット420は、第1サブテーブルDT1aについては、ライン単位の処理に必要なブロックの範囲をSRAM156に入力してデコード処理を行うものとすることができる。また、第2サブテーブルDT1bについては、全てのデータを予めSRAM156に入力しておくものとすることができる。後述するように、第2サブテーブルDT1bのデータ容量は1Kバイト未満であり、SRAM156のデータ容量をそれほど圧迫することがないためである。このように、第1サブテーブルDT1aや第2サブテーブルDT1bを予めSRAM156に入力することにより、デコードユニット420は、デコード処理を迅速に行うことが可能になる。
また、第1サブテーブルDT1aの必要なブロックの範囲を予めSRAM156に入力する場合には、第1サブテーブルDT1aのその範囲のインデックス値を、第2サブテーブルDT1bを参照することで、予めプレデコード値に変換し、この変換後の第1サブテーブルDT1aをSRAM156に入力するものとすることができる。こうして変換された第1サブテーブルDT1aの内容は、図12に示したプレデコードテーブルDT1と同じ内容となる。そのため、デコードユニット420は、プレデコードテーブルDT1を用いたデコード処理と同等に、第1サブテーブルDT1aから直接的にプレデコード値を取得することが可能になる。
ここで、第1サブテーブルDT1aと第2サブテーブルDT1bとを用いることにより使用するデータ容量が削減される理由を説明する。図12に示したプレデコードテーブルDT1では、8192個のブロック番号と32個のエンコード値とに対応付けて、「0」から「164」までのプレデコード値が記録されている。「164」という値は、8ビットのデータ長で表すことができるから、プレデコードテーブルDT1全体では、256Kバイト(=8192個×32個×8ビット)のデータ量を有することになる。
これに対して、図23に示した第1サブテーブルDT1aは、8192個のブロック番号と32個のエンコード値とに対応付けて、「0」から「25」までのインデックス値が記録されている。「25」という値は、5ビットのデータ長で表すことができるから、第1サブテーブルDT1a全体では、160Kバイト(=8192個×32個×5ビット)のデータ量を有することになる。つまり、第1サブテーブルDT1aには、ブロック番号とエンコード値とに対応付けて、エンコード値毎に固有に定められたインデックス値が記録されているため、対応するプレデコード値が異なる場合であってもブロック間で重複した値を記録することができる。この結果、プレデコード値よりも少ないデータ長で、各要素に値を記録することができるため、テーブルのデータ容量を削減することができる。
また、図24に示した第2サブテーブルDT1bは、26個のインデックス値と32個のエンコード値(図24には図示の便宜のため、エンコード値は「21」までしか示していない)とに対応付けて、「0」から「164」までのプレデコード値が記録されている。そのため、第2サブテーブルDT1bは、832バイト(=26個×32個×8ビット)という1Kバイトにも満たないデータ量を有することになる。従って、第1サブテーブルDT1aと第2サブテーブルDT1bとのデータ量を合わせても、161Kバイト程度のデータ量となり、図12に示したプレデコードテーブルDT1に比べて、概ね、4割程度のデータ量を削減することができる。この結果、プレデコード値を求めるために必要なRAM152のデータ容量を削減することができる。
なお、上述した第2サブテーブルDT1bのデータ容量の計算では、エンコード値が32個まで用意されているものとしたが、ディザマトリックスデータDMとドット発生量テーブルDGTの種類によっては、その最大値は21程度となる場合がある。このような場合には、第2サブテーブルDT1bは、図24に示すように、エンコード値を21まで用意すればよいから、そのデータ容量を572バイト(=26個×22個×8ビット)まで削減することが可能になる。
更に、第2サブテーブルDT1bは、図24の下段に示すように、エンコード値に応じて、対応付けられているプレデコード値の個数が異なっている。そのため、エンコード値に応じて、テーブル中に用意する要素の数を可変とすれば、より少ないデータ容量とすることができる。
また、図24に示すように、第2サブテーブルDT1bは、エンコード値に応じて、記録されているプレデコード値の範囲が異なっている。そのため、プレデコード値を表すのに必要なビット数をエンコード値に応じて可変とすれば、更に、少ないデータ容量とすることができる。
また、第2サブテーブルDT1bは、図24に示すように、1つのエンコード値に対して、プレデコード値が、最大26種類対応付けられているが、例えば、エンコード値が0や1の場合には、プレデコード値は、それぞれ1つずつしか対応付けられていない。そこで、このような場合には、複数のエンコード値をひとまとめにして、その中で、各インデックス値とプレデコード値の組み合わせを定義するものとしてもよい。このようにすれば、効率的に、第2サブテーブルDT1bを構成することが可能になる。
(E−1)第1,第2サブプレデコードテーブルの生成方法:
次に、第1サブテーブルDT1aと第2サブテーブルDT1bとを用いたデコード処理を実現するために、これらのテーブルを生成する方法を以下に説明する。
図26は、図12に示したプレデコードテーブルDT1を、第1サブテーブルDT1aと第2サブテーブルDT1bとに変換するテーブル変換処理のフローチャートである。この処理は、図6に示した初期化処理のステップS140によって、図12に示したプレデコードテーブルDT1が生成された後にCPU151が実行する処理である。
この処理が実行されると、CPU151は、まず、全ての要素を「0」とした第1サブテーブルDT1aと第2サブテーブルDT1bとをRAM152に用意する(ステップS1000)。そして、プレデコードテーブルDT1内で参照するエンコード値EVを「0」とするとともに(ステップS1010)、これから参照するブロック番号Nを「0」、現時点でのインデックス値IVを「0」とする(ステップS1020)。
続いて、CPU151は、RAM152に記憶されたプレデコードテーブルDT1を参照して、現在のエンコード値EVおよびブロック番号Nに対応するプレデコード値を取得する(ステップS1030)。そして、取得したプレデコード値が、プレデコードテーブルDT1内の現在のエンコード値EVにおいて、初めて出現した値であるかを判断する(ステップS1040)。初めて出現したかどうかは、第2サブテーブルDT1bの現在のエンコード値に対応する各要素に、既にそのプレデコード値が記録されているかを調べることで判別することができる。
上記ステップS1040において、初めて出現したプレデコード値であると判断された場合には(ステップS1040:Yes)、CPU151は、第2サブテーブルDT1b内の、現在のエンコード値EVおよびインデックス値IVに対応する要素に、ステップS1030で取得したプレデコード値をセットする(ステップS1050)。
第2サブテーブルDT1bにプレデコード値をセットすると、続いて、CPU151は、第1サブテーブルDT1a内の、現在のエンコード値EVおよびブロック番号Nに対応する要素に、現在のインデックス値IVをセットする(ステップS1060)。
第1サブテーブルDT1aにインデックス値IVをセットすると、CPU151は、現在のインデックス値IVに「1」を加え(ステップS1070)、現在のブロック番号Nが、その最大値Nmax(本実施例では、「8191」)以上になったかを判断する(ステップS1080)。その結果、ブロック番号Nが、未だ最大値Nmaxまで達していなければ、現在のブロック番号Nに「1」を加え(ステップS1090)、処理をステップS1030に戻す。こうすることで、プレデコードテーブルDT1内のエンコード値毎に、各ブロック番号に対応付けられたプレデコード値を調べることができ、そのプレデコード値が初めて出現する値であれば、その値を、第2サブテーブルDT1bに記録することができる。
上記ステップS1040において、プレデコードテーブルDT1から取得したプレデコード値が、初めて出現した値ではないと判断されれば(ステップS1040:No)、CPU151は、取得したプレデコード値に対応するインデックス値を第2サブテーブルDT1b内の現在のエンコード値に対応する要素から検索して、検索された値を、第1サブテーブルDT1aの現在のエンコード値およびブロック番号に対応する要素にセットする(ステップS1100)。こうすることにより、ステップS1030で取得されたプレデコード値が既に出現した値であっても、そのプレデコード値に対応するインデックス値を第2サブテーブルDT1bから探し出し、これを、第1サブテーブルDT1aに記録することができる。なお、この場合には、インデックス値IVの加算を行うことなく、処理を上述したステップS1080に進める。
上記ステップS1080において、ブロック番号Nが、最大値Nmax以上であると判断されると、CPU151は、続いて、現在のエンコード値EVが、その最大値EVmax(本実施例では「31」)以上であるかを判断する(ステップS1110)。この結果、エンコード値EVが最大値EVmaxに達していないと判断されれば(ステップS1110:No)、現在のエンコード値EVに「1」を加え(ステップS1120)、処理を上記ステップS1020に戻す。こうすることで、プレデコードテーブルDT1内で参照するエンコード値を順次移動させながら、第1サブテーブルDT1aおよび第2サブテーブルDT1bを生成することができる。CPU151は、第1サブテーブルDT1aおよび第2サブテーブルDT1bの生成が完了すれば、RAM152からプレデコードテーブルDT1を消去する。
以上で説明したテーブル変換処理によれば、一旦生成したプレデコードテーブルDT1に基づいて、第1サブテーブルDT1aと第2サブテーブルDT1bとを容易に生成することができる。
(E−2)第1,第2サブテーブルの他の生成方法:
次に、プレデコードテーブルDT1を生成することなく、第1サブテーブルDT1aと第2サブテーブルDT1bとを直接的に生成する方法を説明する。
図27は、エンコードテーブルETと第1サブテーブルDT1aと第2サブテーブルDT1bとを同時に生成するためのテーブル生成処理のフローチャートである。この処理は、図6に示した初期化処理のステップS140におけるテーブル生成処理に代えて実行される処理である。
この処理が実行されると、CPU151は、まず、RAM152内に、初期値としてすべての要素を「0」に設定したエンコードテーブルETと、第1サブテーブルDT1aと、第2サブテーブルDT1bとを用意し、更に、全ての要素を「255」に設定したテンポラリテーブルTTを用意する(ステップS1200)。
図28は、テンポラリテーブルTTの一例を示す説明図である。図示するように、このテンポラリテーブルTTには、エンコード値とプレデコード値とに対応付けてインデックス値が記録される。このテーブルは、プレデコード値に対応付けるインデックス値の決定や、第1サブテーブルDT1aに対して記録するインデックス値の決定に用いるテーブルであり、当該テーブル生成処理実行時にのみ用いられるテーブルである。
説明を図27に戻す。CPU151は、上述した各テーブルを用意すると、現在の処理対象とするブロック番号Nを「0」とし(ステップS1210)、「0」から「31」までの各エンコード値に対応させて、初期値を「0」とした32個のカウンタを用意する(ステップS1215)。このカウンタは、第2サブテーブルDT1bの作成時において、プレデコード値を記録する要素のインデックス値を決定するためのカウンタである。以下では、このカウンタのことを「インデックス値カウンタ」という。
インデックス値カウンタを用意すると、CPU151は、更に、以降の処理で用いられる変数として、エンコード値EVを「0」とし、現在のブロック内に発生する各サイズ(Sドット,Mドット,Lドット)のドット数をそれぞれ「0」とする(ステップS1220)。そして、更に、現在の入力階調値TDを「0」とする(ステップS1230)。
続いて、CPU151は、上記ステップS220で設定した入力階調値TDに基づき、現在のブロック内に発生する各サイズのドット数を決定するドット数カウント処理を実行する(ステップS240)。このドット数カウント処理の処理内容は既に説明した通りである。
ドット数カウント処理が実行されて、各サイズのドット数が確定すると、次に、CPU151は、前回の入力階調値TDにおける各サイズのドット数に対して、今回の入力階調値TDにおける各サイズのドット数のいずれかが変化したかを判定する(ステップS1250)。
上記ステップS1250において、変化ありと判定されれば(ステップS1250:Yes)、現在のブロック番号Nおよびエンコード値EVに対応する各サイズのドット数を、上記ステップS1240でカウントされた値に更新する(ステップS1260)。そして、ステップS1200において用意したエンコードテーブルET内の現在のブロック番号Nおよびエンコード値EVに対応する要素に、階調閾値として、現在の入力階調値TDをセットする(ステップS1270)。こうすることで、エンコードテーブルETが生成されていくことになる。
エンコードテーブルETに階調閾値をセットすると、続いて、CPU151は、サブテーブル生成処理を実行する(ステップS1280)。この処理は、現在のエンコード値EVおよびブロック番号に応じて、第1サブテーブルDT1aに対して、インデックス値を記録すると共に、第2サブテーブルDT1bに対して、プレデコード値を記録するための処理である。かかる処理の詳細については後述する。
サブテーブル生成処理の実行後、CPU151は、現在のエンコード値EVをインクリメントする(ステップS1290)。つまり、このステップS1290によれば、上記ステップS1250においていずれかのサイズのドットの数が変化したと判断される毎にエンコード値EVが変化していくことになる。換言すれば、1ブロック内に発生するドットの態様が変化する度にエンコード値EVが変化していくことになる。
上記ステップS1290によって、エンコード値EVをインクリメントした後、もしくは、上記ステップS1250において、いずれのサイズのドット数も変化していないと判断された場合には(ステップS1250:No)、CPU151は、現在の入力階調値TDが「255」を超えたか否かを判断する(ステップS1300)。その結果、入力階調値TDが「255」を超えていなければ(ステップS1300:No)、現在の入力階調値TDをインクリメントした上で(ステップS1310)、処理を上記ステップS1240に戻す。
一方、上記ステップS1300において、現在の入力階調値TDが「255」を超えていると判断されれば(ステップS1300:Yes)、全てのブロックについて上述した処理が完了したかを判断し(ステップS1320)、完了していなければ(ステップS1320:No)、現在のブロック番号Nをインクリメントした上で(ステップS1340)、処理を上記ステップS1220に戻す。全てのブロックについて上述した処理が完了していれば(ステップS320:Yes)、当該テーブル生成処理は終了する。
図29は、上記ステップS1280において実行されるサブテーブル生成処理の詳細なフローチャートである。このサブテーブル生成処理が実行されると、まず、CPU151は、RAM152に記憶されたポストデコードテーブルDT2を参照して、上記ドット数カウント処理においてカウントされた各ドットの数に応じたプレデコード値を取得する(ステップS1400)。そして、図28に示したテンポラリテーブルTTを参照して、ポストデコードテーブルDT2から取得したプレデコード値と現在のエンコード値とに対応するインデックス値IVを取得する(ステップS1410)。テンポラリテーブルTTは、初期状態では、すべての値が「255」であるため、このステップS1410が最初に実行された場合には、常に、インデックス値IVとして「255」が取得されることになる。
テンポラリテーブルTTからインデックス値IVを取得すると、CPU151は、このインデックス値IVが「255」であるかを判断する(ステップS1420)。インデックス値IVが「255」であれば(ステップS1420:Yes)、CPU151は、テンポラリテーブルTT内で、現在のエンコード値およびプレデコード値に対応する要素を初めて参照したことになる。この場合、CPU151は、上記ステップS1410でインデックス値IVとして「255」を取得した要素に、新たなインデックス値IVとして現在のエンコード値に対応するインデックス値カウンタの値をセットする(ステップS1430)。
テンポラリテーブルTTにインデックス値カウンタの値をセットすると、CPU151は、続いて、第2サブテーブルDT1b内の、現在のエンコード値および上記ステップS1430においてセットしたインデックス値IVに対応する要素に、上記ステップS1400で取得したプレデコード値をセットする(ステップS1440)。
テンポラリテーブルTTへのインデックス値IVのセット、および、第2サブテーブルDT1bへのプレデコード値のセットを行うと、CPU151は、現在のエンコード値に対応するインデックス値カウンタに「1」を加算する(ステップS1450)。つまり、上記ステップS1410においてテンポラリテーブルTTから取得したインデックス値IVが「255」である度に、エンコード値毎に用意したインデックス値カウンタの値をインクリメントするのである。こうすることで、第2サブテーブルDT1b内の現在のエンコード値に対応する要素に新たなプレデコード値を記録するたびに、次にプレデコード値を記録すべきインデックス値が増加していくことになる。
インデックス値カウンタに「1」を加算すると、CPU151は、ステップS1430でテンポラリテーブルTTに記録したインデックス値を、第1サブテーブルDT1aの現在のブロック番号およびエンコード値EVに対応する要素にセットする(ステップS1470)。こうすることで、第1サブテーブルDT1aにインデックス値が記録されていくことになる。
上記ステップS1420において、テンポラリテーブルTTから取得したインデックス値IVが「255」ではないと判断された場合には(ステップS1420:No)、現在のエンコード値において、同じインデックス値IVが既に出現し、これを第1サブテーブルDT1aに記録したことがあることになる。そこで、CPU151は、ステップS1410で取得したインデックス値を、そのまま第1サブテーブルDT1a内の現在のブロック番号およびエンコード値に対応する要素にセットする(ステップS1460)。このように、テンポラリテーブルTTを利用すれば、ポストデコードテーブルDT2から取得したプレデコード値に対して既にインデックス値が対応付けられているかを容易に判別することができるため、第1サブテーブルDT1aの生成を迅速に行うことが可能になる。
以上の処理により、サブテーブル生成処理が終了すると、CPU151は、図27に示したテーブル生成処理のステップS1290に処理を進める。図27に示したテーブル生成処理が完了した後には、CPU151は、RAM152からテンポラリテーブルTTを消去する。かかるテーブルは、初期化処理時にのみ用いられ、ハーフトーン処理では参照されないテーブルだからである。
以上で説明したテーブル生成処理によれば、プレデコードテーブルDT1を予め生成することなく、エンコードテーブルETの生成と同時に第1サブテーブルDT1aと第2サブテーブルDT1bとを生成することができる。従って、初期化処理を迅速に行うことが可能になる。
(F)効果:
以上で説明した実施例によれば、次のような効果が生じる。すなわち、図24(d)に示したドット配置データの生成結果と、図24(b)に示した4×2の順序値データとを対比してみると、サイズの大きなドットから順に、ドットが重複無く順序値の低い位置に配置されていることがわかる。順序値が低いということは、その順序値に対応する閾値の値が低いということになる(図7(b)参照)。図7(a)に示したディザマトリックスデータDMは、組織的ディザ法におけるディザパターンとしての性質上、閾値は、その値が低いほど分散性よく配置されており、その値が高くなるほど、既に配置された閾値の場所を避けるように配置されている。そのため、図24(d)に示したドット配置データでは、最も大きなサイズのドットから優先的に、低い順序値、すなわち、低い閾値の場所に配置されることになり、大きなサイズのドットほど、分散性がよく配置されることになる。従って、本実施例におけるドットの配置方法によれば、印刷用紙上で目立つことになる大きなドットの分散性を最も高めることができるため、出力画像の画質を大幅に向上させることが可能になる。
また、本実施例において、ディザマトリックスデータDMとしてドットを良好に分散させることのできるブルーノイズ特性を有するマトリックスを用いれば、マトリックス内のどのブロックが何階調になるのか特別な規則性がないことになり、図11に示したように、ブロック毎にエンコード値の取り得る値が異なることになる。そのため、従来の濃度パターン法などでは、階調値に応じて画一的に多値化を行うため、実質的な階調数が低減してしまう可能性があったが、本実施例では、ハーフトーン処理を4×2ドットのブロック単位で行いながらも、ディザマトリックス内におけるそのブロックの位置に応じて、ドットの発生パターンが様々に変化することになり、従来の多値化手法よりも大幅に出力画像の画質を向上させることができる。
また、本実施例では、ハーフトーン処理に用いる各種テーブルを、ディザマトリックスデータDMとドット発生量テーブルDGTとに基づき生成するものとしたため、ディザマトリックスデータDM内の閾値の配置について適宜最適化を図ることにより、比較的容易に出力画像の画質を向上させることができる。つまり、本実施例のように、ブロック毎にそのブロックの位置に応じたハーフトーン処理を行うことのできるテーブルの構造を用いれば、従来の多値化で用いられていた画一的な変換テーブルよりも柔軟に画質の向上を図ることが可能になる。
また、本実施例のハーフトーン処理によれば、エンコードテーブルETと、プレデコードテーブルDT1(第1サブテーブルDT1a、第2サブテーブルDT1b)と、ポストデコードテーブルDT2と、順序値テーブルSTとを順次参照していくことで、CMY画像に対するハーフトーン処理が完了する。従って、誤差拡散法などの他のハーフトーン処理のように、誤差を分散させるような複雑な演算を行うことなく極めて高速なハーフトーン処理を実現することができる。
また、本実施例では、ハーフトーン処理を、エンコード処理とデコード処理との2段階の処理に分割し、エンコード処理の結果生成されたエンコード値EVを、RAM152内の中間バッファBFに一時的に蓄積するものとした。従って、デコード処理以降に、印刷機構によるドットの形成に時間を要する場合であっても、エンコード処理の結果得られたエンコード値EVを、RAM152にバッファリングすることで、早期にエンコード処理のみを終了させることができる。この結果、CPU151を印刷に関する処理から迅速に解放することが可能になる。また、この中間バッファBFには、各色8ビット(255階調)のデータ容量を有するCMY画像のデータが、エンコード処理によって、各色5ビットのエンコード値EVに減縮されて記憶されるため、RAM152の記憶容量を大幅に削減することができ、コストダウンを図ることが可能になる。
また、本実施例では、プレデコードテーブルDT1の代わりに、第1サブテーブルDT1aおよび第2サブテーブルDT1bを用いることで、使用するテーブルのデータ量を削減することができる。この結果、RAM152の記憶容量を節減することが可能になる。
なお、本実施例では、図5に示したように、印刷処理が実行される度に初期化処理を実行するものとして説明したが、初期化処理は、その他のタイミングで実行するものとしてもよい。例えば、プリンタ100の電源投入時に実行されるものとしてもよいし、ユーザによって、印刷用紙や印刷モードの設定が変更された際に実行されるものとしてもよい。
(G)変形例:
以上、本発明の実施例について説明したが、本発明はこのような実施例に限定されず、その趣旨を逸脱しない範囲で種々の構成を採ることができることはいうまでもない。例えば、画像処理ASIC155によってハードウェアによって実現した機能を、CPU151による所定のプログラムの実行によってソフトウェア的に実現するものとしてもよい。
また、上記実施例では、エンコード処理時に用いるエンコードテーブルETには、各ブロック番号と各エンコード値とに対して階調閾値が対応付けられているものとした。これに対して、エンコードテーブルETには、各ブロック番号と、「0」から「255」までの各階調値とに対して、それぞれエンコード値が対応付けられているものとしてもよい。このようなエンコードテーブルであれば、階調閾値と階調値とを順次比較する処理を行うことなく、ブロック番号と階調値とから直接的にエンコード値を導き出すことができる。そのため、処理の高速化を図ることが可能になる。
また、上記実施例では、プリンタ100は、複合機タイプであるものとし、単体で、画像データの入力からハーフトーン処理、インクの吐出制御まで行うものとした。これに対して、プリンタ100にコンピュータを接続し、コンピュータにおいて、画像データの入力と、ハーフトーン処理の一部、すなわち、エンコード処理までを実行するものとしてもよい。このような構成では、コンピュータに所定のプログラムをインストールすることで、実施例に記載した初期化処理やハーフトーン処理と同様の処理を実現することができる。プリンタ100は、コンピュータからプリンタケーブル等を経由してエンコード値EVを受信すると、そのエンコード値EVに応じてデコード処理を行い、印刷機構を制御して、印刷用紙への印刷を行う。
このように、コンピュータでエンコード処理までを実行するものとすれば、C,M,Y,Kの各色毎に、8ビット(255階調)のデータサイズを有する画像データが、5ビットのエンコード値EVに変換されるため、コンピュータとプリンタ100間の通信量を削減することができる。この結果、全体として印刷速度を向上させることが可能になる。
また、データの通信速度よりも、プリンタ100内における処理速度が問題となるような場合にあっては、エンコード処理だけではなくデコード処理もコンピュータで行わせるものとすることができる。こうすることにより、プリンタ100の処理負担を軽減させることができるので、全体として印刷速度を向上させることが可能になる。また、このように、コンピュータで、エンコード処理とデコード処理の両者を実行するものとすれば、ハーフトーン処理に要するハードウェアが不要となるため、プリンタ100の製造コストを削減することが可能になる。