以下、上述した本発明の作用・効果を一層明らかにするため、本発明の実施の形態を実施例に基づき次の順序で説明する。
(A)プリンタの構成:
(B)印刷処理:
(C)初期化処理:
(D)ハーフトーン処理:
(D−1)エンコード処理:
(D−2)デコード処理:
(E)エンコード処理の他の方法:
(F)変形例:
(A)プリンタの構成:
図1は、本発明の実施例としてのプリンタ100を示す説明図である。プリンタ100は、複合機タイプのプリンタであり、光学的に画像を読み込むスキャナ110や、画像データの記録されたメモリカードMCを挿入するためのメモリカードスロット120、デジタルカメラ等の機器を接続するUSBインタフェース130等を備えている。プリンタ100は、スキャナ110によって取り込んだ画像や、メモリカードMCから読み込んだ画像、USBインタフェース130を介してデジタルカメラから読み込んだ画像等を印刷用紙Pに印刷することができる。また、プリンタ100は、プリンタケーブル等によって接続された図示していないパーソナルコンピュータから入力した画像の印刷も行うことができる。
プリンタ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を搬送する。
プリンタ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は、CMY画像を構成する各画素の階調値(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」)までのデータが入力される(図17参照)。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(図11参照)、ポストデコードテーブル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には、各エンコード値EVに対応付けて、そのエンコード値EVに対応する階調値の範囲が代表階調値というパラメータにより記録されていることになる。
図11は、プレデコードテーブルDT1のデータ構造を示す説明図である。図示するように、このプレデコードテーブルDT1には、ブロック番号とエンコード値EVとに対応付けて、図8に示したポストデコードテーブルDT2のインデックス値が記録されている。図3に示したデコードユニット420は、そのデコード処理時に、中間バッファBFに記憶されたエンコード値EVを読み込み、このポストデコードテーブルDT2を参照することで、エンコード値EVをインデックス値に変換する。なお、インデックス値の範囲は、本来、「0」から「164」までであるが、図11には、「255」というインデックス値が記録されている部分がある。しかし、これは、単なるダミーのデータであり、デコード処理時には参照されない部分である。
ここで、デコード処理の内容を簡単に説明する。デコードユニット420は、図11に示したプレデコードテーブルDT1を参照してエンコード値EVをインデックス値に変換すると、図8のポストデコードテーブルDT2を参照することで、インデックス値に対応するドット数データを取得する。そして、このドット数データと、図7に示した順序値テーブルSTとに基づき図4に示したドット配置データを生成する。こうすることで、デコードユニット420は、エンコード値EVに基づきドット配置データを生成することができる。このデコード処理についての詳細な説明は後述する。
以上、本実施例における初期化処理の流れについて説明した。以下では、上述したステップS140におけるテーブル生成処理の内容を詳細に説明する。
(C−1)エンコードテーブル及びプレデコードテーブル生成処理:
図12は、図6のステップS140で実行されるテーブル生成処理(エンコードテーブル及びプレデコードテーブル生成処理)の詳細を示すフローチャートである。この処理が実行されると、CPU151は、まず、RAM152に、すべての要素を「255」に設定したエンコードテーブルETとプレデコードテーブルDT1を用意する(ステップS200)。
すべての要素を「255」に設定したエンコードテーブルETとプレデコードテーブルDT1を用意すると、CPU151は、現在の処理対象とするブロック番号Nを「0」とし(ステップS210)、更に、以降の処理で用いられる変数として、エンコード値EVを「0」とし、現在のブロック内に発生する各サイズ(Sドット,Mドット,Lドット)のドット数をそれぞれ「0」とする(ステップS220)。そして、更に、現在の入力階調値TDを「0」とする(ステップS230)。
続いて、CPU151は、上記ステップS220で設定した入力階調値TDに基づき、現在のブロック内に発生する各サイズのドット数を決定するドット数カウント処理を実行する(ステップS240)。
図13は、上記ステップ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)。
図14は、上述したドット数カウント処理の具体例を示す説明図である。図14(a)に示すように、ここでは、ドット発生量テーブルDGTにおいて、現在の入力階調値TDに対応するLドットのドット発生量が「409」、Mドットが「1550」、Sドットが「1304」だとし、現在のブロックに対応する閾値群が、図7(b)に示した閾値群であったとする。
この場合、まず、図13のステップS420では、閾値群内の最も低い閾値「23」と、Lドットのドット発生量「409」とが比較される。そうすると、このドット発生量「409」の方が、閾値「23」よりも大きいので、ステップS420では、「Yes」と判定され、ステップS430によってLドットのカウント数がインクリメントされて「1」になる。そうすると、ステップS450によって、総カウント数nがインクリメントされるため、続くステップS420では、2番目に低い閾値「472」とLドットのドット発生量「409」が比較される。この場合、閾値「472」よりもドット発生量「409」の方が小さくなるので、ステップS420では、「No」と判定され、処理がステップS460に進む。この時点で、Lドットのカウント数は、図14(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サイズのカウント数は、図14(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サイズのドットのカウント数がインクリメントされ、図14(d)に示すように「2」となる。すると、現在の総カウント数nは「7」であるため、ステップS440において、「Yes」と判定され、各サイズのドットのカウント数が確定する。すなわち、以上で示した例では、Lドットが1個、Mドットが5個、Sドットが2個となる。
以上、図14を用いて説明したように、上述したドット数カウント処理では、最初に、Lドットの発生数が決定され、つづいて、Mサイズ、Sサイズのドットの発生数が決定される。各サイズの発生数を決定する際には、各サイズのドット発生量を加算しつつ閾値との比較を行っていくので、最終的には、図14(d)に示すように、各サイズのドットの数は、ブロック内に各サイズのドットが重複せずにLドットから順に配置することが可能な数になる。また、上述したドット数カウント処理では、全サイズのドットのドット発生量の累積値を超えた閾値が参照されると、その時点で処理が終了する。そのため、毎回、閾値をすべて参照する必要が無い。従って、各サイズのドットのカウント処理が高速化され、ひいては、初期化処理を高速に行うことが可能になる。
説明を図12に戻す。図12のステップS240、すなわち、図13に示したドット数カウント処理が実行されて、各サイズのドット数が確定すると、次に、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に戻す。こうすることで、CPU151は、現在のブロックについて入力階調値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)、当該テーブル生成処理を終了する。当該テーブル生成処理によれば、図10に示したエンコードテーブルETと、図11に示したプレデコードテーブルDT1とが生成されることになる。
以上、図5のステップS10で実行される初期化処理の全内容を説明した。以下では、この初期化処理によって生成された種々のテーブルを用いて実行されるハーフトーン処理の詳細な処理内容について説明する。
(D)ハーフトーン処理:
図15は、図5に示した印刷処理のステップS40で実行されるハーフトーン処理のフローチャートである。このハーフトーン処理は、上述した初期化処理において生成した各テーブル(エンコードテーブルET、プレデコードテーブルDT1、ポストデコードテーブルDT2、順序値テーブルST)を順次参照することで、CMY画像の各画素について、それぞれドット配置データを生成する処理である。
このハーフトーン処理が実行されると、画像処理ASIC155は、まず、図3に示したエンコードユニット410を用いて、処理対象の画素の各色(C,M,Y,K,Lc、Lm)の階調値を、それぞれエンコード値EVに変換するエンコード処理を行う(ステップS800)。
(D−1)エンコード処理:
図16は、エンコード処理の詳細な処理内容を示すフローチャートである。このエンコード処理は、入力画素の階調値を、エンコード値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内のブロックの位置を容易に求めることができる。
図17は、ブロック番号の計算方法の概念を示す説明である。図7(a)に示したディザマトリックスデータDMは、横方向に128ブロック、縦方向に64ブロックの計8192個のブロックを有する。そのため、1枚の入力画像データを、128画素×64画素を単位として分割し、かかる単位内の各画素に対して、ブロック番号が0から8191まで割り振られるように、ブロック番号の計算を行う。すなわち、図17のように、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)
図18は、ブロック番号の他の計算方法の概念を示す説明図である。図17に示したブロック番号の計算例では、1枚の画像データ内に複数のディザマトリックスDMがタイル状に等しく並べられることを想定してブロック番号の計算を行っている。これに対して、図18では、タイル状に配置されたディザマトリックスデータDMのうち、偶数行のディザマトリックスデータDMを、奇数行のディザマトリックスデータDMに対してX方向に64画素ずらして並べている。このように、ディザマトリックスDMをずらして画像内に配置するものとすれば、ディザマトリックスDMの繰り返しパターンの傾向が出力画像に現れることを抑制できるため、画質を向上させることができる。
本実施例では、エンコードユニット410は、ライン単位でCMY画像を入力するものとしたため、図17や図18を参照すれば、最初のラインについては、ブロック番号として「0」から「127」が繰り返して適用されることになる。従って、本実施例では、エンコードユニット410がエンコード処理を実行するに当たり、入力したラインのY座標に応じて、予めエンコードテーブルETの必要な部分についてのみSRAM156に入力しておく。こうすることで、各画素の階調値を取得する度に、SRAM156よりもアクセス速度の遅いRAM152にエンコードテーブルETを読みに行く必要が無くなり、処理を高速化することが可能になる。
図16のステップS804によって、ブロック番号の計算が完了すると、エンコードユニット410は、これから求めようとするエンコード値EVの値を「0」に初期化する(ステップS806)。そして、図10に示したエンコードテーブルET(実際には、SRAM156に読み込まれた部分的なエンコードテーブルET)を参照して、ステップS804で算出されたブロック番号および現在のエンコード値EVに対応する代表階調値GVtを取得する(ステップS808)。
代表階調値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に対応する代表階調値GVtを取得して、再び、代表階調値GVtと階調値GVとの比較を行う。こうして、比較を繰り返した結果、ステップS810において、初めて階調値GVが、代表階調値GVt未満となれば(ステップS810:No)、そのときのエンコード値EVの値が、エンコード結果のエンコード値EVとして確定する(ステップS816)。
以上で説明したエンコード処理によれば、図10に示したエンコードテーブルETを参照することにより、入力画素の階調値を、その画素が属するブロックに応じて、5ビットのエンコード値に変換することができる。エンコードユニット410は、このエンコード処理を、CMY画像の全画素について実行する。
説明を図15に戻す。上述したエンコード処理によって、エンコードユニット410は階調値をエンコード値EVに変換すると、その値を、RAM152内の中間バッファBFにバッファリングする(ステップS820)。上述したエンコード処理の結果、この中間バッファBFには、8ビットの階調値ではなく、5ビットのエンコード値EVが格納されることになるため、RAM152の記憶容量を大幅に削減することができる。
エンコードユニット410によってエンコード値EVが中間バッファBFにバッファリングされると、次に、デコードユニット420が、このエンコード値EVに基づき、図4に示したドット配置データを生成するデコード処理を実行する(ステップ840)。このデコード処理は、画像データを構成する全ての画素についてエンコード値EVがバッファリングされることを待つことなく、1つでもエンコード値EVがバッファリングされるとデコードユニット420によって実行される。つまり、エンコード処理とデコード処理とは、同時並列的に実行されることになる。
(D−2)デコード処理:
図19は、デコード処理の詳細なフローチャートである。このデコード処理が実行されると、デコードユニット420は、まず、中間バッファBFに蓄積されたエンコード値EVを読み出す(ステップS822)。このデコード処理においても、1ライン分に相当するエンコード値EVをライン単位で中間バッファBFから読み出す。
エンコード値EVを読み出した後、デコードユニット420は、処理対象のエンコード値EVの生成元である画素が属するブロック番号の計算を行う(ステップS824)。エンコード値EVは、エンコード処理された順序で中間バッファBFにバッファリングされているため、この順序通りにエンコード値EVを読み出せば、そのエンコード値EVに対応するブロック番号も上述した計算方法によって自ずと算出することができる。なお、デコード処理においても、RAM152に記憶されたプレデコードテーブルDT1および順序値テーブルSTの中から、デコード処理に必要なブロック番号に該当する部分のみを予めSRAM156に入力しておくものとする。
ブロック番号の計算を行うと、デコードユニット420は、図11に示したプレデコードテーブルDT1(実際には、SRAM156に入力された部分的なプレデコードテーブルDT1)を参照して、ステップS822において取得したエンコード値EVと、ステップS824によって求めたブロック番号とに対応したインデックス値を取得する(ステップS826)。そして、更に、ポストデコードテーブルDT2を参照して、このインデックス値に対応するドット数データを取得する(ステップS828)。このポストデコードテーブルDT2については、テーブル全体を予めSRAM156に入力しておくものとする。ポストデコードテーブルDT2は比較的容量が少ないため(165×16ビット=330バイト)、SRAM156の容量を圧迫することはないからである。ポストデコードテーブルDT2からドット数データを取得すると、デコードユニット420は、各サイズのドットをブロック内に配置するドット配置処理を実行する(ステップS830)。
図20は、ドット配置処理の詳細なフローチャートである。図21は、このドット配置処理によるドットの配置工程を模式的に示す説明図である。図20に示すように、このドット配置処理が実行されると、デコードユニット420は、まず、現在のブロックに対応する順序値データ(図7(c)参照)を、SRAM156に部分的に記憶された順序値テーブルST(図7(d)参照)から取得する(ステップS900)。そして、これからドットを配置するブロック内の全要素に対して、「ドット無し」を表すドットサイズ値「00」を設定して初期化し(ステップS910)、これからドットを配置しようとするブロック内の位置を、図21(a)に示す「a」の位置(最も左上の位置)に設定する(ステップS920)。
ドットを配置しようとする位置を設定すると、デコードユニット420は、現在のドット位置に対応する順序値を順序値データから取得する(ステップS930)。図21(b)には、順序値テーブルSTから入力した順序値データの一例を示している。図示した例では、現在の位置「a」に対応する順序値は、「5」となるため、上記ステップS930では、この値「5」が取得される。
次に、デコードユニット420は、ポストデコードテーブルDT2から取得したドット数データから、ステップS930で取得した順序値に対応するドットサイズ値を取得する(ステップS940)。具体的には、ドット数データの下位ビット側から2ビット毎に、ステップS930で取得した順序値の値分だけ数え、その位置に記録されたドットサイズ値を取得する。図21(c)には、ポストデコードテーブルDT2から取得したドット数データの一例を示している。かかる図において、順序値「5」に対応するドットサイズ値は、ドットサイズデータの下位ビットから数えて6つめのドットサイズ値「01」である。ドットサイズ値「01」は、Sサイズのドットであることを表す。
ドットサイズ値を取得すると、CPU151は、取得したドットサイズ値を、ブロック内の現在の位置に設定する(ステップS950)。つまり、図21(d)に示すように、現在の位置が「a」の位置であれば、かかる位置に、図21(c)のドット数データから取得されたドットサイズ値「01」を設定する。
現在の位置にドットサイズ値を設定すると、CPU151は、全ての位置についてドットサイズ値の設定が終了したか否かを判断する(ステップS960)。その結果、全ての位置についてドットサイズ値の設定が終了していれば(ステップS960:Yes)、当該ドット配置処理を終了する。一方、終了していなければ、ブロック内の現在の位置をa,b,c,d,・・・の順(図21(a)参照)に移動し(ステップS970)、処理を上記ステップS930に戻す。こうすることで、他の位置についてドットサイズ値の設定を行う。
以上で説明したドット配置処理が、中間バッファBFにバッファリングされたすべてのエンコード値EVについて完了すれば、デコードユニット420によるデコード処理が完了する。このデコード処理によって生成された各ドット配置データは、インク吐出制御ユニット500に引き渡され、インクヘッド211によるドットの形成に供される。なお、本実施例では、順序値テーブルを参照することで、ドットの配置を行うものとしたが、ディザマトリックスデータDM内の該当するブロックを直接参照し、閾値の低い要素から順にドットを発生させることで、ドットの配置を行うものとしてもよい。
以上で説明した本実施例のハーフトーン処理によれば、次のような効果が生じる。すなわち、図21(d)に示したドット配置データの生成結果と、図21(b)に示した4×2の順序値データとを対比してみると、サイズの大きなドットから順に、ドットが重複無く順序値の低い位置に配置されていることがわかる。順序値が低いということは、その順序値に対応する閾値の値が低いということになる(図7(b)参照)。図7(a)に示したディザマトリックスデータDMは、組織的ディザ法におけるディザパターンとしての性質上、閾値は、その値が低いほど分散性よく配置されており、その値が高くなるほど、既に配置された閾値の場所を避けるように配置されている。そのため、図21(d)に示したドット配置データでは、最も大きなサイズのドットから優先的に、低い順序値、すなわち、低い閾値の場所に配置されることになり、大きなサイズのドットほど、分散性がよく配置されることになる。従って、本実施例におけるドットの配置方法によれば、印刷用紙上で目立つことになる大きなドットの分散性を最も高めることができるため、出力画像の画質を大幅に向上させることが可能になる。
また、本実施例において、ディザマトリックスデータDMとしてドットを良好に分散させることのできるブルーノイズ特性を有するマトリックスを用いれば、マトリックス内のどのブロックが何階調になるのか特別な規則性がないことになり、ブロック毎にエンコード値の取り得る値が異なることになる。そのため、従来の濃度パターン法などでは、階調値に応じて画一的に多値化を行うため、実質的な階調数が低減してしまう可能性があったが、本実施例では、ハーフトーン処理を4×2ドットのブロック単位で行いながらも、ディザマトリックス内におけるそのブロックの位置に応じて、ドットの発生パターンが様々に変化することになる。この結果、従来の多値化手法よりも大幅に出力画像の画質を向上させることができる。
また、本実施例では、ハーフトーン処理に用いる各種テーブルを、ディザマトリックスデータDMとドット発生量テーブルDGTとに基づき生成するものとしたため、ディザマトリックスデータDM内の閾値の配置について適宜最適化を図ることにより、比較的容易に出力画像の画質を向上させることができる。つまり、本実施例では、ブロック毎にそのブロックの位置に応じたハーフトーン処理を行うことのできるテーブルの構造を採用したので、従来の多値化で用いられていた画一的な変換テーブルよりも柔軟に画質の向上を図ることが可能になる。
また、本実施例のハーフトーン処理によれば、エンコードテーブルETと、プレデコードテーブルDT1と、ポストデコードテーブルDT2と、順序値テーブルSTとを順次参照していくことで、CMY画像に対するハーフトーン処理が完了する。従って、誤差拡散法などの他のハーフトーン処理のように、誤差を分散させるような複雑な演算を行うことなく極めて高速なハーフトーン処理を実現することができる。
また、本実施例では、ハーフトーン処理を、エンコード処理とデコード処理との2段階の処理に分割し、エンコード処理の結果生成されたエンコード値EVを、RAM152内の中間バッファBFに一時的に蓄積するものとした。従って、デコード処理以降に、印刷機構によるドットの形成に時間を要する場合であっても、エンコード処理の結果得られたエンコード値EVを、RAM152にバッファリングすることで、早期にエンコード処理のみを終了させることができる。この結果、CPU151を印刷に関する処理から迅速に解放することが可能になる。また、この中間バッファBFには、各色8ビット(255階調)のデータ容量を有するCMY画像のデータが、エンコード処理によって、各色5ビットのエンコード値EVに減縮されて記憶されるため、RAM152の記憶容量を大幅に削減することができ、コストダウンを図ることが可能になる。
なお、本実施例では、図5に示したように、印刷処理が実行される度に初期化処理を実行するものとして説明したが、初期化処理は、その他のタイミングで実行するものとしてもよい。例えば、プリンタ100の電源投入時に実行されるものとしてもよいし、ユーザによって、印刷用紙や印刷モードの設定が変更された際に実行されるものとしてもよい。
(E)エンコード処理の他の方法:
ここで、上述したエンコード処理の他の処理方法について説明する。図16に示したエンコード処理では、エンコード値を順次加算していき、そのエンコード値に対応する代表階調値が初めて現在の階調値以上となる場合に、そのエンコード値を目的のエンコード値として出力している。換言すれば、この処理では、昇順に並んだエンコードテーブルET内の代表階調値と、比較の対象となる階調値とを順次比較して、その階調値と等しいか、もしくは大きい代表階調値のうち、最小の代表階調値の順位を探索し、この順位を、エンコード値として出力していることになる。以下では、このエンコード処理を、二分探索の手法を応用したシンプルな回路によって効率的に実現する方法を説明する。
図22は、画像処理ASIC155内に構成されるエンコード値探索ユニット600の概略構成を示す説明図である。このエンコード値探索ユニット600は、図3に示したエンコードユニット410と同様の機能を果たすユニットである。エンコード値探索ユニット600は、第1比較回路610と、第2比較回路620と、第3比較回路630と、第4比較回路640と、第5比較回路650とを備えている。これらの比較回路は、図示するように、それぞれ直列的に接続されている。
第1比較回路610は、「0」から「255」までのいずれかの値をとる8ビットのCMY階調値を色変換ユニット300から入力する。第1比較回路610は、更に、上述したブロック番号の計算方法によって算出された現在のブロック番号に対応する32個の代表階調値(以下、「テーブルデータ」という)をエンコードテーブルETから昇順に入力する。各テーブルデータは、「0」から「255」のいずれかの値をとる8ビットのデータである。そのため、第1比較回路610は、エンコードテーブルETから計32バイトのテーブルデータを入力することになる。
第1比較回路610は、エンコードテーブルETから入力した32個のテーブルデータの中央値と、色変換ユニット300から入力したCMY階調値との比較を行う。そして、32個のテーブルデータの中央値(厳密には、最小値から数えて16番目の値)よりもCMY階調値が大きければ、中央値よりも大きなテーブルデータを16個選択する。このとき、第1比較回路610、この比較の結果を記憶する結果ビットの値を「1」にセットする。逆に、32個のテーブルデータの中央値よりもCMY階調値が小さければ、中央値よりも小さなテーブルデータを16個選択する。このとき、結果ビットには、「0」をセットする。第1比較回路610は、上述のように選択した16個のエンコード値と、結果ビットと、CMY階調値とを、第1比較回路610の後段に接続された第2比較回路620に転送する。
第2比較回路620は、第1比較回路610から16個のテーブルデータとCMY階調値と結果ビットとを入力する。そして、第1比較回路610と同様に、入力した16個のテーブルデータの中央値とCMY階調値との比較を行い、その結果選択した8個のエテーブルデータと、2つの結果ビットと、CMY階調値とを、第3比較回路630に転送する。第3比較回路、第4比較回路、第5比較回路でも、こうした処理が同様に行われる。この結果、第5比較回路からは、最終的に、5ビット分の結果ビットが出力される。この5ビットの結果ビットが表す値が、エンコード処理結果としてのエンコード値になる。以下、各比較回路の詳細な構成と比較処理の具体例とを説明する。
図23は、第1比較回路610の回路ブロック図である。図示するように、第1比較回路610は、32個のテーブルデータレジスタRG0a〜RG31aと、16個のセレクタSL0a〜SL15aと、比較器CPaと、CMY階調値を入力するための階調値レジスタGRaとを備えている。
階調値レジスタGRaは、色変換ユニット300からCMY階調値を入力して記憶する。階調値レジスタGRaは、記憶したCMY階調値を、そのまま、第2比較回路620に転送する。
テーブルデータレジスタRG0a〜RG31aは、SRAM156を介してエンコードテーブルETから現在のブロックに対応する32個のテーブルデータを昇順に入力する。
各セレクタSL0a〜SL15aには、それぞれ、2組のテーブルデータレジスタが接続されている。例えば、セレクタSL0aには、テーブルデータレジスタRG0aとテーブルデータレジスタRG16aとが接続され、セレクタSL0bには、テーブルデータレジスタRG1aとテーブルデータレジスタRG17aとが接続されている。つまり、セレクタの番号を「x」とすると、セレクタSL(x)aには、テーブルデータレジスタRG(x)aとテーブルデータレジスタRG(x+16)aとが接続されることになる。各セレクタには、更に、セレクト信号として、比較器CPaの出力値が入力される。各セレクタは、入力したセレクト信号が「0」であれば、自分自身に接続されている2つのエンコード値レジスタのうち、レジスタ番号の小さなレジスタを選択し、そのレジスタに記憶されているテーブルデータを第2比較回路620に出力する。一方、入力した出力値が「1」であれば、自身に接続されている2つのエンコード値レジスタのうち、レジスタ番号の大きなレジスタを選択し、そのレジスタに記憶されているテーブルデータを第2比較回路620に出力する。このように構成されたセレクタ群によれば、比較器CPaからのセレクト信号に応じて、テーブルデータレジスタRG0a〜RG15aに記録されたテーブルデータか、テーブルデータレジスタRG16a〜RG31aに記憶されたテーブルデータか、のいずれか16個のテーブルデータを第2比較回路620に対して出力することができる。
比較器CPaは、入力端子A,Bと、出力端子Cとを備えている。入力端子Aには、色変換ユニット300が接続され、CMY階調値が入力される。入力端子Bには、32個のテーブルデータの中央値としてテーブルデータレジスタRG15aに記憶されたデータが入力される。比較器CPaは、入力端子Aと入力端子Bとに入力した値を比較し、その比較結果が、「A>B」であれば、出力端子Cに「1」を出力する。これに対して、比較結果が「A≦B」であれば、出力端子に「0」を出力する。つまり、この比較器CPaによる処理と上述したセレクタ群による処理とによれば、CMY階調値がテーブルデータの中央値よりも大きければ、中央値よりも大きな値をもつテーブルデータが第2比較回路620に出力される。また、CMY階調値が中央値以下であれば、中央値以下の値をもつテーブルデータが第2比較回路620に出力される。出力端子Cからの出力値は、セレクタ群に対して出力されるほか、比較器CPaによる比較結果を表す結果ビット信号として、第2比較回路620にも出力される。
図24は、第2比較回路620の回路ブロック図である。図示するように、第2比較回路620は、16個のテーブルデータレジスタRG0b〜RG15bと、8個のセレクタSL0b〜SL7bと、比較器CPbと、CMY階調値を入力するための階調値レジスタGRbと、結果ビットレジスタRRbとを備えている。
テーブルデータレジスタRG0b〜RG15bには、第1比較回路610から転送された16個のテーブルデータが昇順に入力される。比較器CPbは、第1比較回路610の階調値レジスタGRaから入力したCMY階調値と、テーブルデータレジスタRG7bに記憶されたテーブルデータの中央値との比較を行う。この比較の結果はセレクト信号として各セレクタに入力される。CMY階調値がテーブルデータの中央値よりも大きければ、中央値よりも大きな値をもつテーブルデータレジスタRG8b〜RG15b内のデータがセレクタ群から第3比較回路630に出力される。これに対して、CMY階調値が中央値以下であれば、中央値以下の値をもつテーブルデータレジスタRG0b〜RG7b内のデータがセレクタ群から第3比較回路630に出力される。
結果ビットレジスタRRbは、第1比較回路610の比較器CPaから、結果ビットを入力して記憶する。記憶された結果ビットは、第2比較回路620の比較器CPbによる比較結果を表す結果ビットとともに、2ビットのデータとして第3比較回路630に出力される。
図25は、第3比較回路630の回路ブロック図である。また、図26は、第4比較回路640の回路ブロック図である。これらの回路は、レジスタやセレクタの数が異なるだけで、図24に示した第2比較回路620とほぼ同様の回路構成である。図25に示した第3比較回路630は、第2比較回路620から8個のテーブルデータと2ビットの結果ビットとCMY階調値とを入力して、第1比較回路610や第2比較回路620と同様の処理を行い、4個のテーブルデータと3ビットの結果ビットとCMY階調値とを出力する。図26に示した第4比較回路640は、これらのデータを入力すると、他の比較回路と同様の処理を行い、2個のテーブルデータと4ビットの結果ビットとCMY階調値とを第5比較回路650に出力する。
図27は、第5比較回路650の回路ブロック図である。第5比較回路650は、テーブルデータレジスタRG0e,RG1eと、比較器CPeと、結果ビットレジスタRReとを備えている。テーブルデータレジスタRG0e,RG1eには、第4比較回路640から出力された2つのテーブルデータが昇順に入力される。比較器CPeには、テーブルデータの中央値として、テーブルデータレジスタRG0eに記憶されたテーブルデータと、CMY階調値とが入力される。比較器CPeは、これらの値を比較し、その比較結果を、結果ビットとして出力する。結果ビットレジスタRReには、第4比較回路640から入力した4ビット分の結果ビットが記憶される。この4ビット分の結果ビットに、比較器CPeから出力される1ビット分の結果ビットを加えた5ビットの結果ビットが、最終的にエンコード値探索ユニット600から出力されるエンコード値を表す。このエンコード値は、エンコード値探索ユニット600から出力されて中間バッファBFに記憶される。なお、第5比較回路650の構成から、テーブルデータレジスタRG1eは省略してもよい。比較器CPeに入力されるデータは、常に、テーブルデータレジスタRG0eに記憶されたデータだからである。
図28は、エンコード値探索ユニット600によってエンコード値を求める具体的な例を示す説明図である。図28(a)には、第1比較回路610に入力される32個のテーブルデータの例を示すと共に、CMY階調値として「240」という値が入力された場合の比較の様子を示している。図23に示した回路構成によれば、第1比較回路610は、CMY階調値として「240」を入力すると、32個のテーブルデータの中央値である「80」と、このCMY階調値を比較する。そうすると、CMY階調値の方が大きい値であるため、第1比較回路610は、32個のテーブルデータのうち、中央値よりも大きい側のテーブルデータを16個選択して第2比較回路620に転送する。また、第1比較回路610は、この比較の結果により、結果ビットとして「1」を出力する。
図28(b)には、第2比較回路620に入力される16個のテーブルデータと、CMY階調値「240」との比較の様子を示している。第2比較回路620は、第1比較回路610から16個のテーブルデータを入力すると、この16個のテーブルデータの中央値「193」と、CMY階調値「240」との比較を行う。そうすると、やはり、CMY階調値の方が大きい値であるため、第2比較回路620は、16個のテーブルデータのうち、中央値よりも大きい側のテーブルデータを8個選択して第3比較回路630に転送する。また、第2比較回路620は、この比較の結果により、結果ビットとして「1」を出力し、この値を、第1比較回路610から出力された結果ビットの末尾に加える。つまり、第2比較回路620からは、2ビットの結果ビットとして、「11」という値が出力される。
図28(c)には、第3比較回路630に入力される8個のテーブルデータと、CMY階調値「240」との比較の様子を示している。第3比較回路630は、第2比較回路620から8個のテーブルデータを入力すると、この8個のテーブルデータの中央値「255」と、CMY階調値「240」との比較を行う。そうすると、今度は、CMY階調値の方が小さい値であるため、第3比較回路630は、8個のテーブルデータのうち、中央値よりも小さい側のテーブルデータを4個選択して第4比較回路640に転送する。また、第3比較回路630は、この比較の結果により、結果ビットとして「0」を出力し、この値を、第2比較回路620から出力された結果ビットの末尾に加える。つまり、第3比較回路630からは、3ビットの結果ビットとして、「110」という値が出力される。
図28(d)には、第4比較回路640に入力される4個のテーブルデータと、CMY階調値「240」との比較の様子を示している。第4比較回路640は、第3比較回路630から4個のテーブルデータを入力すると、この4個のテーブルデータの中央値「255」と、CMY階調値「240」との比較を行う。そうすると、CMY階調値の方が小さい値であるため、第4比較回路640は、4個のテーブルデータのうち、中央値よりも小さい側のテーブルデータを2個選択して第5比較回路650に転送する。また、第4比較回路640は、この比較の結果により、結果ビットとして「0」を出力し、この値を、第3比較回路630から出力された結果ビットの末尾に加える。つまり、第4比較回路640からは、4ビットの結果ビットとして、「1100」という値が出力される。
図28(e)には、第5比較回路650に入力される2個のテーブルデータと、CMY階調値「240」との比較の様子を示している。第5比較回路650は、第4比較回路640から2個のテーブルデータを入力すると、この2個のテーブルデータの中央値「238」と、CMY階調値「240」との比較を行う。そうすると、CMY階調値の方が大きい値であるため、第5比較回路650は、中央値よりも大きい側のテーブルデータ「255」を選択する。また、第5比較回路650は、この比較の結果により、結果ビットとして「1」を出力し、この値を、第4比較回路640から出力された結果ビットの末尾に加える。そうすると、第5比較回路650からは、5ビットの結果ビットとして、「11001」という値が出力される。
2進数で「11001」という値は、10進数で「25」であるため、エンコード値探索ユニット600から出力されるエンコード値は、「25」になる。図28(a)には、各テーブルデータの上部に、昇順に0から31までのエンコード値を割り振っている。第5比較回路650によって選択されたテーブルデータ「255」は、この中で、ちょうど、「25」というエンコード値に該当するデータである。つまり、エンコード値探索ユニット600は、テーブルデータの中央値と階調値とを比較し、その結果に応じて、テーブルデータの数を繰り返し半減していくことで、エンコード値を求めることができるのである。
以上で説明したエンコード値探索ユニット600によれば、第1比較回路610から第5比較回路650までをパイプライン状に接続し、テーブルデータや結果ビットを順次転送していくことで、1クロック単位でエンコード処理を行うことが可能になる。この結果、印刷処理を大幅に高速化することが可能になる。また、比較器やセレクタなど、単純な回路の組み合わせによってエンコード処理を実現することができるため、画像処理ASIC155の中に、容易に回路を構成することできる。
また、本実施例では、図12に示したように、エンコードテーブルET生成開始時に、予め全ての要素を「255」に設定することとしたため、テーブルデータの並びを常に昇順に保つことができる。そのため、上述した各比較回路によるCMY階調値とテーブルデータの比較を円滑に行うことができる。
ところで、本実施例では、エンコード値探索ユニット600は5つの比較回路610〜650を備えるものとしたが、この個数は、エンコード値探索ユニット600が一度に入力するテーブルデータの数に依存している。詳しくは、上述した処理では、テーブルデータの数を順次1/2に半減させて、最終的に1つのテーブルデータを選択することになる。そのため、テーブルデータの数が2^n個であれば、それを半減させる回数はn回ということになる。つまり、2^n個のテーブルデータの数に対して、比較回路の数はn個であるという関係が成り立つことになる。
また、本実施例では、第1比較回路610は、偶数個(32個)のテーブルデータを入力するものとしたため、厳密に言えば中央の値は存在しない。そのため、便宜的に、最小値から数えて16番目の値を中央値であるものとして用いた。しかし、例えば、最小値から数えて17番目の値を中央値とすることもできる。この場合、エンコード値の結果が、上述した説明に沿うように、比較器によって実現する条件式や、テーブルデータの数を半減させる境界を適宜設定すればよい。また、比較器による比較方法やデータ数の低減方法、あるいは、結果ビットの求め方を適宜調整することにより、数値列内の中央値ではなく、任意の位置のデータを用いてエンコード値を求めるものとしてもよい。
また、本実施例では、図22〜27に示したように、多段の比較回路を用意して、テーブルデータの数を半減させていくことにした。これに対して、例えば、比較回路の出力をラッチして、入力側に再帰的に入力することで、1つの比較回路だけで、テーブルデータの数を半減させていくことも可能である。この場合、テーブルデータの数を半減させた回数に応じて、使用するセレクタや、中央値を入力するレジスタの位置を可変させるものとする。
以上、本発明の実施例について説明したが、本発明はこのような実施例に限定されず、その趣旨を逸脱しない範囲で種々の構成を採ることができることはいうまでもない。例えば、画像処理ASIC155によってハードウェアによって実現した機能を、CPU151による所定のプログラムの実行によってソフトウェア的に実現するものとしてもよい。