以下、上述した本発明の作用・効果を一層明らかにするため、本発明の実施の形態を実施例に基づき次の順序で説明する。
A.プリンタの構成:
B.印刷処理:
C.初期化処理:
D.デコードテーブル生成処理:
E.エンコードテーブル生成処理:
F.ハーフトーン処理:
G.効果:
H.変形例:
A.プリンタの構成:
図1は、本発明の実施例としてのプリンタ100を示す説明図である。プリンタ100は、いわゆる複合機タイプのプリンタであり、光学的に画像を読み込むスキャナ110や、画像データの記録されたメモリカードMCを挿入するためのメモリカードスロット120、デジタルカメラ等の機器を接続するUSBインタフェース130等を備えている。プリンタ100は、スキャナ110によって取り込んだ画像や、メモリカードMCから読み取った画像、USBインタフェース130を介してデジタルカメラから読み取った画像等を印刷用紙Pに印刷することができる。また、プリンタケーブル等によって接続された図示していないパーソナルコンピュータから入力した画像の印刷も行うことができる。
プリンタ100は、印刷対象の画像の選択や、印刷用紙の種類、サイズの設定など、印刷に関する種々の設定操作を行うための操作パネル140を備えている。操作パネル140の中央部には、液晶モニタ145が備えられている。液晶モニタ145には、メモリカードMC等から入力した画像の一覧や種々のグラフィカルインタフェース(GUI)が表示される。
プリンタ100は、後述するように、シアン(C)、ライトシアン(Lc)、マゼンタ(M)、ライトマゼンタ(Lm)、イエロ(Y)、ブラック(K)の6色のインクを用いて、カラー印刷を行う機能を有している。また、プリンタ100は、これら6色のインクを用いてカラー印刷を行う場合に、印刷用紙に吐出するドットのサイズを4段階に調整する機能を備える。以下の説明では、ドットのサイズを4段階に調整することを「4値化」という。
図2は、プリンタ100の内部構成を示す説明図である。図示するように、プリンタ100は、印刷用紙Pに印刷を行う機構として、インクカートリッジ212を搭載したキャリッジ210や、キャリッジ210を主走査方向に駆動するキャリッジモータ220、印刷用紙Pを副走査方向に搬送する紙送りモータ230等を備えている。
キャリッジ210には、シアン(C)、ライトシアン(Lc)、マゼンタ(M)、ライトマゼンタ(Lm)、イエロ(Y)、ブラック(K)、の各インクが収容されたインクカートリッジ212が装着されている。キャリッジ210は、これらの色に対応して計6種類のインクヘッド211を備えている。インクカートリッジ212からインクヘッド211に供給されたインクは、図示しないピエゾ素子を駆動することで印刷用紙Pに吐出される。
キャリッジ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には、後述する初期化処理時に使用されるディザデータDthDATやドット発生量テーブルDGTBLが記憶されている。
CPU151は、RAM152を制御プログラム実行時の一時メモリとして用いるほか、メモリカードMCから読み出した画像データを一時的に記憶する用途にも用いる。また、CPU151は、後述する初期化処理によって生成するエンコードテーブルEncTBLやデコードテーブルDecTBLをRAM152に記憶する。エンコードテーブルEncTBLとデコードテーブルDecTBLとは、本願の「変換テーブル」に対応するものである。
画像処理ASIC155は、CPU151がメモリカードMC等から入力した画像データに対して、色変換処理やハーフトーン処理を施し、印刷機構(インクヘッド211、キャリッジモータ220、紙送りモータ230)を制御して画像を印刷する一連の処理を行う集積回路である。
本実施例のプリンタ100は、制御ユニット150によるインクヘッド211の制御により、印刷用紙Pに吐出するインク滴のサイズを4値化し、4種類のサイズのドットを形成することができる。以下では、4種類のサイズのドットを、ドットの形成されない場合も含め、サイズの小さい順に、「ドット無し」、「Sドット」、「Mドット」、「Lドット」というものとする。
図3は、異なる大きさのインク滴がインクヘッド211から吐出される原理を示す説明図である。図の上部に示した電圧波形において、破線で示した波形が通常のドットを吐出する際の波形である。この電圧波形中、区間d2において、一旦、マイナスの電圧をピエゾ素子PEに印加すると、インク通路68の断面積を増大する方向にピエゾ素子PEが変形する。そうすると、インクカートリッジ212からのインクの供給速度には限界があるため、インク通路68の拡大に対してインクの供給量が不足する。この結果、図3下部の状態Aに示した通り、ノズルNz先端のインクの界面Meが、ノズルNz内に引き寄せられ、凹んだ状態となる。
一方、実線で示す電圧波形を用い、区間d1に示すようにマイナス電圧をピエゾ素子PEに急激に印加すると、インクカートリッジ212からのインクの供給量はさらに不足した状態となる。従って、状態aで示すように、インク界面Meは状態Aに比べて更にノズルNz内に引き寄せられた状態となる。次に、ピエゾ素子PEに正の電圧が印加されると(区間d3)、インク通路68が狭められ、インクが吐出される。このとき、インク界面Meがあまり内側に凹んでいない状態(状態A)からは、状態Bおよび状態Cに示すごとく大きなインク滴が吐出される。これに対して、インク界面Meが大きく内側に凹んだ状態(状態a)からは状態bおよび状態cに示すごとく小さなインク滴が吐出される。このように、ピエゾ素子PEに印加する電圧波形を調整することで、インクヘッド211から大きさの異なるインク滴が吐出されることになる。
図4は、図2に示した画像処理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形式の画像データを入力し、この画像データを、印刷媒体上に形成されるドットの配置パターンを表すドット配置データに変換する回路である。
CMY形式の画像データは、画素毎に、CMYKLcLmの各色それぞれ256階調を有するデータであるが、プリンタ100は、吐出するインク滴のサイズを最大4段階に調整することができるにすぎず、CMY形式のデータをそのまま用いて256階調の色を印刷用紙上に再現することができない。そのため、プリンタ100は、ハーフトーン処理ユニット400によって、CMY形式の階調値を、単位面積あたりのドットの粗密を表すドット配置データに変換することで、中間調の色を表現する。
図5は、ドット配置データの一例を示す説明図である。この図では、CMY形式の画像データの最も左上の画素(1,1)の色の階調値が「52」の場合に、これをドット配置データに変換した例を図の左下に示した。このように、本実施例では、1つの画素の階調値が入力されると、4×2のドット群の中で、SドットやMドット、Lドットなどを配置してその階調値が表す色を印刷用紙上に表現する。なお、前述したドット群のことを、以下では「ブロック」と呼ぶことがある。
ここで、ドット配置データの生成方法を簡単に説明する。ドット配置データ内の各ドットの配置は、大域的なディザテーブルからドット群のサイズおよび変換対象の画素の位置に応じて切り出された局所的な閾値群(図8(b)参照)と、その画素の階調値に対応する各サイズのドットの発生量(図9参照)との関係から決定される。つまり、図9に示したドット発生量テーブルによって、階調値に応じた各サイズのドットの発生量を求め、その各ドットの発生量と閾値群内の閾値とを比較していき、1ブロック内に配置する各サイズのドットの個数を求める。そして、その個数分のドットを大きなサイズのドットから閾値の低い場所順に配置していくことでドット配置データが生成される。かかる処理の詳細な説明については後述する。
本実施例では、CMY画像中の画素の階調値が同一の場合であっても、ハーフトーン処理の対象となる画素の位置が異なれば、適用される閾値群が異なるため、異なるドット配置データが生成される場合がある。例えば、図5において、CMY画像の最も左上の画素以外に、もう一つ、「52」の階調値を有する画素(j,1)を示している。この画素に対応するドット配置データの例を図の右下に示したが、かかるドット配置データは、先に示したドット配置データとは異なるドット配置を有している。つまり、本実施例では、階調値の値に加えて、ハーフトーン処理対象となる画素の位置に応じて生成するドット配置データを変化させるので、従来の組織的ディザ法や濃度パターン法等よりも高画質な画像の出力を行うことが可能になる。
上述したように、本実施例では、ドット群の単位を4×2としたため、例えば、入力画像の解像度が、360dpi×360dpiであれば、印刷用紙に出力される出力解像度は、1440dpi×720dpiとなる。ドット群の横方向の解像度が縦方向の解像度よりも高いものとしたのは、階調変化に対する人間の目の追従性が縦方向よりも横方向に敏感であるためである。また、印刷用紙Pを副走査方向に移動させる制御よりも、キャリッジ210を主走査方向に移動させる制御の方が比較的容易であるため、横方向の解像度を縦方向の解像度よりも高くしている。しかし、もちろん、ドット群のサイズは、4×2以外にも、縦横比が同一となる4×4や2×2などとすることも可能である。なお、以下の説明では、RGB形式あるいはCMY形式の画像の構成要素の最小単位を「画素」といい、印刷用紙Pに形成される出力画像の構成要素の最小単位を「ドット」というものとする。なお、RGB形式あるいはCMY形式の画像中の複数の画素を4×2や2×2のブロックとしてまとめ、その複数の画素を代表する画素(例えば、ブロック内の画素の階調値を平均化したもの)を上述した「画素」として扱うものとしてもよい。
説明を図4に戻す。ハーフトーン処理ユニット400は、エンコードユニット410とデコードユニット420とを備えている。
ハーフトーン処理ユニット400は、色変換ユニット300からCMY形式の画像データを入力すると、この画像データをエンコードユニット410に入力する。
エンコードユニット410は、入力された画像データを構成する各画素の階調値を、RAM152に記憶されたエンコードテーブルEncTBLを参照することで、5ビットのデータで表されるエンコード値に変換する。かかる変換処理を、以下、「エンコード処理」という。エンコード処理によって得られるエンコード値は、印刷用紙上に、どのようなドット配置データ(図5参照)を形成するかを指し示す値である。エンコード値が5ビットのデータ幅で収まるのは、後述するデコードテーブル生成処理によって、4×2のドット群内に各サイズのドットを配置したときの組み合わせの数が、結果的に、最大で32の組み合わせとなるからである。
エンコードユニット410は、8ビットで表される階調値を5ビットのエンコード値に変換すると、このエンコード値を、RAM152の所定領域に確保した中間バッファBFに中間データとして格納する。このように、本実施例では、メモリカードMC等から入力した画像データを、8ビットのデータから5ビットのデータに変換してRAM152に記憶することができるので、RAM152の使用容量が削減され、コストダウンを図ることが可能になる。エンコード処理の過程で参照されるエンコードテーブルEncTBLの生成方法や、エンコード処理の詳細については後で説明する。
デコードユニット420は、中間バッファBFからエンコード値を読み込み、RAM152に記憶された所定のデコードテーブルDecTBLを参照することで、このエンコード値を、4×2ドットのドット配置データに変換する。かかる変換処理のことを、以下、「デコード処理」という。デコード処理の過程で参照されるデコードテーブルDecTBLの生成方法や、デコード処理の詳細については後で説明する。
デコードユニット420は、エンコード値をドット配置データに変換すると、そのドット配置データをインク吐出制御ユニット500に出力する。
インク吐出制御ユニット500は、インクヘッド211、キャリッジモータ220、紙送りモータ230を制御して、ハーフトーン処理ユニット400から入力したドット配置データに基づき印刷用紙上にドットを形成する。インク吐出制御ユニット500は、入力したドット配置データに記録されたドットの種類に応じて、インクヘッド211内のピエゾ素子に印加する電圧波形を調整してインク滴を吐出し、サイズの異なるドットの打ち分けを行う。こうすることで、本実施例のプリンタ100は、印刷用紙に対してカラー印刷を行う。
B.印刷処理:
図6は、プリンタ100が実行する印刷処理のフローチャートである。この印刷処理は、ユーザによる操作パネル140の操作によって印刷する画像データが選択され、所定の印刷ボタンが操作された場合に、CPU151によって実行される処理である。
この印刷処理が実行されると、CPU151は、まず、図4に示したエンコードテーブルEncTBLやデコードテーブルDecTBLを生成するための初期化処理を行う(ステップS10)。かかる初期化処理の詳細な説明は後述する。
初期化処理が完了すると、CPU151は、ユーザによって指定された画像データをメモリカードMC等から入力する(ステップS20)。そして、入力した画像データを、画像処理ASIC155に出力する。すると、画像処理ASIC155では、色変換ユニット300による色変換処理(ステップS30)、および、ハーフトーン処理ユニット400によるハーフトーン処理(ステップS40)が行われ、入力画像の画素毎にドット配置データが生成される。画像処理ASIC155が行うハーフトーン処理の詳細な説明は後述する。
ハーフトーン処理ユニット400によってドット配置データが生成されると、インク吐出制御ユニット500によってインクの吐出制御が行われる(ステップS50)。この結果、印刷用紙に対してカラー画像が印刷される。
C.初期化処理:
図7は、上述した印刷処理のステップS10で実行される初期化処理の詳細を示すフローチャートである。図示するように、この初期化処理が実行されると、まず、CPU151は、ROM153から、エンコードテーブルEncTBLやデコードテーブルDecTBLの生成元となるディザデータDthDATを入力する(ステップS100)。
図8は、本願の「初期データ」に対応するディザデータDthDATのデータ構造およびその生成原理を示す説明図である。ディザデータDthDATのデータ構造の説明の前に、まず、ディザデータDthDATの生成元となる大域的ディザテーブルWDTBLについて説明する。図8(a)には、この大域的ディザテーブルWDTBLの模式図を示した。本実施例では、大域的ディザテーブルWDTBLは、横128×縦32の計4096個の要素を有するものとする。この大域的ディザテーブルWDTBLは、従来のハーフトーン技術として知られた組織的ディザ法で用いられるディザテーブルと同種のテーブルである。そのため図示した大域的ディザテーブルWDTBLにおいても、多階調を有する画像データを2値化する際に、白黒ドットの分散性が最も高まるように、0から4095までの4096種類(=128×32)の閾値が各要素に配置されている。なお、図8(a)における各閾値の図示は省略している。
ディザデータDthDATの生成方法は次の通りである。すなわち、まず、大域的ディザテーブルWDTBLを、4×2の要素を1つのブロックとして、計512(=(128/4)×(32/2))個のブロックに分割し、各ブロックに対してブロック番号をつける。本実施例では、図の上部に示すように、大域的ディザテーブルWDTBLの最も左上に位置するブロックにブロック番号「1」を与え、その右隣に位置するブロックにブロック番号「2」を与えるものとした。
こうして、各ブロックにブロック番号をつけると、図8(b)に示すように、大域的ディザテーブルWDTBLから、これよりも領域の小さい小領域ディザマトリクスである閾値群として各ブロックを取り出し、この閾値群内に記録された8つの閾値をその閾値群のブロック番号に対応するディザデータDthDATに昇順に並び直して記録する。大域的ディザテーブルWDTBLには閾値として、0から4095までの値が記録されているため、閾値は、最大で12ビットのデータ容量を有することになる。そこで、本実施例では、図8(d)に示すように、1つのディザデータDthDATは、8エントリ×2バイトの計16バイトのデータ容量を有するものとし、1エントリ内の下位12ビットに閾値データを記録していくものとした。
前述のように、閾値は12ビットのデータであり、ディザデータDthDATの各エントリは、2バイトの容量を有するものとしたため、各エントリにつき、4ビットの容量が残存する。そこで、本実施例では、この残存した4ビットの部分に、「順序値」と呼ばれるデータを記録する。この順序値は、本願の「配置復元データ」に対応するものである。
図8(c)は、順序値の例を示している。この順序値は、図8(b)に示す閾値群を元に生成されている。つまり、例えば、図8(b)に示した閾値群の全要素について同時に、階調値を0から4095まで上げていくと、23,472,1010,1322、…、の順に、階調値が閾値を超えることになる。こうして、階調値が閾値を超える順番を定義したものが、図8(c)に示す順序値である。つまり、この順序値は、対応するブロック内の閾値の配置を表すとともに、そのブロック内にドットを発生させる場合に、ブロック内の各要素にドットが発生していく順序を表していることになる。1つのブロックは、8つの要素から構成されるため、順序値は、0から7まで計8種類の値をとる。つまり、順序値の値は、最大3ビットのデータで表すことができるため、ディザデータDthDATの各エントリに残存した上位4ビットに記録することが可能となる。
順序値は、図8(c)に示すように、最も左上の要素から右下の要素にかけて、順番に取り出され、その値が、図8(d)に示すように、ディザデータDthDATの各エントリの上位4ビットに記録される。
以上で説明したように、ディザデータDthDATは、大域的ディザテーブルWDTBLから取り出されたブロック毎に、昇順に記録された8つの閾値と、ドットの発生順序を定義した8つの順序値とを有している。なお、8つの閾値は昇順に記録され、順序値はその位置に応じて記録されていることから、ディザデータDthDATの1エントリ内に記録されている1組の閾値と順序値とは、その組み合わせに関連性はないことになる。
図7のステップS100では、ROM153から全てのブロック番号のディザデータDthDATがRAM152に入力されるものとする。こうして入力されたディザデータDthDAT内の閾値は、後述するエンコード閾値テーブルETTBLの生成に用いられることになり、順序値は、後述するデコードテーブルDecTBLの生成に用いられることになる。各ディザデータDthDATは、RAM152内に、ブロック番号順に連続して入力される。そのため、ディザデータDthDAT自体にブロック番号が付されていなくても、CPU151は、16バイト(=2バイト×8エントリ)にブロック番号を乗算する所定のアドレス計算を行うことにより、任意のブロック番号のディザデータDthDATをRAM152から読み出すことができる。もとより、ブロック番号とこれに対応するディザデータDthDATとを組み合わせて記憶するものとしてもよい。
ここで、説明を図7に戻す。CPU151は、ROM153からディザデータDthDATを入力すると、続いて、エンコードテーブルEncTBLやデコードテーブルDecTBLの生成元となるドット発生量テーブルDGTBLをROM153からRAM152に入力する(ステップS110)。
図9は、ドット発生量テーブルDGTBLの一例を示す説明図である。図示するように、このドット発生量テーブルDGTBLには、横軸に示した入力階調値TDに応じて、Sドット、Mドット、Lドットの発生量がそれぞれ縦軸に定義されている。この図によれば、入力階調値TDが0から70程度までは、Sドットのみが発生し、その後、入力階調値TDが120程度までは、SドットとMドットの両者が発生することがわかる。また、入力階調値TDが110程度になると、SドットとMドットに加えて、Lドットが発生するようになり、入力階調値TDが概ね180以降になると、Lドットのみが発生することがわかる。なお、縦軸に示すドット発生量は、後述するドット数カウント処理におけるディザデータDthDAT内の閾値との比較が可能なように、大域的ディザテーブルWDTBLに記録された閾値と同じ0から4095までの値をとる。
図9には、Sドット,Mドット,Lドットの発生量とともに、これらのドットが印刷媒体に形成される際に吐出されるインクの総重量の変化を示した。図示したインク総重量の変化によれば、入力階調値TDが増加するにつれ、インクの総重量が徐々に増加していくことになる。各サイズのドット発生量は、かかる総重量の変化にあわせて、それぞれの発生量が設定されている。なお、このドット発生量テーブルDGTBLは、プリンタ100がサポートしている印刷用紙の種類に応じて用意されるものとしてもよい。この場合、印刷時の設定において、ユーザによって選択された用紙の種別に応じて、対応するドット発生量テーブルDGTBLを入力するものとする。こうすることで、選択された印刷用紙に適した印刷を行うことが可能になる。
説明を図7に戻す。以上の処理によってディザデータDthDATとドット発生量テーブルDGTBLとを入力すると、CPU151は、入力したディザデータDthDATとドット発生量テーブルDGTBLとに基づき、デコードテーブルDecTBLとエンコード閾値テーブルETTBLとを生成する処理を行う(ステップS120)。以下では、かかるステップS120による処理を、単純に「デコードテーブル生成処理」という。
デコードテーブル生成処理は複雑な処理であるため、詳細な説明は後に記述するものとし、ここでは、このデコードテーブル生成処理の結果得られるデコードテーブルDecTBLとエンコード閾値テーブルETTBLのデータ構造について説明する。
図10は、デコードテーブルDecTBLのデータ構造を示す説明図である。図示するように、このデコードテーブルDecTBLには、ブロック番号とエンコード値とに対応付けて、ブロック内に配置するドットの種類および位置を表すドット配置データが記録されている。図4に示したデコードユニット420は、処理対象の画素の位置に対応するブロック番号と、中間バッファBFから入力したエンコード値とに基づき、このデコードテーブルDecTBLを参照することで、印刷媒体に形成すべきドットの配置パターンを容易に取得することができる。
図11は、エンコード閾値テーブルETTBLのデータ構造を示す説明図である。図示するように、このエンコード閾値テーブルETTBLには、ブロック番号とエンコード値とに対応付けて、0から255までの値を表す入力階調値TDの値が記録されている。このエンコード閾値テーブルETTBLは、後述するエンコードテーブルEncTBLの生成にのみ利用されるデータであるため、ハーフトーン処理ユニット400によるハーフトーン処理に用いられることはない。そのため、ここでは、エンコード閾値テーブルETTBL自体の意義には言及しない。
説明を図7に戻す、CPU151は、ステップS120のデコードテーブル生成処理において、エンコード閾値テーブルETTBLとデコードテーブルDecTBLとを生成すると、かかる処理によって生成されたエンコード閾値テーブルETTBLを用いて、エンコードテーブルEncTBLの生成を行うエンコードテーブル生成処理を実行する(ステップS130)。このエンコードテーブル生成処理も複雑な処理であるため、詳細な説明は後に記述する。ここでは、エンコードテーブル生成処理の結果得られるエンコードテーブルEncTBLのデータ構造について説明する。
図12は、エンコードテーブルEncTBLのデータ構造を示す説明図である。図示するように、このエンコードテーブルEncTBLには、ブロック番号とCMYの階調値とに対応付けて、5ビットの値で表されるエンコード値が記録されている。
図13は、エンコードテーブルEncTBLに記録されたエンコード値の変化を模式的に示す説明図である。図13には、ブロック番号がN1からN5までの5つのブロックについて、階調値に応じたエンコード値の変化の例を示している。図示の便宜のため、エンコード値の変化は、ブロック毎に縦軸をずらして描いている。図示するように、各ブロックとも、階調値が増加すれば、エンコード値の値も増加しているが、その増加の態様は、ブロック毎に異なっている。各ブロックにおけるエンコード値の値は、図11に示したデコードテーブルDecTBL中のドット配置データを示す値である。そのため、CMY画像の中で、同じ階調値を有する画素があっても、その画素の位置が異なれば、適用するブロック番号も異なり、それらの画素に対応する印刷媒体上の位置には、異なるドット配置データが形成されることになる。
説明を図7に戻す。CPU151は、以上の処理によって、デコードテーブルDecTBLとエンコードテーブルEncTBLとを生成すると、これらのテーブルをRAM152に記憶する(ステップS140)。こうして、RAM152に記憶されたエンコードテーブルEncTBLとデコードテーブルDecTBLとは、図4に示したハーフトーン処理ユニット400におけるエンコード処理とデコード処理とに供されることになる。なお、デコードテーブル生成処理で生成されたエンコード閾値テーブルETTBLについてはエンコード処理にもデコード処理にも用いられないため、エンコードテーブルEncTBLの生成後にRAM152から消去するものとしてもよい。
D.デコードテーブル生成処理:
図14は、図7のステップS120で実行されるデコードテーブル生成処理の詳細を示すフローチャートである。この処理は、図8に示した全てのブロック(ブロック番号1〜4096)についてブロック毎に行われる処理である。
この処理が実行されると、CPU151は、まず、以降の処理で用いられる変数として、エンコード値EncDataを「0」とし、現在のブロック内に発生する各サイズのドット数を「0」とする(ステップS200)。そして、更に、入力階調値TDを「0」とする(ステップS210)。
次に、CPU151は、上記ステップS210で設定した入力階調値TDに応じて現在のブロック内に発生する各サイズのドットの数を一義的に決定するドット数カウント処理を行う(ステップS220)。
図15は、上記ステップS220におけるドット数カウント処理の詳細を示すフローチャートである。かかる処理では、まず、CPU151は、上記ステップS210で設定された入力階調値TDに対応する各サイズのドット発生量をドット発生量テーブルDGTBL(図9参照)から取得する(ステップS400)。
各サイズのドット発生量を取得すると、CPU151は、現在のブロック番号に対応し、ソートされた閾値を有するディザデータDthDAT(図8(d)参照)をRAM152から読み込む。そして、そのディザデータDthDAT内で参照するエントリ番号nを「0」とし、更に、各サイズのドットのカウント数(dotL,dotM,dotS)を「0」として初期化する(ステップS410)。
エントリ番号nとカウント数とを設定すると、CPU151は、現在のエントリ番号nに対応する閾値を、ディザデータDthDATから読み込む。そして、上記ステップS400で取得したLドットのドット発生量が、この閾値よりも大きいか否かを判断する(ステップS420)。この判断の結果、Lドットの発生量が、エントリ番号nの閾値(すなわち、n番目の閾値)よりも大きければ(ステップS420:Yes)、Lドットのカウント数dotLをインクリメントする(ステップS430)。すなわち、この場合、4×2のドット配置データ内に発生するLドットの数が1つ増加することになる。
Lドットのカウント数dotLをインクリメントすると、CPU151は、現在のエントリ番号nが「7」であるかを判断する(ステップS440)。その結果、エントリ番号nが「7」であれば、ディザデータDthDAT内の全ての閾値を参照したことになり、ドット数のカウントが終了したと判断できるので、処理を後述するステップS500に進める。一方、ステップS440において、エントリ番号nが「7」でなければ、次のエントリ番号の閾値とドット発生量との比較を続行するため、エントリ番号nをインクリメントし(ステップS450)、処理を上記ステップS420に戻す。
上記ステップS420において、Lドットの発生量が、n番目の閾値以下であれば(ステップS420:No)、CPU151は、次に、ドット発生量テーブルDGTBLから取得した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は、ドット発生量テーブルDGTBLから取得した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において、8番目の閾値まで参照したと判断された場合には(ステップS440:Yes)、CPU151は、最後に、各サイズのドットのカウント数を記録したドット数データDCDATを生成する(ステップS500)。
図16は、ドット数データDCDATの一例を示す説明図である。図には、4×2のドット配置データ内において、Lドットが3つ、Mドットが2つ、Sドットが2つ配置される場合のドット数データを表している。図示するように、このドット数データDCDATは、16ビットのデータ量を有しており、Lドットについては、「11」、Mドットについては、「10」、Sドットについては「01」、ドット無しについては「00」として、ドットの種類を表すデータを2ビットのドットサイズ値で表している。このドット数データDCDATには、大きなサイズのドットを表すドットサイズ値ほど、下位ビット側(LSB側)に位置するように、ドットサイズ値の記録を行う。
図17は、上述したドット数カウント処理の具体例を示す説明図である。図17(a)に示すように、ここでは、ドット発生量テーブルDGTBLにおいて、現在の入力階調値TDに対応するLドットのドット発生量が「409」、Mドットが「1550」、Sドットが「1304」だとし、現在のブロックに対応するディザデータDthDATが、図8(d)に示したディザデータだとする。
この場合、まず、図15のステップS420では、ディザデータDthDAT内の1番目の閾値「23」と、Lドットのドット発生量「409」とが比較される。そうすると、このドット発生量「409」の方が、閾値「23」よりも大きいので、ステップS420では、「Yes」と判定され、ステップS430によってLドットのカウント数がインクリメントされて「1」になる。そうすると、ステップS450によって、エントリ番号nがインクリメントされるため、続くステップS420では、2番目の閾値「472」とLドットのドット発生量「409」が比較される。この場合、閾値「472」よりもドット発生量「409」の方が小さくなるので、ステップS420では、「No」と判定され、処理がステップS460に進む。この時点で、Lドットのカウント数は、図17(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サイズのカウント数は、図17(c)に示すように「5」で確定する。
7番目の閾値「2240」が参照されると、ステップS460では、「No」と判定されるため、次に、ステップS480において、LドットとMドットとSドットのドット発生量の累積値「3263(=409+1550+1304)」と、7番目の閾値「2240」とが比較される。この結果、ドット発生量の累積値「3263」の方が7番目の閾値よりも大きいため、ステップS480では「Yes」と判定され、ステップS490によってSドットのカウント数がインクリメントされて「1」になる。そうすると、次に、8番目の閾値「3262」が参照される。
LドットとMドットとSドットのドット発生量の累積値「3263」は、8番目の閾値「3262」よりも依然として大きい。そのため、ステップS480では、再度、「Yes」と判定されて、ステップS490によってSサイズのドットのカウント数がインクリメントされ、図17(d)に示すように「2」となる。すると、現在のエントリ番号nは「7」であるため、ステップS440において、「Yes」と判定され、各サイズのドットのカウント数が確定する。すなわち、以上で示した例では、Lドットが1個、Mドットが5個、Sドットが2個となる。
以上、図17を用いて説明したように、上述したドット数カウント処理では、最初に、Lドットの発生数が決定され、つづいて、Mサイズ、Sサイズのドットの発生数が決定される。各サイズの発生数を決定する際には、各サイズのドット発生量を加算しつつ閾値との比較を行っていくので、最終的には、図17(d)に示すように、ブロック内に各サイズのドットが重複せずにLドットから順に配置されていくことになる。
なお、図17では、ブロック内の各ドットの配置も決定されているように見えるが、実際にはこのドット数カウント処理では、昇順にソートされた閾値のみを用いて各サイズのドットをカウントしているため、その配置までは決定されない。ドットの配置は、後述するドット配置データ生成処理において、本処理によってカウントされたドットの個数とディザデータDthDAT内の順序値とによって決定されることになる。
ここで、ドット数カウント処理の他の具体例について検討する。例えば、現在の入力階調値TDに対応するLドット、Mドットのドット発生量がともに「0」であり、Sドットのドット発生量が「1500」とする。また、現在のブロックに対応するディザデータDthDATが、図8(d)に示したディザデータだとする。そうすると、図15に示したフローチャートのステップS420、ステップS460では、Lドットの発生量もMドットの発生量も「0」であり、1番目の閾値「23」よりも小さいため、「No」と判断され、ステップS480に処理が進む。そして、このステップS480では、ドット発生量「1500」を超える5番目の閾値「1659」が参照された時点で、ステップS480では、「No」と判定され、Sドットのカウント数が「5」で決定し、カウント処理が終了する。すなわち、本実施例では、ディザデータDthDAT内に閾値が昇順にソートされて記録されているため、全サイズのドット発生量の累積量を超えた閾値が参照された時点で、次の閾値を参照する必要が無くなる。従って、各サイズのドットのカウント処理が高速化され、ひいては、初期化処理を高速に行うことが可能になる。
ここで、説明を図14のステップS230に戻す。図14のステップS220、すなわち、図15に示したドット数カウント処理が実行されて、各サイズのドット数がカウントされると、次に、CPU151は、前回の入力階調値TDにおける各サイズのドット数に対して、今回の入力階調値TDにおける各サイズのドット数のいずれかが変化したかを判定する(ステップS230)。例えば、前回のカウント処理によって、Sドットが2個、Mドットが5個、Lドットが1個であった場合に、今回のカウント処理によって、Sドットが2個、Mドットが4個、Lドットが2個となれば、MドットとLドットのカウント数が変化していることになるので、上記ステップS230では、変化あり(Yes)と判定される。
上記ステップS230において、変化ありと判定されれば(ステップS230:Yes)、現在のブロック番号およびエンコード値EncDataに対応する各サイズのドット数を、上記ステップS220でカウントされた値に更新する(ステップS240)。そして、上記カウント処理のステップS500において生成されたドット数データDCDATと、ディザデータDthDAT内の順序値とに基づき、ドット配置データの生成を行う(ステップS250)。なお、このドット配置データ生成処理の詳細については後述する。
上記ステップS250においてドット配置データを生成すると、CPU151は、図11のデコードテーブルDecTBL内の現在のブロック番号とエンコード値EncDataに対応する箇所に、ステップS250で生成したドット配置データを記録する(ステップS260)。そして、更に、図11に示したエンコード閾値テーブルETTBL内の現在のブロック番号とエンコード値に対応する箇所に、現在の入力階調値TDを記録する(ステップS270)。これらの処理により、エンコード閾値テーブルETTBLとデコードテーブルDecTBLとが生成されることになる。
デコードテーブルDecTBLへのドット配置データの記録、および、エンコード閾値テーブルETTBLへの入力階調値TDの記録を完了すると、CPU151は、現在のエンコード値EncDataをインクリメントする(ステップS280)。つまり、このステップS280では、上記ステップS230において、いずれかのサイズのドットの数が変化する毎にエンコード値EncDataが変化していくことになる。換言すれば、4×2のドット配置データの内容が変化する度にエンコード値EncDataが変化していくことになる。
上記ステップS280によって、エンコード値EncDataをインクリメントした後、もしくは、上記ステップS230において、いずれのサイズのカウント数も変化していないと判断された場合には、CPU151は、現在の入力階調値TDが「255」を超えたか否かを判断する(ステップS290)。その結果、入力階調値TDが「255」を超えていなければ(ステップS290:No)、現在の入力階調値TDをインクリメントした上で(ステップS300)、処理を上記ステップS220に戻す。一方、現在の入力階調値TDが「255」を超えていれば(ステップS290:Yes)、デコードテーブル生成処理を終了し、処理を図7のステップS130(エンコードテーブルの生成処理)に移す。
ここで、上述したデコードテーブル生成処理のステップS250において実行されるドット配置データ生成処理について、図18および図19を参照して詳しく説明する。
図18は、ドット配置データ生成処理の詳細なフローチャートである。一方、図19は、ドット配置データの生成過程を模式的に表す説明図である。図18において、ドット配置データ生成処理が実行されると、CPU151は、まず、現在のブロック番号に対応するディザデータDthDAT(図8(d)参照)を参照し、順序値データを入力する(ステップS600)。そして、図15のステップS500で生成したドット数データDCDAT(図16参照)を入力する(ステップS610)。
次に、CPU151は、これから生成しようとする4×2のドット配置データの全要素に対して、「ドット無し」を表すドットサイズ値「00」を記録することで初期化を行う(ステップS620)。そして、これからドットを配置しようとするドット配置データ上の位置を、図19(a)に示す「a」の位置(最も左上の位置)に設定する(ステップS630)。
ドットを配置しようとする位置を設定すると、CPU151は、現在のドット位置に対応する順序値を順序値データから取得する(ステップS640)。図19(b)には、ディザデータDthDATから入力した順序値データの一例を示している。図示した例では、現在の位置「a」に対応する順序値は、「5」となるため、上記ステップS640では、この値「5」が取得される。
次に、CPU151は、ステップS640で取得した順序値に対応するドットサイズ値をドット数データDCDATから取得する(ステップS650)。具体的には、ドット数データDCDATの下位ビット側から2ビット毎に、ステップS640で取得した順序値の値分だけ数え、その位置に記録されたドットサイズ値を取得する。図19(c)には、上記ステップS610で入力したドット数データDCDATの一例を示している。かかる図において、順序値「5」に対応するドットサイズ値は、ドットサイズデータの下位ビットから数えて6つめのドットサイズ値「01」である。ドットサイズ値「01」は、Sサイズのドットであることを表す。
ドットサイズ値を取得すると、CPU151は、取得したドットサイズ値を、ドット配置データ上の現在の位置に設定する(ステップS660)。つまり、図19(d)に示すように、現在の位置が「a」の位置であれば、かかる位置に、図19(c)のドット数データDCDATから取得されたドットサイズ値「01」を設定する。
現在の位置にドットサイズ値を設定すると、CPU151は、全ての位置についてドットサイズ値の設定が終了したか否かを判断する(ステップS670)。その結果、全ての位置についてドットサイズ値の設定が終了していれば、当該ドット配置データ生成処理を終了する。一方、終了していなければ、ドット配置データ上の現在の位置を移動し、処理を上記ステップS640に戻すことで、他の位置についてドットサイズ値の設定を行う。
以上で説明したドット配置データ生成処理および上述したドット数カウント処理によれば、次のような効果が生じる。すなわち、図19(d)に示したドット配置データの生成結果と、図19(b)に示した4×2の順序値データとを対比してみると、サイズの大きなドットから順に、重複無く順序値の低い位置に配置されていることがわかる。順序値が低いということは、その順序値に対応する閾値群内の閾値の値が低いということになる(図8(b)参照)。図8(a)に示した大域的ディザテーブルWDTBLは、組織的ディザ法におけるディザパターンの性質上、閾値は、その値が低いほど分散性よく配置されており、その値が高くなるほど、既に配置された閾値の場所を避けるように、その閾値が配置されている。つまり、図19(d)に示したドット配置データでは、最も大きなサイズのドットから優先的に、低い順序値、すなわち、低い閾値の場所に配置されることとなるため、大きなサイズのドットほど、分散性がよく配置されることになる。従って、本実施例におけるドットの配置方法によれば、印刷用紙上で目立つことになる大きなドットの分散性を最も高めることができるため、出力画像の画質を大幅に向上させることが可能になる。
以上、図7のステップS120に示したデコードテーブル生成処理の詳細について説明した。CPU151は、このデコードテーブル生成処理を、図8に示した全ブロックについて実行することにより、図10に示したデコードテーブルDecTBLを生成することができる。
E.エンコードテーブル生成処理:
図20は、図7に示した初期化処理のステップS130におけるエンコードテーブル生成処理の詳細なフローチャートである。この処理は、図11に示したエンコード閾値テーブルETTBLを参照して図12に示したエンコードテーブルEncTBLを生成する処理である。このエンコードテーブル生成処理は、上述したデコードテーブル生成処理と同じく、図8に示した全てのブロックについてブロック毎に行われる処理である。
この処理が実行されると、まず、CPU151は、以降の処理で用いられる変数として、現在のエンコード値EncDataを「0」とし(ステップS700)、現在の入力階調値TDを「0」とする(ステップS710)。
次に、CPU151は、現在のエンコード値EncDataが、エンコード値の最大値EncMax未満であるか否かを判断する(ステップS720)。最大値EncMaxは、エンコード値が5ビットデータである場合には、「31」である。
上記ステップS720において、現在のエンコード値EncDataが、最大値EncMax未満と判断された場合には(ステップS720:Yes)、CPU151は、上記デコードテーブル生成処理(図14参照)によって生成されたエンコード閾値テーブルETTBL(図11参照)を参照して、現在のエンコード値EncDataに対応する入力階調値Xを取得する(ステップS730)。その結果、現在の入力階調値TDが、ステップS730で取得した入力階調値Xを超えるか否かを判断し(ステップS740)、入力階調値TDの値が、入力階調値Xを超えていれば(ステップS740:Yes)、現在のエンコード値EncDataをインクリメントする(ステップS750)。
CPU151は、上記ステップS750でエンコード値EncDataをインクリメントした後、または、上記ステップS720で、エンコード値EncDataが最大値EncMax以上となった場合(ステップS720:No)、もしくは、上記ステップS740で、入力階調値TDが入力階調値Xを超えていないと判断された場合に(ステップS740:No)、図12に示したエンコードテーブルEncTBL中の現在のブロックおよび現在の入力階調値TDに対応する要素に、エンコード値EncDataをセットする(ステップS760)。
そして、CPU151は、現在の入力階調値TDが、その最大値である「255」を超えたか否かを判断し(ステップS770)、超えていれば(ステップS770:Yes)、当該エンコードテーブル生成処理を終了する。一方、超えていなければ(ステップS770:No)、現在の入力階調値TDをインクリメントし、処理を上記ステップS720に戻す。
以上で説明したエンコードテーブル生成処理により、図12に示したエンコードテーブルEncTBLを生成することができる。上述したエンコードテーブル生成処理では、入力階調値TDを0から255まで徐々に加算していく中で、現在の入力階調値TDがエンコード閾値テーブルETTBLに記録されている各入力階調値Xを超えた場合に、エンコード値EncDataの値がインクリメントされていくことになる。そのため、図12のエンコードテーブルEncTBLでは、入力階調値TDが漸増していくにつれ、エンコード値EncDataの値は、図12や図13に示すごとく段階的に増加していくことになる。
以上で、図7に示した初期化処理のステップS130までの説明が終了した。CPU151は、この図7のステップS130が終了すると、ステップS120で生成したデコードテーブルDecTBLと、ステップS130で生成したエンコードテーブルEncTBLとをRAM152に記憶する。これにより、図7に示した初期化処理は終了する。
F.ハーフトーン処理:
図21は、図6に示した印刷処理のステップS40で実行されるハーフトーン処理の詳細なフローチャートである。このハーフトーン処理は、図6のステップS30によってRGB形式からCMY形式に色変換された画像データに対して、1画素単位で行われる処理である。
このハーフトーン処理が実行されると、画像処理ASIC155は、まず、図4に示したエンコードユニット410を用いて、処理対象の画素の各色(C,M,Y,K,Lc、Lm)の階調値をエンコード値EncDataに変換するエンコード処理を行う(ステップS800)。
図22は、エンコードユニット410が実行するエンコード処理の詳細を表すフローチャートである。このエンコード処理が実行されると、エンコードユニット410は、まず、処理対象の画素が属するブロック番号の計算を行う(ステップS802)。ここで、本実施例では、印刷対象とするRGB画像データの入力解像度が360dpi×360dpiであるものとし、印刷用紙に出力する出力解像度が1440dpi×720dpiであるものとする。そうすると、1ブロックのサイズは、4×2であるため、このような入力解像度と出力解像度の関係では、入力画像の1画素が、出力画像の4×2ドットに対応することになる。すなわち、本実施例では、処理対象のCMY画像の1画素が、図8(a)に示した大域的ディザテーブルWDTBLの1ブロックに対応するものとしてブロック番号の計算を行う。
ブロック番号の具体的な計算方法について以下に説明する。図8(a)に示した大域的ディザテーブルWDTBLは、横方向に32ブロック、縦方向に16ブロックを有するものとした。そのため、1枚の入力画像データを、32画素×16画素を単位として分割し、かかる単位内の各画素に対して、ブロック番号が1から512(=32×16)まで割り振られるように、ブロック番号の計算を行う。すなわち、エンコード処理を行おうとする現在の画素の座標を(X,Y)とし、その原点を(0,0)すると、現在の画素のY座標が「0」であり、X座標が、「0」から「31」までの間は、ブロック番号が「1」から「32」まで、順番に割り振られることになる。その後、現在の画素のX座標が、「32」になった時点で、ブロック番号は、再び、「1」となる。このように、画像のX方向に対して、ブロック番号が「1」から「32」まで繰り返して適用された後に、現在の画素の座標が、(0,1)になった時点で、ブロック番号は「33」となる。そして、その後、Y座標が「1」の間は、「33」〜「64」までのブロック番号が繰り返して割り振られることになる。つまり、ブロック番号Numは、エンコード処理を行う対象画素の座標を(X,Y)とすると、下記式(1)によって求めることができる。ただし、下記式(1)において、「%」は、剰余を求める演算子であるものとする。
Num=((X%32)+(Y%16)*32)+1 …(1)
上記ステップS802によって、ブロック番号の計算を行うと、エンコードユニット410は、図12に示したエンコードテーブルEncTBLを参照し、現在の画素の階調値TDと、ステップS802によって計算したブロック番号Numとから、対応するエンコード値EncDataを取得する(ステップS804)。例えば、図12によれば、現在の画素の階調値が「48」で、算出されたブロック番号が「4」であれば、エンコード値は「5」として取得されることになる。以上の処理により、エンコードユニット410によるエンコード処理は終了する。
ここで、説明を図21に戻す。画像処理ASIC155は、エンコードユニット410によるエンコード処理が終了すると、かかるエンコード処理の結果得られたエンコード値EncDataを、RAM152上に用意した中間バッファBF(図4参照)に対して記録する(ステップS810a〜S810f)。
中間バッファBFに対してエンコード値EncDataを記録すると、画像処理ASIC155は、デコードユニット420を用いて、中間バッファBFに記録されたエンコード値EncDataをドット配置データに変換するデコード処理を実行する(ステップS820a〜S820f)。
図23は、デコードユニット420が実行するデコード処理の詳細なフローチャートである。このデコード処理が実行されると、デコードユニット420は、まず、中間バッファBFに蓄積されたエンコード値EncDataを読み出す(ステップS822)。
エンコード値EncDataを読み出した後、デコードユニット420は、処理対象の画素が属するブロック番号の計算を行う(ステップS824)。かかる計算の手法は、上述した通りである。なお、かかる処理において、デコードユニット420は、上述した計算方法に基づき、自身でブロック番号を計算するものとしてもよいし、エンコードユニット410から、計算結果を取得するものとしてもよい。
ブロック番号の計算を終えると、デコードユニット420は、図10に示したデコードテーブルDecTBLを参照し、ステップS822によって読み出したエンコード値EncDataと、ステップS824によって算出したブロック番号とに対応するドット配置データを取得する(ステップS826)。以上の処理により、デコードユニット420によるデコード処理、および、図21に示した一連のハーフトーン処理が終了する。
以上で説明した本実施例のハーフトーン処理によれば、エンコードテーブルEncTBLとデコードテーブルDecTBLの2つのテーブルを参照するだけで、CMY画像に対するハーフトーン処理が完了する。従って、極めて高速なハーフトーン処理を実現することができる。また、デコード処理以降に、印刷機構によるドット形成処理に時間を要する場合であっても、エンコード処理の結果得られたエンコード値EncDataを、RAM152にバッファリングすることができるので、CPU151を印刷処理から迅速に解放することが可能になる。また、各色8ビット(255階調)のデータ容量を有するCMY画像のデータが、エンコード処理によって、各色5ビットのデータ(エンコード値)に減縮されるため、RAM152の記憶容量を大幅に削減することができ、コストダウンを図ることが可能になる。
なお、上述した実施例では、図6に示したように、印刷処理が実行される度に初期化処理が実行されるものとして説明したが、初期化処理は、その他のタイミングで実行するものとしてもよい。例えば、プリンタ100の電源投入時に実行されるものとしてもよいし、ユーザによって、印刷用紙や印刷モードの設定が変更された際に実行されるものとしてもよい。
G.効果:
以上で説明した本実施例のプリンタ100では、ハーフトーン処理において参照される各テーブルの生成元となるディザデータDthDAT内に、閾値が昇順にソートされて記録されているものとした。従って、1ブロック内に発生するドットの数をカウントする処理において、小さな閾値から順番に参照していき、全サイズのドット発生量の累積量を超えた閾値が参照された時点で、カウント処理が完了し、次の閾値を参照する必要が無くなる。従って、各サイズのドットのカウント処理が高速化され、ひいては、初期化処理、印刷処理を高速に行うことが可能になる。また、このディザデータDthDATに基づき生成されたエンコードテーブルとデコードテーブルとを参照するだけで、画像データを容易にドットの配置パターンに変換することができるので、処理が簡略化され、ハーフトーン処理を高速に行うことが可能になる。
また、本実施例では、本来、閾値のみを記録する目的のディザデータDthDATに対して、その残余ビット部分を利用し、順序値を記録するものとした。従って、各テーブルの生成時に利用される閾値データと、ドット配置データ生成時に利用される順序値データとを個別に管理する必要がないため、RAM152やROM153に記憶されるデータの管理を効率的に行うことが可能になる。
H.変形例:
以上、本発明の実施例について説明したが、本発明はこのような実施例に限定されず、その趣旨を逸脱しない範囲で種々の構成を採ることができることはいうまでもない。例えば、画像処理ASIC155によってハードウェアによって実現した機能を、CPU151による所定のプログラムの実行によってソフトウェア的に実現するものとしてもよい。その他、以下のような変形が可能である。
(H1)第1変形例:
上述した実施例では、図8(d)に示したように、ディザデータDthDATの上位4ビットに順序値が記録されるものとした。この順序値は、図8(c)中に矢印で示したように、1ブロック内の4×2個の順序値を、左上から右下に位置する順序値にかけて順番に記録されている。これに対して、本変形例では、図24に示すように、順序値に換えて位置データの記録を行う。
図24は、ディザデータの変形例を示す説明図である。本変形例では、図24(c)に示すように、順序値データの4×2の各要素に対して、その要素の位置を表す位置データが割り当てられているものとした。各順序値の左上に四角で囲った枠内に示した数値が位置データである。本変形例では、ディザデータDthDATの上位4ビットに、順序値の小さい順からその順序値に対応する位置データを記録する。例えば、図24(c)において、最も順序値の低い値は「0」であり、この順序値「0」に対応する位置データは、図24(c)中の最も左下の「4」であることから、かかる「4」の値が、ディザデータDthDAT内の最初のエントリに記録されることになる。また、次に順序値の低い値は「1」であるため、この「1」に対応する位置データは「2」であることから、かかる「2」の値が、ディザデータDthDAT内の2番目のエントリに記録されることになる。
本変形例におけるディザデータDthDATを用いてドット配置データを生成する場合について考えると、図18のステップS640において、現在のドット位置に対応する順序値を取得する際に、例えば、現在のドット位置が「0」であれば、かかる「0」の値を有する位置データをディザデータDthDAT内から検索する。そうすると、その「0」の値が何番目のエントリに記録されているかがその順序値を表すことになる。従って、本変形例によれば、容易に順序値を取得することが可能になる。
また、以上のように、順序値に対応する位置データをディザデータDthDAT内に記録するものとすれば、各エントリ内に記録された位置データと閾値とは、結果的に、ブロック内の同じ位置の値を指すことになる。そのため、ディザデータDthDATの取り扱いおよび管理を容易に行うことが可能になる。
(H2)第2変形例:
上述した実施例では、デコードテーブル生成処理の過程において、各ブロックおよび各エンコード値に対応するドット配置データを生成する際に、ドットの粒状感を低減させるため、大きなサイズのドットから順に、ブロック内の閾値の低い場所に配置を行うものとした。そのため、デコードテーブルDecTBL内において、低い階調値(詳しくは、エンコード値)に対応付けられたドット配置データは、その多くが小さなドットのみにより構成されるため、ドットの分散性が低いものがある。そこで、図18のドット配置データ生成処理時において、ドットの分散性が低いおそれの有るドット配置データを生成する際に、図8(d)のディザデータDthDAT内の順序値データとは別に用意された拡張順序値データを参照させることにより、ドットの分散性を向上させることが可能になる。
図25は、本変形例におけるドット配置データ生成処理のフローチャートである。図25に示したドット配置データ生成処理では、ステップS610aからステップS680aまでの処理は、図18に示したドット配置データ生成処理のステップS610からステップS680までの処理と全く同一である。すなわち、異なる部分は、ステップS600a,ステップS602a、ステップS604aである。
このドット配置データ生成処理が実行されると、まず、CPU151は、現在処理中のブロック番号とエンコード値EncDataに対応付けられた拡張順序値データがROM153内の拡張順序値データテーブルXTBL内に存在するか否かを判断する(ステップS600a)。
図26は、拡張順序値データテーブルXTBLの一例を示す説明図である。図示するように、この拡張順序値データテーブルXTBLには、ブロック番号とエンコード値とに対応付けて、拡張順序値データが記憶されている。ただし、拡張順序値データは、全てのブロックと全てのエンコード値に対して記憶されているわけではない。すなわち、通常の順序値データを適用してはドットの分散性が低くなってしまうドット配置データに対応するブロック番号とエンコード値とに対してのみ記憶されている。また、ブロック番号とエンコード値とが分かれば、結果的にブロック内に発生するドットの数は予め把握できるため、拡張順序値データには、必要な数の順序値しか設定されていない。例えば、図26において、ブロック番号が「1」で、エンコード値が「13」の拡張順序値データは、0から4までの順序値が設定されているが、これは、このブロック番号とエンコード値とによって生成されるドットの数が5つであることが予め分かっているからである。このように、必要な順序値のみを設定することで、拡張順序値データテーブルXTBLのデータ容量を大幅に削減することができる。
上記ステップS600aにおいて、現在処理中のブロック番号とエンコード値EncDataに対応付けられた拡張順序値データが存在すると判断された場合には(ステップS600a:Yes)、CPU151は、拡張順序値データテーブルXTBLから、その拡張順序値データを入力する(ステップS602a)。一方、拡張順序値データが存在しない場合には、CPU151は、現在のブロック番号に対応するディザデータDthDATから、通常の順序値データを入力する(ステップS604a)。
以上の処理によって、拡張順序値データもしくは順序値データを入力すると、CPU151は、ステップS610a以降の処理によって、拡張順序値データもしくは順序値データ内の順序値を参照しつつ図19に示した手順のようにドット配置データを生成する。
図27は、拡張順序値データを適用した場合のドット配置データと、適用しない場合のドット配置データを例示する説明図である。かかる図では、2つのドットを1つのブロック内に配置する例を示している。図の左側には、通常の順序値データによるドットの配置結果を示し、図の右側には、拡張順序値データを適用してドットを配置した結果を示した。図示するように、通常の順序値データでは、ドット同士が隣り合って、極めて分散性が低くなる場合があるが、本変形例によって、拡張順序値データを予め定義しておけば、図の右側に示すように、ドットを強制的に分散させることができる。このように、本変形例によれば、図8(a)に示した大域的ディザテーブルWDTBLを基礎とした実施例のハーフトーン処理に比べ、より画質の向上した印刷を行うことが可能になる。
(H3)第3変形例:
上述した実施例では、図4のデコードユニット420は、中間バッファBFからエンコード値EncDataを読み込み、デコードテーブルDecTBLから、そのエンコード値EncDataと処理対象の画素のブロック番号とに対応したドット配置データを取得することにより、ハーフトーン処理を行うものとした。
これに対して、本変形例では、図10のデコードテーブルDecTBLに換え、2つの変換テーブルを用いることでデコード処理を実現する。図28は、本変形例のデコード処理において用いる第1変換テーブルDT1の一例を示す説明図である。また、図29は、本変形例のデコード処理において用いる第2変換テーブルDT2の一例を示す説明図である。
図28に示した第1変換テーブルには、ブロック番号とエンコード値とに対応付けて、0から164までの値(以下、「第1ドット数データ」という)が記録されている。この第1ドット数データは、LドットとMドットとSドットのそれぞれの発生数をまとめて表した値である。第1ドット数データが164までの値に収まるのは、1つのブロックを構成する8つの画素についてみれば、各画素について、「大ドットを形成する」、「中ドットを形成する」、「小ドットを形成する」、「ドットを形成しない」の4つの状態を取り得る。従って、ドット個数の組合せは、これら4つの状態を、重複を許容して8回選択した時の組合せの数に等しくなるから、4H8(=4+8-1C8)によって求めることができる。このことから、最大でも165通り(0〜164)の組合せしか出現しないことになる。なお、nHrは、n個の物の中から重複を許してr回選択するときの重複組合せ数を求める演算子である。また、nCrは、n個の物の中から重複を許さずにr回選択するときの組合せ数を求める演算子である。
図29に示した第2変換テーブルには、図28に示した第1ドット数データに対応付けて、各サイズのドット個数を表す第2ドット数データが記録されている。この第2ドット数データは、上述した実施例のドット数データDCDATに相当する。実施例と同様に、この第2ドット数データは、ドットのサイズを表すドットサイズ値が、サイズの大きい順に下位ビットから順に記録されている。例えば、図29の第2変換テーブルDT2において、第1ドット数データが「2」であれば、第2ドット数データは、「00,00,00,00,00,00,01,01」となり、Sドットが2つ発生することを表している。図29の第2変換テーブルDT2の右側には、第2ドット数データが表す各サイズのドットの数の内訳を示している。この第2変換テーブルDT2は、図の下部に示したドット発生量テーブルに基づき生成されるテーブルである。
図30は、本変形例において画像処理ASIC155のデコードユニット420が実行するデコード処理のフローチャートである。このデコード処理が実行されると、デコードユニット420は、まず、中間バッファBFに蓄積されたエンコード値EncDataを読み出す(ステップS1400)。
エンコード値EncDataを読み出すと、デコードユニット420は、処理対象の画素が属するブロック番号の計算を行う(ステップS1410)。かかる計算の手法は上述した実施例で説明したとおりである。
ブロック番号の計算を終えると、デコードユニット420は、図28に示した第1変換テーブルを参照して、ステップS1400によって読み出したエンコード値EncDataと、ステップS1410によって計算したブロック番号とに対応する第1ドット数データを取得する(ステップS1420)。
第1ドット数データを取得すると、次に、デコードユニット420は、図29に示した第2変換テーブルを参照して、その第1ドット数データに対応する第2ドット数データを取得する(ステップS1430)。
第2ドットデータを取得すると、デコードユニット420は、ステップS1430によって取得した第2ドット数データと現在のブロック番号に対応するディザデータDthDATに記録された順序値データに基づき、第2ドット数データに定義された各サイズのドットをブロック内に配置する処理を行う(ステップS1440)。この配置処理は、実施例において説明した図18のドット配置データ生成処理と同一の処理である。すなわち、図18のドット配置データ生成処理は、実施例では、デコードテーブルDecTBL内に記録するドット配置データを生成するための処理であるが、本変形例では、第2ドット数データに応じて、動的にドット配置データを生成する処理として実行される。このドット配置データ生成処理が実行されれば、最終的に、ブロック番号とエンコード値に対応したドット配置データが生成され、本変形例におけるデコード処理が終了する。
以上で説明した第3変形例によれば、2つの変換テーブルを参照することにより、中間バッファBFから取得したエンコード値EncDataをドット配置データに変換することができる。実施例に示したデコードテーブルDecTBLには、4×2サイズのドット配置データが全てのブロック番号と全てのエンコード値とに対応付けて記憶されているため、比較的、RAM152に記憶されるデータ容量が大きくなる。これに対して、本変形例では、第1変換テーブルDT1のデータ量と第2変換テーブルDT2のデータ量を加算しても、そのデータ容量の総和は、実施例のデコードテーブルよりも少なくなる。従って、RAM152の記憶容量を削減でき、コストダウンを図ることが可能になる。
なお、上述した第2変形例における拡張順序値データによるドットの配置は、第3変形例においても適用することができる。すなわち、図30に示したデコード処理のステップS1440のドット配置処理において、拡張順序値データを読み込むことによって、ブロック内のドットをこの拡張順序値データに基づき配置することが可能である。従って、第3変形例においても、より分散性の高いドットの配置を実現することが可能になる。
(H4)第4変形例:
上述した実施例では、入力解像度が360dpi×360dpiで、出力解像度が1440dpi×720dpiの場合(以下、「高解像度モード」という)についてのハーフトーン処理について説明した。これに対して、本変形例では、出力解像度を減じ、入力解像度が360dpi×360dpiで、出力解像度が720dpi×720dpiの場合(以下、「低解像度モード」という)についてのハーフトーン処理について説明する。
図31は、高解像度モードと低解像度モードとにおける1ブロック分の出力の実サイズの違いを示す説明図である。上述した低解像度モードは、実施例で説明した高解像度モードよりも、横方向で1/2倍の出力解像度となる。そうすると、図31に示すように、印刷用紙上に形成される4×2のドットからなる1ブロック分の実サイズは、高解像度モード時に比べ、横方向で2倍の大きさとなる。そのため、低解像度モード時におけるハーフトーン処理では、次のようにエンコード処理およびデコード処理を行うことで、出力画像のサイズを適正化する。
図32は、低解像度モード時におけるハーフトーン処理の概要を表すフローチャートである。まず、画像処理ASIC155は、CMY画像からX方向に隣り合う2画素分の画素データを入力する(ステップS1500)。
次に、画像処理ASIC155のエンコードユニット410は、上記ステップS1500で入力した2つの画素が、同じブロック番号に属するものとして、それぞれエンコード処理を行う(ステップS1510)。
エンコード処理の後、画像処理ASIC155のデコードユニット420は、中間バッファBFを経由して、エンコードユニット410から2画素分のエンコード値を入力すると、各画素について、デコード処理を行い、デコードテーブルDecTBLから、2ブロック分のドット配置データを取得する(ステップS1520)。
2ブロック分のドット配置データを取得すると、デコードユニット420は、ドット配置データの分割合成処理を行う(ステップS1530)。この分割合成処理では、デコードユニット420は、CMY画像中において、左側に位置していた画素に対応するドット配置データ(4×2)から左半分(2×2)のドット配置データを取得し、更に、CMY画像中において、右側に位置していた画素に対応するドット配置データ(4×2)から右半分(2×2)のドット配置データを取得する。そして、取得したこれらの2×2のドット配置データを左右に配置して合成すれば、1ブロック分のハーフトーン処理が完了する。
以上で説明した第4変形例によれば、解像度の低減に伴い、1ブロック分の実サイズが拡大したとしても、2画素分のドット配置データを分割して結合することで、出力画像の実サイズを高解像度モードによる出力画像の実サイズと同じサイズに保つことができる。また、2つのドット配置データをそれぞれ分割して合成した場合であっても、各ドット配置データは、同一のブロック番号から生成されているため、分割合成後のブロック内でドット数が意図せずに増減してしまうことを抑制することができる。従って、解像度を減じて出力を行っても、入力画像中に存在していた文字や線の一部が消失してしまうといった画質の劣化を抑制することが可能になる。
(H5)変形例5:
上記実施例では、プリンタ100は、複合機タイプであるものとし、単体で、画像データの入力からハーフトーン処理、インクの吐出制御まで行うものとした。これに対して、プリンタ100にコンピュータを接続し、コンピュータにおいて、画像データの入力と、ハーフトーン処理の一部、すなわち、エンコード処理までを実行するものとしてもよい。このような構成では、コンピュータに所定のプログラムをインストールすることで、実施例に記載した初期化処理やハーフトーン処理を実現することができる。プリンタ100は、コンピュータからプリンタケーブル等を経由してエンコード値を受信すると、そのエンコード値に応じてデコード処理を行い、印刷機構を制御して、印刷用紙への印刷を行う。
このように、コンピュータでエンコード処理までを実行するものとすれば、C,M,Y,Kの各毎に、8ビット(255階調)のデータサイズを有する画像データが、5ビットのエンコード値に変換されるため、コンピュータとプリンタ100間の通信量を削減することができる。この結果、全体として印刷速度を向上させることが可能になる。