以下、上述した本発明の作用・効果を一層明らかにするため、本発明の実施の形態を実施例に基づき次の順序で説明する。
(A)プリンタの構成:
(B)印刷処理:
(C)初期化処理:
(C−1)エンコードテーブル及びプレデコードテーブル生成処理:
(C−2)データ量削減処理:
(D)ハーフトーン処理:
(D−1)エンコード処理:
(D−2)デコード処理:
(E)差分エンコードテーブル及びその生成方法:
(F)差分エンコードテーブルを用いたエンコード処理:
(G)差分エンコードテーブルの他の生成方法:
(H)差分エンコードテーブルの他の態様:
(I)変形例:
(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の生成方法や、エンコード処理の詳細な方法については後で説明する。
なお、上述したエンコード処理時に参照するエンコードテーブルETは、後述するデータ量削減処理によって、そのデータ量が、5ビットのエンコード値EVが取り得る最大値である「31」未満のエンコード値とブロックの総数との積に応じたデータ容量以下の容量まで削減されてRAM152に記憶されている。このように、本実施例では、比較的サイズの大きなエンコードテーブルETのデータ容量を予め削減することで、RAM152の使用量を削減している。
画像処理ASIC155は、その内部に、図2に示したRAM152よりも高速に読み書きを行うことのできるSRAM156を備えている。エンコードユニット410は、1ライン分のCMY画像をエンコード値EVに変換するにあたり、RAM152内のエンコードテーブルETからその1ライン分のエンコード処理に必要なデータのみをこのSRAM156に一時的に入力し、この部分的なエンコードテーブルETを参照することでエンコード処理を行う。詳細は後述するが、例えば、CMY画像の最上部のラインをエンコード処理する場合には、図10に示したエンコードテーブルETのブロック番号0から127(ブロック番号の最大値は、「8191」)までのデータが入力される(図20参照)。1ライン分のエンコード処理においては、エンコードテーブルET内の一部のブロックが繰り返し使用されることになるため、画像処理ASIC155内のSRAM156に予め必要なデータだけを入力することで、効率的にエンコード処理を行うことが可能になる。なお、本実施例では、エンコードユニット410は、1ライン単位でエンコード処理を行うものとするが、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ドットのドット配置データに変換する。かかる変換処理のことを、「デコード処理」という。デコード処理の過程で参照される上述した各テーブルの生成方法や、デコード処理の詳細については後で説明する。なお、かかるデコード処理もエンコード処理と同様、1ライン単位で行われるため、プレデコードテーブルDT1や順序値テーブルST内の必要なデータのみが、SRAM156に入力される。
デコードユニット420は、エンコード値EVをドット配置データに変換すると、そのドット配置データをインク吐出制御ユニット500に出力する。
インク吐出制御ユニット500は、インクヘッド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)。以下では、かかるステップ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に基づきドット配置データを生成することができる。このデコード処理についての詳細な説明は後述する。
説明を図6に戻す、CPU151は、ステップS140におけるテーブル生成処理を完了すると、次に、図10に示したエンコードテーブルETのデータ量を削減するデータ量削減処理を実行する(ステップS150)。上述したように、エンコードテーブルETは、ディザマトリックスデータDMやドット発生量テーブルDGTに基づき動的に生成されるテーブルであり、その内容は印刷処理毎に変化する場合がある。ドット発生量テーブルDGTは印刷用紙の種類に応じて異なる内容を有しており、また、ディザマトリックスデータDMについても、ファームウェアの更新等によりその内容が変動する場合があるからである。従って、エンコードテーブルETに記録されるエンコード値EVの範囲は変化することがあり、これに伴い、テーブル内に参照されない領域が存在する場合が生じる。例えば、図10に示したエンコードテーブルETには、エンコード値EVが「0」から「31」まで用意されているにもかかわらず、実際に階調閾値が記録されているのは、エンコード値EVが20までである。そのため、エンコード値EVが21以降の階調閾値はエンコード処理においてどのブロックについても参照されることが無く、エンコード値EVと階調閾値とが実質的に対応しない無駄な領域となる。そこで、本実施例では、上記ステップS150のデータ量削減処理において、こうした無駄な領域(要素)の少なくとも一部を削除する処理を行う。こうすることで、RAM152に記憶されるエンコードテーブルETのデータ量を削減することが可能になる。かかるデータ量削減処理の詳細な処理内容については後述する。
以上、本実施例における初期化処理の流れについて説明した。以下では、上述したステップS140におけるテーブル生成処理と、ステップS150におけるデータ量削減処理の詳細についてそれぞれ説明する。
(C−1)エンコードテーブル及びプレデコードテーブル生成処理:
図13は、図6のステップS140で実行されるテーブル生成処理(エンコードテーブル及びプレデコードテーブル生成処理)の詳細を示すフローチャートである。この処理が実行されると、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のステップS150(データ量削減処理)に移行する。
以上、図6のステップS140に示したテーブル生成処理の詳細について説明した。CPU151は、このテーブル生成処理を実行することにより、図10に示したエンコードテーブルETと、図12に示したプレデコードテーブルDT1とを生成することができる。
(C−2)データ量削減処理:
図16は、図6のステップS150において実行されるデータ量削減処理のフローチャートである。このデータ量削減処理は、上述したテーブル生成処理によって生成されたエンコードテーブルETのデータ量を削減する処理である。
この処理が実行されると、CPU151は、まず、RAM152に記憶されたエンコードテーブルET(図10)を参照し(ステップS600)、最大ステップ数を取得する(ステップS610)。最大ステップ数とは、すべてのブロックのステップ数(段数)の中で最も大きいステップ数のことをいい、換言すれば、初期値としての「0」を除いて最も多くの階調閾値が対応付けられたブロックが有するエンコード値EVの範囲のことをいう。図10に示したエンコードテーブルETでは、最大ステップ数は、ブロック番号3の「21」である。
最大ステップ数を取得すると、次に、CPU151は、データ量削減後のエンコードテーブルET(以下、「圧縮エンコードテーブルETC」と記載する)を格納するために必要な記憶領域をRAM152に確保する(ステップS620)。具体的には、最大ステップ数と、各階調閾値のデータ容量(8ビット)と、ブロックの数とをすべて乗じた値が必要な記憶容量となる。図10の例では、必要な記憶容量は168Kバイト(=8192個×21×8ビット)となる。なお、本願の発明者の実験では、最大ステップ数は、「24」程度になることが多く、この場合には、必要な記憶容量は、192Kバイト(=8192個×24×8ビット)になる。
必要な記憶容量を確保すると、CPU151は、既にRAM152に記憶されたデータ量削減前のエンコードテーブルETから、各階調閾値をステップS620で確保した領域にコピーする(ステップS630)。そして、最後に、データ量削減前のエンコードテーブルETをRAM152から削除する(ステップS640)。こうすることで、最大ステップ数を超えるエンコード値に対応する要素が、すべてのブロックについて削除されることになり、エンコードテーブルETのサイズが削減されることになる。
図17は、当該データ量削減処理によって生成された圧縮エンコードテーブルETCの一例を示す説明図である。この圧縮エンコードテーブルETCと、図10に示したデータ量削減前のエンコードテーブルETとを比較すれば、各ブロックについて、最大ステップ数以上の要素に記録されていた階調閾値「0」が削除され、明らかに、データ量が削減されていることがわかる。本実施例では、このデータ量削減処理によって、エンコードテーブルETのデータ量を概ね3割程度削減することができる。
以上、図5のステップS10で実行される初期化処理の全内容を説明した。以下では、この初期化処理によって生成された種々のテーブルを用いて実行されるハーフトーン処理の詳細な処理内容について説明する。
(D)ハーフトーン処理:
図18は、図5に示した印刷処理のステップS40で実行されるハーフトーン処理のフローチャートである。このハーフトーン処理は、上述した初期化処理において生成した各テーブル(エンコードテーブルET、プレデコードテーブルDT1、ポストデコードテーブルDT2、順序値テーブルST)を順次参照することで、CMY画像の各画素について、それぞれドット配置データを生成する処理である。
画像処理ASIC155は、まず、このハーフトーン処理を実行すると、図3に示したエンコードユニット410を用いて、処理対象の画素の各色(C,M,Y,K,Lc、Lm)の階調値をそれぞれエンコード値EVに変換するエンコード処理を行う(ステップS800)。
(D−1)エンコード処理:
図19は、エンコード処理の詳細な処理内容を示すフローチャートである。このエンコード処理は、入力画素の階調値を、エンコード値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内のブロックの位置を容易に求めることができる。
図20は、ブロック番号の計算方法の概念を示す説明である。図7(a)に示したディザマトリックスデータDMは、横方向に128ブロック、縦方向に64ブロックの計8192個のブロックを有するものとした。そのため、1枚の入力画像データを、128画素×64画素を単位として分割し、かかる単位内の各画素に対して、ブロック番号が0から8191まで割り振られるように、ブロック番号の計算を行う。すなわち、図20のように、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)
図21は、ブロック番号の他の計算方法の概念を示す説明図である。図20に示したブロック番号の計算例では、1枚の画像データ内に複数のディザマトリックスDMがタイル状に等しく並べられることを想定してブロック番号の計算を行っている。これに対して、図21では、タイル状に配置されたディザマトリックスデータDMのうち、偶数行のディザマトリックスデータDMを、奇数行のディザマトリックスデータDMに対してX方向に64画素ずらして並べている。このように、ディザマトリックスDMをずらして画像内に配置するものとすれば、ディザマトリックスDMの繰り返しパターンの傾向が出力画像に現れることを抑制できるため、画質を向上させることができる。
本実施例では、エンコードユニット410は、ライン単位でCMY画像を入力するものとしたため、図20や図21を参照すれば、最初のラインについては、ブロック番号が0から127が繰り返して適用されることになる。従って、本実施例では、エンコードユニット410がエンコード処理を実行するに当たり、入力したラインのY座標に応じて予め圧縮エンコードテーブルETCの必要な部分についてのみSRAM156に入力しておく。こうすることで、各画素の階調値を取得する度に、SRAM156よりもアクセス速度の遅いRAM152にエンコードテーブルETを読みに行く必要が無くなり、処理を高速化することが可能になる。なお、本実施例では、データ容量が削減されたまま、SRAM156に、圧縮エンコードテーブルETCの一部を入力するものとする。こうすることで、SRAM156が必要とする記憶容量を削減することができる。
図19のステップS804によって、ブロック番号の計算が完了すると、エンコードユニット410は、これから求めようとするエンコード値EVの値を「0」に初期化する(ステップS806)。そして、図17に示した圧縮エンコードテーブルETC(実際には、SRAM156に読み込まれた部分的な圧縮エンコードテーブルETC)を参照して、ステップS804で算出されたブロック番号および現在のエンコード値EVに対応する階調閾値GVtを取得する(ステップS808)。
階調閾値GVtを取得すると、エンコードユニット410は、この階調閾値GVtと、ステップS802で入力した処理対象の画素の階調値GVとを比較し、この階調値GVが階調閾値GVt以上であるかを判定する(ステップS810)。この判定の結果、階調値GVが階調閾値GVt以上であれば(ステップS810:Yes)、現在のエンコード値EVに「1」を加算し(ステップS812)、加算後のエンコード値EVがその最大値EVmax以上となったかを判定する(ステップS814)。最大値EVmaxは、上述した最大ステップ数から「1」を差し引いた値である(例えば、図17のエンコードテーブルを参照している場合には「20」)。エンコード値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)。
以上で説明したエンコード処理によれば、図17に示したエンコードテーブルETを参照することにより、入力画素の階調値を、その画素が属するブロックに応じて、5ビットのエンコード値に変換することができる。エンコードユニット410は、このエンコード処理を、CMY画像の全画素について実行する。
なお、上述したエンコード処理では、SRAM156に対して、圧縮エンコードテーブルETCの一部を、データ量が削減されたまま入力するものとした。これに対して、SRAM156に入力するブロックについて、データ量を図10に示した元の形式まで回復させて入力するものとしてもよい。このような構成であれば、SRAM156内に入力されるエンコードテーブルの形式が一律になるため、SRAM156のメモリ管理を容易に行うことが可能になる。
説明を図18に戻す。上述したエンコード処理によって、エンコードユニット410は階調値をエンコード値EVに変換すると、その値を、RAM152内の中間バッファBFにバッファリングする(ステップS820)。上述したエンコード処理の結果、この中間バッファBFには、8ビットの階調値ではなく、5ビットのエンコード値EVが格納されることになるため、RAM152の記憶容量を大幅に削減することができる。
エンコードユニット410によってエンコード値EVが中間バッファBFにバッファリングされると、次に、デコードユニット420が、このエンコード値EVに基づき、図4に示したドット配置データを生成するデコード処理を実行する(ステップ840)。このデコード処理は、画像データを構成する全ての画素についてエンコード値EVがバッファリングされることを待つことなく、1つでもエンコード値EVがバッファリングされるとデコードユニット420によって実行される。つまり、エンコード処理とデコード処理とは、同時並列的に実行されることになる。
(D−2)デコード処理:
図22は、デコード処理の詳細なフローチャートである。このデコード処理が実行されると、デコードユニット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)。
図23は、ドット配置処理の詳細なフローチャートである。図24は、このドット配置処理によるドットの配置工程を模式的に示す説明図である。図23に示すように、このドット配置処理が実行されると、デコードユニット420は、まず、現在のブロックに対応する順序値データ(図7(c)参照)を、SRAM156に部分的に記憶された順序値テーブルST(図7(d)参照)から取得する(ステップS900)。そして、これからドットを配置するブロック内の全要素に対して、「ドット無し」を表すドットサイズ値「00」を設定して初期化し(ステップS910)、これからドットを配置しようとするブロック内の位置を、図24(a)に示す「a」の位置(最も左上の位置)に設定する(ステップS920)。
ドットを配置しようとする位置を設定すると、デコードユニット420は、現在のドット位置に対応する順序値を順序値データから取得する(ステップS930)。図24(b)には、順序値テーブルSTから入力した順序値データの一例を示している。図示した例では、現在の位置「a」に対応する順序値は、「5」となるため、上記ステップS930では、この値「5」が取得される。
次に、デコードユニット420は、ポストデコードテーブルDT2から取得したドット数データから、ステップS930で取得した順序値に対応するドットサイズ値を取得する(ステップS940)。具体的には、ドット数データの下位ビット側から2ビット毎に、ステップS930で取得した順序値の値分だけ数え、その位置に記録されたドットサイズ値を取得する。図24(c)には、ポストデコードテーブルDT2から取得したドット数データの一例を示している。かかる図において、順序値「5」に対応するドットサイズ値は、ドットサイズデータの下位ビットから数えて6つめのドットサイズ値「01」である。ドットサイズ値「01」は、Sサイズのドットであることを表す。
ドットサイズ値を取得すると、CPU151は、取得したドットサイズ値を、ブロック内の現在の位置に設定する(ステップS950)。つまり、図24(d)に示すように、現在の位置が「a」の位置であれば、かかる位置に、図24(c)のドット数データから取得されたドットサイズ値「01」を設定する。
現在の位置にドットサイズ値を設定すると、CPU151は、全ての位置についてドットサイズ値の設定が終了したか否かを判断する(ステップS960)。その結果、全ての位置についてドットサイズ値の設定が終了していれば(ステップS960:Yes)、当該ドット配置処理を終了する。一方、終了していなければ、ブロック内の現在の位置をa,b,c,d,・・・の順(図24(a)参照)に移動し(ステップS970)、処理を上記ステップS930に戻すことで、他の位置についてドットサイズ値の設定を行う。
以上で説明したドット配置処理が、中間バッファBFにバッファリングされたすべてのエンコード値EVについて完了すれば、デコードユニット420によるデコード処理が完了する。このデコード処理によって生成された各ドット配置データは、その生成の都度、インク吐出制御ユニット500に引き渡され、インクヘッド211によるドットの形成に供されることになる。なお、本実施例では、順序値テーブルを参照することで、ドットの配置を行うものとしたが、ディザマトリックスデータDM内の該当するブロックを直接参照し、閾値の低い要素から順にドットを発生させることで、ドットの配置を行うものとしてもよい。
以上で説明した本実施例のハーフトーン処理によれば、次のような効果が生じる。すなわち、図24(d)に示したドット配置データの生成結果と、図24(b)に示した4×2の順序値データとを対比してみると、サイズの大きなドットから順に、ドットが重複無く順序値の低い位置に配置されていることがわかる。順序値が低いということは、その順序値に対応する閾値の値が低いということになる(図7(b)参照)。図7(a)に示したディザマトリックスデータDMは、組織的ディザ法におけるディザパターンとしての性質上、閾値は、その値が低いほど分散性よく配置されており、その値が高くなるほど、既に配置された閾値の場所を避けるように配置されている。そのため、図24(d)に示したドット配置データでは、最も大きなサイズのドットから優先的に、低い順序値、すなわち、低い閾値の場所に配置されることになり、大きなサイズのドットほど、分散性がよく配置されることになる。従って、本実施例におけるドットの配置方法によれば、印刷用紙上で目立つことになる大きなドットの分散性を最も高めることができるため、出力画像の画質を大幅に向上させることが可能になる。
また、本実施例において、ディザマトリックスデータDMとしてドットを良好に分散させることのできるブルーノイズ特性を有するマトリックスを用いれば、マトリックス内のどのブロックが何階調になるのか特別な規則性がないことになり、図11に示したように、ブロック毎にエンコード値の取り得る値が異なることになる。そのため、従来の濃度パターン法などでは、階調値に応じて画一的に多値化を行うため、実質的な階調数が低減してしまう可能性があったが、本実施例では、ハーフトーン処理を4×2ドットのブロック単位で行いながらも、ディザマトリックス内におけるそのブロックの位置に応じて、ドットの発生パターンが様々に変化することになり、従来の多値化手法よりも大幅に出力画像の画質を向上させることができる。
また、本実施例では、ハーフトーン処理に用いる各種テーブルを、ディザマトリックスデータDMとドット発生量テーブルDGTとに基づき生成するものとしたため、ディザマトリックスデータDM内の閾値の配置について適宜最適化を図ることにより、比較的容易に出力画像の画質を向上させることができる。つまり、本実施例のように、ブロック毎にそのブロックの位置に応じたハーフトーン処理を行うことのできるテーブルの構造を用いれば、従来の多値化で用いられていた画一的な変換テーブルよりも柔軟に画質の向上を図ることが可能になる。
また、本実施例のハーフトーン処理によれば、エンコードテーブルETと、プレデコードテーブルDT1と、ポストデコードテーブルDT2と、順序値テーブルSTとを順次参照していくことで、CMY画像に対するハーフトーン処理が完了する。従って、誤差拡散法などの他のハーフトーン処理のように、誤差を分散させるような複雑な演算を行うことなく極めて高速なハーフトーン処理を実現することができる。
また、本実施例では、ハーフトーン処理を、エンコード処理とデコード処理との2段階の処理に分割し、エンコード処理の結果生成されたエンコード値EVを、RAM152内の中間バッファBFに一時的に蓄積するものとした。従って、デコード処理以降に、印刷機構によるドットの形成に時間を要する場合であっても、エンコード処理の結果得られたエンコード値EVを、RAM152にバッファリングすることで、早期にエンコード処理のみを終了させることができる。この結果、CPU151を印刷に関する処理から迅速に解放することが可能になる。また、この中間バッファBFには、各色8ビット(255階調)のデータ容量を有するCMY画像のデータが、エンコード処理によって、各色5ビットのエンコード値EVに減縮されて記憶されるため、RAM152の記憶容量を大幅に削減することができ、コストダウンを図ることが可能になる。
更に、本実施例では、エンコード処理に用いられるエンコードテーブルET内の階調閾値が実質的に記録されていない要素を予め削除することで、データ量を削減するものとした。従って、RAM152の記憶容量をより削減することが可能になる。また、こうしてRAM152にはデータ容量の削減されたエンコードテーブルETが記憶されているため、この一部のデータをSRAM156に転送する際にも、その転送量を削減することができる。従って、データ転送に要する時間が減縮され、ハーフトーン処理の高速化を図ることが可能になる。
なお、本実施例では、図5に示したように、印刷処理が実行される度に初期化処理を実行するものとして説明したが、初期化処理は、その他のタイミングで実行するものとしてもよい。例えば、プリンタ100の電源投入時に実行されるものとしてもよいし、ユーザによって、印刷用紙や印刷モードの設定が変更された際に実行されるものとしてもよい。
(E)差分エンコードテーブル及びその生成方法:
上述した初期化処理時のデータ量削減処理では、エンコードテーブルETから実質的に階調閾値が対応付けられていない要素を削除することで、エンコードテーブルETのデータ容量を削減するものとした。これに対して、以下では、エンコードテーブルET内の各階調閾値を差分で表すことにより、データ容量の更なる削減を行う方法について説明する。
図25は、階調閾値を差分で表した差分エンコードテーブルETDの一例を示す説明図である。図25(a)には、図10に示した通常のエンコードテーブルETの一部を示し、図25(b)には、このエンコードテーブルETに対応する差分エンコードテーブルETDの一部を示している。図25(b)には、ブロック番号「0」のエンコード値「19」に対応する差分値「21」を、通常のエンコードテーブルETのエンコード値「18」,「19」に対応する2つの階調閾値「234」,「255」から求めた例を示している。図示するように、差分エンコードテーブルETD内の各差分値は、エンコードテーブルETの隣接した2つの階調閾値の差によって求めることができる。
図26は、通常のエンコードテーブルETから差分エンコードテーブルETDへの変換を行うテーブル変換処理のフローチャートである。この処理は、図6に示した初期化処理中のテーブル生成処理(ステップS140)の実行後に、データ量削減処理(ステップS150)の実行に先立って行われる処理である。
この処理が実行されると、CPU151は、まず、変換を行うブロック番号Nを「0」に設定する(ステップS1100)。そして、現在のブロック番号およびエンコード値「0」に対応する要素に記録された階調閾値をエンコードテーブルETから読み込み、これを、差分エンコードテーブルETDの同じ要素にコピーする(ステップS1110)。エンコード値が「0」に対応する階調閾値は、差分演算を行う上での初期値になるからである。
続いて、CPU151は、エンコード値EVを「1」に設定し(ステップS1120)、エンコードテーブルETから隣接する2つの階調閾値、すなわち、ブロック番号「N」およびエンコード値「EV」に対応する第1の階調閾値TDG1と、ブロック番号「N」およびエンコード値「EV−1」に対応する第2の階調閾値TDG2とを読み込む(ステップS1130)。
CPU151は、上記ステップS1130において読み込んだ第2の階調閾値TDG2が「255」であるかを判断し(ステップS1140)、「255」でなければ(ステップS1140:Yes)、差分エンコードテーブルETDに、第1の階調閾値TDG1と第2の階調閾値TDG2との差分をセットする(ステップS1150)。こうして、差分値をセットするとCPU151は、エンコード値EVの値を1つ加算し(ステップS1160)、その加算されたエンコード値EVが、5ビットで表現可能な最大値である「31」を超えたか否かを判断する(ステップS1170)。この判断の結果、エンコード値EVが「31」を超えない場合、すなわち、エンコード値EVが、「31」以下の場合は、処理を上記ステップS1130に戻して、上述した一連の処理を繰り返す。こうすることにより、各エンコード値EVに対応する階調閾値の差分が算出され、これが、差分エンコードテーブルETDにセットされることになる。なお、上記ステップS1140において、第2の階調閾値TDG2が「255」であると判断された場合には(ステップS1140:No)、図25(a)を参照すればわかるように、この階調閾値「255」は、そのブロック番号について、最大のエンコード値EVに対応する階調閾値となる。従って、以降の階調閾値はすべて初期値としての「0」が記録されていることになるため、残りの差分の演算を行うことなく、処理をステップS1180に進める。
上記ステップS1170で、エンコード値EVが「31」を超えたと判断された場合(ステップS1170:Yes)、もしくは、上記ステップS1140で、第2の階調閾値TDG2が「255」であると判断された場合(ステップS1140:No)には、現在のブロックについて全ての差分を算出したことになるので、CPU151は、ブロック番号Nを1つ加算する(ステップS1180)。そして、この加算後のブロック番号Nの値が、ブロック番号の最大値Nmax(本実施例では、「8191」)を超えか否かを判断する(ステップS1190)。この結果、ブロック番号Nの値が、ブロック番号の最大値Nmaxを超えると判断されれば(ステップS1190:Yes)すべてのブロックについて、差分を求めたことになるので、当該テーブル変換処理を終了する。これに対して、ブロック番号Nの値が、ブロック番号の最大値Nmaxを超えないと判断されれば(ステップS1190:No)、処理をステップS1110に戻すことで、次のブロックについて差分の演算を行う。
以上のようにして生成された差分エンコードテーブルETDに含まれる差分値は、大きくとも「30」を超えることはない(図25(b)参照)。つまり、通常のエンコードテーブルETでは、各階調閾値が8ビット(0〜255)の値で表されていたが、差分エンコードテーブルETDでは、差分値を5ビット(0〜31)の値で表すことが可能になる。そのため、図10のエンコードテーブルETでは、256Kバイト(=エンコード値32個×8ビット×ブロック8192個)のデータ容量が必要であったが、本実施例の差分エンコードテーブルETDでは、そのデータ容量が、160Kバイト(=エンコード値32個×5ビット×ブロック8192個)まで削減されることになる。すなわち、本実施例によれば、エンコードテーブルETのデータ容量を、4割程度削減することが可能になる。
これに加え、本実施例では、上述したテーブル変換処理によって差分エンコードテーブルETDを生成した後に、図6に示した初期化処理のステップS150において、データ量削減処理を行う。そのため、差分値が実質的に対応付けられていない要素が、このデータ量削減処理によって削除されることになり、差分エンコードテーブルETDのデータ容量を更に削減することが可能になる。例えば、データ量削減処理によって、エンコード値のステップ数が「32」から「24」まで削減されれば、160Kバイトまで削減された差分エンコードテーブルETDの容量が、更に、120Kバイト(=エンコード値24個×5ビット×ブロック8192個)まで削減されることになり、元のエンコードテーブルETの半分以下までデータ容量が削減されることになる。
なお、上述の説明では、エンコードテーブルETから差分エンコードテーブルETDへのテーブル変換処理を、図6に示した初期化処理中のテーブル生成処理とデータ量削減処理との間に実行するものとしたが、テーブル生成処理およびデータ量削減処理の両者を実行した後に実行するものとしてもよい。
(F)差分エンコードテーブルを用いたエンコード処理:
図27は、差分エンコードテーブルETDを用いたエンコード処理のフローチャートである。この処理は、図19に示したエンコード処理に代わって実行される処理である。本処理は、図19に示したエンコード処理とは大部分が同じ処理であるため、以下では異なる部分を重点に説明する。なお、図27には、図19と異なる処理内容について、そのステップ番号の末尾に「b」と符号を付加して表している。
このエンコード処理が実行されると、図3に示したエンコードユニット410は、まず、CMY画像をライン毎に色変換ユニット300から入力し、その中から1画素ずつX方向(右方向)に階調値GVを取得する(ステップS802)。
階調値GVを取得すると、エンコードユニット410は、その画素が属するブロック番号の計算を行う(ステップS804)。かかる計算方法は既に説明した通りである。
ブロック番号を計算すると、エンコードユニット410は、これから求めようとするエンコード値EVの値および階調閾値GVtの値を「0」に初期化する(ステップS806b)。そして、図25に示した差分エンコードテーブルETD(実際には、SRAM156に読み込まれた部分的な差分エンコードテーブルETD)を参照して、ステップS804で算出されたブロック番号および現在のエンコード値EVに対応する差分値DVを入力する(ステップS808)。
差分値DVを入力すると、エンコードユニット410は、この差分値DVを階調閾値GVtに加算し、新たな階調閾値GVtを求める(ステップS809b)。こうすることで、差分値を順次累積していくことができる。新たな階調閾値GVtを求めると、エンコードユニット410は、この階調閾値GVtと、ステップS802で入力した処理対象の画素の階調値GVとを比較し、階調値GVが階調閾値GVt以上であるかを判定する(ステップS810)。この判定の結果、階調値GVが階調閾値GVt以上であれば(ステップS810:Yes)、現在のエンコード値EVに「1」を加算し(ステップS812)、加算後のエンコード値EVがその最大値EVmax以上となったかを判定する(ステップS814)。エンコード値EVが最大値EVmax以上となれば(ステップS814:Yes)、その時点で、エンコード値EVは最大値EVmaxに確定する(ステップS816)。
上記ステップS814において、エンコード値EVがその最大値EVmax未満であると判定されれば(ステップS814:No)、エンコードユニット410は、処理をステップS808に戻すことで、次のエンコード値EVに対応する差分値DVを取得して、これを階調閾値GVtに累積し、再び、階調閾値GVtと階調値GVとの比較を行う。こうして、比較を繰り返した結果、ステップS810において、初めて階調値GVが、階調閾値GVt未満となれば、そのときのエンコード値EVの値が、エンコード結果のエンコード値EVとして確定する(ステップS816)。
以上で説明したエンコード処理によれば、差分エンコードテーブルETD内の差分値DVを順次加算して累積することで、通常のエンコードテーブルETを用いたエンコード処理と同等の処理を行うことが可能になる。
なお、かかるエンコード処理においても、圧縮エンコードテーブルETCを用いたエンコード処理と同様に、入力した1ライン分の画素に対応する差分エンコードテーブルETDの一部をSRAM156に予め入力するものとする。しかし、RAM152からSRAM156にテーブルの一部を転送する際に、差分値を通常の階調閾値に戻した上で転送を行うものとしてもよい。こうすることで、図27に示したエンコード処理ではなく、図19に示した通常のエンコード処理によってエンコードを行うことができ、処理の複雑化を抑制することが可能になる。差分値を通常の階調閾値に戻すには、エンコード値の低い値に対応する差分値から、順次、差分値を累積していくことで、各エンコード値EVに対応する階調閾値を求めることができる。
(G)差分エンコードテーブルの他の生成方法:
上述したテーブル変換処理では、既に生成された通常のエンコードテーブルETから差分値を次々求めていくことで、差分エンコードテーブルETDを生成するものとした。これに対して、以下では、ディザマトリックスデータDMとドット発生量テーブルDGTとから直接、差分エンコードテーブルETDを生成する方法を説明する。
図28は、差分エンコードテーブルETDおよびプレデコードテーブル生成処理のフローチャートである。この処理は、図6に示した初期化処理のステップS140において、図13のテーブル生成処理に代えて実行される処理である。なお、かかる生成処理は、図13のテーブル生成処理と大部分が同じ処理であるため、以下では異なる部分を重点に説明する。なお、図28には、図13と異なる処理内容について、そのステップ番号の末尾に「b」と符号を付加して表している。
この処理が実行されると、CPU151は、まず、RAM152に、すべての要素を「0」に設定した差分エンコードテーブルETDとプレデコードテーブルDT1を用意する(ステップS200b)。そして、CPU151は、現在の処理対象とするブロック番号Nを「0」とし(ステップS210)、更に、以降の処理で用いられる変数として、エンコード値EVを「0」とし、現在のブロック内に発生する各サイズ(Sドット,Mドット,Lドット)のドット数をそれぞれ「0」とする(ステップS220)。そして、更に、現在の入力階調値TDおよび差分値DVを「0」とする(ステップS230b)。
続いて、CPU151は、上記ステップS220で設定した入力階調値TDに基づき、現在のブロック内に発生する各サイズのドット数を決定するドット数カウント処理を実行する(ステップS240)。かかるドット数カウント処理の処理内容は、図14を用いて既に説明したとおりである。
図14に示したドット数カウント処理が実行されて、各サイズのドット数が確定すると、CPU151は、前回の入力階調値TDにおける各サイズのドット数に対して、今回の入力階調値TDにおける各サイズのドット数のいずれかが変化したかを判定する(ステップS250)。
上記ステップS250において、変化ありと判定されれば(ステップS250:Yes)、現在のブロック番号Nおよびエンコード値EVに対応する各サイズのドット数を、上記ステップS240でカウントされた値に更新する(ステップS260)。そして、ステップS200において用意した差分エンコードテーブルETDの現在のブロック番号Nおよびエンコード値EVに対応する要素に、差分値DVをセットする(ステップS270b)。
差分エンコードテーブルETDに差分値DVをセットすると、続いて、CPU151は、予め作成しておいたポストデコードテーブルDT2(図8参照)を参照し、上記ステップS260で更新した各サイズのドットの数と同数のドット数を有するインデックス値を取得する。こうして、インデックス値を取得すると、CPU151は、ステップS200において用意したプレデコードテーブルDT1の現在のブロック番号Nおよびエンコード値EVに対応する要素に、そのインデックス値をセットする(ステップS280)。
差分エンコードテーブルETDへの差分値DVの記録、および、プレデコードテーブルDT1へのインデックス値の記録を完了すると、CPU151は、現在のエンコード値EVをインクリメントするとともに、差分値DVを「0」に再設定する(ステップS290b)。つまり、このステップS290bでは、上記ステップS250においていずれかのサイズのドットの数が変化したと判断される毎にエンコード値EVが変化していくことになり、この時同時に、差分値DVが「0」に戻されることになる。
上記ステップS290bによって、エンコード値EVのインクリメントおよび差分値DVのクリアを行った後、もしくは、上記ステップS250において、いずれのサイズのドット数も変化していないと判断された場合には(ステップS250:No)、CPU151は、現在の入力階調値TDが「255」を超えたか否かを判断する(ステップS300)。その結果、入力階調値TDが「255」を超えていなければ(ステップS300:No)、現在の入力階調値TDおよび差分値DVをインクリメントした上で(ステップS310)、処理を上記ステップS240に戻す。
一方、上記ステップS300において、現在の入力階調値TDが「255」を超えていれば(ステップS300:Yes)、全てのブロックについて上述した処理が完了したかを判断し(ステップS320)、完了していなければ(ステップS320:No)、現在のブロック番号Nをインクリメントした上で(ステップS340)、処理を上記ステップS220に戻す。
以上で説明した差分エンコードテーブルETDの生成処理によれば、通常のエンコードテーブルETを生成することなく、直接、差分エンコードテーブルETDを作成することができる。従って、初期化処理、ひいては、印刷処理全体が高速化されることになる。
(H)差分エンコードテーブルの他の態様:
(H−1)差分エンコードテーブルの第1の変形例:
次に、差分エンコードテーブルETDの他の態様について説明する。上述したように、図25に示した差分エンコードテーブルETDは、その差分値DVの最大値は、「30」程度である。そのため、図25に示した差分エンコードテーブルETDは、各差分値を5ビット(0〜31)のデータで表すことができる。しかし、エンコードテーブルETは、ディザマトリックスデータDMとドット発生量テーブルDGTとに基づき動的に生成されるテーブルであるため、差分値DVは、必ずしも5ビットの範囲で収まるとは限らない。そこで、以下では、差分値DVが予め定めたビット数を超える場合の対処方法について説明する。なお、以下では、予め定めた差分値のビット数は、5ビットよりも更に少ない4ビット(0〜15)であるものとする。
図29は、差分エンコードテーブルETDの第1の変形例を示す説明図である。図29(a)には、図25(b)に示した通常の差分エンコードテーブルETDの一部を示し、図29(b)には、本変形例における差分エンコードテーブルETD2の一部を示している。本変形例の差分エンコードテーブルETD2は、各要素に、4ビットの差分値、すなわち、0から15までの差分値を記録可能としている。
図29(a)に示した差分エンコードテーブルETDにおいて、エンコード値が「0」,「2」,「3」,「16」に対応する差分値「28」,「30」,「24」,「17」は、それぞれ、4ビットで表現可能な差分値「15」を超えている。そのため、本変形例では、図29(b)に示すように、「15」を超える差分値については、その差分値を「15」で除算することで、除数としての「15」とその剰余との組み合わせで表している。すなわち、差分値が「28」の場合には、これを、「15」と「13」で表し、差分値が「30」の場合には、これを「15」と「15」で表している。こうすることで、4ビットを超える差分値についても2以上の数値の組み合わせで表現することが可能になる。なお、図中には2つの数値の組み合わせの例を示しているが、例えば、差分値が「35」の場合は、「15」と「15」と「5」との3つの数値によって1つの差分値を表すことになる。
このように、差分エンコードテーブルETD2は、「15」以上の差分値を2以上の数値で表すため、各差分値に対応するエンコード値の数も増加する。例えば、図29では、当初、エンコード値の範囲が0から18までであったものが、0から22までに拡張されている。従って、本変形例では、このような差分エンコードテーブルETD2のエンコード値の拡張に合わせて、デコード処理に用いられるプレデコードテーブルDT1のエンコード値の範囲も、これに従って拡張を行う。
図30は、エンコード値の範囲を拡張させたプレデコードテーブルDT1bの一例を示す説明図である。図30(a)には、拡張前の通常のプレデコードテーブルDT1の一部を示し、図30(b)には、拡張後のプレデコードテーブルDT1bの一部を示している。図29では、エンコード値が「0」,「2」,「3」,「16」に対応する差分値を、それぞれ複数の要素で表すものとしたため、図30に示したプレデコードテーブルDT1bについても、これらのエンコード値に対応するインデックス値を、それぞれ複数の要素で表している。ただし、この複数の要素には、同一のインデックス値を記録するものとしている。例えば、図30では、通常のプレデコードテーブルDT1において、エンコード値が「2」に対応するインデックス値は「2」である。エンコード値「2」は、図29を参照すれば、その拡張後のエンコード値は、「3」および「4」に対応することになる。そこで、これらのエンコード値に対応する要素には、それぞれ、エンコード値拡張前のエンコード値に対応付けられていたインデックス値「2」を記録する。
このようにして、差分エンコードテーブルのエンコード値の拡張に合わせてプレデコードテーブルのエンコード値の範囲も拡張させれば、1つの差分値を複数の数値で表す場合であっても、容易にエンコード処理およびデコード処理を行うことが可能になる。エンコード処理の過程で、差分値を累積していくにあたり、2つの数値で1つの差分値を表す部分については、エンコード値が1つ増加したとしても、プレデコードテーブルDT1bでは、同じインデックス値を示すことになり、同一のドット配置を表すことになるからである。そのため、本変形例においても、図27のエンコード処理と、図22のデコード処理とをそのまま実行することで、上述した通常の差分エンコードテーブルETDを用いたハーフトーン処理と同等のハーフトーン処理を実現することができる。
(H−2)差分エンコードテーブルの第2の変形例:
図31は、差分エンコードテーブルETDの第2の変形例を示す説明図である。図31(a)には、図25(b)に示した通常の差分エンコードテーブルETDの一部を示し、図31(b)には、本変形例における差分エンコードテーブルETD3の一部を示している。本変形例の差分エンコードテーブルETD3についても、各要素に、4ビットの差分値DV、すなわち、「0」から「15」までの差分値DVを記録可能としている。
かかる第2の変形例においても、第1の変形例と同様に、差分値が「15」を超える部分について、除数としての「15」と剰余の数とで、1つの差分値を表すことに相違はない。しかし、本変形例では、予め定めたビット数で表現可能な最大値(本変形例では「15」)をエスケープシーケンスコード(以下、「ESCコード」という)として扱い、エンコード処理時に、差分エンコードテーブルETD3内の各数値(各差分値)を入力する過程において(図27のステップS808)、入力した数値がESCコードであれば、予め定めたビット数で表現可能な最大値「15」に対して、次に参照する数値を加算する処理を行うものとする(つまり、剰余が読み込まれるまで、加算を行う)。
このように、本変形例では、「15」という数値に対して、上述のように特殊な意味を持たせたため、図31(a)のエンコード値「2」の部分のように、差分値が「30」の場合には、上述した第1の変形例では、「15」と「15」の2つの数値によってこの差分値を表すことになるが、本変形例では、「15」と「15」と「0」の3つの数値によってこの差分値を表すことになる。
上述したように、本変形例では、図27のエンコード処理のステップS808において差分エンコードテーブルETD3から入力した数値がESCコードである場合に、次々に数値を読み込んでこれらを加算していく処理を行うため、エンコード処理を行えば、その過程で自動的に、図31(b)に示した本変形例の差分エンコードテーブルETD3を、図31(a)に示した元の差分エンコードテーブルETDに逆変換しながらエンコード処理を行っているといえる。従って、第1の変形例のように、プレデコードテーブルDT1の形式までを変更するまでもなく、ハーフトーン処理を行うことが可能になる。
なお、本変形例では、予め定めたビット数で表現可能な最大値をESCコードとして表すものとしたが、他の数値あるいは記号をESCコードとして扱うものとすることも可能である。
以上で説明した変形例としての差分エンコードテーブルETD2,ETD3は、エンコード処理時におけるSRAM156への入力の際に、そのままの形式でSRAM156に入力するものとしてもよい。また、元の差分エンコードテーブルETDの形式に復元した上で入力するものとしてもよい。また、元の差分エンコードテーブルETDの形式に復元した上で、更に、通常のエンコードテーブルETの形式まで復元させて入力するものとしてもよい。
(I).変形例:
以上、本発明の実施例について説明したが、本発明はこのような実施例に限定されず、その趣旨を逸脱しない範囲で種々の構成を採ることができることはいうまでもない。例えば、画像処理ASIC155によってハードウェアによって実現した機能を、CPU151による所定のプログラムの実行によってソフトウェア的に実現するものとしてもよい。その他、以下のような変形が可能である。
(I−1)第1変形例:
上記実施例のデータ量削減処理では、図16を用いて説明したように、エンコードテーブルETの中から最大ステップ数を求め、この最大ステップ数に応じて必要な領域を2次元テーブルとしてRAM152に確保するものとした。従って、データ量の削減によって生成された圧縮エンコードテーブルETCは、図17に示したように、最大ステップ数に該当するブロックについては、過不足無く階調閾値が記録されているが(図17の例では、ブロック番号4)、他のブロックについては、依然として、「0」となる階調閾値が残存している。図25(b)に示した差分エンコードテーブルETDについてもこの点は同様である。そこで、本変形例では、初期値としての「0」が残存しているすべての要素について削減する処理を行う。
図32は、後述する本変形例のテーブル生成処理において作成される圧縮エンコードテーブルETC2の一例を示す説明図である。この圧縮エンコードテーブルETC2は、図示するように、一意のアドレスに対して、ブロック番号とエンコード値と階調閾値とが対応付けられている。この圧縮エンコードテーブルETC2は、図10に示したエンコードテーブルETから、エンコード値が1以上の要素に存在する階調閾値が「0」の部分を取り除き、残存した階調閾値を、そのブロック番号とエンコード値と共に、連続した一意のアドレスに連続的に対応付けたものとなる。このような圧縮エンコードテーブルETC2を作成すれば、図17に示した実施例における圧縮エンコードテーブルETCよりも、更にデータ量を削減することができる。
なお、本変形例では、図32の圧縮エンコードテーブルETC2を参照する際に、任意のブロックについてアクセスが容易となるように、各ブロックの先頭アドレスを別テーブルとして用意する。図33には、このようなアドレステーブルATを示した。図示するように、このアドレステーブルATには、各ブロックのブロック番号に対応付けて、そのブロックの先頭アドレスが記録されている。このアドレステーブルATを参照すれば、上述したエンコード処理において、容易に目的のブロックの階調閾値を取得することができる。
図34は、図32に示した本変形例の圧縮エンコードテーブルETCと、図33に示したアドレステーブルATを生成するためのテーブル作成処理のフローチャートである。このテーブル作成処理の大部分は、図13に示した実施例におけるテーブル生成処理の処理内容と同じであるため、異なる部分を重点に説明する。図34に示した本変形例のテーブル生成処理において、図13と異なる処理内容については、ステップ番号の末尾に「b」と付している。
このテーブル作成処理が実行されると、まず、CPU151は、RAM152内に、全ての要素を「0」とした圧縮エンコードテーブルETC2と、プレデコードテーブルDT1を用意する(ステップS200b)。かかる処理によって用意する圧縮エンコードテーブルETC2の容量は、全てのブロックについてエンコード値が「0」から「31」まで8ビットの階調閾値を記録可能な最大限の容量とする。
圧縮エンコードテーブルETC2とプレデコードテーブルDT1とを用意すると、CPU151は、現在の処理対象とするブロック番号Nを「0」とするとともに、アドレスカウンタCを「0」とする(ステップS210b)。このアドレスカウンタCは、図28に示したアドレステーブルATに対して、各ブロックの先頭アドレスを記録するために用いるカウンタである。
続いて、CPU151は、アドレステーブルの現在のブロック(すなわち、ブロック番号0)に対応する先頭アドレスとして、現在のアドレスカウンタCの値をセットする(ステップS215b)。こうすることで、ブロック番号が「0」のブロックについては、その先頭アドレスは、アドレス「0」に設定される。
以下、ステップS220からステップS260までの処理は、図13に示した処理と同一の処理である。すなわち、以降の処理で用いられる変数として、エンコード値EVを「0」とし、現在のブロック内に発生する各サイズ(Sドット,Mドット,Lドット)のドット数をそれぞれ「0」とする(ステップS220)。そして、現在の入力階調値TDを「0」とする(ステップS230)。更に、CPU151は、現在の入力階調値TDに基づき、現在のブロック内に発生するドット数を決定するドット数カウント処理を行い(ステップS240)、各サイズのドット数のいずれかが変化すれば(ステップS250)、現在のブロック番号Nおよびエンコード値EVに対応する各サイズのドット数を、上記ステップS240でカウントされた値に更新する(ステップS260)。
上記実施例では、この後、エンコードテーブルETの現在のブロック番号Nおよびエンコード値EVに対応する要素に、階調閾値として、現在の入力階調値TDをセットするものとして。これに対して、本変形例では、圧縮エンコードテーブルETC2のアドレスCに、階調閾値として現在の入力階調値TDをセットするとともに、現在のブロック番号Nとエンコード値EVとをセットする(ステップS270b)。そして、実施例と同じく、プレデコードテーブルDT1にインデックス値をセットする(ステップS280)。インデックス値をプレデコードテーブルDT1にセットすると、CPU151は、実施例と同じく、現在のエンコード値EVをインクリメントするが、このとき、本変形例では、同時に、アドレスカウンタCについてもインクリメントする(ステップS290b)。
以下、ステップS300からステップS340までの処理は、実施例と同じ処理内容のため説明を省略する。以上の処理により、アドレスカウンタCが1つずつインクリメントされながら、各アドレスに、ブロック番号とエンコード値と階調閾値とが対応付けて記録されることになる。最後に、CPU151は、予め最大限の容量を確保しておいた圧縮エンコードテーブルETC2から、ブロック番号、エンコード値、階調閾値がすべて「0」のまま残存している領域を削除する。こうすることで、図32に示した本変形例の圧縮エンコードテーブルETC2が生成されることになる。なお、本変形例では、図6に示した初期化処理のステップS150におけるデータ量削減処理は実行しない。上述した本変形例のテーブル作成処理によって、データ量の削減が同時に行われるからである。
以上で説明した第1変形例によれば、実質的に階調値が対応付けられていないエンコードテーブルET内の要素をすべて削除することができるため、実施例において生成した圧縮エンコードテーブルETCよりもさらにデータ容量の少ない圧縮エンコードテーブルETC2を生成することが可能になる
なお、本変形例のテーブル生成処理によって生成された圧縮エンコードテーブルETC2において、同じブロックに属する各階調閾値について差分を算出することで、差分エンコードテーブルETDについても、図32と同様に、連続したアドレス空間に各差分値を記録した形式とすることができる。図35には、かかる差分エンコードテーブルETD4の例を示している。
なお、本変形例では、各ブロックの先頭アドレスを示すアドレステーブルATを生成するものとしたが、それ以外にも、例えば、各ラスタの先頭位置に対応するアドレスが分かるテーブルや、SRAM156への読み出し単位の先頭アドレスが分かるテーブル、前回の読み出しが終了したアドレスの位置を示すポインタなどを管理することで、圧縮エンコードテーブルETC2あるいは差分エンコードテーブルETD4から必要なデータを容易に読み込むが可能になる。
(I−2)第2変形例:
上記実施例では、エンコードテーブルETについてデータ容量を削減するものとした。これに対して、図16に示したデータ量削減処理と同じ内容の処理を、図12に示したプレデコードテーブルDT1について実行することで、エンコードテーブルETだけではなく、プレデコードテーブルについても同様にデータ容量を削減することが可能である。また、上記第2変形例で図27に示した圧縮エンコードテーブルETC2のデータ形式も、プレデコードテーブルDT1のデータ形式に適用することが可能である。
(I−3)第3変形例:
上記実施例では、デコード処理時に、プレデコードテーブルDT1と、ポストデコードテーブルDT2と、順序値テーブルSTの3つのテーブルを参照することで、エンコード値EVからドット配置データを生成するものとした。しかし、これらのテーブルを1つに統合することで、エンコード値EVを直接ドット配置データに変換することも可能である。
図36は、エンコード値EVとブロック番号から、直接、ドット配置データを取得することのできるテーブル(以下、「ダイレクトデコードテーブルDDT」という)の一例を示す説明図である。このダイレクトデコードテーブルDDTには、エンコード値EVとブロック番号とに対応付けて、図4に示したドット配置データがそれぞれ記憶されている。このダイレクトデコードテーブルDDTの各要素に記憶されているドット配置データは、プレデコードテーブルDT1内に記憶されたインデックス値を、ポストデコードテーブルDT2と順序値テーブルSTに基づき、すべてドット配置データに変換したデータに他ならない。つまり、上記実施例によってプレデコードテーブルDT1を作成した後、このプレデコードテーブルDT1内のすべてのインデックス値について、図22のデコード処理を行えば、図36に示したダイレクトデコードテーブルDDTを生成することができる。このように、予めダイレクトデコードテーブルDDTを生成するものとすれば、1つのテーブルを参照するだけで、デコード処理が完了するため、より高速にハーフトーン処理を行うことが可能になる。
(I−4)第4変形例:
上記実施例では、プリンタ100は、複合機タイプであるものとし、単体で、画像データの入力からハーフトーン処理、インクの吐出制御まで行うものとした。これに対して、プリンタ100にコンピュータを接続し、コンピュータにおいて、画像データの入力と、ハーフトーン処理の一部、すなわち、エンコード処理までを実行するものとしてもよい。このような構成では、コンピュータに所定のプログラムをインストールすることで、実施例に記載した初期化処理やハーフトーン処理と同様の処理を実現することができる。プリンタ100は、コンピュータからプリンタケーブル等を経由してエンコード値EVを受信すると、そのエンコード値EVに応じてデコード処理を行い、印刷機構を制御して、印刷用紙への印刷を行う。
このように、コンピュータでエンコード処理までを実行するものとすれば、C,M,Y,Kの各色毎に、8ビット(255階調)のデータサイズを有する画像データが、5ビットのエンコード値EVに変換されるため、コンピュータとプリンタ100間の通信量を削減することができる。この結果、全体として印刷速度を向上させることが可能になる。
また、データの通信速度よりも、プリンタ100内における処理速度が問題となるような場合にあっては、エンコード処理だけではなくデコード処理もコンピュータで行わせるものとすることができる。こうすることにより、プリンタ100の処理負担を軽減させることができるので、全体として印刷速度を向上させることが可能になる。また、このように、コンピュータで、エンコード処理とデコード処理の両者を実行するものとすれば、ハーフトーン処理に要するハードウェアが不要となるため、プリンタ100の製造コストを削減することが可能になる。
(I−5)第5変形例:
上述した実施例では、エンコードテーブルET内の各階調値の差分を求め、これを差分エンコードテーブルETDに記録するものとしたが、更に、この差分値についての差分を求め、これを記録するものとしてもよい。つまり、多段階の差分演算を行うことで差分エンコードテーブルを生成するものとしてもよい。かかる場合には、エンコード処理の過程において、複数回の累積加算を行うことで、元の階調値を算出することができる。また、エンコードテーブルET内の階調値の差分を求め、この差分値の最小値を別途RAM152に記憶しておき、各差分値とこの最小値との差を、各エンコード値に対応付けるものとしてもよい。こうすることで、差分値をより小さな値で表すことが可能になる。