以下では、本発明の作用・効果をより明確に説明するために、本発明の実施の形態を、次のような順序に従って説明する。
A.実施例の概要:
B.装置構成:
C.第1実施例の画像印刷処理の概要:
C−1.多値化結果値生成処理の概要:
C−2.ドット形成有無決定処理の概要:
C−3.ディザ法の概要:
C−4.分類番号を決定するための考え方:
C−5.多値化テーブルの設定方法:
C−6.変換テーブルの設定方法:
C−7.順序値マトリックスの設定方法:
C−8.多値化結果値からドット形成有無を適切に決定可能な原理:
C−9.画素群の位置から分類番号を決定する方法:
C−10.変形例:
D.第2実施例:
D−1.第2実施例のドット形成有無決定処理の原理:
D−2.第2実施例のドット形成有無決定処理:
E.第3実施例:
E−1.画質を改善する原理:
E−2.第3実施例のドット形成有無決定処理:
E−3.第3実施例の変形例:
F.第4実施例:
F−1.画質を改善する原理:
F−2.第4実施例の画像印刷処理の概要:
A.実施例の概要 :
実施例の詳細な説明に入る前に、図1を参照しながら、実施例の概要について説明しておく。図1は、印刷システムを例にとって、本発明の概要を説明するための説明図である。本印刷システムは、画像処理装置としてのコンピュータ10と、画像出力装置としてのプリンタ20等から構成されており、コンピュータ10に所定のプログラムがロードされて実行されると、コンピュータ10およびプリンタ20などが全体として、一体の画像出力システムとして機能する。プリンタ20は、印刷媒体上にドットを形成することによって画像を印刷する。コンピュータ10は、印刷しようとする画像の画像データに所定の画像処理を施すことによって、プリンタ20が画素毎にドットの形成を制御するためのデータを生成して、該プリンタ20に供給する。
一般的な印刷システムでは、次のようにして画像を印刷する。先ず、コンピュータで所定の画像処理を施すことにより、画像データを、画素毎にドット形成の有無を表すデータに変換する。次いで、得られたデータをプリンタに供給し、プリンタでは供給されたデータに従ってドットを形成することにより画像を印刷している。ここで、印刷しようとする画像の画素数が多くなると、それに伴って、画像処理に要する時間が増加して、画像を迅速に印刷することが困難となる。また、画素数が多くなるにつれて、画素毎にドット形成の有無を表すデータのデータ量が増加するので、コンピュータからプリンタにデータを出力するために要する時間が長くなり、それだけ印刷に要する時間が増加してしまう。
こうした点に鑑みて、図1に例示した印刷システムでは、次のようにして画像を印刷する。先ず、コンピュータ10では、画像を構成する画素を、所定の複数個ずつまとめて画素群を生成し、各画素群について、画素群を代表する階調値たる画素群階調値を決定する。次いで、画素群階調値をコード化することによりコード値を生成する。コード化に際しては、画素群毎に付与された分類番号を取得して、画素群階調値とコード値とを、分類番号毎に対応付けた第1の対応関係を参照することによって行う。
プリンタ20では、各画素群についてのコード値を受け取ると、画素群内の各画素についてのドット形成の有無を表すデータ(画素群の出力ドット配置)を決定する。ドット形成の有無は、第2の対応関係を参照しながら、ドット形成有無決定モジュールによって行われる。このようにして得られたドット形成有無の決定結果に従って、ドット形成モジュールがドットを形成することによって画像が印刷される。
ここで、画素毎にドット形成の有無を表すデータに比べれば、画素群毎のコード値は遙かに小さなデータ量とすることができる。従って、コンピュータ10から画素毎にドット形成の有無を表したデータをプリンタ20に供給する代わりに、画素毎のコード値を供給してやれば、極めて迅速にデータを転送することが可能となる。
また、コード値は、コンピュータ10内で次のようにして生成される。先ず、画素群階調値決定モジュールにおいて画素群階調値が決定される。画素群階調値の決定に際しては、例えば、画素群内の各画素の画像データに基づいて決定することとしてもよい。一方、第1の対応関係記憶モジュールには、画素群階調値とコード値とを対応付けた対応関係(第1の対応関係)が、画素群の分類番号毎に記憶されている。ここで画素群の分類番号は、各画素群を画像中での位置に応じて複数種類に分類することによって設定することもできるし、また、画像がいつも同じように分割される場合などには、各画素群毎に予め適切な分類番号を付与しておくこともできる。更に、簡便には、乱数などを用いてランダムに分類番号を付与することも可能である。コード化モジュールは、画素群の画素群階調値を受け取ると、第1の対応関係記憶モジュールの中から、画素群に応じた対応関係を参照することによって、画素群階調値をコード値に変換する。
このように対応関係を参照しながらコード値を生成しているために、画素群階調値を極めて迅速にコード化することができる。このため、生成したコード値をプリンタ20に迅速に供給可能なことと相まって、たとえ画素数の多い画像であっても迅速に画像を印刷することが可能となる。また、対応関係を参照して画素群階調値をコード化すれば、極めて簡素な処理でコード値を生成することができる。このため、画素群階調値をコード化するためには、コンピュータ10のような高度な処理能力を有する機器を用いずとも、例えばプリンタ20あるいはデジタルカメラなどの内部でもコード値を得ることが可能となる。更に、第2の対応関係を参照することで、コード値から直ちに画素群の出力ドット配置が得られるので、ドット形成の有無を迅速に決定することができる。加えて、対応関係を参照するという簡素な処理で、出力ドット配置を決定することができるので、コンピュータ10のような高度な処理能力を有する機器を用いずとも、画素群の出力ドット配置、すなわち画素毎のドット形成の有無を迅速に決定することが可能となる。
加えて、第2の対応関係において、各画素群に設定されている複数のコード値の中には、互いにドットの形成される画素位置のみが異なった関係にある共役コード値が、少なくとも一組ずつ含まれている。そして、第1の対応関係において画素群階調値と画素群毎に関連付けられているコード値は、各画素群について第2の対応関係によって出力ドット配置と関連付けられているコード値となっている。
共役コード値は、互いに、ドットの形成される画素位置のみが異なっているだけであるため、一方の共役コード値を他方の共役コード値に入れ換えたとしても、その画素群に表現される階調値には何ら影響を与えることがない。このため、共役コード値の存在するコード値については、より高画質な画像が得られるコード値を予め選択して第1の対応関係に設定しておくことができるので、高画質な画像を出力することが可能となっている。以下では、こうした印刷システムを例に用いることにより、本発明の各種実施例について詳細に説明する。
B.装置構成 :
図2は、本実施例の画像処理装置としてのコンピュータ100の構成を示す説明図である。コンピュータ100は、CPU102を中心に、ROM104やRAM106などが、バス116で互いに接続して構成された周知のコンピュータである。
コンピュータ100には、フレキシブルディスク124やコンパクトディスク126等のデータを読み込むためのディスクコントローラDDC109や、周辺機器とデータの授受を行うための周辺機器インターフェースPIF108、CRT114を駆動するためのビデオインターフェースVIF112等が接続されている。PIF108には、後述するカラープリンタ200や、ハードディスク118等が接続されている。また、デジタルカメラ120やカラースキャナ122等をPIF108に接続すれば、デジタルカメラ120やカラースキャナ122で取り込んだ画像を印刷することも可能である。また、ネットワークインターフェースカードNIC110を装着すれば、コンピュータ100を通信回線300に接続して、通信回線に接続された記憶装置310に記憶されているデータを取得することもできる。
図3は、本実施例のカラープリンタ200の概略構成を示す説明図である。カラープリンタ200はシアン,マゼンタ,イエロ,ブラックの4色インクのドットを形成可能なインクジェットプリンタである。もちろん、これら4色のインクに加えて、染料または顔料濃度の低いシアン(淡シアン)インクと、染料または顔料濃度の低いマゼンタ(淡マゼンタ)インクとを含めた合計6色のインクドットを形成可能なインクジェットプリンタを用いることもできる。尚、以下では場合によって、シアンインク,マゼンタインク,イエロインク,ブラックインク,淡シアンインク,淡マゼンタインクのそれぞれを、Cインク,Mインク,Yインク,Kインク,LCインク,LMインクと略称することがあるものとする。
カラープリンタ200は、図示するように、キャリッジ240に搭載された印字ヘッド241を駆動してインクの吐出およびドット形成を行う機構と、このキャリッジ240をキャリッジモータ230によってプラテン236の軸方向に往復動させる機構と、紙送りモータ235によって印刷用紙Pを搬送する機構と、ドットの形成やキャリッジ240の移動および印刷用紙の搬送を制御する制御回路260などから構成されている。
キャリッジ240には、Kインクを収納するインクカートリッジ242と、Cインク,Mインク,Yインクの各種インクを収納するインクカートリッジ243とが装着されている。インクカートリッジ242,243をキャリッジ240に装着すると、カートリッジ内の各インクは図示しない導入管を通じて、印字ヘッド241の下面に設けられた各色毎のインク吐出用ヘッド244ないし247に供給される。
図4は、インク吐出用ヘッド244ないし247におけるインクジェットノズルNzの配列を示す説明図である。図示するように、インク吐出用ヘッドの底面には、C,M,Y,Kの各色のインクを吐出する4組のノズル列が形成されており、1組のノズル列あたり48個のノズルNzが、一定のノズルピッチkで配列されている。
制御回路260は、CPUや、ROM、RAM、PIF(周辺機器インターフェース)等がバスで相互に接続されて構成されている。制御回路260は、キャリッジモータ230および紙送りモータ235の動作を制御することによってキャリッジ240の主走査動作および副走査動作を制御するとともに、コンピュータ100から供給される印刷データに基づいて、各ノズルから適切なタイミングでインク滴を吐出する制御を行う。こうして、制御回路260の制御の下、印刷媒体上の適切な位置に各色のインクドットを形成することによって、カラープリンタ200はカラー画像を印刷することができる。
また、本実施例のカラープリンタ200は、吐出するインク滴の大きさを制御することにより、インクドットの大きさを制御することが可能である。以下、カラープリンタ200が大きさの異なるインクドットを形成する方法について説明するが、その準備として、先ず、各色インクを吐出するノズルの内部構造について説明する。
図5(a)は、インクを吐出するノズルの内部構造を示した説明図である。各色のインク吐出用ヘッド244ないし247には、このようなノズルが複数設けられている。図示するように、各ノズルにはインク通路255と、インク室256と、インク室の上にピエゾ素子PEとが設けられている。キャリッジ240にインクカートリッジ242,243を装着すると、カートリッジ内のインクがインクギャラリ257を経由してインク室256に供給される。ピエゾ素子PEは、周知のように電圧を印加すると結晶構造が歪んで極めて高速に電気−機械エネルギの変換を行う素子である。本実施例では、ピエゾ素子PEの両端に設けられた電極間に所定波形の電圧を印加することで、インク室256の側壁を変形させる。その結果、インク室256の容積が減少し、容積の減少分に相当するインクがインク滴IpとなってノズルNzから吐出される。このインク滴Ipがプラテン236に装着された印刷用紙Pに染み込むことで、印刷用紙上にインクドットが形成される。
図5(b)は、ピエゾ素子PEに印加する電圧波形を制御することで、吐出するインク滴の大きさを変更する原理を示した説明図である。ノズルからインク滴Ipを吐出するためには、ピエゾ素子PEに府の電圧を印加してインクギャラリ257からインク室256内に一旦インクを吸入し、その後、ピエゾ素子PEに正電圧を印加してインク室容積を減少させて、インク滴Ipを吐出させる。ここで、インクの吸引速度が適切であればインク室容積の変化量に相当するインクが吸入されるが、吸引速度が速すぎると、インクギャラリ257とインク室256との間には通路抵抗があるためにインクギャラリ257からのインクの流入が間に合わなくなる。その結果、インク通路255のインクがインク室内に逆流して、ノズル付近のインク界面が大きく後退した状態となる。図5(b)に実践で示した電圧波形aは、適正な速度でインクを吸引する波形を示し、破線で示した電圧波形bは適切速度より大きな速度で吸引する波形の一例を示している。
十分なインクがインク室256内に供給された状態で、ピエゾ素子PEに正電圧を印加すると、インク室256の容積減少に相当する体積のインク滴IpがノズルNzから吐出される。これに対して、インクの供給量が不足してインク界面が大きく後退した状態で正電圧を印加すると、吐出されるインク滴は小さなインク滴となる。このように、本実施例のプリンタ200では、インク滴の吐出前に印加する府の電圧波形を制御してインクの吸引速度を変更することで、吐出するインク滴の大きさを制御し、大ドット、中ドット、小ドットの3種類のインクドットを形成することが可能となっている。
もちろん、3種類に限らずより他種類のドットを形成することも可能である。更には、微細なインク滴を一度に複数吐出して、吐出するインク滴の数を制御するといった方法を用いて、印刷用紙上に形成されるインクドットの大きさを制御してもよい。このようにしてインクドットの大きさを制御すれば、印刷しようとする画像の領域に応じて異なる大きさのインクドットを使い分けてやることで、より高画質の画像を印刷することも可能となる。
尚、各色のインク吐出ヘッドからインク滴を吐出する方法には、種々の方法を適用することができる。すなわち、ピエゾ素子を用いてインク滴を吐出する方式や、インク通路に配置したヒータでインク通路内に泡(バブル)を発生させてインク滴を吐出する方法などを用いることができる。また、インク滴を吐出する代わりに、熱転写などの現象を利用して印刷用紙上にインクドットを形成する方式や、静電気を利用して各色のトナー粉を印刷媒体上に付着させる方式のプリンタを使用することも可能である。
以上のようなハードウェア構成を有するカラープリンタ200は、キャリッジモータ230を駆動することによって、各色のインク吐出用ヘッド244ないし247を印刷用紙Pに対して主走査方向に移動させ、また紙送りモータ235を駆動することによって、印刷用紙Pを副走査方向に移動させる。制御回路260は、キャリッジ240の主走査および副走査の動きに同期させながら、適切なタイミングでノズルを駆動してインク滴を吐出することによって、カラープリンタ200は印刷用紙上にカラー画像を印刷している。
尚、カラープリンタ200にも、制御回路260内にはCPU,RAM,ROMなどが搭載されていることから、コンピュータ100が行う処理をカラープリンタ200内で実施することも可能である。このような場合は、デジタルカメラ120などで撮影した画像の画像データをカラープリンタ200に直接供給して、制御回路260内で必要な画像処理を実施することにより、カラープリンタ200から直接画像を印刷することも可能となる。
C.第1実施例の画像印刷処理の概要 :
以下では、上記のようなコンピュータ100およびカラープリンタ200が、画像を印刷するために、それぞれの内部で行われる画像処理(画像印刷処理)について説明する。ここでは、理解の便宜を図るため、初めに画像印刷処理の概要について説明し、次に、こうした画像印刷処理を行うことで、画質を低下させることなく画像を迅速に印刷することが可能な理由について説明する。
尚、以下では、画像印刷処理の前半部分はコンピュータ100で実施され、後半部分はカラープリンタ200で実施されるものとして説明するが、コンピュータ100が行う処理をカラープリンタ200の内部で実施したり、あるいはデジタルカメラ120など、画像データを生成する機器の内部で実施することも可能である。すなわち、第1実施例の画像印刷処理によれば、後ほど詳細に説明するように、前半部分の処理をたいへん簡素なものとすることができるので、高い処理能力を有していないCPUを用いた場合でも迅速に実施することが可能である。このため、カラープリンタ200やデジタルカメラなどに画像印刷処理の前半部分を組み込んだ場合でも、十分に実用的な印刷システムを構成することができる。
図6は、第1実施例の画像印刷処理の全体的な流れを示すフローチャートである。図示されているように、画像印刷処理を開始すると先ず初めに、コンピュータ100が画像データの読み込みを開始する(ステップS100)。ここでは、画像データはRGBカラー画像データであるものとして説明するが、カラー画像データに限らず、モノクロ画像データについても同様に適用することができる。また、カラープリンタに限らず単色プリンタについても同様に適用することが可能である。
カラー画像データの読み込みに続いて、色変換処理を行う(ステップS102)。色変換処理とは、R,G,Bの階調値の組合せによって表現されているRGBカラー画像データを、印刷のために使用されるインク各色についての階調値の組合せによって表現された画像データに変換する処理である。前述したように、カラープリンタ200はC,M,Y,Kの4色のインクを用いて画像を印刷している。そこで、色変換処理ではRGB各色によって表現された画像データを、C,M,Y,Kの各色の階調値によって表現されたデータに変換する。色変換処理は、色変換テーブル(LUT)と呼ばれる3次元の数表を参照することで行う。LUTには、RGBカラー画像データに対して、色変換によって得られるC,M,Y,K各色の階調値が予め記憶されている。ステップS102の処理では、このLUTを参照することにより、RGBカラー画像データをC,M,Y,K各色の画像データに迅速に色変換することが可能となっている。
色変換処理を終了すると、解像度変換処理を開始する(ステップS104)。解像度変換処理とは、画像データの解像度を、プリンタ200が画像を印刷する解像度(印刷解像度)に変換する処理である。画像データの解像度が印刷解像度よりも低い場合は、補間演算を行って画素間に新たな画像データを生成し、逆に画像データの解像度が印刷解像度よりも高い場合には、一定の割合でデータを間引くことによって、画像データの解像度を印刷解像度に一致させる処理を行う。
以上のようにして解像度を印刷解像度に変換したら、コンピュータ100は、多値化結果値生成処理を開始する(ステップS106)。多値化結果値生成処理の詳細な内容は後ほど詳しく説明することとして、ここでは概要のみを説明する。多値化結果値生成処理では、隣接する画素を所定個数ずつ画素群としてまとめることにより、1つ画像を複数の画素群に分割する。画素群としてまとめられ画素数は、必ずしも全ての画素群が同数である必要はなく、例えば、複数の画素数を規則的に切り換えたり、あるいは画像中での位置に応じて画素群にまとめられる画素数を切り換えることも可能であるが、ここでは理解の便宜から、最も単純な場合として全画素群が同数の画素を有するものとして説明する。こうして複数の画素を画素群にまとめて、各画素群を代表する階調値である画素群階調値を求めた後、画素群階調値の多値化を行う。その結果、画素群毎の画素群階調値が多値化結果値に変換されることになる。
ここで、本実施例の多値化結果値生成処理では、多値化の結果として取り得る状態数が画素群毎に異なっている。すなわち、一般的に行われる多値化では、例えば1つの画像中で2値化と3値化とが切り換わることはないが、本実施例の多値化結果値生成処理では、画素群毎に多値化の段数が異なっている。そして、画素群階調値を、画素群毎に個数の段数で多値化して得られた結果値を、カラープリンタ200に向かって出力する。このように画素群階調値を、画素群毎に固有の段数で多値化して、得られた結果を出力することとすれば、カラープリンタ200に出力すべきデータ量を大きく低減することができる。また、後述するように、画素群毎の多値化結果値は、迅速に生成することができることから、データ量が小さくなることと相まって、多値化結果値を極めて迅速にカラープリンタ200に出力することが可能となる。こうした多値化結果値生成処理の詳細については後述する。
カラープリンタ200の制御回路260に内蔵されたCPUは、コンピュータ100から画素群毎に供給された多値化結果値のデータを受け取ると、ドット形成有無決定処理を開始する(ステップS108)。上述したように、多値化結果値は、画素群階調値を多値化して得られた値であり、画素群内でいずれの画素にドットを形成すればよいかを示した値ではない。画素群の多値化結果値からドットを形成する画素位置を決定する手法としては、いわゆる濃度パターン法と呼ばれる手法が知られているが、本実施例の多値化結果値は画素群毎に固有の段数で多値化されており、濃度パターン法をそのまま適用することはできない。そこで、第1実施例のドット形成有無決定処理では、後述するような特殊な方法を用いることにより、画素群毎に得られた多値化結果値からドットを形成する画素位置を決定する。
また、いわゆる濃度パターン法では、実質的な解像度が、多値化を行った画素群の解像度まで低下してしまい、画質の悪化を招き易い傾向があった。これに対して、第1実施例のドット形成有無決定処理によれば、後述するように画素群の大きさに依存して画質が悪化することがない。更に、いわゆるブルーノイズマスク、あるいはグリーンノイズマスクと呼ばれるディザマトリックスを用いることで実現されるような、ドットが良好に分散した高画質な画像を印刷することが可能となる。第1実施例のドット形成有無決定処理の詳細な内容、および、かかる処理を適用してドット形成の有無を決定することで、こうした特性が得られる理由については、後ほど詳しく説明する。
以上のようにして、ドットを形成すべき画素位置を決定したら、決定した画素位置にドットを形成する処理を行う(ステップS110)。すなわち、図3を用いて説明したように、キャリッジ240の主走査および副走査を繰り返しながらインク吐出用ヘッドを駆動してインク滴を吐出することにより、印刷用紙上にインクのドットを形成する。こうしてドットを形成することにより、画像データに対応した画像が印刷されることになる。
C−1.多値化結果値生成処理の概要 :
図7は、上述した第1実施例の画像印刷処理で行われる多値化結果値生成処理の流れを示すフローチャートである。ここでは、多値化結果値生成処理はコンピュータ100で実施されるものとして説明するが、後述するように、多値化結果値生成処理は極めて簡素な処理とすることができるから、カラープリンタ200あるいはデジタルカメラ120内で実施することも可能である。以下、フローチャートに従って説明する。
本実施例の多値化結果値生成処理を開始すると、先ず初めに、互いに隣接する所定個数の画素をまとめて画素群を生成する(ステップS130)。ここでは、主走査方向に4画素分、副走査方向に2画素分の合計8つの画素を画素群にまとめるものとする。尚、画素群としてまとめる画素は、このように矩形状に縦横の位置が揃った画素である必要はなく、互いに隣接し且つ所定の位置関係にあればどのような画素を画素群としてまとめても良い。
次いで、画素群階調値と、画素群の分類番号とを決定する(ステップS132)。画素群階調値とは、画素群を代表する階調値であり、次のようにして簡単に求めることができる。例えば、画素群内の各画素に割り当てられた画像データの平均値を求めて画素群階調値とすることができる。あるいは、画素群の中で最も多くの画素に割り当てられた画像データ、更には、画素群内で特定の位置にある画素の画像データを画素群階調値とすることも可能である。
また、画素群の分類番号は、次のようにして極めて簡便に決定することができる。図8は、画素群の分類番号を決定する方法を示した説明図である。図8(a)は、画像中で8つの画素をまとめて生成された1つの画素群を表している。以下では、この画素群についての分類番号を決定する方法について説明する。尚、図8(a)に示すような、分類番号を決定するために着目している画素群を、着目画素群と呼ぶことにする。
今、画像の一番左上隅を原点に取って、原点からの主走査方向および副走査方向への画素数によって画素位置を表すものとする。また、画素群の位置は、画素群の左上隅にある画素の画素位置によって表すものとする。図8(a)では、着目画素群の位置を示す画素に黒丸を付して表示している。この画素の画素位置が(X,Y)であったとする。着目画素群の分類番号は、X,Yを2進数表示して、所定のビットに記憶されているデータを読み出すだけで、極めて容易に決定することができる。例えば、図8(b)に示すように、着目画素群の位置を表すX,Yがそれぞれ10ビットデータであったとする。そして、Xの最上位の4ビット目から8ビット目までのデータを読み出して得られた値をNとし、Yの最上位の4ビット目から8ビット目までのデータを読み出して得られた値をMとする。すると、本実施例の場合は、
N+(M−1)×32 …(1)
を算出することによって、画素群の分類番号を簡単に決定することができる。このようにして画素群の分類番号を決定可能な理由については後述する。
こうして、画素群の分類番号と画素群階調値とを決定したら、後述する多値化テーブルを参照することによって、画素群階調値を多値化する(ステップS134)。図9は、多値化に際して参照される多値化テーブルを概念的に示した説明図である。図示されているように、多値化テーブルには、画素群の分類番号毎に、画素群階調値に対する多値化結果値が対応づけて記憶されており、多値化結果値は、画素群階調値が増加するに従って段階的に増加していく。
図10は、画素群階調値が増加するに従って多値化結果値が段階的に増加していく様子を例示した説明図である。図では、横軸に画素群階調値を取り、縦軸の多値化結果値を取った折れ線グラフを用いて、画素群階調値に対する多値化結果値を表示している。尚、図中では、異なる分類番号N1〜N5を有する5つの画素群についての多値化結果を示しているが、これら画素群の折れ線が重なって判別し難くなることを避けるために、多値化結果値の原点位置を縦軸方向に少しずつ、ずらして表示している。
一例として、図中に太い実線で示した分類番号N1番の画素群について説明すると、画素群階調値が0〜4の範囲では、多値化結果値は「0」であるが、画素群階調値が5〜20の範囲では多値化結果値は「1」に増加する。次いで、画素群階調値が21〜42の範囲では多値化結果値は「2」に増加し、画素群階調値が43〜69の範囲では多値化結果値は「3」に増加する。このように、画素群階調値が増加するに従って、多値化結果値も段階的に増加していき、最終的には、多値化結果値は「15」まで増加する。すなわち、分類番号N1番の画素群については、階調値0〜255の範囲を取り得る画素群階調値を、階調値0〜15までの16段階に多値化(言わば、16値化)していることになる。
同様に、図中で太い破線で示した分類番号N2番の画素群や、太い一点鎖線で示した分類番号N3番の画素群については、階調値0〜255の範囲を取り得る画素群階調値を、階調値0〜17までの18段階に多値化(言わば、18値化)している。更に、細い実線で示した分類番号N4番の画素群および細い一点鎖線で示した分類番号N5番の画素群については、画素群階調値を階調値0〜20までの21段階に多値化(言わば、21値化)していることになる。このように、本実施例の多値化結果値生成処理では、各画素群の多値化の段数(多値化の結果として取り得る状態数)が同じではなく、画素群の分類番号に応じて固有の段数で多値化されている。この結果、同じ画素群階調値を多値化した場合でも、画素群の分類番号が異なり、そのため多値化の段数が異なっていれば、異なる結果値に多値化されることになる。
また、多値化段数が同じであったとしても、同じ多値化結果値が得られるわけではない。例えば、図10に示した分類番号N2の画素群と、分類番号N3の画素群とを比較すれば明らかなように、これら画素群についての多値化段数はいずれも18段であるが、多値化結果値が切り換わる画素群階調値は多くの場合、一致していない。分類番号N4の画素群と分類番号N5の画素群とについても同様に、これら画素群の多値化段数はいずれも21段であるが、多値化結果値が切り換わる画素群階調値は一致していないことが多い。このことから、例え画素群の多値化段数が同じでも、分類番号が異なれば、異なる多値化結果値が得られることになる。
図9に示した多値化テーブルには、画素群階調値に対する多値化結果値が画素群の分類番号毎に記憶されている。そして、画素群階調値と多値化結果値との対応関係は、図10に示したように、分類番号毎に固有の対応関係となっている。図7に示した多値化結果値生成処理のステップS134では、このような多値化テーブルを参照して画素群階調値を多値化することにより、画素群毎に多値化結果値を生成する処理を行う。尚、図9に示す多値化テーブルの設定方法については、後ほど詳しく説明する。
以上のようにして、複数の画素を画素群にまとめて、その画素群の多値化結果値を生成したら、全画素について処理を終了したか否かを判断する(ステップS136)。そして、未処理の画素が残っている場合は(ステップS136:no)、ステップS130に戻って新たな画素群を生成し、後述する一連の処理を行うことにより、その画素群についての多値化結果値を生成する。こうした操作を繰り返し、全画素についての処理を終了したと判断されたら(ステップS136:yes)、各画素群について得られた多値化結果値をカラープリンタ200に出力した後(ステップS138)、図7の多値化結果値生成処理を終了する。
このように、画素群毎に多値化結果値を出力してやれば、画素毎にドット形成の有無を表すデータを出力する場合よりも、カラープリンタ200に供給すべきデータ量を大幅に減少させることができる。以下では、この点について説明する。
本実施例では、大ドット、中ドット、小ドットの3種類のドットを形成可能としているから、ドットを形成しない場合も含めると、画素毎に4つの状態を取り得ることになり、従って、ドット形成の有無を表すためには1画素あたり2ビットのデータ量が必要となる。また、本実施例では、1つの画素群は8つの画素で構成されているものとしているから、画素毎にドット形成の有無を表そうとすると、画素群あたり16ビット(=2ビット×8画素)のデータ量が必要となる。
一方、図7に示した多値化結果値生成処理では、画素群の分類番号によって異なるものの、多値化の段数は15〜21程度となっている(図9、図10を参照のこと)。画素群毎に多値化の段数を決定する方法については後述するが、多値化の段数は、多く見積もっても30を越えることはないと考えられる。従って、画素群の多値化結果値であれば、1画素群あたり5ビットのデータ量があれば十分に表現することが可能である。前述したように、画素毎にドット形成の有無を表す場合には画素群あたり16ビットのデータ量が必要となることから、画素群階調値を多値化して得られた結果値を出力することにすれば、カラープリンタ200に出力すべきデータ量を1/3以下に減少させることができる。この様に、本実施例の画像印刷処理では、画素群の多値化結果値を出力しているため、データ量を大きく減少させることができ、カラープリンタ200に迅速にデータを出力することが可能となっている。
カラープリンタ200は、こうしてコンピュータ100から多値化結果値を受け取ると、以下に説明するドット形成有無決定処理を行うことにより、画素群内の各画素についてドット形成の有無を決定する。
C−2.ドット形成有無決定処理の概要 :
図11は、前述した第1実施例の画像印刷処理で行われるドット形成有無決定処理の流れを示すフローチャートである。かかる処理は、コンピュータ100から画素群毎に多値化結果値を受け取った後、カラープリンタ200によって実行される処理である。以下、図11のフローチャートに従って説明する。
第1実施例のドット形成有無決定処理を開始すると、先ず初めに、処理対象とする画素群を1つ選択し、選択した画素群の多値化結果値を取得する(ステップS160、S162)。次いで、画素群の多値化結果値を、その画素群に形成するドット個数を表すデータに変換する(ステップS164)。ここで、図9および図10に示したように、多値化結果値は、画素群の分類番号が異なれば、例え画素群階調値が同じであっても異なった値を取る。このことから明らかなように、画素群の多値化結果値は、同じ分類番号の画素群との間でのみ結果値の大小を比較することが可能であり、分類番号が異なる画素群については、多値化結果値を比較することができないデータとなっている。
そこで、画素群の分類番号に依存する多値化結果値を、分類番号に依存しない多値化結果値に変換することを考える。多値化結果値を分類番号に依存しない値に変換してやれば、全ての画素群についての多値化結果値の大小を比較することができるので、それぞれの変換値の序列に応じて、大ドット・中ドット・小ドットの適切な形成個数、すなわちドット個数を表すデータを対応付けることが可能となる。
図11のステップS164では、このような考え方に基づいて、画素群の分類番号に依存する多値化結果値を、画素群に形成するべきドットの個数を示すデータに変換する。実際の変換は、画素群の分類番号と多値化結果値との組合せ毎に、適切なドット個数のデータを予め設定しておいた変換テーブルを参照するだけで、極めて迅速に行うことができる。
図12は、画素群の分類番号と多値化結果値との組合せを、ドット個数を示すデータに変換する際に参照される変換テーブルを概念的に示した説明図である。図示されているように、変換テーブルには、多値化結果値に対応するドット個数のデータが、分類番号毎に設定されている。一例として、分類番号1番の画素群について説明すると、多値化結果値0に対しては、ドット個数のデータとして「0」が設定されている。このドット個数データ「0」は、大ドット、中ドット、小ドットの形成個数がいずれも0個であることを表したコードデータである。また、多値化結果値1に対しては、ドット個数のデータとして「1」が設定されている。ドット個数データ「1」は、大ドット、中ドットの形成個数は0個であり、小ドットの形成個数が1個であることを表すコードデータである。更に、多値化結果値15に対してはドット個数データ「164」が設定されている。ドット個数データ「164」は、大ドットを8個形成し、中ドットおよび小ドットは形成しないことを表すコードデータである。
このように、変換テーブルには、ドット個数を示すデータはコード化されたデータとして設定されている。すなわち個数データは、直接的にドット個数を表すものでなくても、何らかの方法で、ドット個数を特定可能であれば、どのような形態のデータとすることもできる。また、分類番号1番の画素群については、「16」より大きな多値化結果値に対してはドット個数を示すデータが設定されていない。これは、分類番号1番の画素群は多値化段数が16段であり、多値化結果値は0〜15の値しか取り得ないことに対応するものである。従って、分類番号2番の画素群のように多値化段数が18段の画素群については、0〜17の多値化結果値に対してのみドット個数を示すデータが設定され、「18」より大きな多値化結果値に対しては、ドット個数を示すデータが設定されることはない。
図13は、コード化された個数データと、各コードデータが表す大ドット・中ドット・小ドットの個数の組合せとの対応関係を示した説明図である。このように、各種ドットの個数をコード化して扱っているのは、次のような理由によるものである。
ここでは、1つの画素群は8つの画素をまとめて構成されているものとしているから、大ドット、中ドット、小ドットの形成個数は、それぞれ0〜8個の値を取り得る。従って、各ドットの個数をコード化せずに、そのまま表現しようとすると、大ドットの個数、中ドットの個数、小ドットの個数を表すためにそれぞれ4ビットずつ、合計では12ビットのデータ量が必要となる。
一方、1つの画素群は8つの画素から構成されているから、画素群に形成され得るドット個数の合計は、最大でも8個である。例えば、大ドットが4個、中ドットが3個、小ドットが2個といったドット個数の組合せは、ドット個数の合計が9個となって8個を越えてしまうので現実には発生し得ない。こうした点に着目すれば、現実に発生し得るドット個数の組合せは、それほど多くの種類はないと考えられる。実際に算出すれば、次のようになる。画素群には8つの画素が含まれており、各画素についてみれば「大ドットを形成する」、「中ドットを形成する」、「小ドットを形成する」、「ドットを形成しない」の4つの状態を取り得る。従って、画素群に形成し得るドット個数の組合せは、これら4つの状態を、重複を許して8回選択した時の組合せの数に等しくなるから、
4H8(=4+8−1C8)
によって求められ、結局、最大でも165通りの組合せしか出現しないことになる。ここで、nHrは、n個の物の中から重複を許してr回選択するときの重複組合せ数を求める演算子である。また、nCrは、n個の物の中から重複を許さずにr回選択するときの組合せ数を求める演算子である。165通りの組合せであれば、8ビットあれば表現することができる。従って、現実に発生し得るドット個数の組合せにコード番号を設定しておけば、画素群に形成すべきドット個数の組合せを8ビットのデータで表すことができる。結局、ドット個数の組合せをコード化しておくことで、ドットの種類毎に形成個数を表した場合よりも、必要なデータ量を低減することが可能となる。このような理由から、個数データを図13に示したようにコード化して表現することとして、図12に示した変換テーブルでは、分類番号毎の多値化結果値に対して、コード化されたドット個数のデータが設定されているのである。尚、図12に示すような変換テーブルを設定する方法については、別図を用いて後ほど詳しく説明する。
図11に示したドット形成有無決定処理では、図12に示した変換テーブルを参照することにより、画素群の多値化結果値を、ドット個数を表すコードデータに変換する処理を行う。尚、図12に示した変換テーブルを参照するためには、多値化結果値に加えて、画素群の分類番号が必要となる。ここで、図8を用いて前述したように、本実施例においては、画素群の分類番号は画像中での画素群の位置に基づいて決定されている。多値化結果値は画素群毎に供給されるから、多値化結果値が供給される順序に基づいて、処理しようとする多値化結果値の画素群が画像上でどの位置にあるかを知ることができ、これにより分類番号を簡単に決定することが可能である。画像上での画素群の位置に応じて分類番号を決定する方法については、後述する。尚、コンピュータ100からカラープリンタ200に向けて、多値化結果値とともに分類番号を出力してもよいことは言うまでも無い。
次いで、画素群に対応する順序値マトリックスを読み込む処理を行う(ステップS166)。ここで、順序値マトリックスとは、画素群内の各画素について、ドットが形成される順番を設定したマトリックスである。図14は、順序値マトリックスを例示した説明図である。図示されているように、順序値マトリックスも画素群の分類番号毎に異なるマトリックスが設定されている。一例として、図14(a)に示した分類番号1番の順序値マトリックスについて説明する。分類番号1番の画素群は、画素群を構成する8つの画素の中で、左上隅にある画素が最もドットの形成され易い画素である。順序値マトリックスの左上隅の画素に数値「1」が設定されているのは、この画素が1番目にドットが形成される画素であることを表したものである。尚、順序値マトリックスに設定されているこのような順番を表す数値を、順序値と呼ぶものとする。また、画素群の右下隅の画素に順序値「2」が設定されているのは、この画素が画素群中で2番目にドットが形成されることを表している。このように、順序値マトリックスには、画素群に含まれる8つの画素について、ドットが形成される順番を示す順序値が設定されている。
こうした順序値マトリックスは、画素群の分類番号によって異なったマトリックスとなっている。例えば、図14(b)に示した分類番号2番の順序値マトリックスでは、1番目にドットが形成される画素(順序値「1」の画素)は、下段の左から2番目の画素であり、2番目にドットが形成される画素(順序値「2」の画素)は、右下隅の画素である。図14(c)に示した分類番号3番の順序値マトリックスでは、1番目にドットが形成される画素(順序値「1」の画素)は、上段の右から2番目の画素であり、2番目にドットが形成される画素(順序値「2」の画素)は、左下隅の画素である。
第1実施例のカラープリンタ200に搭載されたROMには、図14に例示したような順序値マトリックスが画素群の分類番号毎に、予め記憶されている。そして、図11のステップS166では、画素群の分類番号に対応する順序値マトリックスを、ROMから読み出す処理を行う。尚、画素群の分類番号毎に順序値マトリックスを設定する方法については、別図を用いて詳しく説明する。
画素群に対応する順序値マトリックスを読み込んだら、画素群を構成する8つの画素の中から、先ず初めに大ドットを形成する画素を決定する(ステップS168)。大ドットは他のドットよりもドットが目立ち易いことから、できるだけドットが分散して形成されるように、ドットを形成する画素位置を他のドットに優先させて決定しておくことが望ましい。このため、先ず初めに大ドットを形成する画素を決定するのである。ドットを形成する画素の決定に際しては、画素群の多値化結果値を変換して得られたドット個数のデータと、画素群に対応する順序値マトリックスとを使用する。
図15は、ドット個数のデータと順序値マトリックスとを用いて、画素群内で各種ドットを形成する画素を決定している様子を概念的に表した説明図である。例えば、画素群に形成すべきドット個数を示すコードデータが、大ドット1個、中ドット2個、小ドット1個の組合せを表していたものとする。前述したように、順序値マトリックスには画素群内の各画素にドットが形成される順番が設定されており、また、初めに大ドットを形成する画素から決定するのであるから、順序値「1」が設定されている画素には大ドットが形成されることになる。もちろん、仮に大ドットの形成個数が2個であれば、順序値「1」の画素に加えて、順序値「2」の画素にも大ドットが形成されることになる。図15では、大ドットが形成される画素には、細かい斜線を付して表示している。図11のステップS168では、このようにしてドット個数のデータと順序値マトリックスとに基づいて、大ドットを形成する画素を決定する処理を行う。
大ドットを形成する画素を決定したら、続いて中ドットを形成する画素を決定する(図11のステップS170)。図15に示した例では、中ドットを形成すべき個数は2個である。順序値「1」の画素には既に大ドットを形成することにしているから、中ドットは順序値「2」の画素と順序値「3」の画素とに形成されることになる。図15では、中ドットが形成される画素に、少し粗い斜線を付して表示している。図11のステップS170では、このようにして大ドットを形成しない画素の中から中ドットを形成する画素を決定する処理を行う。
中ドットを形成する画素を決定したら、今度は小ドットを形成する画素を決定する(図11のステップS172)。図15に示した例では、小ドットを形成すべき個数は1個であり、順序値「1」ないし順序値「3」の画素には既に大ドットおよび中ドットを形成することにしているから、小ドットは順序値「4」の画素に形成されることになる。図15では、小ドットが形成される画素に、粗い斜線を付して表示している。
こうして大ドット、中ドット、小ドットを形成する画素を決定したら、画素群の中で残った画素はドットを形成しない画素であると決定すればよい(図11のステップS174)。以上のような処理を全て行ったら、画素群内の全画素についてドット形成の有無を決定したことになる。
次いで、全画素群について、上述した処理を行ってドット形成の有無を決定したか否かを判断し(ステップS176)、未処理の画素群が残っていれば(ステップS176:no)、ステップS160に戻って新たな画素群を選択し、その画素群について続く一連の処理を行う。こうした操作を繰り返し、最終的に全画素群についての処理を終了したと判断されたら(ステップS176:yes)、図11に示したドット形成有無決定処理を終了して、図6に示した画像印刷処理に復帰する。前述したように画像印刷処理では、ドット形成有無の決定結果に従ってドットを形成することにより、印刷用紙上に画像が印刷される。
以上に説明したように、第1実施例の画像印刷処理では、複数の画素をまとめて画素群を構成し、画素群毎に多値化を行って、得られた多値化結果値をカラープリンタ200に出力する。画素群の多値化に際しては、画素群の分類番号と画素群階調値とを求めて、図9に示すような多値化テーブルを参照するだけで直ちに多値化結果値を得ることができる。画素群の分類番号も画素群階調値も、前述したように極めて簡単に求めることができることから、画素群の多値化結果値は極めて迅速に、しかも極めて簡素な処理によって求めることが可能となる。
加えて、多値化結果値は、画素群あたり僅かなビット数(本実施例では高々5ビット)で表現することができるので、画素毎にドット形成の有無を表すデータよりも、データ量を大幅に減少させることができる。このため、画素毎にドット形成の有無を表すデータに代えて、画素群毎の多値化結果値をカラープリンタ200に出力してやれば、データ量が減少する分だけ迅速にデータを供給することが可能となる。
また、カラープリンタ200では、画素群毎の多値化結果値を受け取ると、これを画素群内に形成すべきドットの個数を示すデータに変換する。かかる変換は、図12に示すような変換テーブルを参照するだけで、迅速に行うことができる。次いで、変換して得られたドット個数を示すデータと、順序値マトリックスとに基づいて、大ドット・中ドット・小ドットの形成有無を決定した後、ドットを形成して画像を印刷する。順序値マトリックスを参照すれば、大ドット・中ドット・小ドットを形成する画素は比較的簡単に決定することができる。従って、カラープリンタ200においても、画素群毎の多値化結果値を受け取ると、比較的簡素な処理で、迅速に画素毎のドット形成の有無を決定し、延いては、迅速に画像を印刷することが可能となる。
加えて、第1実施例の画像印刷処理では、単に迅速に画像を印刷することができるだけでなく、十分な画質で画像を印刷することができる。特に、画素群の分類番号に応じて、多値化テーブルや、変換テーブル、および順序値マトリックスを適切に設定しておくことで、いわゆるブルーノイズマスク、あるいはグリーンノイズマスクと呼ばれるディザマトリックスを用いて実現されるような、ドットが良好に分散した高画質な画像を印刷することが可能となる。以下では、こうしたことが可能な理由も含めて、画素群の分類番号を決定する考え方、多値化テーブル、変換テーブル、順序値マトリックスなどを設定する方法について、順次説明する。
C−3.ディザ法の概要 :
上述した第1実施例の画像印刷処理は、いわゆるディザ法と呼ばれる方法を発展させて改良したものである。そこで、画素群の分類番号を決定する考え方や、多値化テーブル、変換テーブル、順序値マトリックスなどの設定方法を説明する準備として、先ず、ディザ法の概要について簡単に説明しておく。
ディザ法とは、画像データを、画素毎にドット形成の有無を表すデータに変換するために用いられる代表的な手法である。この手法では、ディザマトリックスと呼ばれるマトリックスに閾値を設定しておき、画像データの階調値とディザマトリックスに設定されている閾値とを画素毎に比較して、画像データの階調値の方が大きい画素についてはドットを形成すると判断し、そうでない画素についてはドットを形成しないと判断する。このような判断を画像中の全画素について行えば、画像データを画素毎にドット形成の有無を表すデータに変換することができる。
図16は、ディザマトリックスの一部を拡大して例示した説明図である。図示したマトリックスには、横方向(主走査方向)に128画素、縦方向(副走査方向)に64画素、合計8192個の画素に、階調値1〜255の範囲から万遍なく選択された閾値がランダムに記憶されている。ここで、閾値の階調値が1〜255の範囲から選択されているのは、本実施例では、画像データが階調値0〜255の値を取り得る1バイトデータとしていることに加えて、画像データの階調値と閾値とが等しい場合には、その画素にはドットを形成するものと判断していることによるものである。
すなわち、ドットが形成されるのは画像データの階調値が閾値よりも大きい画素に限る(すなわち階調値と閾値とが等しい画素にはドットは形成しない)とした場合、画像データの取り得る最大階調値と同じ値の閾値を有する画素には、決してドットが形成されることはない。こうしたことを避けるため、閾値の取り得る範囲は、画像データの取り得る範囲から最大階調値を除いた範囲とする。逆に、画像データの階調値と閾値とが等しい画素にもドットを形成するとした場合、画像データの取り得る最小階調値と同じ値の閾値を有する画素には、常にドットが形成されてしまうことになる。こうしたことを避けるため、閾値の取り得る範囲は、画像データの取り得る範囲から最小階調値を除いた範囲とする。本実施例では、画像データの取り得る階調値が0〜255であり、画像データと閾値が等しい画素にはドットを形成するとしていることから、閾値の取り得る範囲を1〜255としておくのである。尚、ディザマトリックスの大きさは、図16に例示したような大きさに限られるものではなく、縦と横の画素数が同じマトリックスも含めて種々の大きさとすることができる。
図17は、ディザマトリックスを参照しながら、各画素についてのドット形成の有無を判断している様子を概念的に示した説明図である。ドット形成の有無を判断するに際しては、先ず、判断しようとする画素を選択し、この画素についての画像データの階調値と、ディザマトリックス中で対応する位置に記憶されている閾値とを比較する。図17中に示した細い破線の矢印は、画像データの階調値と、ディザマトリックスに記憶されている閾値とを、画素毎に比較していることを模式的に表したものである。例えば、画像データの左上隅の画素については、画像データの階調値は97であり、ディザマトリックスの閾値は1であるから、この画素にはドットを形成すると判断する。図17中に実線で示した矢印は、この画素にはドットを形成すると判断して、判断結果をメモリに書き込んでいる様子を模式的に表したものである。一方、この画素の右隣の画素については、画像データの階調値は97、ディザマトリックスの閾値は177であり、閾値の方が大きいので、この画素についてはドットを形成しないと判断する。ディザ法では、こうしてディザマトリックスを参照しながら、画素毎にドットを形成するか否かを判断することで、画像データを画素毎にドット形成の有無を表すデータに変換する。
以上に説明した内容を踏まえて、以下では、画素群の分類番号を決定する考え方や、多値化テーブル、変換テーブル、順序値マトリックスなどの設定方法について説明する。
C−4.分類番号を決定するための考え方 :
以下では、先ず初めに、画素群の分類番号を付与する考え方を説明する。次いで、図8を用いて前述した簡便な方法によって、画素群の分類番号を求めることができる理由について説明する。
図18は、画素群毎の分類番号を決定するための考え方を示した説明図である。図18(a)は、画像の一番左上隅の箇所において、横方向に4画素、縦方向に2画素の合計8画素をまとめることによって画素群を1つ生成した様子を概念的に示したものである。
前述したように、ディザ法では画素に割り当てられた画像データの階調値と、ディザマトリックスの対応する位置に設定されている閾値とを比較して、画素毎にドット形成の有無を判断している。一方、本実施例では、隣接する所定数の画素を画素群としてまとめているから、ディザマトリックスに設定されている閾値についても、画素群に対応する所定数ずつまとめてブロックを生成することにする。図18(b)は、図16に示したディザマトリックスに設定されている閾値を、横方向に4つ、縦方向に2つずつまとめて複数のブロックを生成した様子を示している。図16に示したディザマトリックスは、横方向(主走査方向)に128画素分、縦方向(副走査方向)に64画素分の合計8192画素分の閾値が設定されているから、これら閾値を横方向に4つ、縦方向に2つずつブロックにまとめれば、ディザマトリックスは縦横それぞれ32個ずつ、合計1024個のブロックに分割されることになる。
今、図18(b)に示すように、これらブロックに1番〜1024番までの通し番号を付しておく。そして、画像データにディザマトリックスを適用した時に、各画素群の位置に適用されるブロックの通し番号によって、画素群を分類してやる。例えば、図18(c)に示したように、画像の一番左上隅にある画素群には、図18(b)中の通し番号1番のブロックが適用されるから、この画素群は分類番号1番の画素群に分類するのである。以上が、画素群の分類番号を決定するための基本的な考え方である。
次に、図8を用いて前述した方法によって、画素群の分類番号を算出可能な理由について説明する。図19は、画素群の分類番号を算出する方法を示した説明図である。図19(a)は、画像中で生成された1つの画素群を表している。以下では、この画素群を着目画素群として、分類番号を算出する方法について説明する。前述したように、着目画素群の位置は、画素群の左上隅にある画素の画素位置によって表すものとする。図19(a)では、画素群の位置を示す画素に黒丸を付して表示している。この画素の画素位置が(X,Y)であったとする。すると、各画素群の大きさは、主走査方向に4画素、副走査方向に2画素としているから、
X=4n+1、 Y=2m+1
となるようなn、m(ここで、n,mは0以上の正整数)が存在する。換言すれば、着目画素群の左側にはn個の画素群が並んでおり、着目画素群の上側にはm個の画素群が並んでいることになる。
ここで、前述したように画素群は、画像データにディザマトリックスを適用したときに、着目画素群に適用されるブロックの通し番号に基づいて分類することとしているから(図18参照のこと)、ディザマトリックスを移動させながら画像データに適用する方法によって、同じ画素群でも異なった分類番号に分類されることになる。実際には、ディザマトリックスを移動させながら画像データに適用する方法はどのような方法でも構わないが、ここでは説明の便宜から、最も単純な方法すなわちディザマトリックスを横方向に移動させるものとして説明する。図19(b)には、ディザマトリックスを横方向に少しずつ移動させながら、繰り返し画像データに適用している様子が概念的に示されている。
図19(c)は、図19(b)に示すようにディザマトリックスを繰り返して用いながら、図19(a)に示した着目画素群にディザマトリックスを適用している様子を概念的に表している。このようにディザマトリックスを移動させていくと、ディザマトリックス中のいずれかのブロックが、着目画素群に適用されることになる。ここでは、着目画素群には、ディザマトリックス中でM行N列目のブロックが適用されたものとする。すると、図19(a)に示したように着目画素群の左側にはn個の画素群があり、上側にはm個の画素群があるから、Nとn、およびMとmとの間には、それぞれ
N=n − int(n/32)×32 + 1
M=m − int(m/32)×32 + 1
の関係が成り立っている。ここで、intは、小数点以下を切り捨てて整数化することを表す演算子である。すなわち、int(n/32)は、n/32の計算結果に対して小数点以下の数値を切り捨てることによって得られる整数値を表している。このように、着目画素群の位置が分かれば、図19(d)に表示した上述の関係式から数値MおよびNを求めて、ディザマトリックス中でM行N列目にあるブロックのブロック番号を、その着目画素群の分類番号としてやればよい。もっとも実際には、図8を用いて前述したように、着目画素群の座標値X,Yを2進数表示したデータから、所定ビットのデータを抜き出すだけで、極めて簡単に求めることができる。以下、この理由について説明する。
図20は、着目画素群の座標値の2進数表示から分類番号を求める方法を示した説明図である。着目画素群の座標値を(X,Y)として、X,Yが10ビットで表現されているものとする。図20(a)は、数値Xを表す10ビットの2進数データを概念的に示している。図では、各ビットを識別するために、最上位ビットから最下位ビットに向かって1番から10番までの通し番号を付して表示している。
図19を用いて前述したように、着目画素群の左側にある画素群の個数nは、数値Xから1を減算して4で除算すれば得ることができる。ここで、4での除算は、2ビット分だけ右方向にシフトさせることで実施することができるから、数値Xから1を減算して、得られた2進数データを右方向に2ビット分だけビットシフトさせればよい。更に、数値Xは任意の値を取るのではなく、4n+1の形式で表現可能な数値しか取り得ないから、1を減算せずに、単に2進数データを右方向に2ビット分だけビットシフトさせるだけで、画素群の個数nを得ることができる。図20(b)は、こうして数値Xをビットシフトして得られた個数nの2進数データを概念的に表している。
次いで、int(n/32)を算出する。すなわち、個数nを32で除算して、小数点以下の数値を切り捨てる操作を行う。32による除算は、2進数データを右方向に5ビット分だけビットシフトさせることで実行可能であり、また、データを整数形式で扱っていれば、小数点以下の数値は自動的に切り捨てられてしまう。結局、int(n/32)の2進数データは、個数nの2進数データを、単に右方向に5ビット分だけビットシフトさせることで得ることができる。図20(c)は、個数nをビットシフトして得られたint(n/32)の2進数データを概念的に表している。
こうして得られたint(n/32)に32を乗算する。32による乗算は、2進数データを5ビット分だけ左方向にビットシフトすることで実施することができる。図20(d)は、個数nをビットシフトして得られたint(n/32)×32の2進数データを概念的に表している。
次いで、個数nからint(n/32)×32を減算すれば、前述の数値Nを得ることができる。個数nの2進数データ(図20(b)参照)とint(n/32)×32の2進数データ(図20(d)参照)とを比較すれば明らかなように、これら2進数データは、上位の5ビットは共通しており、減算する側の数値の下位5ビットは全て「0」となっている。従って、減算される側の数値(個数n)の下位5ビットをそのまま抜き出せば、求める数値Mを得ることができる。すなわち、図20(b)に示した2進数データに対して、図20(f)に示すようなマスクデータを作用させるだけで、極めて簡便に数値Nを得ることが可能である。あるいは、図20(a)に示した着目画素群の位置を示す数値Xの2進数データに、図20(g)のようなマスクデータを作用させて、4番目〜8番目のビットデータを直接抜き出すことによっても、数値Nを得ることができる。
図20では、着目画素群の位置を示す座標値(X,Y)の数値Xから、ディザマトリックス中でのブロック位置を示す数値Nを求める場合について説明したが、全く同様にして、ブロック位置を示す数値Mも数値Yから求めることができる。結局、着目画素群の位置が分かれば、2進数データから特定のビット位置のデータを抜き出すだけで、着目画素群がディザマトリックス中で何行何列目のブロックに対応するかを知ることができ、このブロックの通し番号を算出すれば、着目画素群の分類番号を得ることができる。図8を用いて前述した分類番号の算出方法は、このようにして導かれた方法である。
C−5.多値化テーブルの設定方法 :
次に、図9に示した多値化テーブルを設定する方法について説明する。前述したように、多値化テーブルには、画素群階調値に対する多値化結果値が画素群の分類番号毎に設定されており、多値化テーブルを参照しながら多値化することで、画素群階調値は、図10に示したように画素群の分類番号に応じた固有な態様で多値化されることになる。
本実施例の多値化テーブルは、大きさの異なる複数種類のドットについて画素毎にドット形成の有無を判断可能なように、前述したディザ法を発展させた手法を基にして設定されている。かかる手法の詳細な内容は、特許3292104号に開示されている。多値化テーブルの設定方法を説明する前に、その準備として、上記の特許公報に開示された技術の概要について簡単に説明しておく。
図21は、ディザ法を発展させて、画素毎に大ドット・中ドット・小ドットの形成の有無を決定可能としたハーフトーン処理の流れを示すフローチャートである。ハーフトーン処理を開始すると、先ず初めに、ドットの形成有無を判断しようとする画素を選択して、その画素の画像データを取得する(ステップS200)。次いで、取得した画像データを、大中小の各ドットについての密度データに変換する。ここで、密度データとは、ドットをどの程度の密度で形成するかを表すデータである。密度データは、階調値が大きくなる程、ドットが高い密度で形成されることを表している。例えば、密度データの階調値「255」は、ドットの形成密度が100%、すなわち全ての画素にドットが形成されることを表しており、密度データの階調値「0」は、ドットの形成密度が0%、すなわちいずれの画素にもドットが形成されないことを表している。こうした密度データへの変換は、ドット密度変換テーブルと呼ばれる数表を参照することによって行うことができる。
図22は、画像データの階調値を大中小各ドットについての密度データに変換する際に参照されるドット密度変換テーブルを概念的に示した説明図である。図示されているように、ドット密度変換テーブルには、画像データの階調値に対して、小ドット・中ドット・大ドットの各ドットについての密度データが設定されている。画像データが階調値「0」近傍の領域では、中ドット・大ドットの密度データはいずれも階調値「0」に設定されている。小ドットの密度データは、画像データの階調値が大きくなるに連れて増加して行くが、画像データがある階調値に達すると今度は逆に減少し始め、代わりに中ドットの密度データが増加し始める。画像データの階調値が更に増加して、ある階調値に達すると、小ドットの密度データが階調値「0」となり、中ドットの密度データが減少し始めて、代わりに大ドットの密度データが少しずつ増加していく。図21のステップS202では、このドット密度変換テーブルを参照しながら、画像データの階調値を、大ドットの密度データ、中ドットの密度データ、小ドットの密度データに変換する処理を行う。
処理対象とする画素について、大中小各ドットの密度データが得られたら、先ず初めに大ドットについての形成有無を判断する(図21のステップS204)。かかる判断は、大ドットの密度データと、処理対象としている画素の対応する位置に設定されているディザマトリックスの閾値とを比較することによって行う。大ドットの密度データが閾値よりも大きい場合は、処理対象の画素には大ドットを形成するものと判断し、逆に密度データの方が小さい場合は、大ドットは形成しないものと判断する。
次いで、処理対象の画素に大ドットを形成すると判断されているか否かを判定し(ステップS206)、大ドットを形成すると判断されている場合は(ステップS206:yes)、中ドットおよび小ドットについての判断は省略して、全画素を終了したか否かを判断する(ステップS218)。そして、ドット形成の有無を未判断の画素が残っている場合は(ステップS218:no)、ステップS200に戻って新たな画素を選択し、続く一連の処理を行う。
一方、処理対象の画素に大ドットを形成すると判断されていない場合は(ステップS206:no)、中ドットについての形成有無を判断するべく、大ドットの密度データに中ドットの密度データを加算して中ドット用の中間データを算出する(ステップS208)。こうして得られた中ドット用の中間データと、ディザマトリックスの閾値とを比較する。そして、中ドット用の中間データの方が閾値よりも大きければ、中ドットを形成するものと判断し、逆に中間データよりもディザマトリックスの閾値の方が大きければ、中ドットを形成しないものと判断する(ステップS210)。
次いで、処理対象の画素に中ドットを形成すると判断されているか否かを判定し(ステップS212)、中ドットを形成すると判断されている場合は(ステップS212:yes)、小ドットについての判断は省略して、全画素を終了したか否かを判断する(ステップS218)。
処理対象の画素に中ドットを形成すると判断されていない場合は(ステップS212:no)、小ドットについての形成有無を判断するべく、中ドット用の中間データに小ドットの密度データを加算して小ドット用の中間データを算出する(ステップS214)。そして、得られた小ドット用の中間データと、ディザマトリックスの閾値とを比較する。そして、小ドット用の中間データの方が閾値よりも大きければ、小ドットを形成するものと判断し、逆に中間データよりもディザマトリックスの閾値の方が大きければ、いずれのドットも形成しないものと判断する(ステップS216)。
すなわち、大ドットの密度データよりもディザマトリックスに設定された閾値の方が大きい画素(大ドットが形成されない画素)については、大ドットの密度データに中ドットの密度データを加算して、得られた中間データと閾値とを比較し、中間データの方が大きくなれば、中ドットを形成すると判断する。一方、中間データよりも依然として閾値の方が大きい画素については、中間データに小ドットの密度データを加算して新たな中間データを算出する。そして、この中間データと閾値とを比較して、新たな中間データの方が大きくなれば小ドットを形成すると判断し、依然として閾値の方が大きい画素についてはいずれのドットも形成しないと判断するのである。
以上のような処理を行うことにより、処理対象の画素について、大ドット、中ドット、小ドットのいずれのドットを形成するか、若しくは、いずれのドットも形成しないかを判断することができる。そこで、全画素についての処理を終了したか否かを判断し(ステップS218)、未判断の画素が残っている場合は(ステップS218:no)、ステップS200に戻って新たな画素を選択し、続く一連の処理を行う。このようにして、処理対象として選択された画素について1つずつ、大中小のいずれのドットを形成するか否かを判断していく。そして、全画素について処理を終了したと判断されたら(ステップS218:yes)、図21に示したハーフトーン処理を終了する。
以上、ディザマトリックスを利用して、大中小の各ドットについての形成有無を判断する方法について説明した。以下では、上述の説明を踏まえて、図9に示した多値化テーブルの設定方法について説明する。
前述したように多値化結果値生成処理では、画素群内に含まれる各画素の画像データを画素群階調値で代表させることにより、画素群をまとめて多値化している。そこで、多値化テーブルを設定するに際しては、先ず、画素群内の全画素が画素群階調値と同じ値の画像データを有するものとして、各画素について大中小の各種ドットについての形成有無を判断することを考える。各種ドットについての形成有無の判断は、図21を用いて前述したハーフトーン処理によって行う。
図23は、画素群内の各画素について、大中小各ドットの形成有無を判断している様子を概念的に示した説明図である。図中では、ハーフトーン処理を行うために着目している画素群を太い実線で囲って表している。画素群は8つの画素から構成されており、各画素の画像データは、いずれも画素群階調値と同じ値(図示した例では階調値97)を有している。大中小各種ドットの形成有無を判断するためには、画像データを各ドットについての密度データに変換する。密度データへの変換は、図22に示したドット密度変換テーブルを参照することによって行う。ここでは、画素群内の全画素が同じ画像データを有するものとしているから、各種ドットについても密度データも全て画素について同じ値となる。図示した例では、大ドットの密度データの階調値が「2」、中ドットの密度データの階調値が「95」、小ドットの密度データの階調値が「30」であった場合を表している。
次いで、図21を用いて説明したように、大ドットの密度データ、中ドット用の中間データ、あるいは小ドット用の中間データと、ディザマトリックスに設定されている閾値とを比較することによって、各種ドットについての形成有無を画素毎に判断する。ここで、比較に用いるディザマトリックスの閾値は、ディザマトリックスの中から、着目している画素群に対応する箇所に設定されている閾値を使用する。例えば、図23に示した例では、画素群が画像の左上隅にあることから、閾値についても、ディザマトリックス中の左上隅の画素群に設定されている閾値を使用する。
そして、画素群に設定されている8つの閾値の中で、大ドットの密度データよりも小さな閾値が設定されている画素については、大ドットを形成すると判断する。ここでは、大ドットの密度データは階調値「2」としているから、大ドットが形成される画素は、閾値「1」が設定されている画素だけである。図23では、大ドットが形成されると判断された画素には、細かい斜線を付して表示している。大ドットの密度データ「2」よりも大きく、大ドットの密度データと中ドットの密度データとを加算して得られた中ドット用の中間データ「97」よりも小さな閾値が設定されている画素には、中ドットを形成するものと判断する。このような画素は、閾値「42」が設定された画素、および閾値「58」が設定された画素の2つの画素だけである。図23では、中ドットが形成されると判断された画素には、少し粗い斜線を付して表示している。そして、最後に、中ドット用の中間データ「97」よりも大きく、中ドット用の中間データに小ドット用の密度データを加算して得られた小ドット用の中間データ「127」よりも小さな閾値が設定されている画素には、小ドットを形成するものと判断する。このような画素は、閾値「109」が設定された画素だけである。図23では、小ドットが形成されると判断された画素には、粗い斜線を付して表示している。このようにして、大ドット、中ドット、小ドットの形成有無を判断した結果、着目している画素群の画素群階調値が「97」である場合には、大ドット1個、中ドット2個、小ドット1個が形成されることになる。
画素群階調値が大きく異なれば、画素群内に形成される大ドット、中ドット、小ドットの個数も異なったものとなる。また、画素群階調値を「0」から「255」まで変化させれば、それに伴って大ドット、中ドット、小ドットの個数は、幾段階かに変化するはずである。更に、画素群の分類番号が異なれば、ディザマトリックスの閾値も異なることから、ドット個数の変化の仕方も異なるはずである。図9に示した多値化テーブルは、画素群階調値を「0」から「255」まで変化させたときの、各種ドットの個数が段階的に変化する挙動を、分類番号毎に調べることによって設定されている。
図24は、実際に、多値化テーブルを設定する処理の流れを示したフローチャートである。以下、フローチャートに従って説明する。多値化テーブルの設定処理を開始すると、先ず初めに、画素群の分類番号を1つ選択する(ステップS300)。例えば、ここでは分類番号1番を選択したものとする。
次いで、選択した分類番号の画素群に対応する閾値を、ディザマトリックスの中から読み出してやる(ステップS302)。例えば、ここでは分類番号1番を選択したものとしているから、図16に例示したディザマトリックスの中から、図18(b)中で1番と表示したブロック位置に設定されている8つの閾値を読み出す。
そして、多値化結果値RVおよび画素群階調値BDを「0」に設定し(ステップS304)、更に、大ドット、中ドット、小ドットの形成個数をいずれも0個に設定する(ステップS306)。
続いて、図22に示したドット密度変換テーブルを参照することにより、画素群階調値を大ドット、中ドット、小ドットについての密度データに変換した後(ステップS308)、これら密度データと先に読み込んでおいた閾値とに基づいて、大中小の各種ドットについての形成個数を決定する(ステップS310)。すなわち、図21あるいは図23を用いて説明したように、大ドットの密度データよりも小さな閾値の個数を求めて、得られた個数を大ドットの形成個数とする。また、大ドットの密度データよりも大きく且つ中ドット用の中間データよりも小さな閾値の個数を求めて、これを中ドットの形成個数とする。更に、中ドット用の中間データよりも大きく且つ小ドット用の中間データよりも小さな閾値の個数を求めて、これを小ドットの形成個数とする。
こうして求めた各種ドットの形成個数が、先に設定されていた形成個数に対して変更されたか否かを判断する(ステップS312)。そして、形成個数が変更されたと判断されれば(ステップS312:yes)、多値化結果値RVを「1」だけ増加させて(ステップS314)、得られた多値化結果値RVを画素群階調値BDに対応づけて記憶する(ステップS316)。一方、形成個数が変更されていないと判断された場合は(ステップS312:no)、多値化結果値RVを増加させることなく、そのままの値を画素群階調値BDに対応づけて記憶する(ステップS316)。
以上のようにして、ある画素群階調値に対する多値化結果値を記憶したら、画素群階調値BDが階調値255に達したか否かを判断する(ステップS318)。階調値255に達していなければ(ステップS318:no)、画素群階調値BDを「1」だけ増加させて(ステップS320)、ステップS308に戻って再び画素群階調値BDを密度データに変換した後、続く一連の処理を行って、新たな画素群階調値BDに対応づけて多値化結果値RVを記憶する(ステップS316)。画素群階調値BDが階調値255に達するまで、こうした操作を繰り返す。そして、画素群階調値BDが階調値255に達したら(ステップS316:yes)、選択した分類番号については、すべての多値化結果値を設定したことになる。
そこで、すべての分類番号について、以上のような処理を行ったか否かを判断し(ステップS322)、未処理の分類番号が残っている場合は(ステップS322:no)、ステップS300に戻って再び上述した処理を行う。こうした処理を繰り返し、すべての分類番号について、すべての多値化結果値を設定したと判断されたら(ステップS322:yes)、図24に示した多値化テーブル設定処理を終了する。
以上の説明から明らかなように、多値化結果値は、画素群階調値を変換して得られた大中小各ドットの密度データと、ディザマトリックス中で画素群に対応する位置に記憶されている閾値とによって決定される。ここで、図22に示したドット密度変換テーブルは、画素群の分類番号が異なっていても同じテーブルを参照するから、画素群階調値に対する各ドットの密度データも、分類番号によらず同じ密度データが得られる。しかし、ディザマトリックスから読み出された閾値の組は、分類番号毎に異なったものとなる。何故なら、ディザマトリックスは、画像上でドットが一定のパターンで発生したり、あるいは近接した位置に固まって発生することで画質を悪化させることの無いように、閾値は出来るだけ分散させて且つ出来るだけランダムに設定されている。このため、画素群に含まれる複数個の閾値を組として見たときに、全く同じ組合せとなる可能性は極めて低いと考えられるからである。このような理由から、本実施例の多値化結果値生成処理で参照される多値化テーブルは、画素群階調値と多値化結果値との対応関係が分類番号毎に異なったものとなり、また、多値化結果値が変化する回数(図10に示した多値化の段数)も、分類番号に応じて異なったものとなっている。
C−6.変換テーブルの設定方法 :
次に、図12を用いて前述した変換テーブルの設定方法について説明する。かかる変換テーブルは、図11に示したドット形成有無決定処理中で、多値化結果値を分類番号と組み合わせて、画素群に形成されるドット個数を表すデータに変換するために参照されるテーブルである。
図24を用いて前述した多値化テーブルの設定方法から明らかなように、多値化テーブルに設定されている多値化結果値は、画素群に形成される大中小の各ドットの個数に基づいて決定されている。もっとも、多値化結果値が、画素群に形成されるドット個数の組合せに直ちに対応しているわけではなく、多値化結果値と画素群の分類番号とを組み合わせることで初めて、具体的なドット個数の組合せに対応付けることができる。何故なら、多値化結果値は、画素群階調値を階調値0から階調値255まで増加させたときに、大中小各ドットの形成個数が変化したか否かだけを抽出し、具体的に各ドット個数の組合せがどのように変化したかを示す情報は省かれた状態で設定されているからである。
とは言え、画素群の分類番号が分かっていれば、その画素群で何回目の変化に相当するか、すなわち多値化結果値から、各種ドットについての具体的な個数の組合せを特定することはできる。そこで、分類番号毎に、多値化結果値を設定する元になった各種ドットの具体的な個数を求め、得られたドット個数の組合せに対応するコードデータを、多値化結果値に対応付けて記憶しておく。図12に示した変換テーブルは、こうした操作を、全ての分類番号について行うことによって設定されている。
図25は、変換テーブルを設定する具体的な処理の流れを示したフローチャートである。以下、フローチャートに従って説明する。変換テーブル設定処理を開始すると、先ず初めに、設定対象とする分類番号を1つ選択し(ステップS350)、多値化結果とRVを0に設定する(ステップS352)。
次いで、多値化結果値RVに対応する大中小各ドットの個数を取得する(ステップS354)。例えば、多値化結果値が「N」であったとすると、その分類番号の画素群について、画素群階調値を「0」から「255」に変化させながら大中小各ドットの形成有無を判断し、ドットの形成個数がN番目に変化したときの大ドット、中ドット、小ドットの個数を取得する。
こうして取得した各ドットの個数の組合せを、コードデータに変換する(ステップS356)。ドット個数の組合せからコードデータへの変換は、図13に示した対応表を参照することによって行う。次いで、得られたコードデータを、多値化結果値に対応付けて記憶した後(ステップS358)、対象としている分類番号についての最大の多値化結果に達したか否かを判断する(ステップS360)。すなわち、図9を用いて説明したように、多値化結果の最大値は、画素群の分類番号によって異なっていることから、対象としている分類番号についての多値化結果の最大値に達したか否かを判断するのである。
そして、多値化結果の最大値に達していない場合は(ステップS360:no)、多値化結果RVの値を「1」だけ増加させる(ステップS362)。そして、ステップS354に戻って、新たな多値化結果値RVに対応する各ドットの個数を取得した後、続く一連の処理を繰り返す。こうした操作を繰り返し、対象としている分類番号の最大多値化結果値に達したと判断されたら(ステップS360:yes)、その分類番号については全データが変換テーブルに設定されたことになる。
そこで今度は、全ての分類番号について同様の処理を行ったか否かを判断する(ステップS364)。そして、未だ処理していない分類番号が残っている場合は、ステップS350に戻って新たな分類番号を選択し、この分類番号について、上述した一連の処理を行う。こうして全ての分類番号について処理を終了したと判断されたら(ステップS364:yes)、変換テーブルの全てのデータが設定されたことになるので、図25に示す処理を終了する。
第1実施例のカラープリンタ200は、このようにして設定された変換テーブルが、制御回路260に内蔵されたROM内に予め記憶されている。そして、図11に示したドット形成有無決定処理では、この変換テーブルを参照することによって、多値化結果値を個数データに変換しているのである。
C−7.順序値マトリックスの設定方法 :
次に、図14に例示した順序値マトリックスを設定する方法について説明する。前述したように、順序値マトリックスとは、画素群内の各画素について、ドットが形成される順番を設定したマトリックスである。図11に示したドット形成有無決定処理中では、画素群に対応する順序値マトリックスを読み込んで、マトリックスに設定されている順番に従って、大ドット、中ドット、小ドットを形成する画素を決定していた。
順序値マトリックスも、前述した多値化テーブルと同様に、特許3292104号に開示された手法(ディザ法を発展させて、大きさの異なる複数種類のドットの形成の有無を判断可能とした手法)を基にして設定されている。すなわち、多値化テーブルを設定する場合は、前述したように画素群内の全画素が同じ画像データ(画素群階調値)を有するものとして、画素群内に形成される大中小ドットの個数を決定しながら、画素群階調値を「0」から「255」まで変化させて、このときに各ドットが形成される個数の変化に着目して多値化結果値を設定した。また、図12に示すように、多値化結果値と分類番号とを組み合わせれば、画素群内に形成される大中小の各ドットの個数までは復元することができた。しかし、これら各種ドットが、画素群内のどの画素に形成されるかに関する情報は省略されており、多値化結果値あるいは分類番号からは知ることはできない。順序値マトリックスは、画素群内で各種ドットが形成される画素位置に関する情報を記憶したものと考えることができる。すなわち、特許3292104号に開示された手法を画素群に適用すれば、図21ないし図23を用いて前述したように、各種ドットの形成個数だけでなく、画素群内でドットが形成される画素位置まで決定可能であるところ、本実施例ではこの手法を2つの要素に分解して、各種ドットの形成個数に関する情報については、主に多値化結果値(正確には、多値化結果値および分類番号の組合せ)に反映させ、ドットが形成される画素位置に関する情報ついては、順序値マトリックスに反映させていると考えることができる。このような順序値マトリックスは、実際には、比較的簡単に設定することができる。
図26は、順序値マトリックスを設定する方法について具体的に示した説明図である。以下、図を参照しながら説明する。順序値マトリックスの設定に際しては、先ず、ディザマトリックスを画素群と同じ大きさを有する複数のブロックに分割して、各ブロックに通し番号を付しておく。図18を用いて前述したように、この通し番号がそのまま画素群の分類番号となる。図26(a)は、ディザマトリクスを複数のブロックに分割した様子を概念的に示した説明図である。今、ディザマトリックスが図16に示した大きさ(すなわち、主走査方向に128画素、副走査方向に64画素)を有しているものとすると、1つの画素群は主走査方向に4画素、副走査方向に2画素の大きさを有するとしているから、図26(a)に示すように、ディザマトリックスは主走査方向および副走査方向にそれぞれ32ブロックずつ、全体では、1番から1024番までの分類番号が付された1024個のブロックに分割されることになる。
ディザマトリックスを複数のブロックに分割したら、各ブロックから1組ずつ順序値マトリックスを生成する。図26(b)は、一例として、分類番号1番のブロックから順序値マトリックスを生成している様子を示した説明図である。図26(b)の左側半分には、分類番号1番のブロックに含まれるディザマトリックスの閾値が示されている。図23を用いて前述したように、ドットは小さな閾値が設定されている画素から順番に形成される。従って、図26(b)に示した1番のブロックの中で1番初めにドットが形成される画素は、閾値「1」が設定された画素と考えることができる。そこで、この画素には順序値として「1」を設定する。同様に、2番目にドットが形成される画素は、2番目に小さな閾値である閾値「42」が設定された画素と考えることができる。そこで、この画素には順序値「2」を設定する。このようにして、ブロック内に設定されている閾値の小さな画素から順番に、順序値「1」から順序値「8」までを決定してやれば、図26(b)の右側半分に示した分類番号1番の順序値マトリックスを得ることができる。
図26(c)は、同様にして、ブロック内で小さな閾値が設定されている画素から順番に、順序値「1」から順序値「8」までを設定することで、分類番号2番の順序値マトリックスが得られる様子を示している。図26(a)に示した分類番号「1」番から「1024」番までの全てのブロックについて、以上のような操作を行うことにより、分類番号「1」番から「1024」番までの順序値マトリックスを得ることができる。
第1実施例のカラープリンタ200は、このようにして設定された順序値マトリックスが、制御回路260に内蔵されたROM内に、画素群の分類番号に対応付けて予め記憶されている。そして、図11に示したドット形成有無決定処理を実施する際には、記憶されている順序値マトリックスの中から、画素群の分類番号に対応するマトリックスを読み出しているのである。
C−8.多値化結果値からドット形成有無を適切に決定可能な原理 :
以上に説明したように、第1実施例の画像印刷処理では、複数個の画素を画素群にまとめて、図9に例示した多値化テーブルを参照することにより、画素群毎に多値化結果値を決定する。次いで、図12に例示した変換テーブル、および図14に例示した順序値マトリックスを参照しながら、多値化結果値に基づいて画素群内に各種ドットを形成する画素位置を決定する。このようにしてドットを形成する画素位置を決定した場合でも、ドットが適切に分散された高画質な画像を出力することができる。加えて、比較的少数ずつ(本実施例では8個ずつ)の画素群をまとめて処理しているにも関わらず、いわゆるブルーノイズマスク、あるいはグリーンノイズマスクに代表される画素数が千個を越えるような大規模なディザマトリックスを用いることで実現されるような、良好なドット分布を得ることが可能である。以下では、このようなことが可能となる原理について説明する。
前述した特許3292104号に開示された技術を用いれば、図21および図22を用いて前述したように、画像データを大ドットの密度データ、中ドット用の中間データ、小ドット用の中間データに変換して、ディザマトリックスに設定されている閾値と比較することで、大中小各ドットについての形成の有無を判断することができる。更に、このときに参照するディザマトリックスを、いわゆるブルーノイズマスク、あるいはグリーンノイズマスクに代表されるような分散性が考慮されたマトリックスとしておけば、ドットが良好に分散した高画質な画像を得ることができる。
また、画像データは一般的に、隣接する画素間では近似する(若しくは同一の)階調値が割り当てられる傾向がある。近年では、高画質化の要請から画像データの解像度は益々高くなる傾向にあるが、隣接する画素間で近似若しくは同一の階調値が割り当てられる傾向は、画像データの解像度が高くなるほど顕著に現れる。このことから、図23を用いて前述したように、複数個の画素を画素群としてまとめてしまい、画素群内の画素は全て同じ画像データを有するものとして大中小各ドットの形成有無を判断した場合でも、実際には画質に差が生じることは稀である。
ここで、前述した本実施例の多値化結果値生成処理では、画素群階調値を多値化して、画素群の分類番号に依存した多値化結果値を生成する。こうして生成された多値化結果値は、画素群の分類番号と組み合わせることで、画素群内に形成される各種ドットの個数を示すデータとなっている。図23に示した画素群については、画素群の分類番号と組み合わせることで、大ドット、中ドット、小ドットの形成個数が、それぞれ1個、2個、1個であることを示すような多値化結果値が生成されることになる。
前述した第1実施例のドット形成有無決定処理では、このような多値化結果値を受け取ると、画素群内の各画素について、大中小各ドットについての形成有無を決定する。図27は、前述したドット形成有無決定処理において、多値化結果値を受け取って、画素群内の各画素について大中小各ドットの形成有無を判断する処理の大まかな流れを概念的にまとめた説明図である。図示されているように、多値化結果値を受け取ると、その結果値が表す画素群の分類番号を求めた後、多値化結果値と分類番号とに基づいて、大中小各ドットの形成個数を取得する。また、予め記憶されている順序値マトリックスの中から、分類番号に対応付けて記憶されているマトリックスを読み出してやる。尚、分類番号を求める具体的な方法については後述する。
図23に示した画素群を想定しながら説明すれば、画素群は画像の左上隅にあるから分類番号は1番と求められる。この画素群の多値化結果値と、求めた分類番号とを組み合わせることにより、この画素群には、大ドット1個、中ドット2個、小ドット1個がそれぞれ形成されることが分かる。これら各ドットが、画素群内のどの画素に形成されるかを決定するために、分類番号1番の順序値マトリックスを参照する。この順序値マトリックスは、図23において、ドット形成有無の判断に用いたディザマトリックスの該当部分、すなわち画素群内の各画素についてドット形成の有無を判断するために用いた該当部分から生成した順序値マトリックスである。
このようにして得られた大中小各ドットの個数と、順序値マトリックスとに基づいて、画素群内でこれらドットを形成する画素位置を決定していく。画素位置を決定する具体的な方法は、図15を用いて既に説明しているので、ここでは説明は省略して結果のみを示すと、大ドットは順序値1番の画素に形成され、中ドットは順序値2番の画素と3番の画素とに形成され、小ドットは順序値4番の画素に形成される。図27では、図15に倣って、大ドットを形成する画素には細かいハッチングを付し、中ドットを形成する画素には少し粗いハッチングを付し、小ドットを形成する画素には粗いハッチングを付して表している。こうして得られたドットの分布と、図23に示した画素毎にドット形成の有無を判断して得られたドットの分布とを比較すれば、両者のドット分布は完全に一致していることが分かる。
すなわち、分類番号に依存した多値化結果値のみを受け取った場合でも、上述した方法を用いてドット形成の有無を決定してやれば、前述した特許3292104号を適用してディザ法を参照しながら画素毎に大中小各ドットの形成有無を判断した場合と、全く同じドット分布を得ることができる。このため、ドットが良好に分散された高画質な画像を得ることが可能となるのである。
加えて、多値化結果値を生成するために参照された多値化テーブルは、ディザマトリックスに基づいて設定されている(図25参照)。同様に、多値化結果値からドット形成有無を決定する過程で参照された変換テーブルあるいは順序値マトリックスも、ディザマトリックスに基づいて設定されている(図25、図26参照)。従って、これらテーブル類の設定に用いられるディザマトリックスとして、いわゆるブルーノイズマスク、あるいはグリーンノイズマスクを使用すれば、これらマスクを用いることで初めて得られるような、高画質な画像を得ることが可能となる。
尚、本明細書中で言うブルーノイズマスクとは、ドットを不規則に発生させるディザマトリックスであって、設定されている閾値の空間周波数が、2画素以下を1周期とする高周波数領域に最も大きな成分を有するマトリックスを言う。もっとも、明るい(明度の高い)画像など、特定の明度付近では規則的なパターンでドットが形成される場合があっても良い。また、本明細書中で言うブルーノイズ特性とは、ブルーノイズマスクが有するこうした特性を言う。更に、本明細書中で言うグリーンノイズマスクとは、ドットを不規則に発生させるディザマトリックスであって、設定されている閾値の空間周波数が、2画素から十数画素を1周期とする中間周波数領域に最も大きな成分を有するマトリックスを言う。もっとも、グリーンノイズマトリックスについても、特定の明度付近であれば規則的なパターンでドットが形成される場合があっても良い。また、本明細書中で言うグリーンノイズ特性とは、グリーンノイズマスクが有するこうした特性を言う。
図28は、ブルーノイズマスク、およびグリーンノイズマスクに設定されている閾値の空間周波数特性を概念的に例示した説明図である。図28では、表示の都合から、横軸には空間周波数の代わりに周期を取って表示している。言うまでもなく、周期が短くなるほど、空間周波数は高くなる。また、図28の縦軸は、それぞれの周期での空間周波数成分を示している。尚、図示されている周波数成分は、ある程度変化が滑らかとなるように平滑化された状態で示されている。
図中の実線は、ブルーノイズマスクの空間周波数成分を概念的に示している。図示されているように、ブルーノイズマスクは、1周期の長さが2画素以下の高い周波数領域に最も大きな周波数成分を有している。ブルーノイズマスクの閾値は、このような空間周波数特性を有するように設定されていることから、ブルーノイズマスクに基づいてドット形成の有無を判断した場合には、ドットが互いに離れた状態で形成される傾向にある。また、図中の破線は、グリーンノイズマスクの空間周波数成分を概念的に示している。図示されているように、グリーンノイズマスクは、1周期の長さが2画素から十数画素の中間周波数領域に最も大きな周波数成分を有している。グリーンノイズマスクの閾値は、このような空間周波数特性を有するように設定されていることから、グリーンノイズマスクに基づいてドット形成の有無を判断した場合には、数ドット単位で隣接してドットが形成されながら、全体としてはドットの固まりが分散した状態で形成される傾向にある。
従って、このようなブルーノイズマスク、あるいはグリーンノイズマスクに基づいて、画素群内でのドット形成有無を決定してやれば、画素群単位で処理しているにも関わらず、ブルーノイズ特性あるいはグリーンノイズ特性を反映した分布となるようにドットを発生させて、高画質な画像を出力することが可能となるのである。
C−9.画素群の位置から分類番号を決定する方法 :
ここで、画像上での画素群の位置から、その画素群の分類番号を求める方法について、簡単に説明しておく。
図29は、画像上での画素群の位置に基づいて、分類番号を求める方法を示した説明図である。今、対象としている画素群が、図29(a)に示すように、画像の一番左上隅を基準として主走査方向にi個目の画素群、副走査方向にj個目の画素群の位置にあるとする。また、このような画素群の位置を、座標値(i,j)によって表すものとする。また、ディザマトリックスの大きさは、通常は、画像のようには大きくはないので、図19(b)を用いて前述したように、ディザマトリックスを主走査方向に移動させながら、繰り返して使用するものとする。
1つのディザマトリックスには主走査方向・副走査方向にそれぞれ32個ずつのブロックが含まれるとしているから(図18(b)参照)、ディザマトリックス中で、対象の画素群がある位置をI行J列とすれば、I、Jはそれぞれ次式で求めることができる。
I=i − int(i/32)×32
J=j − int(j/32)×32
ここで、intは、小数点以下を切り捨てて整数化することを表す前述した演算子である。従って、画素群の座標値(i,j)に上式を適用してI,Jを求めることで、その画素群がディザマトリックス中でI行J列にあることが分かる。これより、分類番号は、
I+(J−1)×32 …(2)
によって求めることができる。
また、画素群のディザマトリックス中での位置を表す値I,Jは、上述したような計算を実行せずとも、i,jの2進数表示から所定ビットのデータを抜き出すだけで、極めて簡便に求めることができる。図30は、画素群の座標値(i,j)から、画素群のディザマトリックス中での位置を求める方法を具体的に示した説明図である。図30(a)は、数値iを表す10ビットの2進数表示したデータを概念的に示している。尚、図30(a)では、各ビットを識別するために、最上位ビットから最下位ビットに向かって1番から10番までの通し番号を付して表示している。
画素群の位置を示す値Iを求めるに際しては、先ず初めに、int(i/32)を算出する。この演算は、iの2進数データを右方向に5ビット分だけビットシフトさせることで実行することができる(図30(b)参照)。次いで、int(i/32)×32を算出する。この演算は、int(i/32)の2進数データを左方向に5ビット分だけビットシフトさせることで実行することができる(図30(c)参照)。最後に、数値iから、int(i/32)×32を減算すれば、目的とする数値Iを得ることができる。この操作は、結局は、数値iの2進数データから下位の5ビットのみを抜き出していることに他ならないから、極めて簡便に数値Iを得ることが可能である。同様にして、数値jの2進数データから下位の5ビットのみを抜き出すことで、極めて簡便に数値Jを得ることが可能である。こうして数値IおよびJが求まれば、上述の(2)式を用いて分類番号を算出することができる。
以上、第1実施例の画像印刷処理中で行われる多値化結果値生成処理(図6のステップS106)、およびドット形成有無決定処理(図6のステップS108)の内容について詳しく説明した。上述した多値化結果値生成処理では、所定数の画素をまとめて画素群を生成し、その画素群の画素群階調値を多値化して得られた結果値を生成する。多値化結果値の生成に際しては、多値化テーブルを参照することにより、極めて迅速に生成することができる。加えて、こうして得られた多値化結果値は、画素群の分類番号に依存した結果値であるが、画素毎にドット形成の有無を表すデータに比べて、データ量が遙かに小さくなっているため、コンピュータ100からカラープリンタ200に向かって極めて迅速にデータを出力することができる。すなわち、上述した多値化結果値生成処理では、多値化結果値の生成および出力を高速に実行することが可能であり、その分だけ画像を迅速に印刷することが可能となるのである。
加えて、多値化結果値を生成する処理は、単に多値化テーブルを参照する処理に過ぎず、多値化テーブルを参照するために使用する分類番号や画素群階調値も、極めて簡便な処理で求めることができるので、コンピュータ100のような高いデータ処理能力を備えていない機器を用いた場合でも、十分に実用的な速度で処理することができる。
更に、処理内容の大部分は、単にテーブルを参照するという極めて簡素な処理となることから、CPUを用いてソフトウェア的に実行するのではなく、専用の論理回路を組み込んだICチップを用いてハードウェア的に実行することも容易であり、こうすることで極めて高速に処理することも可能である。従って、デジタルカメラ120などの画像データを生成する機器と、カラープリンタ200とを直接接続した場合でも、多値化結果値生成処理をデジタルカメラ120やカラープリンタ200の内部で実行することで、迅速に画像を印刷することも可能となる。
一方、第1実施例の画像印刷処理中で行われるドット形成有無決定処理では、多値化結果値を受け取ると、画素群内の各画素についてドットの形成有無を決定する。ドット形成の有無を決定するに際しては、変換テーブルを参照することで、多値化結果値をドット個数の組合せに変換する。そして、順序値マトリックスを参照することで、各種ドットの形成位置を決定する。すなわち、変換テーブルおよび順序値マトリックスを参照することによって、各種ドットを形成する画素位置を迅速に決定することができる。
通常、形成可能なドットの種類が増加すると、これら各種ドットを形成する画素位置を決定する処理は加速度的に複雑なものとなる。これに対して、上述した第1実施例のドット形成有無決定処理では、ドットの種類が増加した場合でも、変換テーブルおよび順序値マトリックスを参照するという基本的な処理内容は同じであり、処理内容が複雑化することはない。この点からも、第1実施例のドット形成有無決定処理によれば、簡素で且つ迅速な処理が可能と言うことができる。更に、上述した多値化結果生成処理と同様に、本実施例のドット形成有無決定処理においても、処理内容の大部分は、単にテーブルを参照するという極めて簡素な処理であるため、CPUを用いてソフトウェア的に実行するのではなく、専用の論理回路を組み込んだICチップを用いてハードウェア的に実行することも容易であり、こうすることで極めて高速に処理することが可能である。
C−10.変形例 :
C−10−1.第1の変形例 :
上述した第1実施例の多値化結果値生成処理では、階調値0から階調値255までの画素群階調値毎に、対応する多値化結果値を記憶した多値化テーブルを参照している。しかし多値化結果値は、画素群階調値が増加するに従って段階的に増加するだけなので、多値化結果値が切り換わる画素群階調値だけを記憶しておけば、画素群階調値に対する多値化結果値を求めることができる。以下に説明する第1の変形例の画像印刷処理では、こうした変形例の多値化結果値生成処理を行う。
図31は、変形例の多値化結果値生成処理において参照される閾値テーブルを概念的に示した説明図である。図示されているように閾値テーブルには、分類番号毎に、多値化結果値に対応する閾値が設定されている。この閾値は、画素群階調値を階調値0から階調値255まで増加させたときに、その多値化結果値となる最も大きな画素群階調値を表している。一例として、分類番号1番の画素群について説明する。分類番号1番については、多値化結果値「0」に対しては閾値「2」が設定されている。これは、分類番号1番の画素群については、画素群階調値が「0」ないし「2」の範囲にあれば、多値化結果値が「0」となることを表している。また、多値化結果値「1」に対しては閾値「15」が設定されている。これは、分類番号1番の画素群については、画素群階調値が「3」から「15」の範囲にあれば多値化結果値が「1」となることを表している。同様に、多値化結果値「14」に対しては閾値「243」が、そして多値化結果値「15」に対しては閾値「255」が設定されている。これは、画素群階調値が「244」から「255」の範囲にあれば多値化結果値が「15」になることを、そして、分類番号1番の画素群については、多値化結果値の最大値が「15」であることを表している。
尚、図31では、分類番号毎の閾値は、それぞれ多値化結果値に対応させて設定されているものとした。しかし、特に多値化結果値に対応付けることなく、単なる閾値の組を分類番号毎に記憶することとしてもよい。この場合は、画素群階調値よりも小さな閾値の個数を数えることで、多値化結果値を求めることができる。再び、分類番号1番の画素群を例に用いて説明する。例えば、画素群階調値が「20」であったとする。分類番号1番に設定されている閾値の組の中で、階調値20よりも小さな閾値は、「2」、「15」、「18」の3個である。このことから、画素群階調値20に対する多値化結果値は「3」であると求めることとしてもよい。
以上に説明した変形例の多値化結果値生成処理では、画素群についての画素群階調値と分類番号とを求めた後、図31に例示した閾値テーブルを参照することによって、多値化結果値を生成する。閾値テーブルは、前述した第1実施例の多値化結果生成処理中で参照する多値化テーブル(図9参照)よりも少ないデータ量で記憶しておくことができる。このため、変形例の多値化結果値生成処理は、第1実施例として示した処理に比べて、メモリ使用量を節約することが可能である。これに対して、第1実施例の多値化結果値生成処理は、分類番号と画素群階調値とから多値化テーブルを参照するだけで直ちに多値化結果値を求めることができる。すなわち、変形例における処理のように画素群階調値と閾値とを比較する必要がないので、迅速に多値化することが可能である。
C−10−2.第2の変形例 :
上述した第1実施例のドット形成有無決定処理では、画素群の分類番号と多値化結果値とを受け取ると、これを、画素群内に形成する各種ドットの個数を表すデータに一旦変換した。そして、ドット形成の有無を判断するに際しては、画素群内の各画素についてドットを形成するか否かをドットの種類毎に決定した。例えば、図11に示したフローチャートでは、初めに大ドットについてのドット形成の有無を判断し、次に中ドットのついての判断を行い、最後に小ドットについて判断するといったように、ドットの種類毎にドット形成有無を判断していた。しかし、ドット形成有無を判断する方法は、こうした方法に限られるものではない。例えば、画素群内から画素を1つずつ選択して、各画素について、大中小のいずれのドットが形成されるのか、あるいはドットが形成されないかを判断することとしてもよい。以下に説明する第2の変形例の画像印刷処理では、こうした変形例のドット形成有無決定処理を行う。
図32は、変形例のドット形成有無決定処理の流れを示したフローチャートである。以下、フローチャートに従って、変形例のドット形成有無決定処理について説明する。
変形例のドット形成有無決定処理においても前述した第1実施例における処理と同様に、処理を開始すると先ず初めに、処理対象とする画素群を1つ選択する(ステップS400)。次いで、選択した画素群の多値化結果値を取得し(ステップS402)、画素群の分類番号と多値化結果値とに基づいて、その画素群に形成するドット個数を表すデータを取得する(ステップS404)。ドット個数のデータは、分類番号と多値化結果値との組合せから、図12に示した変換テーブルを参照することによって迅速に取得することができる。
変形例のドット形成有無決定処理では、こうして取得したドット個数のデータを一旦、16ビット長の中間データに変換する(ステップS406)。すなわち、図12の変換テーブルではデータ量を低減するために、ドット個数のデータを8ビット長のコードデータとして表したが、変形例のドット形成有無決定処理では、ドット形成有無をより簡便に決定可能な形式で表現された中間データに一旦変換しておくのである。ここで、中間データのデータ長が16ビットとなっているのは、画素群内に含まれる画素数が8個であり、各画素についてのドット形成の有無は2ビットあれば表現可能であることによる。換言すれば、中間データは2ビットずつを1組として、画素数に相当する8組のデータを用いてドット個数を表すデータとなっている。画素群に形成するドット個数をこのような形式で表現しておけば、後述するように画素との対応が取り易くなるため、ドット形成有無を簡便に決定することが可能となる。変形例のドット形成有無決定処理においては、ドット個数を表すコードデータと中間データとの対応関係が予め記憶されており、ステップS406の処理では、かかる対応関係を参照することによって中間データを取得する。
図33は、ドット個数を表すコードデータと中間データとを対応付けた対応表を示す説明図である。前述したようにコードデータは、各種ドットについての個数の組合せに対応付けられているから(図13参照)、2ビットを1組としてドットの種類を表し、そのビットの組をドットの個数に相当する数だけ並べた表現形式に変換すれば、16ビットのデータを得ることができる。16ビット長の中間データは、コードデータの表現形式をこの様にして変換して得られたデータとなっている。
例えば、コードデータ「1」は、大ドット0個、中ドット0個、小ドット1個の組合せを示している。尚、参考として、図33の右側には、それぞれのコードデータが示すドット個数の組合せが示されている。今、小ドットを表す2ビットデータを「01」とすれば、コードデータ「1」に対応する16ビットデータは、「01」が1組だけ含まれており、他の7組の2ビットデータは「00」であるようなデータとなる。尚、2ビットデータ「00」はドットを形成しないことを表すデータである。
同様に、コードデータ「163」は、大ドット7個、中ドット1個、小ドット0個の組合せを示している。今、大ドットを表す2ビットデータを「11」として、中ドットを表す2ビットデータを「10」とすれば、コードデータ「163」に対応する16ビットデータは、「11」の2ビットデータが7組含まれており、「10」の2ビットデータが1組含まれたデータとなる。
尚、これら2ビットデータは、大ドット、中ドット、小ドットの順番で、右詰めで設定されている。例えば、ドット個数の組合せが、大ドット1個、中ドット2個、小ドット3個であったとすると、8組の2ビットデータの中で、大ドットを表す2ビットデータ「11」は右端に1組だけ設定され、その左隣に続けて、中ドットを表す2ビットデータ「10」が2組設定され、更にその左隣に続けて、小ドットを表す2ビットデータ「01」が3組設定され、残った2組には、ドットを形成しないことを表す2ビットデータ「00」が設定されることになる。もっとも、これら2ビットデータを左詰めで設定することとしても良い。すなわち、大ドット、中ドット、小ドットの順番で左から順番に設定しても良い。
図32に示した変形例のドット形成有無決定処理のS406では、図33に示した対応関係を参照することによって、ドット個数を表すデータを、中間データに変換する処理を行う。尚、以上の説明では、図12に示した変換テーブルを参照することによって、分類番号および画素群階調値の組合せを、ドット個数を表す8ビットのコードデータに一旦変換した後、図33に示した対応関係に基づいて、コードデータを16ビットの中間データに変換するものとした。もっとも、コードデータと中間データとは1対1に対応付けられていることから、図12に示した変換テーブルに、8ビットのコードデータではなく16ビットの中間データを設定しておき、画素群の分類番号および画素群階調値の組合せから、直ちに中間データを取得することも可能である。このようにすれば、変換テーブルのデータ量は大きくなるものの、迅速に中間データを得ることができる。
以上のようにして中間データを取得したら、画素群に対応する順序値マトリックスを読み込んだ後(ステップS408)、画素群の中からドット形成有無を決定しようとする画素を1つ選択して(ステップS410)、順序値マトリックス中で選択した画素位置に設定されている順序値を取得する(ステップS412)。
次いで、先に取得しておいた中間データの中から、順序値に対応する箇所に設定されている2ビットデータを読み出すことによって、選択した画素についてのドット形成の有無を決定する(ステップS414)。図34は、中間データの中から順序値に対応する箇所のデータを読み出すことにより、ドット形成の有無を決定している様子を示した説明図である。図34(a)は、ある画素群に形成するドット個数のデータを変換して得られた中間データを例示したものである。前述したように中間データは、16ビット長のデータであり、2ビットずつ8組のデータから構成されている。また、図34(a)に示した中間データには、大ドットを表す2ビットデータ「11」が1組、中ドットを表す2ビットデータ「10」が2組、小ドットを表す2ビットデータ「01」が3組、ドットを形成しないことを表す2ビットデータ「00」が2組含まれており、これら2ビットデータが、大ドット、中ドット、小ドットの順序で右詰めに設定されている。
今、ドット形成有無を決定しようとしている画素の順序値が「3」であったとする。この場合は、中間データの中で、右から3組目に設定されている2ビットデータを読み出せば、順序値3の画素に形成すべきドットの種類を決定することができる。図34(b)には、中間データの右端から3組目にある2ビットデータを読み出している様子が、概念的に示されている。図示した例では、読み出した2ビットデータは「10」であるから、この画素には中ドットを形成するものと決定すればよい。仮に、順序値が「1」であれば、中間データの右端に設定されている2ビットデータを読み出して、大ドットを形成するものと決定すればよい。
このように、変形例のドット形成有無決定処理では、中間データの中から、順序値に相当する箇所に設定されている2ビットデータを読み出すという極めて簡単な操作によって、ドット形成の有無を決定することができる。これは、次の理由によるものである。先ず、中間データには、大ドット、中ドット、小ドットを表す2ビットデータが右詰めで設定されている。一方、図21あるいは図23に示したように、ディザ法を用いて大中小各ドットの形成有無を判断する処理では、大ドット、中ドット、小ドットの順番でドット形成の有無を決定している。従って、中間データに設定されている2ビットデータを右端から順番に読み出していけば、図21あるいは図23を用いて前述した手法を適用して各種ドットを形成する画素位置を決定した順番と同じ順番で、大ドット、中ドット、小ドットを表す2ビットデータの並びが得られることになる。
また、図21あるいは図23を用いて前述した手法では、ディザマトリックスに小さな閾値が設定されている画素から順番にドットが形成されていく。一方、順序値マトリックスに設定されている順序値は、ディザマトリックスに設定されている閾値の小さい順番を表している。従って、順序値は、図21あるいは図23を用いて前述した手法を用いてドット形成の有無を判断したときに、ドットが形成された順番と一致する。
このことから、対象としている画素の順序値が分かれば、図21あるいは図23の手法を適用したときに、その画素が画素群中で何番目にドットが形成された画素であるかを知ることができ、更に、中間データを右端から数えて順序値組目の2ビットデータを読み出せば、図21あるいは図23の手法を適用したときに得られるドット形成有無の判断結果を知ることができるのである。
尚、以上では、中間データの中で2ビットデータを読み出す箇所を順序値に応じて変更するものとして説明した。しかし、中間データの中で読み出す箇所を変えるのではなく、データを読み出す箇所は固定しておき、中間データを順序値に相当する組数だけシフトさせることとしても良い。この様にしても、ドット形成の有無を決定することができる。図34(c)は、中間データをシフトさせることによって、ドット形成有無を決定している様子を概念的に示した説明図である。図示した例では、中間データの右端にある2ビットデータを読み出すこととして、中間データを画素の順序値に応じた組数(具体的には順序値から1だけ少ない組数)だけ右方向にシフトさせている。図34(b)と図34(c)とを比較すれば明らかなように、どちらの操作を行った場合でも、結局は、中間データの中の同じ箇所に設定されている2ビットデータを読み出していることになる。データを所定のビット数だけシフトさせる処理は、比較的高速に実施可能であることから、この様にして中間データをシフトさせれば、順序値に応じた箇所の2ビットデータを迅速に読み出して、着目している画素についてのドット形成の有無を迅速に決定することができる。
以上のようにして、中間データの中から順序値に相当する箇所に設定されている2ビットデータを読み出すことにより、着目している画素についてのドット形成の有無を決定したら(図32のステップS412)、処理対象としている画素群内の全画素についてドット形成の有無を決定したか否かを判断する(ステップS414)。そして、画素群内に未だドット形成の有無を決定していない画素が残っている場合は(ステップS414:no)、ステップS410に戻って新たな画素を1つ選択し、選択した画素について上述した続く一連の処理を行った後、再び画素群内の全画素についてドット形成の有無を決定したか否かを判断する(ステップS416)。画素群内の全画素についてドット形成の有無を決定するまで、こうした操作を繰り返し、全画素について決定したと判断されたら(ステップS416:yes)、今度は画像中の全画素群について、上述した処理を行ってドット形成の有無を決定したか否かを判断する(ステップS418)。そして、未処理の画素群が残っていれば(ステップS418:no)、ステップS400に戻って新たな画素群を選択し、その画素群について続く一連の処理を行う。こうした操作を繰り返し、最終的に全画素群についての処理を終了したと判断されたら(ステップS418:yes)、図32に示した変形例のドット形成有無決定処理を終了する。
以上に説明したように、変形例のドット形成有無決定処理では、中間データの中から順序値に応じた適切な箇所に設定されている2ビットデータを読み出すだけで、簡便にドット形成の有無を決定することができる。第2の変形例の画像印刷処理では、このようにして迅速にドット形成の有無を決定することができるので、それだけ迅速に画像を印刷することが可能となる。
D.第2実施例 :
以上に説明した第1実施例のドット形成有無決定処理では、画素群毎の多値化結果値を受け取ると、図12に示した変換テーブルを参照することによって一旦、ドット個数を表すデータに変換した後、順序値マトリックスを参照しながら、画素群内でドットを形成する画素位置を決定した。しかし、画素群毎の多値化結果値を受け取ると、各種ドットを形成する画素位置を直ちに決定することも可能である。以下では、こうした第2実施例のドット形成有無決定処理について説明する。
D−1.第2実施例のドット形成有無決定処理の原理 :
図27に示したように、第1実施例のドット形成有無決定処理においては、画素群毎に多値化結果値を受け取ると、画素群の分類番号を求めた後、多値化結果値と分類番号との組合せから、画素群内に形成される各種ドットの個数を決定した。そして、これらドットを形成する画素位置については、分類番号に対応した順序値マトリックスを参照することによって決定していた。すなわち、画素群の多値化結果値および分類番号が決まれば、画素群内の各画素に形成されるドットの種類を決定することができる。従って、予め、多値化結果値と分類番号との組合せ毎に、画素群内の各画素に形成されるドットの種類を求めて対応表に記憶しておけば、かかる対応表を参照するだけで、直ちにドット形成有無を決定することができるはずである。第2実施例のドット形成有無決定処理は、このような考え方に基づいて、画素群の多値化結果値から、各画素についてのドット形成の有無を迅速に決定することが可能となっている。
図35は、第2実施例のドット形成有無決定処理で参照される変換テーブルを概念的に示した説明図である。図示されているように、第2実施例の変換テーブルには、多値化結果値と分類番号との組合せに対応付けて、画素群内の各画素に形成されるドット種類を表すデータが設定されている。以下では、このようなデータをドットデータと呼ぶことにする。図35に示した変換テーブルを参照すれば、画素群の分類番号と画素群階調値との組合せから、対応するドットデータを直ちに読み出すことができる。例えば、分類番号i番、画素群階調値jであれば、ドットデータはDD(i,j)となる。こうして読み出されたドットデータには、画素群内の各画素についてドット形成の有無が記述されている。
図36は、第2実施例の変換テーブルに設定されているドットデータのデータ構造を示した説明図である。図36(a)に示すように、ドットデータは2ビットずつのデータ8組から構成された16ビット長のデータとなっている。ここで、1つのドットデータが8組のデータから構成されているのは、本実施例の画像印刷処理では、1つの画素群には8つの画素が含まれていることに対応するものである。従って、例えば、1つの画素群が4つの画素から構成される場合は、1つのドットデータは4組のデータから構成されることになる。また、1組のデータが2ビットとなっているのは、本実施例のカラープリンタ200が1つの画素あたり、「大ドットを形成」、「中ドットを形成」、「小ドットを形成」、「ドットを形成しない」の4つの状態を表現し得ることに対応したものである。すなわち、1つの画素あたり4つの状態しか取り得ないのであれば、2ビットで表現可能である。そこで、画素1つ分に対応する1組のデータを、2ビットのデータ長としているのである。
図36に示すように、ドットデータを構成する8組のデータは、それぞれ画素群内の所定位置の画素に対応付けられている。例えば、図36(a)に示したドットデータの先頭にある1組目のデータは、図36(b)に示すように、画素群内で左上隅の画素に対応している。また、ドットデータの先頭から2組目のデータは、画素群内で上段の左から2番目の画素に対応している。このように、ドットデータを構成する8組のデータは、それぞれ画素群内の所定位置の画素に予め対応付けられている。
そして、各組のデータの内容は、対応する画素に形成するドットの種類を表している。すなわち、2ビットのデータ「11」は大ドットを形成することを意味している。2ビットのデータ「10」は中ドットを形成することを意味しており、「01」は小ドットを形成することを、そして「00」はドットを形成しないことを意味している。以上の説明から分かるように、図36(a)に例示したドットデータは、画素群の左上隅の画素には大ドットを形成し、上段の左から3番目の画素には中ドットを、下段の左から2番目の画素には小ドットを、画素群の右下隅の画素には中ドットを形成し、そして、その他の画素にはドットを形成しないことを表すデータとなっている。
このような変換テーブルを参照すれば、画素群の分類番号と多値化結果値とに基づいて、各画素についてのドット形成の有無を速やかに決定することが可能である。
D−2.第2実施例のドット形成有無決定処理 :
次に、第2実施例のドット形成有無決定処理において、多値化結果値から画素群内の各画素についてドット形成の有無を決定する具体的な処理について説明する。
図37は、第2実施例のドット形成有無決定処理の流れを示すフローチャートである。以下、フローチャートに従って簡単に説明する。第2実施例のドット形成有無決定処理を開始すると、処理対象とする画素群を1つ選択する(ステップS500)。次いで、選択した画素群の多値化結果値を取得する(ステップS502)。このとき、画素群の分類番号が与えられていなければ、分類番号も算出しておく。そして、分類番号および多値化結果値の組合せに基づいて、図35に示した変換テーブルを参照することにより、画素群内の各画素についてドット形成の有無を表したドットデータを読み出してやる(ステップS504)。第2実施例のドット形成有無決定処理では、こうして変換テーブルから対応する位置に記憶されているドットデータを読み出すだけで、画素群内の各画素についてドット形成の有無を決定することができる。
次いで、全画素群についてドット形成の有無を決定したか否かを判断し(ステップS506)、未処理の画素群が残っていれば(ステップS506:no)、ステップS500に戻って新たな画素群を選択し、その画素群について続く一連の処理を行う。こうした操作を繰り返して、全画素群について処理を終了したと判断されたら(ステップS506:yes)、図37に示す第2実施例のドット形成有無決定処理を終了する。
以上に説明したように、第2実施例のドット形成有無決定処理では、変換テーブルを1回参照するだけで、多値化結果値から画素群内の各画素についてのドット形成有無を直ちに決定することができる。従って、図11に示した第1実施例のドット形成有無決定処理に対しても、より一層迅速にドット形成の有無を決定することができ、延いては、極めて迅速に画像を出力することが可能となる。
E.第3実施例 :
以上に説明した各種実施例のドット形成有無決定処理では、画素群毎に得られた多値化結果値から各画素についてのドット形成有無を決定するに際して、ディザマトリックスを基礎とした手法を用いてドット形成の有無を決定していた。すなわち、ディザマトリックスに設定されている閾値はドットの形成され易さを表していると考えることができる点に着目し、第1実施例では、ディザマトリックスに基づいて設定された順序値マトリックスを用いて、画素群毎に各画素のドット形成の有無を決定した。また、第2実施例では、ディザマトリックスに基づいて設定されたドットデータを、変換テーブルに設定しておき、変換テーブルを参照することによって、多値化結果値から画素群毎に各画素のドット形成の有無を決定した。このため、上述した各種実施例のドット形成有無決定処理によって得られるドットの分布は、ディザマトリックスを用いて発生させたドットの分布と同等の分布が得られることになる。このことは、いわゆるブルーノイズマスクやグリーンノイズマスクに基づいてドットを発生させることで、これらマスクを用いて初めて実現されるようなドット分布が得られることを意味しているが、その一方で、ドットの発生する画素位置がディザマトリックスの制約を受けることも意味している。換言すれば、上述した各種実施例では、高画質な画像を迅速に出力することが可能であるものの、得られる画質はディザ法を用いて実現可能なレベルを越えることができず、より一層の高画質化を図るためには、ディザマトリックスの制約を受けずにドットを発生させ得るような工夫が必要となる。以下に説明する第3実施例では、ディザマトリックスの制約を受けずにドットを発生可能とすることで、より高画質な画像を迅速に出力することが可能となっている。
E−1.画質を改善する原理 :
以下では、先ず初めに「ディザマトリックスによる制約」の意味するところについて説明するとともに、ディザマトリックスの制約を受けずにドットを発生可能とすることで画質を改善することができる原理について説明する。
図38は、ディザマトリックスに基づいてドットを発生させるときに受ける制約について、概念的に示した説明図である。一般に、高画質な画像を得るためには、ドットが出来るだけ万遍なく分散するように発生させることが望ましいから、理想的なドットの分布状態を考えると、隣接するドット間の距離は全てドットで一定となり、従って、ドット間の距離とドットの形成密度との関係は1つに決まってしまう。すなわち、ドットの形成密度に対して、最適なドット間距離が1つずつ存在することになる。図38(a)および図38(b)は、ドットの形成密度と最適なドット間距離との関係を概念的に示した説明図である。尚、ドットは二次元平面上に形成されるのであるが、直感的な理解を可能とするために、図38ではドットが一次元直線上に形成されるものとして表している。ドットが二次元平面上に形成される場合については、一次元上で起きている現象が、直交する方向にも生じているものとすれば、大まかな状況を理解することが可能である。
図38(a)は、一次元上で20%の密度でドットが形成される時の、理想的なドット分布を示した説明図である。この場合は、図示されているように、5画素に1つの割合でドットが形成されることになる。この状態を二次元に拡張する場合は、縦横それぞれに5画素に1つの割合でドットが形成される場合を考えればよいから、25画素に1つの割合すなわち4%の密度でドットが形成される状態に相当すると考えればよい。また、このようなドットの分布を、ディザマトリックスを用いて発生させるためには、ドットが形成されている画素には小さな閾値を設定しておくことが必要となる。
図38(b)は、一次元上で33%の密度でドットが形成される時の、理想的なドット分布を示した説明図である。図示されているように、この場合は3画素に1つの割合でドットが形成されることになる。この状態を二次元に拡張する場合は、9画素に1つの割合すなわち11%の密度でドットが形成される状態に相当する。
ここで、一次元上でのドット形成密度が20%の場合には、図38(a)のドット分布が理想であるから、このようなドット分布を得るためには、図中でドットが形成されている画素の位置に、小さな閾値が設定されたディザマトリックスを用いる必要がある。図38(a)に示した16個分の画素位置については、ドットが形成されている4つの画素位置に小さな閾値を設定しておけばよい。一方、一次元上でのドット形成密度が20%から33%に増加した場合は、16個分の画素位置の中では、図38(b)に示したように6つのドットを形成すればよい。ところが、ドット形成密度20%の場合に理想的なドット分布を得るために、既に4つの画素位置には小さな閾値が設定されているから、これらを除いた中から2つ画素位置に小さな閾値を設定することになる。
図38(c)は、このようにして密度33%でドットが形成された状態を表している。図中で斜線が付されたドットは、密度20%で理想的なドット分布を得るために形成されたドットであり、黒く塗られたドットは、ドット形成密度を33%とするために追加して形成されたドットである。図38(c)のドット分布を、理想的なドット分布である図38(b)の分布と比較すれば明らかなように、図38(c)のドット分布は理想的な分布とはなっていない。これは、密度20%で理想的なドット分布が得られるように、ディザマトリックスには5画素間隔で小さな閾値が設定されているため、より高い密度でドットを形成する場合には、その状態を前提としてドットを追加する以外にないためである。
このように、ディザマトリックスを用いてドットを発生させる場合、ドットの発生の仕方は、より低い密度でのドット分布を前提として、そこに新たなドットが追加されるようなドットの発生の仕方にならざるを得ない。このことは次のように考えれば、より明快に理解することができる。すなわち、前述したように、ディザマトリックスに設定された閾値はドットの発生のし易さを表していると考えることができるから、同じディザマトリックスを用いる以上、ある密度でドットが形成されると、より高い密度では、その画素には必ずドットが形成されることになる。換言すれば、ディザマトリックスに小さな閾値が設定されている画素には、ほとんどの密度で常にドットが形成され、大きな閾値が設定されている画素には、ほとんどの密度でドットが形成されることがない。
「ディザマトリックスによる制約」とは、このようにドットの発生の仕方が、より低い密度で発生するドット分布に拘束されることを言う。従って、ディザマトリックスによる制約を受けている限り、全ての密度で理想的なドット分布を実現することはできず、ある程度のレベルで妥協したドット分布とならざるを得ない。逆に言えば、ディザマトリックスによる制約を受けずにドットを発生させることが可能となれば、より理想に近いドット分布とすることで、画質の改善を図ることが可能となるのである。
図39は、第3実施例において、ディザマトリックスによる制約を受けないドット発生を可能とするためのデータ変換方法を概念的に示した説明図である。第3実施例では、前述した第1実施例と同様に、画像データから画素群毎に画素群階調値を生成し、画素群階調値を多値化結果値に変換する。次いで、変換テーブルを参照することにより、得られた多値化結果値を、画素群内に形成すべきドットの個数を表した個数データ、若しくは、画素群内でのドットパターンを表したドットデータの、いずれかのデータに変換する。画素群が8つの画素から構成されており、形成可能なドットの種類が3種類であるとすれば、図13を用いて前述したようにドット個数の組み合わせは165種類しか取り得ないから8ビットのデータで表現することが可能であり、また、8ビットあれば256種類を表現することができる。従って、ドット個数の組み合わせとしては利用されない91種類分の個数データを利用すれば、91通りのドットデータを表すことができる。
図40は、8ビットの個数データを用いて、165通りのドット個数の組み合わせと、91通りのドットデータとを表す様子を概念的に示した説明図である。図示されているように、個数データの0〜164の範囲は、大中小のドット個数の組み合わせを表すために割り当てられており、個数データの165〜255の範囲は、ドットデータを表すために割り当てられている。従って、多値化結果値を変換して得られた個数データが階調値0〜164の範囲のデータであれば、ドット個数の組み合わせを表した本来の意味での個数データであり、逆に階調値165より大きなデータであった場合は、その個数データは実際にはドットデータを表しているものと判断すればよい。そして、変換によって得られた個数データがドット個数の組み合わせを表している場合は、前述した第1実施例と同様に、順序値マトリックスを参照して、画素群内の各画素についてのドット形成有無を決定する。一方、個数データが実際にはドットデータを表している場合には、ドットパターンテーブルを参照して、その個数データをドットデータに変換することにより、画素群内の各画素についてのドット形成の有無を決定すればよい。
図41は、個数データからドットデータを得るために参照されるドットパターンテーブルを概念的に示した説明図である。図示されているように、ドットパターンテーブルには、ドットデータを表すために割り当てられた個数データの各々に対してドットデータが設定されている。ここでドットデータは、図36を用いて前述した方法によって、画素群内でのドットの分布(ドットパターン)を表したデータである。尚、図41では、参考のために各ドットデータが表すドットの分布(ドットパターン)も示されている。このようなドットパターンテーブルを参照すれば、ドットデータに割り当てられた個数データから、画素群内でのドット分布を直ちに決定することができる。また、ドットパターンテーブルには、各々の個数データに対して自由なドットデータを設定することができるから、ディザマトリックスの制約を受けずにドットを発生させることができる。従って、個数データの一部にはドット個数の組み合わせを割り当てておき、残りの部分にはドットデータを割り当てることとして、個数データから順序値マトリックスを参照して画素群内の各画素についてのドット形成有無を決定する場合と、ドットパターンテーブルを参照して、個数データから直ちに画素群内でのドット分布を得る場合とを併用してやれば、全体として、ディザマトリックスの制約を受けずにドットを発生させることが可能になると考えられる。この点につき、より具体的に説明する。
図42は、ある画素群についての多値化結果値が、ドット個数を表す個数データと、ドットデータを表す個数データとに変換される様子を概念的に示した説明図である。今、ある画素群の画素群階調値を階調値0から255まで変化させたときに、多値化結果値が0から18まで変化したものとする。すなわち、この画素群については画素群階調値が19値化されたことになる。次いで、図12に示したような変換テーブルを参照することにより、多値化結果値を個数データに変換する。図42に実線で示した棒グラフは、階調値0から階調値18までの多値化結果値が、それぞれの個数データに変換された様子を概念的に表している。第1実施例において説明したように、このようにして得られた個数データは、階調値0から階調値164までの範囲から選択されて、それぞれが大中小の各ドットについての個数を表したデータとなっている。
次いで、こうして得られた個数データを、ドットデータに割り当てられた個数データに差し替えてやる。例えば、多値化結果値2に対しては階調値7の個数データに変換されているが、この個数データを、ドットデータを表す個数データに差し替えてやる。ドットデータを表す個数データは、階調値165よりも大きな値に割り当てられている。その結果、この画素群については、多値化結果値2に対しては階調値7の個数データの代わりに、階調値168の個数データに変換されることになる。図42に示された破線は、このように個数データが差し替えられていることを表したものである。尚、図中に示した一点鎖線は、ドットの個数を表す個数データの領域と、ドットデータを表す個数データの領域との境界を表している。また、多値化結果値6に対しても、階調値48の個数データが階調値178の個数データに差し替えられている。更に、多値化結果値10、11、15についても、個数データが差し替えられている。このように、ドット個数を表す個数データの一部を、ドットデータを表す個数データに差し替えてやれば、以下に説明するように、ディザマトリックスの制約を受けずにドットを発生させることが可能となる。
図43は、個数データの一部を差し替えることにより、ディザマトリックスの制約を受けずにドットを発生させることが可能となる様子を示した説明図である。図43(a)は、対象とする画素群の順序値マトリックスを表している。また、この画素群については、多値化結果値0は個数データ「0」に変換され、多値化結果値1は個数データ「1」に、多値化結果値2は個数データ「3」に、多値化結果値3は個数データ「10」に、そして多値化結果値4は個数データ「12」に変換されるものとする。これら個数データは、何れも階調値164より小さいことから、各種ドットの個数を表すデータであり、図13に示した対応関係によれば、個数データ「1」は、小ドットが1つだけ形成されることを表している。また、個数データ「3」は、小ドットが3つだけ形成されることを表しており、個数データ「10」は、中ドットおよび小ドットが1つずつ形成されることを、個数データ「12」は、中ドット1つおよび小ドット3つが形成されることを表している。これらのドットが図43(a)に示した順序値マトリックスに従って形成されることになるから、結局、この画素群については多値化結果値が0から4へと増加するに従って、図43(b)から図43(f)に示したようにして、ドットが発生することになる。
このようなドットの発生の仕方は、ディザマトリックスの制約を受けたものとなっている。すなわち、例えば、画素群中で上段の左から2番目の画素については、もっとも早くドットが形成され、その後は、画素群階調値が増加するにつれて小ドットが中ドットに変更されることはあるものの、常にドットが形成されている。これは、この画素には順序値1が設定されていることによる。また、画素群中で下段の一番右端にある画素についても、比較的早い段階でドットが形成され、その後は、順序値1の画素に1つだけドットが形成されるような場合を除いて、この画素についても常にドットが形成されている。このように、順序値マトリックスに従ってドットを形成すると、小さなドットが大きなドットに置き換わる場合は別として、常に現在のドット分布に対して新たなドットを追加するようにしてドットが発生することになり、ディザマトリックスの制約を受けたドット発生となってしまう。
これに対して、多値化結果値2に対する個数データ「3」が、個数データ「181」に差し替えられたものとする。個数データ「181」は、階調値165よりも大きいことから明らかなように、ドットの個数ではなくドットデータを表しており、図41に示したドットパターンテーブルによれば、図43(g)に示すようなドット分布を表している。従って、個数データ3を個数データ181に差し替えることによって、ドットの分布は、図43(b)、図43(c)、図43(g)、図43(e)、図43(f)と変化することになる。
このようなドットの発生の仕方は、もはやディザマトリックスの制約を受けたものとはなっていない。すなわち、図43(c)と図43(g)とを比較すれば明らかなように、図43(g)のドット分布は、図43(c)のドット分布を前提として新たなドットを追加して得られた分布とはなっていない。また、図43(g)と図43(e)についても同様に、図43(e)に示したドット分布は、図43(g)のドット分布を前提として新たなドットを追加したものとはなっていない。更に、差し替える個数データを階調値181ではなく他の個数データとしてやれば、図43(g)に示すドット分布よりも、より適切なドット分布に変更することも可能である。
このように、ドット個数を表す個数データの一部を、ドットデータを表す個数データに差し替えてやれば、ディザマトリックスの制約を受けずにドットを発生させることができる。しかも、差し替える個数データを適切なドットデータが得られるように選択すれば、単にディザマトリックスの制約を受けないだけでなく、より好ましいパターンでドットが発生するように、ドット分布を積極的に制御することが可能となる。以上が、ディザマトリックスの制約を受けずにドットを発生可能とすることで、画質の改善を可能とする基本的な原理である。以下では、こうした原理に基づいて画質が改善された画像を得るための具体的な処理内容について説明する。
E−2.第3実施例のドット形成有無決定処理 :
図44は、第3実施例のドット形成有無決定処理の流れを示すフローチャートである。かかる処理は、図11を用いて前述した第1実施例のドット形成有無決定処理と同様に、画素群毎に生成された多値化結果値を受け取って、画素群内の各画素についてドット形成有無を決定する処理である。
画素群毎の多値化結果値を生成する処理については、図7を用いて前述した第1実施例の多値化結果値生成処理と同様であるため、ここでは概要のみを説明する。先ず、所定個数の画素をまとめて画素群を生成し(ステップS130相当)、各画素群について画素群階調値および分類番号を求めた後(ステップS132相当)、図9に示すような多値化テーブルを参照すれば、画素群毎の多値化結果値を得ることができる(ステップS134相当)。こうして画素群毎に得られた多値化結果値に対して、以下に説明する処理を行うことにより、画素群内の各画素についてドット形成の有無を決定していく。
第3実施例のドット形成有無決定処理を開始すると、先ず初めに、処理対象とする画素群を1つ選択し(ステップS600)、選択した画素群についての多値化結果値を取得する(ステップS602)。次いで、変換テーブルを参照することにより、画素群の分類番号と多値化結果値との組合せによって定まる個数データを取得する(ステップS604)。第3実施例のドット形成有無決定処理で参照される変換テーブルにも、第1実施例のドット形成有無決定処理で参照される図12に示した変換テーブルと同様に、画素群の分類番号および多値化結果値の組合せ毎に、対応する個数データが予め設定されている。しかし、第1実施例の変換テーブルに設定されている個数データは、全てのデータが、ドットの個数を表すデータ(階調値が0〜164の範囲のデータ)であるのに対して、第3実施例の変換テーブルでは、ドットの個数を表すデータ(階調値が0〜164の範囲のデータ)と、ドットデータを表す個数データ(階調値が165以上のデータ)とが混在した状態で設定されている。
図45は、第3実施例のドット形成有無決定処理で参照される変換テーブルを概念的に示した説明図である。図12に示した変換テーブルと比較すれば明らかなように、第3実施例で参照される変換テーブルでは、所々の個数データが、階調値165以上の個数データ(ドットデータを表す個数データ)に差し替えられたものとなっている。尚、図45では、個数データが差し替えられている箇所には下線を付して表示されている。また、階調値165〜255までの91個の個数データに対しては、図41のドットパターンテーブルに示されているように、適切なドットパターンを表すドットデータが対応付けられた状態で予め設定されている。このドットパターンテーブルに設定されるドットデータは、画質の改善に効果的と考えられる91種類のドットデータを任意に選択することができる。図45に示した変換テーブルは、このようなドットデータを表す個数データと、ドット個数を表す個数データとが混在して設定されたものとなっている。そして、第3実施例のドット形成有無決定処理では、このような変換テーブルを参照する結果、画素群の多値化結果値を個数データに変換する結果、ドットの個数を表す個数データと、ドットデータを表す個数データとが混在した状態のデータに変換されることになる。
次いで、得られた個数データが階調値165以上のデータであるか否かを判断する(ステップS606)。そして、個数データが階調値165に満たないデータである場合は(ステップS606:no)、その個数データは第1実施例と同様に、ドットの個数を表していると考えられるので、前述した第1実施例と同様にして画素群内の各画素についてのドット形成有無を決定することが可能である。すなわち、図11に示したように、画素群の中からドットを形成する画素位置を大ドット、中ドット、小ドットの順番で決定しても良いし、あるいは図32に示したように、個数データを中間データに一旦変換しておき、画素群内の各画素について、大ドット、中ドット、小ドットの何れのドットを形成すべきかを中間データに基づいて決定することとしても良い。
図44に示したフローチャートでは、図32を用いて前述した方法と同様に、個数データを中間データに一旦変換して、各画素について何れのドットを形成すべきかを決定するものとしている。すなわち、得られた個数データを中間データに変換し(ステップS608)、次いで、画素群に対応する順序値マトリックスを読み込む(ステップS610)。そして、順序値マトリックスに設定されている順序値に従って、中間データの中から該当するビット位置に設定されている2ビットデータを読み出すことにより、画素群内の各画素について、何れのドットを形成するかあるいは何れのドットも形成しないかを決定する(ステップS612)。
一方、変換テーブルを参照して得られた個数データが階調値165以上のデータであった場合は(ステップS606:yes)、得られた個数データはドットの個数ではなく、ドットデータを表しているものと考えられる。そこで、この場合は、図41に示したドットパターンテーブルを参照して個数データをドットデータに変換する(ステップS614)。図36を用いて前述したように、ドットデータには画素群内の各画素についてのドット形成有無が設定されているから、個数データをドットデータに変換すれば、画素群内の各画素についてのドット形成有無が得られたことになる。
こうして個数データが階調値165より大きいか否かに応じて、それぞれの方法で個数データから画素群内の各画素についてのドット形成有無を決定したら、全画素群について、上述した処理を終了したか否かを判断する(ステップS616)。そして、未処理の画素群が残っていれば(ステップS616:no)、処理の先頭に戻って新たな画素群を選択し(ステップS600)、続く一連の処理を行う。こうした処理を繰り返し、全画素群について処理し終えたものと判断されたら(ステップS616:yes)、図44に示した第3実施例のドット形成有無決定処理を終了する。
以上に説明した第3実施例のドット形成有無決定処理によれば、階調値165に満たない個数データについてはドット個数を表すものとして、順序値マトリックスに従ってドット形成有無を決定し、階調値165以上の個数データについては、個数データをドットデータに変換することで各画素についてのドット形成有無を決定する。階調値165以上の個数データについては、ディザマトリックスの制約を受けずに任意のドットデータを設定しておくことができるから、順序値マトリックスに従ってドット形成有無を決定する個数データと、ドットデータに変換することにより直ちにドット形成有無を決定可能な個数データとを混在させておけば、図43を用いて説明したように、全体としてもディザマトリックスの制約を受けずにドットを発生させることが可能となる。
加えて、階調値165以上の個数データには任意のドットデータを対応付けておくことができるから、より高い画質の改善効果が得られるようなドットデータを選択して、個々の個数データに対応付けておくことが可能である。更に、こうした個数データは、画素群の分類番号と多値化結果値との組合せ毎に設定することができるから、このことは、画素群の分類番号と画素群階調値(延いては多値化結果値)との組合せを特定して、どのような分布でドットを発生させるかを積極的に制御することが可能であることを意味している。
また一般に、特に高画質の画像を得たい場合には、ドット形成有無を判断するに際して、ディザ法よりも良好な画質が得られると言われている誤差拡散法が用いられる場合が多いが、誤差拡散法では、ドットが形成されるか否かが他の画素から拡散されてきた誤差によって左右されるため、個々の画素についてドットの発生状況を細かく制御することは困難である。これに対して、上述した第3実施例のドット形成有無決定処理では、個々の画素についてドットの発生状況を細かく制御することが可能であり、従って、誤差拡散法を用いた場合よりも、より一層高画質な画像を得ることも可能となる。
また、こうした第3実施例のドット形成有無決定処理においては、図11あるいは図32に示した第1実施例の各種のドット形成有無決定処理に対して、個数データの階調値が165以上か否かを判断する処理が必要になること以外は、特に処理の手間が増えているわけではない。加えて、個数データの階調値が165以上と判断された場合は、図41に示したドットパターンテーブルを参照することで個数データから直ちにドット形成有無を決定することができるので、この点についてはむしろ処理が迅速になっていると言うことができる。結局、第3実施例のドット形成有無決定処理によれば、処理速度を何ら低下させることなく、画質を大きく改善することが可能となるのである。
尚、以上の説明では、大中小の各ドットの個数の組合せは、165通りの組合せが存在しているものとした。しかし、165通りという数は、画素群が8つの画素から構成されており、形成可能なドットの種類が3種類であるとしたときに取り得る全ての組合せの数であって、実際には165通りの全ての組合せが使用されるわけではない。例えば、小ドットが多数形成される状況では、中ドットも形成されるから、小ドットだけが7個あるいは8個も含まれるような組合せは、実際には使用されないものと考えられる。同様に、中ドットだけが7個あるいは8個含まれる組合せも、実際には使用されることはないと考えられる。更には、小ドットと大ドットだけを含んでいて中ドットは1つも含まないような組合せも、幾つかの組合せは実際には使用されることはないと考えられる。このような使用されない組合せがあることを考慮すれば、実際に使用されるドット個数の組合せは165通りよりも少なくなると考えられ、従って、その分だけ多くの個数データをドットデータに割り当てることも可能となる。
また、以上の説明では、個数データがドットデータを表している場合、同じ個数データであれば、画素群によらず同じドットデータを表すものとして説明した。しかし、同じ個数データであっても、分類番号に応じて異なるドットデータを表しているものとすることも可能である。例えば、図41に示したドットパターンテーブルを、分類番号毎に記憶しておけば、こうしたことを実現することができる。こうすれば、画素群の分類番号に応じて、適切なドットデータを設定することが可能となるので、より一層の画質の改善を図ることが可能となる。
E−3.第3実施例の変形例 :
上述した第3実施例では、画素群毎の多値化結果値を個数データに変換する際に、一部の個数データについてはドットデータを表す個数データに差し替えられた状態となるように変換した。従って、個々の画素群については、多値化結果値と個数データとの対応関係が部分的に修正されているものの、多値化の段数が変わることはない。これに対して、個々の画素群の多値化段数を増加させ、増加した多値化結果値に、ドットデータを表す個数データを割り当てることとしても良い。以下ではこうした第3実施例の変形例について説明する。
図46は、画素群の多値化段数を増加させる様子を示した説明図である。今、ディザマトリックスを基礎とする図24に示した方法によれば、ある画素群の画素群階調値は、図中に実線で示した多値化結果値に変換されるものとする。例えば、階調値0〜4の画素群階調値は多値化結果値0に変換され、階調値5〜21の画素群階調値は多値化結果値1に、階調値22〜43の画素群階調値は多値化結果値2に変換されるものとする。
ここで、多値化結果値2に変換される画素群階調値22〜43の範囲を、階調値22〜32および階調値33〜43の2つの範囲に分割することを考える。この結果、画素群階調値22〜32に対する多値化結果値は「2」のままで変わらないものの、画素群階調値33〜43に対する多値化結果値は「2」から「3」に変更される。これに伴って、従来の多値化結果値が「3」であった画素群階調値44〜67の多値化結果値は「4」に変更され、従来の多値化結果値が「4」であった画素群階調値68〜72の多値化結果値は「5」と、それ以降の多値化結果値の値が「1」ずつ増加することになる。図46では、このような、分割に伴って変更された多値化結果値を破線で示している。また、白抜きの小さな矢印は、多値化結果値の値が従来の多値化結果値から「1」ずつ増加していることを表したものである。このように、1つの多値化結果値を有する階調範囲を2つに分割すると、これにより、以降の階調範囲では多値化結果値の値が「1」ずつ増加して、結局、その画素群については多値化段数が1つ増加する。もちろん、階調範囲を3つに分割した場合は、多値化段数が2つ増えることになる。
また、こうした階調範囲の分割は、複数の階調範囲で行うことも可能である。図46に示した例では、画素群階調値22〜43の階調範囲に加えて、画素群階調値93〜132の階調範囲でも、階調範囲の分割を行っている。図中に細い実線で示されているように、階調値93〜132の画素群階調値は、従来は多値化結果値6に変換されていたが、階調範囲22〜43で分割Aが行われたことにより、破線で示されているように多値化結果値7に変換されている。この階調範囲を、多値化結果値7に変換される領域と多値化結果値8に変換される領域とに分割する。その結果、それ以降の領域では、多値化結果値が更に「1」ずつ増加することになる。図中に示した黒塗りの小さな矢印は、分割Bに伴って、それ以降の多値化結果値が「1」ずつ増加していることを表している。また、その結果として得られた多値化結果値を、図中では一点鎖線で表している。結局、以上のような2箇所で階調範囲を分割することにより、画素群階調値と多値化結果値との対応関係は、太い実線、太い破線、および太い一点鎖線で示されるような対応関係に変更されることになる。
次いで、このような多値化結果値の変更に対応させて、多値化結果値と個数データとの対応関係を修正する。図47は、第3実施例の変形例において、多値化結果値と個数データとの対応関係を修正している様子を概念的に示した説明図である。図46を用いて説明したように、従来は多値化結果値2に変換されていた階調値22〜43の画素群階調値は、階調値22〜32と階調値33〜43の2つの領域に分割されて、それぞれの領域の画素群階調値は、多値化結果値2および多値化結果値3の2つの多値化結果値に変換されている。そこで、これら一方の多値化結果値に対しては従来と同じ個数データを対応付けることとして、他方の多値化結果値に対しては、ドットデータを表す新たな個数データを対応付けてやる。図47に示した例では、多値化結果値2に対しては従来と同じ個数データ「8」を対応付けておき、多値化結果値3に対してはドットデータを表す個数データ「174」を対応付けた場合が示されている。
また、このように多値化結果値3に新たな個数データを対応付けた結果として、従来の多値化結果値3に対応付けられていた個数データは多値化結果値4に振り返られ、従来の多値化結果値4に対応付けられていた個数データは多値化結果値5に、従来の多値化結果値5に対応付けられていた個数データは多値化結果値6に振り返られる。このように、従来は多値化結果値2に変換されていた画素群階調値22〜43の領域を2つに分割したことに伴って、多値化結果値3以降に対応付けられていた個数データが、「1」ずつ大きな多値化結果値に振り返られることになる。図47に示した白抜きの矢印は、このように個数データが「1」ずつ大きな多値化結果値に振り返られる様子を表したものである。また、このように個数データが振り返られる結果、多値化結果値と個数データとの対応関係は、図中で破線によって示した対応関係に修正されることになる。
また、図46に示したように、画素群階調値93〜132の領域も2つに分割されている。この領域は、従来は多値化結果値6に変換されていたが、画素群階調値22〜43の領域が2つに分割されたことに伴って、多値化結果値7に変更された領域である。そして、この領域を分割することで得られた2つの領域は、それぞれ多値化結果値7および多値化結果値8に変換されている。そこで、これら多値化結果値の中の一方には従来の個数データ「48」を対応付け、他方の多値化結果値にはドットデータを表す新たな個数データを対応付けてやる。図47に示した例では、従来の個数データ「48」は多値化結果値8に対応付けることとして、新たな個数データ「191」を多値化結果値7に対応付けた場合を示している。また、このように画素群階調値93〜132の領域を2つに分割する結果、それまで多値化結果値8に対応付けられていた個数データは多値化結果値9に振り返られ、多値化結果値9に対応付けられていた個数データは多値化結果値10にと、1つずつ大きな多値化結果値に振り返られることになる。図47に示した黒塗りの矢印は、このように、個数データが更に「1」ずつ大きな多値化結果値に振り返られる様子を表したものである。また、このように個数データが更に振り返られる結果、多値化結果値と個数データとの対応関係は、図中で一点鎖線によって示した対応関係に修正されることになる。
第3実施例の変形例においては、以上に説明したようにして、図9に示した多値化テーブルおよび、図12に示した変換テーブルをそれぞれ修正しておく。そして、図44を用いて前述した第3実施例のドット形成有無決定処理と同様な処理を行うことにより、画素群内の各画素についてのドット形成有無を決定していく。このように画素群の多値化段数を増加させて、すなわち1つの多値化結果値を複数の多値化結果値に分割して、得られた多値化結果値に、ドットデータを表す新たな個数データを対応付けることによっても、ディザマトリックスの制約を受けずに適切にドットを発生させることが可能となる。以下では、この点について説明する。
図48は、画素群の多値化段数を増加させることにより、ディザマトリックスの制約を受けずにドットを発生させることが可能となる理由を示した説明図である。図48(a)には、対象とする画素群に設定されている順序値マトリックスが示されている。また、この画素群の多値化結果値を個数データに変換し、図48(a)に示した順序値マトリックスを参照してドット形成の有無を判断すると、図48(b)、図48(c)、図48(d)、図48(e)の順序でドットが発生するものとする。これらドットの発生状態を多値化結果値との対応関係で言えば、図48(b)の状態が多値化結果値0に対応し、図48(c)の状態が多値化結果値1に、図48(d)が多値化結果値2に、図48(e)が多値化結果値3にそれぞれ対応する。そして、このように順序値マトリックスに従って発生させたドットの分布は、図43を用いて前述したように、ディザマトリックスの制約を受けたものとなっている。すなわち、小さなドットが大きなドットに置き換わる場合は別として、常に現在のドット分布に対して新たなドットが追加されるような、ドットの発生形態となっている。
これに対して、多値化結果値1を、新たな多値化結果値1および新たな多値化結果値2の2つに分割し、新たな多値化結果値2に対してはドットデータを表す個数データ「173」を対応付けてやる。あるいは、多値化結果値2を、新たな多値化結果値2および新たな多値化結果値3の2つに分割し、新たな多値化結果値2の方に、ドットデータを表す個数データ「173」対応付けることとしても良い。図41に示したドットパターンテーブルによれば、個数データ「173」は図48(f)に示すようなドット分布を表している。従って、図48(c)に示したドット分布から図48(d)のドット分布に変化する前に、一旦、図48(f)に示したドット分布を経ることになる。
このようなドットの発生の仕方は、もはやディザマトリックスの制約を受けながら発生させたものではない。すなわち、図48(f)に示したドット分布は、図48(c)のドット分布を前提として新たなドットを追加した分布とはなっておらず、また、図48(d)に示したドット分布についても、図48(d)のドット分布に対して新たなドットを追加した分布とはなっていない。更に、追加した個数データ「173」を他の個数データとすることも可能であるから、ドットの発生の仕方がより適切なものとなるように、適切な個数データを選択することも可能である。前述したように、ディザマトリックスの制約の下では、既に形成されているドットの分布を前提として、新たなドットを追加するようなドットの発生の仕方となってしまうので、最適なドット分布を得ることは困難であった。これに対して、第3実施例の変形例では、ドットの発生状態を積極的に制御することが可能となるため、より高画質の画像が得られることになる。
もちろん、こうした第3実施例の変形例においても、前述した第3実施例と同様に、ドット形成有無決定処理においては、個数データがドット個数を表すデータか、あるいはドットデータを表すデータかの判断が必要になること以外には、特に処理の手間が増えているわけではない。むしろ、個数データがドットデータを表していると判断された場合には、図41に示したドットパターンテーブルを参照することで、画素群内の各画素についてのドット形成有無を直ちに決定することが可能となり、この点では処理が迅速化されていることになる。従って、第3実施例の変形例においても、処理速度を何ら低下させることなく、画質を大きく改善することが可能となっている。
尚、以上では、個数データの一部を差し替えることによって画質の改善を図る形態を第3実施例として説明し、多値化段数を増やして新たな個数データを追加することで画質の改善を図る形態を第3実施例の変形例として説明した。もちろん、これらの形態を組み合わせることで、より一層の画質の改善を図ることも可能である。例えば、ある階調領域の画素群階調値に対しては、多値化結果値に対応付けられた個数データを差し替えることとし、別の階調領域では領域を複数に分割して分割に関わる多値化結果値に新たな個数データを対応付けることとしても良い。あるいは、ある多値化結果値に対する個数データを差し替えた後、その多値化結果値の領域を複数の領域に分割して、分割に関わる多値化結果値に新たな個数データを対応付けることとしても良い。
F.第4実施例 :
以上に説明した第3実施例のドット形成有無決定処理は、前述した第1実施例のドット形成有無決定処理を基礎にした手法と考えることができる。すなわち、第1実施例では、画素群毎の多値化結果値を個数データに一旦変換した後、順序値マトリックスを参照して各画素のドット形成有無を決定しているところを、第3実施例では、多値化結果値を、ドット個数を表す個数データとドットデータを表す個数データとに変換し、ドットデータを表す個数データに関しては順序値マトリックスを参照することなく、画素群内でのドット分布を直接決定する手法と考えることができる。従って、第3実施例のドット形成有無決定処理では、順序値マトリックスを参照して各画素についてのドット形成有無を決定する画素群と、順序値マトリックスを参照することなくドット形成有無を決定する画素群とが混在することになる。
一方、前述した第2実施例では、順序値マトリックスを参照することなく画素群内の各画素についてのドット形成有無を決定することが可能である。従って、第1実施例ではなく、第2実施例のドット形成有無決定処理を基礎とすれば、全ての画素群について順序値マトリックスを参照することなくドットの形成有無を決定して、ディザマトリックスの制約を受けずにドットを発生させることが可能になると考えられる。以下では、こうした第4実施例について説明する。
F−1.画質を改善する原理 :
先ず初めに、第4実施例において、ディザマトリックスの制約を受けずにドットを発生させて画質を改善する原理について説明する。図49は、第2実施例の画像印刷処理で画像データをドットデータに変換する処理の概要と、第4実施例において画質を改善するための基本的な考え方とを示した説明図である。前述したように第2実施例の画像印刷処理では、画像データから画素群毎の画素群階調値を求め、次いで、多値化テーブルを参照することにより、画素群階調値を多値化結果値に変換する。そして、変換テーブルを参照することにより、画素群の分類番号と多値化結果値との組み合わせに対応付けて設定されているドットデータを読み出すことで、画素群内でのドット分布を決定した。このように、第2実施例において画像データからドットデータを得るための処理の流れは、図49中では斜線を付した矢印によって示されている。
ここで、画素群が8つの画素から構成されており、形成可能なドットの種類が3種類であるとすると、前述したように各画素群が取り得る多値化結果値の個数は、通常は16〜22個程度となる。このような多値化結果値を表現するためには、多値化結果値は4ビットのデータ長では足らず、5ビットのデータ長が必要となる。しかし、5ビットあれば32種類の状態を表現し得るから、各画素群には使用されていない多値化結果値が存在していることになる。例えば、ある画素群が取り得る多値化結果値が18個であったとすると、5ビットで表現可能な多値化結果値0〜31の中で、使用されている多値化結果値は0〜17のものだけであり、18〜31の多値化結果値は使用されていないことになる。そこで、所定の階調範囲の画素群階調値については、この未使用の多値化結果値に変換し、変換した多値化結果値に予め適切なドットデータを対応付けておくことにする。使用されていなかった多値化結果値に対応付けておくドットデータは、ディザマトリックスとは無関係に設定することができるから、このようにして多値化結果値をドットデータに変換すれば、画像全体としてもディザマトリックスの制約を受けずにドットを発生させることが可能となる筈である。図49では、このようにしてドットデータを決定する処理の流れが、破線の矢印によって示されている。
図50は、以上のような考え方に基づいて、ある画素群についての画素群階調値と多値化結果値との対応関係を設定している様子を示した説明図である。図中に実線で示した折れ線は、図9に示した多値化テーブルに設定されている画素群階調値と多値化結果値との対応関係を表している。また、この画素群については、0〜18の範囲の多値化結果値を取り得るものとする。このとき、19〜31の範囲の多値化結果値は未使用の状態となっている。
ここでは、ディザマトリックスの制約を受けずにドットを発生させるために、このような対応関係を修正していくことを考える。例えば、図中に実線で示されているように、この画素群については、画素群階調値32〜42には多値化結果値3が対応付けられているが、この多値化結果値を、使われていない多値化結果値19に変更してやる。図50では、多値化結果値が未使用の多値化結果値に変更されたことを破線によって表している。また、実線で示された修正前の対応関係によれば、画素群階調値101〜130に対しては1つの多値化結果値8が対応付けられているが、この階調範囲を分割して、画素群階調値101〜108に対しては多値化結果値20を、画素群階調値121〜130に対しては多値化結果値26を新たに対応付けてやる。この結果、図中に破線で示されるように、画素群階調値101〜130に対しては多値化結果値20と、多値化結果値8と、多値化結果値26の3つの多値化結果値が対応付けられることになる。このように多値化結果値を修正する画素群階調値を選択するためには、例えば実際の画像を出力してみて、画質の改善を要すると判断された画素群階調値を選択してやれば良い。
尚、前述したように、修正された新たな多値化結果値には、従来の対応関係では使用されていない大きな多値化結果値が設定される。従って、修正前の多値化結果値は、画素群階調値が増加するとともに少しずつ増加していたが(図50中の実線を参照のこと)、修正後の多値化結果値は、もはや画素群階調値の増加とともに増加するわけではない(図50中の破線を参照のこと)。換言すれば、修正後の多値化結果値の序列は、対応する画素群階調値の序列とは対応しなくなっている。画素群階調値に対してこのような関係にある値を「多値化」結果値と称するのは適切ではないと考えられるので、以下では、「多値化結果値」の代わりに「コード値」と呼ぶことにする。すなわち、第4実施例においては、画素群階調値を多値化して多値化結果値を得るのではなく、画素群階調値をコード化してコード値を得ると考えることにする。
このような画素群階調値のコード化は、エンコードテーブルを参照することによって迅速に行うことができる。図51は、第4実施例において画素群階調値をコード化するために参照されるエンコードテーブルを概念的に示した説明図である。図示されているようにエンコードテーブルには、図9に示した多値化テーブルと同様に、画素群の分類番号と画素群階調値との組み合わせ毎に対応するコード値が設定されている。また、設定されているコード値は、図9に示した多値化結果値とほぼ同じであるが、ところどころのコード値が未使用の多値化結果値に置き換えられたものとなっている。例えば分類番号1番の画素群については、画素群階調値3および画素群階調値4に対するコード値が未使用の多値化結果値16に置き換えられている。ここでコード値が「16」に置き換えられているのは、修正前のエンコードテーブル(すなわち、図9に示した多値化テーブル)では、分類番号1番の画素群については、画素群階調値255に対して多値化結果値15が設定されていることから、16以上の多値化結果値は使われていないと考えられることによる。尚、図51では、図9に示した多値化テーブルの多値化結果値から修正されたコード値には下線を付して表示してある。
このようなエンコードテーブルを参照して、画素群階調値をコード値に変換し、得られたコード値を、図35に示したような変換テーブルを参照してドットデータに変換してやれば、ディザマトリックスの制約を受けずに適切にドットを発生させることが可能となる。尚、上述したように、第4実施例では画素群階調値をコード化していると考えたことに対応して、コード値からドットデータへの変換は、コード値のデコードと考えることにする。これに伴って、コード値のデコードに際して参照するテーブルはデコードテーブルと呼ぶことにする。以下、画素群階調値のコード化およびデコードを行って、画像を印刷するために行われる処理内容について説明する。
F−2.第4実施例の画像印刷処理の概要 :
図52は、第4実施例の画像印刷処理の流れを示すフローチャートである。かかる処理は、図6を流用して前述した第2実施例の画像印刷処理とほぼ同様であるが、第2実施例の多値化結果値生成処理が第4実施例ではコード値生成処理に置き換わり、第2実施例のドット形成有無決定処理が第4実施例ではデコード処理に置き換わっている点が異なっている。以下では、これら相違点を中心にして、第4実施例の画像印刷処理について説明する。尚、第4実施例の画像印刷処理も、前述した各実施例の画像印刷処理と同様に、コード値生成処理までをコンピュータ100内で行って、デコード処理以降をカラープリンタ200内で行うこととしても良いし、あるいは全ての処理をカラープリンタ200内で行っても良い。
第4実施例の画像印刷処理においても、第2実施例の画像印刷処理と同様に、処理を開始すると先ず初めに画像データを読み込んで(ステップS700)、読み込んだ画像データの色変換処理を行った後(ステップS702)、色変換後の画像データに解像度変換処理を行うことにより、画像データの解像度を印刷解像度に変換する(ステップS704)。
こうして解像度を印刷解像度に変換したら、コード値生成処理を開始する(ステップS706)。前述したように、この処理は第2実施例の多値化結果値生成処理に対応する処理であり、多値化結果値生成処理では図9に示した多値化テーブルを参照して多値化結果値を得ているところを、第4実施例のコード値生成処理では図51に示すようなエンコードテーブルを参照してコード値を得ている点のみが異なっている。そこで、以下では、多値化結果値生成処理の説明に用いた図7を流用しながら、コード値生成処理の内容について説明する。
コード値生成処理を開始すると、先ず初めに、互いに隣接する所定個数の画素をまとめて画素群を生成する(図7のステップS130相当)。ここでは、主走査方向に4画素分、副走査方向に2画素分の合計8つの画素を画素群にまとめるものとする。
次いで、画素群階調値と、画素群の分類番号とを決定する(図7のステップS132相当)。画素群階調値は、画素群内の各画素の画像データに基づいて決定することができ、また、画素群の分類番号は、図8を用いて前述したように、画像中での画素群の位置に基づいて極めて簡便に決定することができる。
こうして、画素群の分類番号と画素群階調値とを決定したら、図51に例示したエンコードテーブルを参照して、分類番号と画素群階調値との組み合わせに対応して設定されているコード値を取得する(図7のステップS134相当)。第2実施例の多値化結果値生成処理によって得られる多値化結果値は、図10に示したように画素群階調値が増加するに従って次第に増加しているが、第4実施例のコード値生成処理によって得られるコード値は、図50に示されているように、もはや画素群階調値の増加とともに増加する値とはなっていない。すなわち、複数のコード値間の大小は特に物理的な意味を有していない。換言すれば、分類番号と組み合わせることでドットデータを特定することができるのであれば、コード値をどのように設定しても構わない。従って、図49ないし図51では、ディザマトリックスの制約を受けずに自由にドットデータを設定することができるコード値は、大きな値を取るものとして説明したが、これは理解の便宜を図ったためであり、実際にはこのような制約を設ける必要はない。
以上のようにして、複数の画素を画素群にまとめて、その画素群のコード値を生成したら、全画素について処理を終了したか否かを判断する(図7のステップS136相当)。そして、未処理の画素が残っている場合は(図7のステップS136:no相当)、処理の先頭に戻って新たな画素群を生成し、後述する一連の処理を行うことにより、その画素群についてのコード値を生成する。こうした操作を繰り返し、全画素についての処理を終了したと判断されたら(図7のステップS136:yes相当)、全ての画素群の画素群階調値がコード値に変換されたことになる。そして、コード値生成処理までをコンピュータ100で行い、以降の処理をカラープリンタ200で行う場合には、得られたコード値をカラープリンタ200に向かって出力する(図7のステップS110相当)。一方、全ての処理をカラープリンタ200内で行う場合には、得られたコード値を、続くデコード処理を行うモジュールに供給して(図7のステップS110相当)、コード値生成処理を終了し、図52に示した第4実施例の画像印刷処理に復帰する。
続いて、このようにして画素群毎に得られたコード値をデコードする処理を開始する(図52のステップS708)。前述したように、デコード処理は第2実施例のドット形成有無決定処理に対応する処理であり、第2実施例のドット形成有無決定処理では、図35に示した変換テーブルを参照して多値化結果値をドットデータに変換しているところを、第4実施例のデコード処理では、図53に示すようなデコードテーブルを参照してコード値をドットデータに変換している点のみが異なっている。そこで、以下では、第2実施例のドット形成有無決定処理の説明に用いた図37を流用しながら、デコード処理の内容について説明する。
第4実施例のデコード処理を開始すると、先ず初めに処理対象とする画素群を1つ選択して(図37のステップS500相当)、選択した画素群のコード値を取得する(図37のステップS502相当)。このとき、画素群の分類番号も算出しておく。画素群の分類番号は、図29および図30を用いて前述した方法により、簡便に算出することができる。そして、デコードテーブルを参照することにより、分類番号および多値化結果値の組合せに設定されているドットデータを読み出してやる(図37のステップS504相当)。
図53は第4実施例のデコード処理で参照されるデコードテーブルを概念的に示した説明図である。第2実施例のドット形成有無決定処理で参照される変換テーブルは、図35に示すように、ドットデータが、分類番号と多値化結果値との組み合わせに対応付けて設定されていたが、第4実施例のデコード処理で参照されるデコードテーブルでは、ドットデータが、分類番号とコード値との組み合わせに対応付けて設定されている点が異なっている。図36を用いて前述したように、ドットデータは、画素群内の各画素についてのドット形成有無を直接表現したものとなっているから、デコードテーブルを参照してコード値をドットデータに変換してやれば、画素群内の各画素についてドット形成の有無を直ちに決定することが可能となる。また、デコードテーブルに設定するドットデータは、画質上の観点から最適なドットデータを設定することができるので、ディザマトリックスの制約を受けることなく適切にドットを発生させることが可能となる。
以上のようにして、選択した画素群についてのドット形成有無を決定したら、全画素群についてドット形成の有無を決定したか否かを判断し(図37のステップS506相当)、未処理の画素群が残っていれば(図37のステップS506:no相当)、処理の先頭に戻って新たな画素群を選択し、その画素群について続く一連の処理を行う。こうした操作を繰り返して、全画素群について処理を終了したと判断されたら(図37のステップS506:yes相当)、第4実施例のデコード処理を終了して、図52の画像印刷処理に復帰する。画像印刷処理では、このようにして得られたドットデータに基づいて、各画素にドットを形成する(図52のステップS710)。この結果、印刷媒体上には画像データに対応した画像が印刷されることになる。
以上に説明したように、第4実施例の画像印刷処理では、エンコードテーブルを参照して画素群毎のコード値を生成し、次いで、デコードテーブルを1回参照するだけで、画素群毎のコード値から、画素群内の各画素についてのドット形成有無を直ちに決定することができる。このため、極めて簡単な処理により、画像データから各画素についてのドット形成有無を迅速に決定することができる。加えて、分類番号とコード値との組み合わせに対応付けてデコードテーブルに設定するドットデータは、画質上の観点から最適なドットデータを設定することが可能である。従って、高画質な画像を迅速に印刷することが可能となるのである。
以上、各種の実施例について説明してきたが、本発明は上記すべての実施例に限られるものではなく、その要旨を逸脱しない範囲において種々の態様で実施することができる。例えば、以上の実施例では、印刷用紙上にドットを形成して画像を印刷する場合について説明したが、本発明の適用範囲は画像を印刷する場合に限られるものではない。例えば、液晶表示画面上で輝点を適切な密度で分散させることにより、階調が連続的に変化する画像を表現する液晶表示装置などにも、本発明を好適に適用することができる。