以下では、本発明の作用・効果をより明確に説明するために、本発明の実施の形態を、次のような順序に従って説明する。
A.実施例の概要:
B.第1実施例:
B−1.装置構成:
B−2.第1実施例の画像印刷処理の概要:
B−3.個数データから画素位置を決定可能な原理:
B−4.第1実施例の個数データ生成処理:
B−4−1.分類番号の決定方法:
B−4−2.個数データ生成テーブル:
B−4−3.階調誤差の拡散方法:
B−5.第1実施例の画素位置決定処理:
B−6.変形例:
B−6−1.第1の変形例:
B−6−2.第2の変形例:
C.第2実施例:
C−1.第2実施例の画像印刷処理:
C−2.第2実施例の個数データ生成処理:
C−2−1.ディザ法を用いた大中小ドットの形成個数の決定処理:
C−2−2.大中小ドットの形成個数のコード化処理:
C−2−3.変換テーブルを利用した第2実施例の個数データ生成処理:
C−3.第2実施例の画素位置決定処理:
A.実施例の概要 :
実施例についての詳細な説明に入る前に、図1を参照しながら、各種実施例の概要について説明しておく。図1は、印刷システムを例にとって、実施例の概要を説明するための説明図である。図示した印刷システムは、画像処理装置としてのコンピュータ10と、画像出力装置としてのプリンタ20等から構成されており、コンピュータ10に所定のプログラムがロードされて実行されると、コンピュータ10およびプリンタ20などが全体として、一体の画像出力システムとして機能する。プリンタ20は、印刷媒体上にドットを形成することによって画像を印刷する。コンピュータ10は、印刷しようとする画像の画像データに所定の画像処理を施すことによって、プリンタ20が画素毎にドットの形成を制御するためのデータを生成して、該プリンタ20に供給する。
一般的な印刷システムでは、次のようにして画像を印刷する。先ず、コンピュータで所定の画像処理を施すことにより、画像データを、画素毎にドット形成の有無を表すデータに変換する。次いで、得られたデータをプリンタに供給し、プリンタでは供給されたデータに従ってドットを形成することによって画像を印刷している。ここで、印刷しようとする画像の画素数が多くなると、それに伴って、画像処理に要する時間が増加して、画像を迅速に印刷することが困難となる。また、画素数が多くなるにつれて、画素毎にドット形成の有無を表すデータのデータ量が増加するので、コンピュータからプリンタにデータを出力するために要する時間が長くなり、それだけ印刷に要する時間が増加してしまう。
こうした点に鑑みて、図1に例示した印刷システムでは、次のようにして画像を印刷する。先ず、コンピュータ10では、画像を構成する画素を互いに隣接した複数個ずつまとめて画素群とする。そして、各画素群について、画素群内に形成するドット個数を表す個数データを生成してプリンタ20に供給する。プリンタ20の画素位置決定モジュールは、各画素群についての個数データを受け取ると、画素群内の各画素についてドットを形成する序列を特定し、個数データと該序列とに基づいて、ドットを形成する画素位置を決定する。このとき、ドットを形成する画素の序列を予め記憶しておくこととすれば、画素位置を迅速に決定することができる。このようにして決定された画素位置に、ドット形成モジュールがドットを形成することによって画像が印刷される。
ここで、画素毎にドット形成の有無を表すデータに比べれば、画素群毎の個数データは遙かに小さなデータ量とすることができる。従って、コンピュータ10から画素毎にドット形成の有無を表したデータをプリンタ20に供給する代わりに、画素毎の個数データを供給してやれば、極めて迅速にデータを転送することが可能となる。
また、画素群の個数データは、コンピュータ10内で次のようにして生成する。先ず、画素群階調値決定モジュールにおいて、画像から生成された複数の画素群について画素群階調値を決定する。画素群階調値とは、画素群を代表する階調値であり、該画素群内に含まれる各画素の画像データに基づいて決定することができる。そして、個数データ供給モジュールでは、画素群階調値と個数データとの対応関係に基づいて、画素群毎に個数データを決定した後、得られた個数データをプリンタ20に供給する。誤差拡散モジュールは、個数データを決定したことによって各画素群に生じた階調誤差を、未だ個数データを決定していない未処理の画素群に拡散する。画素群階調値決定モジュールは、こうして周辺の画素群から拡散されてきた階調誤差を考慮しながら、各画素群についての画素群階調値を決定する。
画素群階調値と個数データとの対応関係に基づいて個数データを決定すれば、迅速に決定することができる。このため、図1に例示した印刷システムでは、個数データをプリンタ20に迅速に供給可能なことと相まって、迅速に生成した個数データを、迅速にプリンタ20に供給することができるので、画像を迅速に印刷することが可能となる。
尚、個数データを生成するに際しては、画素群に付与された分類番号および画素群階調値の組合せと、該組合せを有する画素群の個数データとが対応付けられたテーブル(個数データ生成テーブル)を予め記憶しておき、このテーブルを参照することによって個数データを生成することとしても良い。画素群階調値と分類番号との組合せ毎に、個数データを対応付けておけば、より適切な個数データを迅速に生成することができる。ここで画素群の分類番号は、各画素群を画像中での位置に応じて複数種類の分類することによって設定することもできるし、また、画像がいつも同じように分割される場合などには、各画素群に予め適切な分類番号を付与しておくこともできる。更に、簡便には、乱数などを用いてランダムに分類番号を付与することも可能である。
また、個数データは、対応関係に基づいて、あるいは個数データ生成テーブルを参照して生成することから、極めて簡素な処理で生成することが可能である。このため、個数データを生成するためにコンピュータ10のような高度な処理能力を有する機器を用いずとも、プリンタ20あるいはデジタルカメラなどの内部で個数データを生成することも可能となる。
加えて、各画素群で生じた誤差を、周辺の画素群に拡散して個数データの生成に反映させているので、画素群単位で発生する誤差を解消することができ、延いては高画質な画像を印刷することができる。更に、詳細には後述するが、個数データ生成テーブルを参照しながら個数データを生成した場合には、同じ画素群階調値を有する画素群に対しても異なる階調誤差が生じることとなる。このため、誤差を拡散させることでドットの発生に一定のパターンが生じてしまうことを確実に回避することができるので、常に安定した画質で画像を印刷することも可能となる。以下では、こうした印刷システムを例にとって、本発明の各種実施例について詳細に説明する。
B.第1実施例 :
B−1.装置構成 :
図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は、キャリッジモータ230を駆動することによって、各色のインク吐出用ヘッド244ないし247を印刷用紙Pに対して主走査方向に移動させ、また紙送りモータ235を駆動することによって、印刷用紙Pを副走査方向に移動させる。制御回路260は、キャリッジ240の主走査および副走査の動きに同期させながら、適切なタイミングでノズルを駆動してインク滴を吐出することによって、カラープリンタ200は印刷用紙上にカラー画像を印刷している。
尚、カラープリンタ200にも、制御回路260内にはCPU,RAM,ROMなどが搭載されていることから、コンピュータ100が行う処理をカラープリンタ200内で実施することも可能である。このような場合は、デジタルカメラ120などで撮影した画像の画像データをカラープリンタ200に直接供給して、制御回路260内で必要な画像処理を実施することにより、カラープリンタ200から直接画像を印刷することも可能となる。
B−2.第1実施例の画像印刷処理の概要 :
以下では、上記のようなコンピュータ100およびカラープリンタ200が、画像を印刷するために、それぞれの内部で行われる画像処理(画像印刷処理)について説明する。ここでは、理解の便宜を図るため、初めに画像印刷処理の全体像について簡単に説明し、次に、こうした画像印刷処理が可能である原理について説明する。そして最後に、それぞれの処理の詳細な内容について説明する。
尚、以下では、画像印刷処理の前半部分はコンピュータ100で実施され、後半部分はカラープリンタ200で実施されるものとして説明するが、コンピュータ100が行う処理をカラープリンタ200の内部で実施したり、あるいはデジタルカメラ120など、画像データを生成する機器の内部で実施することも可能である。すなわち、本実施例の画像印刷処理によれば、後ほど詳細に説明するように、前半部分の処理をたいへん簡素なものとすることができるので、高い処理能力を有していないCPUを用いた場合でも迅速に実施することが可能である。
図5は、第1実施例の画像印刷処理の全体的な流れを示すフローチャートである。以下では、図5を参照しながら、画像印刷処理の全体像について簡単に説明する。第1実施例の画像印刷処理を開始すると、先ず初めに、コンピュータ100が画像データの読み込みを開始する(ステップS100)。ここでは、画像データはRGBカラー画像データであるものとして説明するが、カラー画像データに限らず、モノクロ画像データについても同様に適用することができる。また、カラープリンタに限らず単色プリンタについても同様に適用することが可能である。
カラー画像データの読み込みに続いて、色変換処理を行う(ステップS102)。色変換処理とは、R,G,Bの階調値の組合せによって表現されているRGBカラー画像データを、印刷のために使用されるインク各色についての階調値の組合せによって表現された画像データに変換する処理である。前述したように、カラープリンタ200はC,M,Y,Kの4色のインクを用いて画像を印刷している。そこで、第1実施例の色変換処理では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つ画像を複数の画素群に分割する。そして、それぞれの画素群の中で形成すべきドットの個数を表すデータ、すなわち個数データを画素群毎に決定する。一般に、ある画素にドットが形成されるか否かは、その画素の画像データに依存して決まるから、画素群内に形成されるドットの個数を表す個数データについても、画素群についての画像データに基づいて決定することができる。次いで、各画素群について決定した個数データを、カラープリンタ200に向かって出力する。また、画像データを個数データに変換することで、その画素群については何がしかの階調誤差が発生する。そこで、個数データ生成処理では、この階調誤差を周辺の画素群に拡散させておき、周辺の画素群についての処理を行う際には、拡散されてきた誤差が解消されるように考慮しながら個数データを生成する。個数データ生成処理では、このようにして、各画素についての画像データに基づいて個数データを画素群毎に生成した後、カラープリンタ200に供給する処理を行う。個数データ生成処理の詳細については後述する。
カラープリンタ200の制御回路260に内蔵されたCPUは、コンピュータ100から供給された個数データを受け取ると、画素位置決定処理を開始する(ステップS108)。詳細な処理内容については後述するが、画素位置決定処理では大まかには次のような処理を行う。上述したように、コンピュータ100から供給される個数データは、画素群に形成すべきドットの個数を表すデータであり、その個数のドットを画素群内のいずれの画素に形成するかについては未確定な状態となっている。そこで、画像を印刷するに際しては、画素群内で実際にドットを形成する画素位置を、供給された個数データから確定しておく必要がある。画素位置決定処理では、画素群内の各画素についてドットの形成され易さを示す序列、換言すれば、画素群内の複数の画素の中でドットが形成される順序を示す画素の序列を記憶しておき、この序列を参照しながら、ドットを形成する画素位置を個数データに基づいて決定する処理を行う。画素位置決定処理の詳細についても後述する。
以上のようにして、ドットを形成すべき画素位置を決定したら、決定した画素位置にドットを形成する処理を行う(ステップS110)。すなわち、図3を用いて説明したように、キャリッジ240の主走査および副走査を繰り返しながらインク吐出用ヘッドを駆動してインク滴を吐出することにより、印刷用紙上にインクのドットを形成する。こうしてドットを形成することにより、画像データに対応した画像が印刷されることになる。
このように、第1実施例の画像印刷処理では、コンピュータ100からカラープリンタ200に向かって、画素群に形成すべきドット個数のデータのみを供給しており、画素群内でドットが形成される画素位置についてのデータまでは供給していない。画像を構成する画素毎にドット形成の有無を表現することに比べれば、複数の画素をまとめた画素群に形成するドットの個数は遙かに少ないデータ量で表現することができることから、このような方法を採用することで、コンピュータ100からカラープリンタ200に向かって極めて迅速にデータを供給することが可能となる。
例えば、1つの画素群に8つの画素がまとめられており、形成可能なドットは1種類であるとする。この場合、各画素はドットが形成されるか否かのいずれかの状態しか取り得ないから、画素あたり1ビットのデータ長となる。画素群に含まれる全画素について、ドットが形成される画素位置まで含めて表現しようとすると、8ビットのデータ長となる。一方、画素群内に形成されるドットの個数は、0個〜8個のいずれかの9通りしか取り得ない。9通りであれば4ビットあれば表現することができるから、画素群に形成するドットの個数は4ビットのデータ長で表現可能となる。このように、画素毎にドット形成の有無を表すデータに比べて、画素群内に形成されるドット個数は遙かに少ないデータ量で表現することができるので、コンピュータ100からカラープリンタ200に向かって極めて迅速にデータを供給することが可能となるのである。
加えて、詳細には後述するが、ドットを形成する画素位置を適切に決定してやれば、ドット個数のデータのみを供給した場合でも、画質が悪化することはない。また、画素群で生じた階調誤差を周辺の画素群に拡散しておき、周辺の画素群についての個数データを生成する際には、拡散されてきた誤差を解消するように個数データを生成しているので、誤差が速やかに解消される。このため、高画質の画像を得ることができる。更に、個数データは個数データ生成テーブルを参照することによって生成されることから、例え、同じ画素群階調値を有する画素群であっても、同じ個数データが生成されるわけではない。換言すれば、画素群に生じる誤差が常に複雑に変化することになる。このため、ドットが一定の繰り返しパターンで発生するおそれを確実に回避することが可能である。この点については、後ほど詳しく説明する。
その上、後述するアルゴリズムを用いれば、個数データを生成する処理は極めて簡素な処理によって実現することができ、しかも極めて迅速に実行することが可能である。このため、処理能力が比較的小さい画像処理装置を用いた場合でも、十分に実用的な速さで個数データを生成することが可能となる。
B−3.個数データから画素位置を決定可能な原理 :
以下では、上述した方法を採用した場合、すなわち、コンピュータ100からは画素群に形成するドット個数のデータを供給し、このドット個数のデータから実際にドットを形成する画素位置をカラープリンタ200側で決定した場合でも、画質を悪化させることなく画像を印刷することが可能な原理について説明する。
説明の都合上、先ず初めに、ディザ法について説明する。ディザ法とは、画像データを画素毎にドット形成の有無を表すデータに変換するために用いられる代表的な手法である。この手法では、ディザマトリックスと呼ばれるマトリックスに閾値を設定しておき、画像データの階調値とディザマトリックスに設定されている閾値とを画素毎に比較して、画像データの階調値の方が大きい画素についてはドットを形成すると判断し、そうでない画素についてはドットを形成しないと判断する。このような判断を画像中の全画素について行えば、画像データを画素毎にドット形成の有無を表すデータに変換することができる。
図6は、ディザマトリックスの一部を概念的に例示した説明図である。図示したマトリックスには、横方向(主走査方向)に128画素、縦方向(副走査方向)に64画素、合計8192個の画素に、階調値1〜255の範囲から万遍なく選択された閾値がランダムに記憶されている。ここで、閾値の階調値が1〜255の範囲から選択されているのは、本実施例では、画像データが階調値0〜255の値を取り得る1バイトデータとしていることに加えて、画像データの階調値と閾値とが等しい場合には、その画素にはドットを形成するものと判断していることによるものである。
すなわち、ドットが形成されるのは画像データの階調値が閾値よりも大きい画素に限る(すなわち階調値と閾値が等しい画素にはドットは形成しない)とした場合、画像データの取り得る最大階調値と同じ値の閾値を有する画素には、決してドットが形成されることはない。このようにドットが形成されることのない画素が生じないようにするためには、画像データの階調値が閾値より大きい画素にだけドットを形成するとした場合は、閾値の取り得る範囲を、画像データの取り得る範囲から最大階調値を除いた範囲としておけばよい。逆に、画像データの階調値と閾値が等しい画素にもドットを形成するとした場合、画像データの取り得る最小階調値と閾値の値が同じ画素には、常にドットが形成されてしまうことになる。このように常にドットが形成されてしまう画素が生じないようにするためには、画像データの階調値が閾値と同じ画素にもドットを形成するとした場合は、閾値の取り得る範囲を、画像データの取り得る範囲から最小階調値を除いた範囲としておけばよい。本実施例では、画像データの取り得る階調値が0〜255であり、画像データと閾値が等しい画素にはドットを形成するとしていることから、閾値の取り得る範囲を1〜255としておくのである。尚、ディザマトリックスの大きさは、図6に例示したような大きさに限られるものではなく、縦と横の画素数が同じマトリックスも含めて種々の大きさとすることができる。
図7は、ディザマトリックスを参照しながら、各画素についてのドット形成の有無を判断している様子を概念的に示した説明図である。ドット形成の有無を判断するに際しては、先ず、判断しようとする画素を選択し、この画素についての画像データの階調値と、ディザマトリックス中で対応する位置に記憶されている閾値と比較する。図7中に示した細い破線の矢印は、画像データの階調値と、ディザマトリックスに記憶されている閾値とを、画素毎に比較していることを模式的に表したものである。例えば、画像データの左上隅の画素については、画像データの階調値は97であり、ディザマトリックスの閾値は1であるから、この画素にはドットを形成すると判断する。図7中に実線で示した矢印は、この画素にはドットを形成すると判断して、判断結果をメモリに書き込んでいる様子を模式的に表したものである。一方、この画素の右隣の画素については、画像データの階調値は97、ディザマトリックスの閾値は177であり、閾値の方が大きいので、この画素についてはドットを形成しないと判断する。ディザ法では、こうしてディザマトリックスを参照しながら、画素毎にドットを形成するか否かを判断することで、画像データを画素毎にドット形成の有無を表すデータに変換する。
図8は、ディザ法を用いて画像データをドット形成の有無を表すデータに変換している様子を示した説明図である。図8(a)は、画像データの一部を拡大して示したものであり、図中の小さな矩形は画素を、そして、それぞれの矩形の中に表示された数値は画像データの階調値を表している。図示されているように、画像データは、隣接する画素間では近似する(若しくは同一の)階調値が割り当てられる傾向がある。高画質化の要請から近年では画像データの解像度は高くなる傾向にあるが、隣接する画素間で近似若しくは同一の階調値が割り当てられる傾向は、画像データの解像度が高くなるほど顕著となっている。
図8(b)は、ディザマトリックスの対応する位置に閾値が設定されている様子を示している。図8(a)に示した画像データの階調値と、図8(b)に示したディザマトリックスの閾値とを画素毎に比較することによって、ドット形成の有無を判断する。図8(c)は、こうして画素毎にドット形成の有無を判断した結果を示しており、図中で斜線を付した画素がドットを形成すると判断された画素である。
ここで、隣接する画素を所定数ずつ画素群としてまとめ、画素群内でドットを形成すると判断された画素の個数を数えることを考える。一例として、主走査方向(図8中では横方向)に4画素分、副走査方向(図8中では縦方向)に2画素分の、合計8画素ずつを画素群としてまとめるものとする。図8(d)は、こうしてまとめられたそれぞれの画素群について、ドットを形成すると判断された画素を数えることによって得られたドット個数を示している。第1実施例の画像印刷処理において、コンピュータ100からカラープリンタ200に供給されるのは、このような画素群毎の個数を示すデータである。個数データには、ドットを形成する画素位置に関する情報は含まれていないが、次のようにすれば、個数データからドットを形成する画素位置の情報を復元して、画素毎にドット形成の有無を表すデータを生成することができる。
図9は、個数のデータから、画素毎にドット形成の有無を表すデータを生成する様子を示した説明図である。図9(a)は、図8で画素群毎に形成するドットの個数を数えて得られた値を表している。また、図9(b)は、図8で画素毎にドット形成の有無を判断するために参照したディザマトリックスを示している。前述したようにディザ法では、画像データの階調値と、ディザマトリックスの対応する画素位置に設定された閾値とを比較して、画像データの階調値の方が大きければ、その画素にはドットを形成すると判断しており、ディザマトリックスの閾値が小さくなるほどドットが形成され易くなる。このことから、ディザマトリックスはドットが形成される画素の序列を表していると考えることができる。
ディザマトリックスの有するこうした性質に着目すれば、画素群内に形成されるドットの個数から、ドットが形成される画素位置を決定することができる。例えば、図9(a)に示した一番左上隅の画素群について説明すると、この画素群に形成されるドット個数は3である。また、図9(b)に示したディザマトリックスを参照すれば、この画素群内では、左上隅にある画素位置すなわち閾値「1」が設定されている画素位置が最もドットが形成され易い画素であると言える。従って、この画素群内で3つ形成されるドットの中の1つは、左上隅の画素に形成されているものと考えることができる。同様にして、残りの2つのドットは、この画素群内で2番目にドットが形成され易い画素(すなわち図9(b)のディザマトリックスで閾値「42」が設定されている画素)と、3番目にドットが形成され易い画素(すなわち閾値「58」が設定されている画素)とに形成されるものと考えることができる。
もちろん、ドット形成の有無は、ディザマトリックスに設定された閾値だけでなく、画像データの階調値によっても影響されるから、画像データの階調値が極端に大きければ、より小さな閾値が設定されている画素よりも先にドットが形成されることも起こり得る。しかし、前述したように画像データには、隣接する画素には近似する(若しくは同一の)階調値が割り当てられる傾向があるから、ほとんどの場合はドットが形成され易い画素(すなわちディザマトリックスに設定された閾値の小さな画素)からドットが形成されると考えることができる。
図9(a)に示した他の画素群についても、同様にして、ドット個数とディザマトリックスの閾値とに基づいて、ドットを形成する画素位置を決定することができる。例えば、図9(a)の上述した画素群の下にある画素群(左端上から2番目の画素群)については、ドット個数は3個であるから、図9(b)のディザマトリックスを参照すれば、これら3つのドットは、閾値「22」が設定された画素と、閾値「33」が設定された画素と、閾値「91」が設定された画素とに、それぞれ形成されると考えることができる。
図9(a)に示した4つの画素群について、このようにして個数データからドットを形成する画素位置を決定すると、図9(c)に示した結果を得ることができる。図9(c)中で、斜線を付して示した画素はドットを形成すると判断された画素である。図9(c)と図8(c)とを比較すれば明らかなように、個数データから決定した画素位置は、画素毎に決定した画素位置と一致している。このことは、ディザマトリックスを参照して画素毎にドット形成の有無を判断し、画素群内に形成されるドットの個数のみを記憶しておけば、画素位置までは記憶していなくても、ディザマトリックスとドット個数とから、ドットが形成される画素位置を適切に決定可能なことを示している。本実施例の画像印刷処理では、このような原理に基づいて個数データからドットを形成する画素位置を決定して画像を印刷する。すなわち、コンピュータ100から画素群毎に個数データを生成し、カラープリンタ200側で個数データからドットを形成する画素位置を適切に決定することで、高画質な画像の印刷を可能としている。
また、個数データからドットを形成する画素位置を適切に決定するためには、画像データの階調値が画素群内で大きく異なっていなければ良い。前述したように、画像データは隣接する画素間では近似した階調値を有する特性があるから、こうした条件はほとんどの場合に成立するので、個数データのみをカラープリンタ200に供給した場合でも、画質を悪化させることなく画像を印刷することができる。加えて、後述するように、本実施例の個数データ生成処理では、個数データを生成することによって生じた階調誤差を周辺の画素群に拡散しておき、周辺の画素群で個数データを生成するに際しては、拡散されてきた誤差が解消されるように個数データを生成する。このため、画素群で生じた誤差を速やかに解消することが可能となり、印刷画質を大きく改善することが可能となっている。
尚、図7で説明したディザ法においては、ディザマトリックスに設定された閾値と画像データとの階調値とを比較して、いずれの値が大きいかによってドット形成の有無を判断している。これに対して、個数データから画素群内でドットが形成される画素位置を決定する場合には、図9を用いて説明したように、ドットが形成される画素位置を、ディザマトリックスに設定された閾値の小さな画素から順番に決定している。すなわち、画素位置を決定するためには、閾値の値まで必要なわけではなく、画素群内でドットが形成され易い順番が分かっていれば良い。このことから、図9(b)に示すディザマトリックスの代わりに、図9(d)に示すような画素群内の各画素について、ドットが形成される順序を示す値(順序値)が設定されたマトリックス(本明細書中では、このようなマトリックスを序列マトリックスと呼ぶものとする)を記憶しておき、画素群毎に序列マトリックスを参照しながら、個数データから画素位置を決定することも可能である。
B−4.第1実施例の個数データ生成処理 :
以下では、図5に示した第1実施例の画像印刷処理において、画像データから個数データを生成する処理(ステップS106)について説明する。図10は、第1実施例の個数データ生成処理の流れを示すフローチャートである。ここでは、個数データ生成処理はコンピュータ100で実施されるものとして説明するが、後述するように、個数データ生成処理は極めて簡素な処理とすることができるから、カラープリンタ200あるいはデジタルカメラ120内で実施することも可能である。以下、フローチャートに従って説明する。
第1実施例の個数データ生成処理を開始すると、先ず初めに、互いに隣接する所定個数の画素をまとめて画素群を生成する(ステップS200)。ここでは、主走査方向に4画素分、副走査方向に2画素分の合計8つの画素を画素群にまとめるものとする。尚、画素群としてまとめる画素は、このように矩形状に縦横の位置が揃った画素である必要はなく、互いに隣接し且つ所定の位置関係にあればどのような画素を画素群としてまとめても良い。
次いで、画素群の分類番号を決定する(ステップS202)。詳細には後述するが、画素群は、画像中で存在する位置に応じて複数種類に分類され、分類番号が付与される。この分類番号は、後述する方法を用いれば、極めて簡便に決定することができる。
続いて、その画素群に拡散されている拡散誤差ERdfを読み出す(ステップS204)。拡散誤差ERdfとは、周辺の画素群で個数データを生成することで生じた階調誤差ERが拡散されて蓄積されている誤差である。個数データを生成することで生じる階調誤差ERの内容、および階調誤差ERを拡散させる処理については後述する。
処理中の画素群に拡散されている拡散誤差ERdfを読み出したら、今度は、その画素群の画素群階調値DTrpを算出する(ステップS206)。画素群階調値DTdfとは、画素群を代表する階調値であって、画素群としてまとめられた各画素の画像データDTpxと、その画素群の拡散誤差ERdfとから、次のようにして算出される階調値である。
図11は、画素群階調値DTrpの算出方法を示した説明図である。図中で、DTpxは画素群を構成する画素の画像データを示している。図11に示すように、画素群を構成する各画素の画像データDTpx(i) (i=1〜n、ここでnは、画素群を構成する画素の個数)の合計値を、画素の個数nで除算することで平均値を算出し、得られた平均値に、後述する拡散誤差ERdfを加算して、得られた値を画素群階調値DTrpとすることができる。また、本実施例のように画素群が8つの画素で構成されている場合は、各画素の画像データの総和を求めて、得られた2進数データを3ビット分だけ右方向にシフトさせれば、画素群内の各画素についての画像データの平均値を得ることができる。2進数データを3ビット分だけ右方向にシフトさせることは、8で除算することに相当している。こうして得られた平均値に拡散誤差ERdfを加算して、画素群階調値DTrpを求めてもよい。図10のステップS206では、以上のようにして、画素群についての画素群階調値DTrpを算出する。
次いで、ステップS202およびステップS206でそれぞれ求めた分類番号および画素群階調値に基づいて、後述する個数データ生成テーブルを参照することによって、その画素群についての個数データを決定する(ステップS208)。詳細には後述するが、個数データ生成テーブルには、画素群の分類番号と画素群階調値DTrpとの組合せに対応付けて、適切な個数データが予め記憶されている。従って、画素群の分類番号と画素群階調値とを決定すれば、個数データ生成テーブルを参照することで直ちに個数データを求めることが可能である。この点についても、後ほど詳しく説明する。
以上のようにして、1つの画素群について個数データを決定したら、その画素群で生じた階調誤差ERを求めて、周辺の画素群に拡散する処理を行う(ステップS210)。画素群で生じる階調誤差ERの内容については後ほど詳しく説明するが、ここでは、画素群階調値DTrpを個数データに変換することに伴って、その画素群に生じる変換誤差であると考えておく。ステップS210では、画素群で生じた階調誤差ERを算出して、その画素群の周辺にあって未だ個数データを生成していない画素群に、階調誤差ERを拡散する処理を行う。階調誤差ERの算出方法および拡散方法については、階調誤差ERの説明と併せて後ほど詳しく説明する。
こうして、1つの画素群について個数データを生成し、それに伴って生じた階調誤差ERを拡散したら、こうした処理を画像中の全画素について行ったか否かを判断する(ステップS212)。そして、未処理の画素が残っている場合は(ステップS212:no)、ステップS200に戻って新たな画素群を生成し、続く一連の処理を繰り返す。こうした操作を繰り返し、全画素についての処理が終了したと判断されたら(ステップS212:yes)、各画素群について得られた個数データをカラープリンタ200に出力して(ステップS214)、図10に示す第1実施例の個数データ生成処理を終了する。
以下では、画素群の分類番号を決定する方法(図10のステップS202の処理内容)について説明し、次いで、分類番号および画素群階調値から個数データを生成する方法(図10のステップS208の処理内容)について説明する。そして最後に、個数データを生成することで生じる階調誤差ERの求め方および階調誤差を拡散させる方法(図10のステップS210の処理内容)について説明する。
B−4−1.分類番号の決定方法 :
先ず初めに、上述の個数データ生成処理中で、画素群の分類番号を決定する方法について説明する。理解の便宜から、以下では、画素群に分類番号を付与する考え方を説明し、それを踏まえて、分類番号を付与する具体的な方法について説明する。
図12は、画素群毎の分類番号を決定するための考え方を示した説明図である。図12(a)は、画像の一番左上隅の箇所において、横方向に4画素、縦方向に2画素の合計8画素をまとめることによって画素群を1つ生成した様子を概念的に示したものである。
図6および図7を用いて前述したように、ディザ法では画素に割り当てられた画像データの階調値と、ディザマトリックスの対応する位置に設定されている閾値とを比較して、画素毎にドット形成の有無を判断している。一方、本実施例では、隣接する所定数の画素を画素群としてまとめているから、ディザマトリックスに設定されている閾値についても、画素群に対応する所定数ずつまとめてブロックを生成することにする。図12(b)は、図6に示したディザマトリックスに設定されている閾値を、横方向に4つ、縦方向に2つずつまとめて複数のブロックを生成した様子を示している。図6に示したディザマトリックスは、横方向(主走査方向)に128画素分、縦方向(副走査方向)に64画素分の合計8192画素分の閾値が設定されているから、これら閾値を横方向に4つ、縦方向に2つずつブロックにまとめれば、ディザマトリックスは縦横それぞれ32個ずつ、合計1024個のブロックに分割されることになる。
今、図12(b)に示すように、これらブロックに1番〜1024番までの通し番号を付しておく。そして、画像データにディザマトリックスを適用した時に、各画素群の位置に適用されるブロックの通し番号によって、画素群を分類してやる。例えば、図12(c)に示したように、画像の一番左上隅にある画素群には、図12(b)中の通し番号1番のブロックが適用されるから、この画素群は分類番号1番の画素群に分類するのである。
以上が、画素群を分類する際の基本的な考え方である。図10のステップS202では、このように、画像データにディザマトリックスを適用したときに、画素群に適用されるブロックの通し番号によって各画素群を分類し、対応する分類番号を決定して画素群に付与する処理を行う。
次に、画素群の分類番号を決定するための具体的な方法について説明する。図13は、画素群の分類番号を決定する方法を示した説明図である。図13(a)は、画像中で生成された1つの画素群を表している。ここでは、この画素群に着目して分類番号を決定する方法について説明する。尚、以下では、分類番号を決定するために着目している画素群を、着目画素群と呼ぶことにする。
今、画像の一番左上隅にある画素を原点に取って、原点からの主走査方向および副走査方向への画素数によって画素位置を表すものとする。また、画素群の位置は、画素群の左上隅にある画素の画素位置によって表すものとする。図13(a)では、着目画素群の位置を示す画素に黒丸を付して表示している。この画素の画素位置が(X,Y)であったとする。すると、各画素群の大きさは、主走査方向に4画素、副走査方向に2画素としているから、
X=4n+1、 Y=2m+1
となるようなn、m(ここで、n,mは0以上の正整数)が存在する。換言すれば、着目画素群の左側にはn個の画素群が並んでおり、着目画素群の上側にはm個の画素群が並んでいることになる。
ここで、前述したように画素群は、画像データにディザマトリックスを適用したときに、着目画素群に適用されるブロックの通し番号に基づいて分類することとしているから(図12参照のこと)、ディザマトリックスを移動させながら画像データに適用する方法によって、同じ画素群でも異なった分類番号に分類されることになる。実際には、ディザマトリックスを移動させながら画像データに適用する方法はどのような方法でも構わないが、ここでは説明の便宜から、最も単純な方法すなわちディザマトリックスを横方向に移動させるものとして説明する。図13(b)には、ディザマトリックスを横方向に少しずつ移動させながら、繰り返し画像データに適用している様子が概念的に示されている。
図13(c)は、図13(b)に示すようにディザマトリックスを繰り返して用いながら、図13(a)に示した着目画素群にディザマトリックスを適用している様子を概念的に表している。このようにディザマトリックスを移動させていくと、ディザマトリックス中のいずれかのブロックが、着目画素群に適用されることになる。ここでは、着目画素群には、ディザマトリックス中でM行N列目のブロックが適用されたものとする。すると、図13(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の計算結果に対して小数点以下の数値を切り捨てることによって得られた整数値を表している。このように、着目画素群の位置が分かれば、図13(d)に表示した上述の関係式から数値MおよびNを求めて、ディザマトリックス中でM行N列目にあるブロックのブロック番号を、その着目画素群の分類番号としてやればよい。もっとも実際には、M,Nの値は、図13(d)に示すような計算を実行せずとも、極めて簡便に求めることができる。以下、この点について説明する。
図14は、着目画素群の分類番号を決定する方法を具体的に示した説明図である。着目画素群の位置を(X,Y)として、X,Yが10ビットで表現されているものとする。図14(a)は、数値Xを表す10ビットの2進数データを概念的に示している。図では、各ビットを識別するために、最上位ビットから最下位ビットに向かって1番から10番までの通し番号を付して表示している。
図13を用いて前述したように、着目画素群の左側にある画素群の個数nは、数値Xから1を減算して4で除算すれば得ることができる。ここで、4での除算は、2ビット分だけ右方向にシフトさせることで実施することができるから、数値Xから1を減算して、得られた2進数データを右方向に2ビット分だけビットシフトさせればよい。更に、数値Xは任意の値を取るのではなく、4n+1の形式で表現可能な数値しか取り得ないから、1を減算せずに、単に2進数データを右方向に2ビット分だけビットシフトさせるだけで、画素群の個数nを得ることができる。図14(b)は、こうして数値Xをビットシフトして得られた個数nの2進数データを概念的に表している。
次いで、int(n/32)を算出する。すなわち、個数nを32で除算して、小数点以下の数値を切り捨てる操作を行う。32による除算は、2進数データを右方向に5ビット分だけビットシフトさせることで実行可能であり、また、データを整数形式で扱っていれば、小数点以下の数値は自動的に切り捨てられてしまう。結局、int(n/32)の2進数データは、個数nの2進数データを、単に右方向に5ビット分だけビットシフトさせることで得ることができる。図14(c)は、個数nをビットシフトして得られたint(n/32)の2進数データを概念的に表している。
こうして得られたint(n/32)に32を乗算する。32による乗算は、2進数データを5ビット分だけ左方向にビットシフトすることで実施することができる。図14(d)は、個数nをビットシフトして得られたint(n/32)×32の2進数データを概念的に表している。
次いで、個数nからint(n/32)×32を減算すれば、前述の数値Nを得ることができる。個数nの2進数データ(図14(b)参照)とint(n/32)×32の2進数データ(図14(d)参照)とを比較すれば明らかなように、これら2進数データは、上位の5ビットは共通しており、減算する側の数値の下位5ビットは全て「0」となっている。従って、減算される側の数値(個数n)の下位5ビットをそのまま抜き出せば、求める数値Mを得ることができる。すなわち、図14(b)に示した2進数データに対して、図14(f)に示すようなマスクデータを作用させるだけで、極めて簡便に数値Nを得ることが可能である。あるいは、図14(a)に示した着目画素群の位置を示す数値Xの2進数データに、図14(g)のようなマスクデータを作用させて、4番目〜8番目のビットデータを直接抜き出すことによっても、数値Nを得ることができる。
図14では、着目画素群の位置を示す座標値(X,Y)の数値Xから、ディザマトリックス中でのブロック位置を示す数値Nを求める場合について説明したが、全く同様にして、ブロック位置を示す数値Mも数値Yから求めることができる。結局、着目画素群の位置が分かれば、2進数データから特定のビット位置のデータを抜き出すだけで、着目画素群がディザマトリックス中で何行何列目のブロックに対応するかを知ることができ、このブロックの通し番号によって、着目画素群の分類番号を迅速に決定することが可能なのである。
B−4−2.個数データ生成テーブル :
次いで、第1実施例の個数データ生成処理中で、画素群の分類番号と画素群階調値DTrpとから、個数データ生成テーブルを参照することによって個数データを取得する処理(図10のステップS208)について説明する。
図15は、画素群の分類番号と画素群階調値DTrpとから個数データを取得するために参照される個数データ生成テーブルを概念的に示した説明図である。図示されているように、個数データ生成テーブルには、画素群の分類番号と画素群階調値との組合せに対応付けて、適切な個数データが予め記憶されている。図12を用いて前述したように、ここでは画素群は分類番号1番〜1024番のいずれかに分類され、また、画素群階調値は1バイトデータであるとすれば、0〜255のいずれかの階調値を取り得るから、分類番号と画素群階調値との組合せは、1024×256=262144の組合せが存在する。個数データ生成テーブルには、この全ての組合せに対して個数データが設定されており、この個数データは次のようにして決定されている。
図16は、画素群の分類番号と画素群階調値DTrpとの組合せに応じて、適切な個数データを決定する様子を概念的に示した説明図である。一例として、画素群の分類番号が1番であるとする。分類番号1番の画素群には、ディザマトリックス中で通し番号1番のブロックが適用される。図16(a)には、通し番号1番のブロックに設定されている閾値が示されている。
今、画素群階調値が0であるとする。画素群階調値とは画素群を代表する階調値であるから、画素群中の全画素が階調値0の画像データを有するものと考える。そして、各画素の階調値(すなわち「0」)と図16(a)に示した閾値とを比較し、階調値の方が大きい(若しくは同じ)画素については、ドットを形成するものと判断する。画素群の全画素についてこうした判断を行った後、ドットの個数を数えて、得られた値を個数データとする。図16(a)に示したいずれの閾値も、階調値0よりは大きいから、ドットを形成すると判断される画素は存在しない。そこで、分類番号が1番で画素群階調値が0の組合せについては、個数データ0を設定する。図16(b)は、画素群階調値が0の場合の個数データを決定している様子を概念的に表している。この場合は、画素群内のいずれの画素にもドットは形成されず、従って、個数データは0となる。
図16(c)は、画素群階調値が1の場合に個数データを決定する様子を概念的に示している。この場合は、画素群内の全画素が階調値1の画像データを有するものとして、各画素の階調値を図16(a)に示した閾値と比較する。その結果、画素群内で左上隅にある画素では、画像データの階調値と閾値とが等しくなってドットを形成すると判断され、他の画素についてはドットを形成しないと判断される。図16(c)に表示された斜線の付された丸印は、その画素にドットを形成すると判断されたことを表している。この結果、分類番号が1番で画素群階調値が1の組合せについては、個数データ1が設定される。
こうした操作を、0〜255までの全ての画素群階調値について行うことにより、個数データを決定していく。例えば、画素群階調値が2の場合は、図16(d)に示したように、個数データは1となり、画素群階調値が100の場合は、図16(e)に示すように個数データは3となる。図16(f)および図16(g)には、画素群階調値が200の場合および画素群階調値が255の場合に、それぞれの個数データを決定する様子が概念的に示されている。図15中で、分類番号1に該当する行(表中に示された横方向の欄)の部分に、各画素群階調値に対応付けて設定されている個数データは、このようにして決定された個数データである。こうした操作を、1番〜1024番までの全ての分類番号について行えば、最終的に、全ての分類番号と全ての画素群階調値とのあらゆる組合せに対応する個数データを決定することができる。図15に示した個数データ生成テーブルには、分類番号と画素群階調値DTrpとの組合せに応じて、対応する個数データが予め設定されている。そして、図10に示したステップS208では、この個数データ生成テーブルを参照することによって、画素群階調値DTrpを個数データに迅速に変換することが可能である。
B−4−3.階調誤差の拡散方法 :
以上のようにして、画素群階調値DTrpを個数データに変換することに伴い、その画素群では階調誤差ERが生じる。上述した個数データ生成処理では、この階調誤差ERを周辺の画素群に拡散しておき(図10のステップS210)、これら画素群では、周辺の画素群から拡散されてきた誤差(拡散誤差ERdf)を考慮しながら画素群階調値DTrpを算出する。以下では、画素群階調値DTrpを個数データに変換することで生じる階調誤差ERの意味するところと、その算出方法、更に階調誤差ERを拡散する方法について説明する。
図15および図16を用いて前述したように、画素群階調値DTrpが最小値(階調値:0)の場合は個数データも「0」となり、画素群階調値DTrpが最大値(階調値:255)の場合は個数データは「8」となる。その間の範囲では、画素群階調値が大きくなるに従って、個数データも大きな値となる。ここで、本実施例では画素群は8つの画素で構成されるものとしているから、個数データは0〜8の9階調しか取り得ない。これに対して、画素群階調値が1バイトデータであるとすると、画素群階調値は0〜255の256階調を取り得る。すなわち、256階調を有する画素群階調値を9階調の個数データに変換することになるから、何がしかの変換誤差が発生する。
また、画素群が表現する階調値は、ドットが全く形成されない状態(個数データ「0」に相当)から、全ての画素にドットが形成された状態(個数データ「8」に相当)まで8段階で増加し得る。そこで、個数データ「0」の状態の画素群が表現する階調値を「0」として、ドットが1つ増える毎に表現する階調値が「32」ずつ増加し、全画素にドットが形成された状態の画素群は階調値255を表現しているものとする。すると、画素群階調値DTrpに対して、その画素群に表現される階調値(表現階調値)との間には誤差が発生することになる。階調誤差ERとは、画素群階調値DTrpを個数データに変換することに伴って発生するこのような誤差であり、画素群階調値から表現階調値を減算することによって求めることができる。すなわち、階調誤差ERは、
ER = DTrp − (ドット個数)×(ドット1つあたりの表現階調値)
によって算出することが可能である。
図17は、画素群階調値が増加するに従って画素群に表現される階調値(表現階調値)が段階的に増加し、それに伴って階調誤差ERが発生する様子を概念的に示した説明図である。ここで、ある画素群階調値が与えられたときに何個のドットが発生するか、すなわち、画素群階調値に対する個数データは、ディザマトリックスの対応するブロックに設定された閾値によって異なってくる。そこで、図17では、図8(b)中に示した4つのブロックを例に用いて、対応する画素群で生じる階調誤差ERを表示している。
図17(a)は、図8(b)に示した4つのブロックの中の左上隅にあるブロック(図12(b)の通し番号によれば1番のブロック)を用いて、画素群階調値を0〜255まで増加させたときに、その画素群で表現される階調値と、その結果として生じる階調誤差ERを示したものである。例えば、画素群階調値が45であったとすると、通し番号1番のブロックでは、閾値1が設定された画素と、閾値42の画素にドットが形成されるから、その画素群に表現される階調値は「64」となる。画素群階調値45に対して、実際に表現される階調値は64であるから、その画素群では、45−64=−9で、階調値「−9」の階調誤差ERが生じることになる。図17(a)は、このようにして、0〜255までのすべての画素群階調値に対して、発生する階調誤差ERを求めた結果を示したものである。
また、図17(b)は、上述したブロックの右隣のブロック(図12の通し番号によれば、2番のブロック)について、画素群階調値に対する表現階調値および階調誤差ERを示したものである。上述した1番のブロックと同様に、画素群階調値が45である場合について説明する。画素群階調値45に対しては、通し番号2番のブロックでは、閾値5が設定されている画素にのみドットが形成される。従って、その画素群に表現される階調値は「32」であり、階調値13の階調誤差ERが生じることになる。
図17(c)は、1番ブロックの真下のブロック(図12の通し番号によれば33番のブロック)について、同様にして階調誤差ERを求めたものであり、図17(d)は、2番ブロックの真下のブロック(通し番号34番のブロック)について、階調誤差ERを求めたものである。図17(a)〜(d)を比較すれば明らかなように、階調誤差ERの発生パターンは複雑に変化しており、また、同じ画素群階調値に対しても、発生する階調誤差ERは画素群毎に異なった値となっている。
尚、上述したように、画素群に表現される階調値は、階調値0〜階調値255の範囲で段階的に変化している。このことに着目すれば、画素群の個数データを決定することは、画素群の多値化と考えることもできる。すなわち、誤差を拡散させながら画素群内の画像データを多値化していると考えることもできる。このように誤差を拡散しながら多値化を行う場合、多値化結果に一定の繰り返しパターンが発生し画質に影響を与えることがある。しかし、図17に示したように、本実施例の多値化では、画素群の分類番号が異なれば同じ画素群階調値に対しても多値化結果は異なっており、発生する階調誤差も異なったものとなる。そして、図13を用いて前述した画素群の分類番号の決定方法から明らかなように、画素群には連続して同じ分類番号が付与されることはないから、階調誤差の発生パターンも複雑に変化することになるので、多値化結果に一定の繰り返しパターンが発生して画質を悪化させるおそれはない。
以上のようにして、画素群に発生した階調誤差ERを算出したら、得られた階調誤差ERを、周辺にある未処理の画素群に拡散させる。図18は、ある画素群で生じた階調誤差ERを、周辺の画素群に拡散させている様子を概念的に示した説明図である。図中に示した矩形は画素群を模式的に示したものであり、実線の画素群は処理中の画素群を表している。また、ハッチングが施された破線の画素群は既に個数データを生成した画素群を表しており、ハッチングのない破線の画素群は未だ個数データを生成していない画素群を表している。図18に示すように、処理中の画素群には隣接して4つの未処理の画素群が存在している。そこで、図18(a)に示した例では、画素群で生じた階調誤差ERを、これら4つの画素群に均等に分配する。図中に示した白抜きの矢印は、階調誤差ERをこれら画素群に、均等に拡散誤差ERdfとして分配している様子を概念的に表している。尚、階調誤差ERは、隣接する画素群に、必ずしも均等に分配する必要はなく、所定の重みを付けて分配することとしても良い。あるいは、隣接する画素群だけではなく、より遠方の画素群に拡散させても構わない。拡散誤差ERを拡散させるときの、周辺の各画素群への重み係数は、誤差拡散マトリックスとして予め設定しておくことができる。
また、図17に示した各ブロックについての例示から明らかなように、画素群で生じる階調誤差ERの大きさは、単一画素で発生する階調誤差ほどには大きな値となることはない。例えば、単一画素の場合、階調誤差ERは−254〜254までの値を取り得る。すなわち、画像データの階調値254の画素に対して、ディザマトリックスの閾値が「255」であった場合には、その画素にはドットは形成されないから、階調値254の階調誤差が生じる。また、画像データの階調値1に対してディザマトリックスの閾値「1」の場合には、その画素にはドットが形成されるから、階調値「−254」の誤差が生じる。これに対して画素群では、各画素で生じる階調誤差が、正または負のいずれか一方に偏って発生することは無いから、全体としては誤差が相殺し合う方向に働くため、画素群で生じる階調誤差ERは比較的小さな値となる。このように、画素群で発生する階調誤差ERは比較的小さな値となることに着目すれば、図18(b)に示すように、すべての階調誤差ERを1つの画素群に拡散させることで、誤差を拡散する処理を簡素なものとすることも可能である。
図10に示したステップS210では、以上のようにして、画素群で生じた階調誤差ERを算出し、得られた誤差を周辺の画素群に拡散させる処理を行う。周辺の画素群では、拡散されてきた誤差を拡散誤差ERdfとして蓄積しておく。そして、その画素群について画素群階調値DTrpを算出する際には、蓄積しておいた拡散誤差ERdfを読み出して(ステップS204)、続くステップS206では、拡散誤差ERdfを考慮しながら画素群階調値DTrpを算出するのである。
尚、拡散誤差ERdfを拡散するに際しては、誤差を周辺の画素群に拡散するのではなく、各画素群の中で所定位置にある画素に拡散させることとしてもよい。すなわち、所定位置の画素に割り当てられている画像データに拡散誤差ERdfを加算して補正画像データを求め、この補正画像データを含めて算出した画素群の平均画像データを画素群階調値とすることも可能である。
B−5.第1実施例の画素位置決定処理 :
次に、前述した第1実施例の画像印刷処理において、個数データから画素群内でドットを形成する画素位置を決定する処理(図5のステップS108)について説明する。図19は、第1実施例の画素位置決定処理の流れを示すフローチャートである。かかる処理は、カラープリンタ200の制御回路260に内蔵されたCPUによって実行される処理である。以下では、前述した図9を参照しながら、図19に示すフローチャートに従って、第1実施例の画素位置決定処理の内容について説明する。尚、図9は、個数データからドットを形成する画素位置を決定可能な原理を説明するために用いられたものである。
画素位置決定処理を開始すると、先ず初めに、処理の対象とする画素群を1つ選択し(ステップS300)、その画素群の個数データを取得する(ステップS302)。ここでは、図9(a)に示すような個数データが供給されたものとする。そして、処理対象の画素群として、図9(a)中で一番左上隅の画素群が選択されたものとする。この場合は、図19のステップS302では、選択した画素群の個数データとして、「3」が取得されることになる。
次いで、序列マトリックスを参照することにより、画素群内でドットが形成される画素位置を決定する(ステップS304)。序列マトリックスとは、図9(d)に例示されているように、画素群内の各画素についてドットの形成され易さを示したマトリックスである。ここでは、処理対象の画素群は、画像中で一番左上隅にある画素群であるとしているから、序列マトリックスも該当する箇所のマトリックス(すなわち、図9(d)で左上隅にある8画素分のマトリックス)を参照する。そして、個数データが「3」であるから、序列マトリックス中でドットの形成され易さが、1番から3番までの画素にドットが形成されるものと判断する。その結果、図9(c)の一番左上隅の画素群に示されているように、処理対象の画素群については、ドットを形成する画素位置は一番左上隅の画素と、その2つ右隣の画素と、更に右下の画素の3つの画素位置に決定することができる。尚、図9(c)では、ドットが形成される画素には斜線を付して表示している。図19のステップS304では、このようにして序列マトリックスを参照しながら、個数データに基づいてドットを形成する画素位置を決定する。
尚、ここでは序列マトリックスを参照して画素位置を決定するものとして説明した。しかし、図9においても前述したように、画素群内で各画素の序列を示している点については、ディザマトリックスも序列マトリックスと同様である。従って、序列マトリックスに代えて、ディザマトリックスを参照しても良いことはもちろんである。
以上のようにして、ステップS300において選択した画素群についての画素位置を決定したら、全ての画素群についての処理を終了したか否かを判断する(図19のステップS306)。未処理の画素群が残っていれば(ステップS306:no)、ステップS300に戻って新たな画素群を選択し、続く一連の処理を行う。こうした処理を繰り返すことにより、図9(a)に例示した個数データは、図9(c)に示すような、ドットを形成する画素位置を示すデータに変換されていく。そして、全ての画素群について処理が終了したら(ステップS306:yes)、図19に示した画素位置決定処理を終了して、図5の画像印刷処理に復帰する。
以上、第1実施例の画像印刷処理中で行われる個数データ生成処理(図5のステップS106)、および画素位置決定処理(図5のステップS108)の内容について詳しく説明した。上述した個数データ生成処理では、所定数の画素を画素群としてまとめて、画素群毎に個数データを生成する。個数データの生成に際しては、分類番号と画素群階調値とに基づいて個数データ生成テーブルを参照するだけで生成することができる。また、分類番号や画素群階調値も容易に求めることができるので、極めて容易に個数データを生成することが可能である。こうして生成された個数データは、画素毎にドット形成の有無を表すデータに比べて、データ量が遙かに小さくなっているため、コンピュータ100からカラープリンタ200に向かって極めて迅速にデータを出力することができる。すなわち、上述した個数データ生成処理では、個数データの生成および出力を高速に実行することが可能であり、その分だけ画像を迅速に印刷することが可能となる。
また、上述した個数データ生成処理では、個数データの生成に伴って画素群毎に発生した階調誤差を周辺の画素群に拡散しておき、周辺の画素群で個数データを生成する際には、拡散されてきた誤差が解消されるようにして個数データを生成する。このため、個数データを生成することによって生じた階調誤差を速やかに解消することができ、画質を改善することが可能である。更に、図17を用いて説明したように、画素群が切り換わるに伴って階調誤差の発生パターンは複雑に変化することから、個数データが一定のパターンで生成されてしまい、画質に悪影響を与えるおそれもない。
加えて、個数データを生成する処理は、単に変換テーブルを参照する処理に過ぎず、変換テーブルを参照するために使用する分類番号や画素群階調値も、極めて簡便な処理で求めることができるので、コンピュータ100のような高いデータ処理能力を備えていない機器を用いた場合でも、十分に実用的な速度で処理することができる。
B−6.変形例 :
上述した第1実施例の個数データ生成処理には、種々の変形例が存在する。以下では、これら変形例について簡単に説明する。
B−6−1.第1の変形例 :
以上に説明した第1実施例の個数データ生成処理では、画素群の分類番号と画素群階調値DTrpとから、個数データ生成テーブルを参照することによって個数データを取得した。また、こうして画素群階調値DTrpを個数データに変換することで、その画素群に生じた階調誤差ERを算出して、周辺の画素群に拡散した。しかし、階調誤差ERは画素群階調値DTrpと個数データとが分かれば算出可能であり、また、その個数データは、分類番号と画素群階調値DTrpとが分かれば、個数データ生成テーブルを参照することで決定することができる。こうした点に着目すれば、画素群で生じる階調誤差ERは、その画素群の分類番号と画素群階調値DTrpとを求めた時点で、既に決まっていることになる。換言すれば、画素群の分類番号と画素群階調値とが分かれば、個数データだけでなく、その画素群で生じる階調誤差ERも決まってしまうことになる。従って、上述した第1実施例のように個数データから階調誤差ERを算出するのではなく、階調誤差ERも個数データ生成テーブルに記憶しておき、かかるテーブルを参照することで、個数データと同時に階調誤差ERを取得することも可能である。
図20は、こうした第1の変形例における個数データ生成処理の流れを示すフローチャートである。かかる第1の変形例の個数データ生成処理は、図10に示した第1実施例の個数データ生成処理に対して、個数データ生成テーブルを参照することで、個数データと階調誤差ERとを一度に取得する点が大きく異なっている。以下では、かかる相違点に焦点をあてて、第1の変形例の個数データ生成処理について簡単に説明する。
第1の変形例の個数データ生成処理を開始すると、互いに隣接する所定個数の画素をまとめて画素群を生成した後、その画素群の分類番号を決定する(ステップS350、S352)。そして、その画素群に拡散されている拡散誤差ERdfを読み出して、画素群階調値DTrpを算出する(ステップS354、S356)。これらの処理は、前述した第1実施例と同様であるため、ここでは詳細な説明は省略する。
次いで、求めた分類番号および画素群階調値に基づいて、個数データ生成テーブルを参照することによって、その画素群についての個数データと、その画素群で生じる階調誤差ERを取得する(ステップS358)。図15に示した第1実施例の個数データ生成テーブルには、分類番号および画素群階調値の組合せ毎に個数データが記憶されていたが、第1の変形例の個数データ生成処理で参照するテーブルには、個数データに加えて、予め算出しておいた階調誤差ERも記憶されている。このため、ステップS358においては、画素群の分類番号と画素群階調値DTrpとに基づいて個数データ生成テーブルを参照することにより、その画素群の個数データと階調誤差ERとを一度に取得することができる。
次いで、得られた階調誤差ERを周辺の画素群に拡散した後(ステップS360)、画像中の全画素について行ったか否かを判断する(ステップS362)。そして、未処理の画素が残っている場合は(ステップS362:no)、ステップS350に戻って新たな画素群を生成し、続く一連の処理を繰り返す。こうした操作を繰り返し、全画素についての処理が終了したと判断されたら(ステップS362:yes)、各画素群について得られた個数データをカラープリンタ200に出力して(ステップS364)、図20に示す第1の変形例の個数データ生成処理を終了する。
以上に説明した第1の変形例の個数データ生成処理では、個数データ生成テーブルを参照することで、画素群の個数データと階調誤差ERとを同時に取得することができる。このため、誤差の算出が不要となるので、より迅速に個数データを生成することが可能となる。
B−6−2.第2の変形例 :
また、上述した各種の個数データ生成処理では、画素群階調値を個数データに変換することによって生じた階調誤差を、周辺の画素群に拡散させることとした。しかし、画素群の画像データから画素群階調値を算出する際には、何某かの丸め誤差が発生する。あるいは、画像処理装置に供給される画像データの分解能が画素群階調値の算出分解能よりも高い場合にも、丸め誤差が発生する。こうして発生した丸め誤差も、周辺の画素群に拡散させておき、周辺の画素群についての画素群階調値を算出する際には、これら考慮することとしても良い。以下では、こうした第2の変形例の個数データ生成処理について簡単に説明する。
図21は、第2の変形例において、画素群階調値を算出する際に生じた丸め誤差ERrdを周辺の画素群に拡散しながら個数データを生成する処理の流れを示したフローチャートである。かかる第2の変形例における個数データ生成処理は、前述した第1の変形例における個数データ生成処理に対して、画素群で生じた階調誤差ERに加えて丸め誤差ERrdも拡散する点が異なっている。以下では、かかる相違点に焦点をあてながら、第2の変形例の個数データ生成処理について説明する。
第2の変形例においても、第1の変形例と同様に、個数データ生成処理を開始すると、互いに隣接する所定個数の画素をまとめて画素群を生成した後、その画素群の分類番号を決定する(ステップS400、S402)。そして、その画素群に拡散されている拡散誤差ERdfを読み出してやる(ステップS404)。このとき読み出す拡散誤差ERdfは、前述した各種実施例では、画素群で生じた階調誤差ERが拡散された誤差であるのに対して、第2の変形例では、階調誤差ERに後述する丸め誤差ERrdを加えた合計誤差ERtlが拡散された誤差である点が異なっている。
次いで、拡散誤差ERdfと、画素群の各画素の画像データとを用いて、画素群の画素群階調値DTrpを算出するとともに、算出時に発生した丸め誤差ERrdを取得する(ステップS406)。拡散誤差ERdfおよび各画素の画像データから画素群階調値DTrpを算出する方法は、前述した各種実施例と同様である。但し、第2の変形例では、画素群階調値DTrpを算出することに併せて、画素群階調値DTrpを算出するための除算の際に生じた丸め誤差ERrdを取得しておく。
次いで、求めた分類番号および画素群階調値に基づいて、個数データ生成テーブルを参照することによって、その画素群についての個数データと、その画素群で生じる階調誤差ERを取得する(ステップS408)。ここで、第2の変形例においては、画素群階調値DTrpを算出する際に生じた丸め誤差ERrdも考慮するから、その画素群では階調誤差ERに加えて丸め誤差ERrdも生じていることになる。そこで、第2の変形例の個数データ生成処理では、個数データ生成テーブルを参照して階調誤差ERを取得すると、この階調誤差ERに、先に取得しておいた丸め誤差ERrdを加算することによって、その画素群で生じた合計誤差ERtlを算出する(ステップS410)。
こうして得られた合計誤差ERtlを、周辺の画素群に拡散誤差ERdfとして拡散させる(ステップS412)。合計誤差ERtlを拡散させる割合は、予め誤差拡散マトリックスに設定しておけばよい。また、階調誤差ERの大きさが比較的小さな値となることと同様の理由により、合計誤差ERtlの値も比較的小さな値しか取らないことから、合計誤差ERtlを複数の画素群に分配するのではなく、隣接する1つの画素群にだけ拡散させることも可能である。
以上のようにして、画素群で生じた合計誤差ERtl、すなわち、階調誤差ERと丸め誤差ERrdとを周辺の画素群に拡散したら、画像中の全画素について行ったか否かを判断する(ステップS414)。そして、未処理の画素が残っている場合は(ステップS414:no)、ステップS400に戻って新たな画素群を生成し、続く一連の処理を繰り返す。こうした操作を繰り返し、全画素についての処理が終了したと判断されたら(ステップS414:yes)、各画素群について得られた個数データをカラープリンタ200に出力して(ステップS416)、図21に示す第2の変形例の個数データ生成処理を終了する。
以上に説明したように、単に階調誤差ERを拡散させるだけでなく、画素群階調値を算出する際に生じた丸め誤差ERrdも拡散してやれば、それだけ画像データを正確に反映した個数データを生成することができるので、得られる画質を改善することが可能となる。
また、画素群階調値の分解能に対して入力される画像データの分解能が高い場合などには、画素群階調値ERrpを算出する際に丸め誤差ERrd発生する。そこで、この丸め誤差ERrdを周辺の画素群に拡散しておき、周辺の画素群における画素群階調値の算出に反映させれば、画素群階調値の分解能が画像データに対して不足していることを補って、より滑らかな階調変化を表現することが可能となる。従って、画素群の階調誤差ERを拡散しない場合には、丸め誤差ERrdだけでも拡散してやれば、分解能の不足を補って画質を改善することが可能である。
C.第2実施例 :
以上に説明した第1実施例では、カラープリンタ200で形成可能なドットは1種類であるものとして説明した。しかし、今日では、印刷画質を向上させることを目的として、大きさの異なるドットや、インク濃度の異なるドットなど、多種のドットを形成可能なプリンタ(いわゆる多値ドットプリンタ)が広く使用されている。本願の発明は、こうした多値ドットプリンタに適用した場合にも、大きな効果を得ることができる。以下では、第2実施例として、本願発明を多値ドットプリンタに適用した場合について説明する。
C−1.第2実施例の画像印刷処理の概要 :
第2実施例の画像印刷処理は、フローチャートについては、図5に示した第1実施例の画像印刷処理と同様である。以下では、図5のフローチャートを流用しながら、第2実施例の画像印刷処理の概要について簡単に説明する。
第2実施例の画像印刷処理を開始すると、先ず初めに、コンピュータ100で画像データを読み込んだ後、色変換処理を行う(図5のステップS100およびステップS102相当)。次いで、解像度変換処理を行って、画像データの解像度を印刷解像度に変換した後(ステップS104相当)、個数データ生成処理を開始する(ステップS106相当)。
前述したように、第1実施例では、カラープリンタ200が形成可能なドットは1種類であるものとしており、個数データ生成処理では、画素群内に形成されるドット個数を表す個数データを画素群毎に生成して、カラープリンタ200に出力した。これに対して、第2実施例では、カラープリンタ200は、大きさの異なる3種類のドット、すなわち大ドット、中ドット、小ドットを形成可能であるものとする。このことと対応して、第2実施例の個数データ生成処理では、画素群内に、大ドット、中ドット、小ドットがそれぞれ何個ずつ形成されるかを表す個数データを生成することになる。また、詳細には後述するが、個数データを少ないデータ量で効率よく出力するために、大ドット、中ドット、小ドットの個数をそのまま出力するのではなく、コード化された状態で出力する。第2実施例の個数データ生成処理の詳細については後述する。
カラープリンタ200の制御回路260に内蔵されたCPUは、コンピュータ100から供給された個数データを受け取ると、画素位置決定処理を開始する(図5のステップS108相当)。詳細には後述するが、第2実施例の画素位置決定処理では、コード化された状態で供給された個数データを、大ドット、中ドット、小ドットの個数を示すデータに復号した後、これらドットを形成する画素位置を決定する。
こうして、大中小の各種ドットを形成すべき画素位置を決定したら、決定した画素位置にドットを形成する(図5のステップS110相当)。こうして大ドット、中ドット、小ドットを形成することにより、画像データに対応した画像が印刷される。
C−2.第2実施例の個数データ生成処理 :
次に、上述した第2実施例の画像印刷処理において、画素群内に形成される大ドット、中ドット、小ドットの個数がコード化された個数データを生成する処理について説明する。後述するように、コード化された個数データも、画素群の分類番号と画素群階調値とに基づいて変換テーブルを参照することにより、極めて容易に生成することができる。こうしたことが可能である理由を説明するために、先ず初めに、画素群内に形成される大中小ドットの個数を、いわゆるディザ法を用いて決定する処理について簡単に説明する。次いで、大中小ドットの個数をコード化する処理について説明し、その後に、第2実施例の個数データ生成処理で行われる詳細な処理内容について説明する。
C−2−1.ディザ法を用いた大中小ドットの形成個数の決定処理 :
図22は、画素群内に形成される大ドット、中ドット、小ドットの個数を、ディザ法を適用して決定する処理の流れを示すフローチャートである。尚、かかる処理の詳細については、特許3292104号に開示されている。大中小ドットの個数を決定する場合も、処理を開始すると先ず初めに、互いに隣接する所定数の画素をまとめて画素群を形成する(ステップS430)。ここでは、前述した実施例と同様に、主走査方向に4画素、副走査方向に2画素の合計8つの画素を画素群としてまとめるものとする。
次いで、画素群の中からドット形成の有無を判断するべく、処理対象とする画素を1つ選択して(ステップS432)、選択した処理画素について、大ドット、中ドット、小ドットの形成有無を判断する(ステップS434)。大中小ドットの形成有無は次のようにして判断する。
図23は、選択した1つの画素についてハーフトーン処理を行うことにより、大ドット、中ドット、小ドットの形成有無を判断する処理の流れを示すフローチャートである。大中小ドットのハーフトーン処理を開始すると、先ず初めに処理対象とする画素についての画像データを、大ドット、中ドット、小ドットの各ドットについての密度データに変換する(ステップS460)。ここで、密度データとは、ドットをどの程度の密度で形成するかを表すデータである。密度データは、大きな階調値となるほどドットが高い密度で形成されることを表している。例えば、密度データの階調値「255」は、ドットの形成密度が100%、すなわち全ての画素にドットが形成されることを表しており、密度データの階調値「0」は、ドットの形成密度が0%、すなわちいずれの画素にもドットが形成されないことを表している。こうした密度データへの変換は、ドット密度変換テーブルと呼ばれる数表を参照することによって行うことができる。
図24は、画像データの階調値を大中小各ドットについての密度データに変換する際に参照されるドット密度変換テーブルを概念的に示した説明図である。図示されているように、ドット密度変換テーブルには、色変換によって得られた画像データの階調値に対して、小ドット・中ドット・大ドットの各ドットについての密度データが設定されている。画像データが階調値「0」近傍の領域では、中ドット・大ドットの密度データはいずれも階調値「0」に設定されている。小ドットの密度データは、画像データの階調値が大きくなるに連れて増加して行くが、画像データがある階調値に達すると今度は逆に減少し始め、代わりに中ドットの密度データが増加し始める。画像データの階調値が更に増加して、ある階調値に達すると、小ドットの密度データが階調値「0」となり、中ドットの密度データが減少し始めて、代わりに大ドットの密度データが少しずつ増加していく。図23のステップS460では、このドット密度変換テーブルを参照しながら、画像データの階調値を、大ドットの密度データ、中ドットの密度データ、小ドットの密度データに変換する処理を行う。
このようにして、処理対象とする画素について、大中小各ドットの密度データが得られたら、先ず初めに大ドットについての形成有無を判断する(図23のステップS462)。かかる判断は、大ドットの密度データと、処理対象としている画素の対応する位置に設定されているディザマトリックスの閾値とを比較することによって行う。そして、密度データの方が大きい場合は処理対象の画素には大ドットを形成するものと判断される。判断の結果が大ドットを形成することになった場合は、ステップS464において「yes」と判断され、ハーフトーン処理を抜けて図22のドット個数決定処理に復帰する。
逆に、大ドットの密度データよりも閾値の方が大きければ、ステップS462において、処理対象の画素には大ドットは形成されないと判断される。その結果、大ドットが形成されない場合は、ステップS464において「no」と判断され、今度は中ドットについて形成有無を判断する処理を開始する。中ドットの形成有無の判断には、大ドットの密度データと中ドットの密度データとを加算して、中ドット用の中間データを算出する(ステップS466)。そして、得られた中ドット用の中間データと、ディザマトリックスの閾値とを比較することにより、中ドットの形成有無を判断する(ステップS468)。中ドット用の中間データの方が大きい場合は、処理対象の画素には中ドットを形成するものと判断される。その結果、中ドットを形成することになった場合は、ステップS470において「yes」と判断され、ハーフトーン処理を抜けて図22のドット個数決定処理に復帰する。
逆に、中ドット用の中間データよりも閾値の方が大きかった場合は、ステップS468の処理では、処理対象の画素には中ドットを形成しないと判断される。その結果、中ドットも形成されない場合は、ステップS470において「no」と判断され、今度は小ドットについて形成有無を判断する処理を開始する。小ドットの形成有無の判断には、中ドット用の中間データと小ドットの密度データとを加算して、小ドット用の中間データを算出する(ステップS472)。そして、得られた小ドット用の中間データと、ディザマトリックスの閾値とを比較することにより、小ドットの形成有無を判断する(ステップS474)。その結果、小ドット用の中間データの方が大きい場合は処理対象の画素には小ドットを形成するものと判断し、逆に、小ドット用の中間データよりも閾値の方が大きい場合には、いずれのドットも形成されないものと判断する。以上のような処理を行えば、処理対象としている画素について、大ドット、中ドット、小ドットのいずれのドットを形成するか、若しくは、いずれのドットも形成しないかを判断することができるので、図23に示したハーフトーン処理を抜けて図22のドット個数決定処理に復帰する。
上述した処理を行いながら大中小の各ドットの形成有無を判断する様子について、図25を参照しながら補足して説明する。図25は、画素群内の各画素について、ディザ法を適用しながら大中小各ドットの形成有無を判断している様子を概念的に示した説明図である。ここでは、説明が煩雑となることを避けるために、画素群内の全画素が同じ階調値を有しており、従って、大中小各ドットの密度データも同じ階調値を有しているものとする。図25(a)は、画素群内の各画素について得られた大中小ドットの密度データを示しており、いずれの画素も、大ドットの密度データが「2」、中ドットの密度データが「90」、小ドットの密度データが「32」であったものとする。
図25(b)は、ディザマトリックス中で、画素群の対応する位置に記憶されている閾値を表している。大ドットの形成有無を判断する際には、大ドットの密度データと、これら閾値とを比較する。ここでは、いずれの画素についても、大ドットの密度データは「2」であるとしているから、大ドットを形成すると判断される画素は、閾値「1」が設定された画素だけである。図25(b)には、大ドットが形成されると判断された画素には、細かい斜線を付して表示している。その他の画素については、中ドットか小ドットのどちらかが形成されるか、若しくはいずれのドットも形成されないかのいずれかであると考えられる。そこで、中ドットの形成有無を判断する。
中ドットの形成有無の判断に際しては、大ドットの密度データ「2」と中ドットの密度データ「90」とを加算して中ドット用の中間データを算出し、得られた中間データ「92」とディザマトリックスの閾値とを比較する。その結果、閾値「42」が設定された画素と、閾値「58」が設定された画素の2つの画素にのみ、中ドットが形成されるものと判断される。図25(c)には、中ドットが形成されると判断された画素には、少し細かい斜線を付して表示している。そして、大ドットも中ドットも形成されない画素については、小ドットが形成されるか、ドットが形成されないかのいずれかであると考えられる。そこで、中ドット用の中間データ「92」に小ドットの密度データ「32」を加算して、小ドット用の中間データを算出し、得られた中間データ「124」とディザマトリックスの閾値とを比較する。その結果、閾値「109」が設定された画素にのみ、小ドットが形成されるものと判断される。図25(d)には、小ドットが形成されると判断された画素には、粗い斜線を付して表示している。
図22に示したドット個数決定処理のステップS432〜S436では、以上のようにして画素群内の各画素について中間データを算出しながら、大中小の各ドットについての形成有無を判断していく。こうして、画素群内の全画素について判断を終了したら(ステップS436:yes)、画素群内に形成される大ドット、中ドット、小ドットの個数を取得する(ステップS438)。図25に例示した画素群については、大ドット1個、中ドット2個、小ドット1個となる。
こうして、大中小の各ドットのドット個数を取得したら、画像の全画素について以上の処理を行ったか否かを判断する(ステップS440)。そして、未処理の画素が残っている場合は、ステップS430に戻って続く一連の処理を繰り返し、画像の全画素について処理を終了したと判断されたら、図22に示したディザ法によるドット個数決定処理を終了する。その結果、画像データは複数の画素群に分割され、各画素群に形成される大ドット、中ドット、小ドットの個数が得られることになる。図26は、画素群毎に大ドット、中ドット、小ドットの形成個数が得られた様子を概念的に示した説明図である。
C−2−2.大中小ドットの形成個数のコード化処理 :
以上のようにして画素群毎に各ドットの個数が求められたら、求めたドットの個数をコード化した状態でプリンタに出力する。すなわち、例えば図26に示すように、ドットの種類が大中小の3種類である場合、ドットの種類毎に形成する個数を出力したのでは、1つの画素群について3回ずつドット個数を出力しなければならない。これでは、コンピュータ100からカラープリンタ200にデータを迅速に出力することで画像を迅速に印刷するという効果が減殺されてしまう。そこで、各ドットの個数を個別に出力するのではなく、各ドットの個数の組合せ、例えば(大ドットがK個、中ドットがL個、小ドットがN個)という組合せを、組合せ毎に設定された個別のコードに変換した後、得られたコードを出力するのである。
大中小各ドットの組合せをコード化する処理は、ドット個数の組合せとコードデータとを対応付けた状態で予め対応テーブルに記憶しておき、この対応テーブルを参照することで行う。図27は、画素群に形成される大中小各ドットの個数の組合せと、コードデータとが対応付けて設定された対応テーブルを示す説明図である。図27に例示の対応テーブルには、例えば大ドット、中ドット、小ドットの個数がいずれも0個である組合せには、コードデータ「0」が対応付けられている。また、大ドットが0個、中ドットが0個、小ドットが1個の組合せには、コードデータ「1」が対応付けられている。このように対応テーブルには、各ドットの個数の組合せ毎に、予め固有のコードデータが対応付けて設定されている。
ここで、大中小ドットの個数の組合せ数は、次のようなものとなる。画素群内の各画素には、大ドット、中ドット、小ドットのいずれのドットも形成され得るが、1つの画素に複数のドットが形成されることはないから、ドット個数の合計が画素群内の画素数(上述した実施例では8個)を越えることはない。従って、これら大中小ドットの個数の組合せは、「大ドットを形成する」、「中ドットを形成する」、「小ドットを形成する」、「ドットを形成しない」の4つの状態の中から重複を許して8回選択するときの組合せの数に等しくなるから、
4H8 (=4+8−1C8)
によって求められ、165通りの組合せが存在していることになる。ここで、nHrは、n種類の物の中から重複を許してr回選択したときに得られる組合せの数(重複組合せ数)を求める演算子である。また、nCrは、n種類の物の中から重複を許さずにr回選択したときに得られる組合せの数を求める演算子である。
このように、大中小各ドットの個数の組合せが165通り存在していることから、コードデータも「0」〜「164」の165通りあればよい。165通りであれば、8ビットのデータ長があれば表現することができる。結局、大ドットの個数、中ドットの個数、小ドットの個数と、3回出力する代わりに、8ビットのコード化された個数データを1回出力するだけで、画素群に形成する各種ドットの個数を出力することが可能となる。そこで、図26に示すような画素群毎に得られたドット個数の組合せを、図27に示すような対応テーブルを参照しながらコード化された個数データに変換してからプリンタに供給することで、個数データの供給を迅速化して画像を迅速に印刷するのである。
C−2−3.第2実施例の個数データ生成処理 :
以上では、画素群内に形成する大中小ドットの個数をディザ法を用いて決定した後、得られたドット個数の組合せをコード化してからプリンタに供給するという、言わば2段階の処理を経るものとして説明した。しかし、第2実施例の個数データ生成処理では、個数データ生成テーブルを参照することにより、画素群の画像データをコード化された個数データに直接変換して、カラープリンタ200に出力する。このため、個数データを極めて迅速に生成することが可能となるとともに、個数データを生成する処理もたいへん簡素なものとすることができる。
更に、第2実施例の個数データ生成処理においても、前述した第1実施例と同様に、個数データを生成することで画素群に生じた階調誤差を、周辺の画素群に拡散させることにより、誤差を速やかに解消することができ、延いては高画質な画像を得ることが可能となっている。以下では、こうした第2実施例の個数データ生成処理について説明する。
図28は、第2実施例の個数データ生成処理の流れを示すフローチャートである。尚、以下では、第2実施例の個数データ生成処理もコンピュータ100で実施されるものとして説明するが、前述した第1実施例と同様に、第2実施例の個数データ生成処理も極めて簡素な処理とすることができるから、カラープリンタ200あるいはデジタルカメラ120内で実施することも可能である。以下、フローチャートに従って説明する。
第2実施例の個数データ生成処理を開始すると、先ず初めに、互いに隣接する所定個数の画素をまとめて画素群を生成する(ステップS500)。ここでは、上述した実施例と同様に、主走査方向に4画素分、副走査方向に2画素分の合計8つの画素を画素群にまとめるものとする。次いで、画素群の分類番号を決定する(ステップS502)。画素群の分類番号の決定方法は、前述した第1実施例と同様であるため、ここでは説明は省略する。次いで、その画素群に拡散されている拡散誤差ERdfを読み出して(ステップS504)、読み出した拡散誤差ERdfと画素群の各画素の画像データとから、画素群階調値DTrpを算出する(ステップS506)。画素群階調値の算出方法についても、上述した第1実施例と同様であるため、ここでは説明を省略する。
次いで、画素群の分類番号と画素群階調値とから個数データ生成テーブルを参照することにより、コード化された個数データと、階調誤差ERを取得する(ステップS508)。前述したように階調誤差ERとは、画素群階調値を個数データに変換したことで画素群に生じた階調表現の誤差であり、個数データに従って画素群にドットを形成したときに、その画素群に表現される階調値(表現階調値)を、画素群階調値から減算することによって算出することができる。
図29は、第2実施例の個数データ生成処理において参照される個数データ生成テーブルを概念的に示した説明図である。図示されているように、第2実施例の個数データ生成テーブルには、画素群の分類番号と画素群階調値との組合せに対応付けて、コード化された個数データと、階調誤差ERとが予め記憶されている。従って、第2実施例の個数データ生成処理においては、画素群の分類番号および画素群階調値を決定して変換テーブルを参照するだけで、直ちにコード化された状態の個数データと、階調誤差ERとを求めることが可能である。
次いで、個数データと同時に取得した階調誤差ERを周辺の画素群に拡散する処理を行う(ステップS510)。すなわち、図18を用いて前述したように、階調誤差ERを周辺にあって未だ個数データを生成していない画素群に、所定の比率で分配して、拡散誤差ERdfとして蓄積しておくのである。階調誤差ERを各画素群へ拡散する際の比率は、誤差拡散マトリックスとして予め設定しておくことができる。もちろん、第1実施例と同様に、階調誤差ERを1つの画素群にのみ分配したり、あるいは誤差を周辺の画素群に拡散するに際して、各画素群内の所定位置にある画素に拡散させることも可能である。図28のステップS504で読み出した拡散誤差ERdfは、以上のようにして、各画素群から拡散されて蓄積されている拡散誤差ERdfである。
以上のようにして、1つの画素群についてコード化された個数データを生成し、それに伴って生じる階調誤差を拡散したら、画像データの全画素について処理を終了したか否かを判断する(ステップS512)。そして、未処理の画素が残っている場合は(ステップS512:no)、ステップS500に戻って新たな画素群を生成し、続く一連の処理を繰り返す。こうした操作を繰り返し、全画素についての処理が終了したと判断されたら(ステップS512:yes)、各画素群について得られたコード化済みの個数データをカラープリンタ200に出力して(ステップS514)、図28に示す第2実施例の個数データ生成処理を終了する。
C−3.第2実施例の画素位置決定処理 :
次に、第2実施例のカラープリンタ200において、コード化された個数データを受け取って大中小各ドットを形成する画素位置を決定する処理について説明する。図30は、第2実施例の画素位置決定処理の流れを示すフローチャートである。かかる処理は、図19を用いて前述した第1実施例の画素位置決定処理に対して、個数データを復号して大中小各ドットの形成個数を示すデータに変換する点と、大中小各ドットについて画素位置を決定する点とが大きく異なっている。以下では、これら相違点に焦点をあてながら、第2実施例の画素位置決定処理について説明する。
第2実施例の画素位置決定処理を開始すると、先ず初めに、画素位置を決定しようとする画素群を1つ選択し(ステップS600)、その画素群の個数データを取得する(ステップS602)。こうして取得された個数データは、コード化されたデータとなっている。そこで、個数データを復号して、大ドット、中ドット、小ドットについての個数を示すデータに変換する処理を行う(ステップS604)。個数データを復号する処理は、復号テーブルを参照することによって行う。図31は、第2実施例の画素位置決定処理中でコード化された個数データを復号するために参照される復号テーブルを概念的に示した説明図である。
図示されるように、復号テーブルには、コード化された個数データに対応する大ドット、中ドット、小ドットのドット個数の組合せが設定されている。例えば、コード化された個数データが「1」である場合は、大ドットおよび中ドットの個数は0個で、小ドットの個数が1個であるドット個数の組合せに復号される。図30のステップS604では、このような復号テーブルを参照することにより、コード化された個数データを大中小各ドットの個数を表すデータに変換する。
次いで、処理中の画素群に対応する位置に記憶されている序列マトリックスを参照することにより、大中小各ドットの個数から、これらドットを形成する画素位置を決定する処理を行う(ステップS606)。序列マトリックスとは、図9(d)に例示されているように、画素群内の各画素についてドットの形成され易さを示したマトリックスである。図32は、序列マトリックスを参照しながら、大中小各ドットを形成する画素位置を決定している様子を概念的に示した説明図である。例えば、個数データを復号することにより、大ドットの個数が1個、中ドットの個数が2個、小ドットの個数が1個の組合せが得られたものとする。
画素位置の決定に際しては、先ず初めに大ドットを形成する画素位置を決定する。ここでは、大ドットの個数は1個であるとしているから、最もドットの形成され易い画素、すなわち、序列マトリックスで順序値が「1」に設定されている画素に大ドットが形成されるものと判断する。ここで、大ドットの個数がN個である場合は、序列マトリックスで順序値が「1」から「N」までの値が設定されている画素に大ドットを形成するものと判断する。図32では、大ドットを形成する画素位置には、細かい斜線を付して表示している。
次いで、中ドットを形成する画素位置を決定する。中ドットの個数は2個であり、順序値「1」が設定されている画素位置には大ドットが形成されるから、中ドットは順序値「2」が設定された画素位置と順序値「3」が設定された画素位置とに形成される。図32では、中ドットが形成される画素位置には、少し粗い斜線を付して表示している。
最後に、小ドットを形成する画素位置を決定する。小ドットの個数は1個であり、順序値「1」の画素位置には大ドットが、順序値「2」および「3」の画素位置には中ドットが形成されるから、小ドットは順序値「4」が設定された画素位置に形成される。図32では、小ドットが形成される画素位置には、粗い斜線を付して表示している。図30のステップS606では、このようにして序列マトリックスを参照しながら、大ドット、中ドット、小ドットの順番でドットを形成する画素位置を決定する処理を行う。
こうして、1つの画素群について、コード化された個数データを復号し、大中小の各ドットを形成する画素位置を決定したら、全画素群について処理を終了したか否かを判断する(図30のステップS608)。そして、未処理の画素群が残っている場合は(ステップS608:no)、ステップS600に戻って、新たな画素群について続く一連の処理を繰り返す。こうして全ての画素群について画素位置を決定したと判断されたら(ステップS608:yes)、図30に示す第2実施例の画素位置決定処理を抜けて、画像印刷処理に復帰した後、印刷用紙上に各種ドットを形成する。この結果、画像データに対応した画像が印刷されることになる。
尚、以上の説明では、コード化された個数データを復号する際に、各種ドットのドット個数のデータに復号するものとして説明した。しかし、上述したように、大ドット、中ドット、小ドットの順番で画素位置を決定することから、各種ドットのドット個数ではなく、大ドットの個数、大ドットと中ドットの合計個数、大ドットと中ドットと小ドットの合計個数に復号することとしても良い。例えば、図32に示した例では、大ドット1個、中ドット2個、小ドット1個と復号する代わりに、大ドット1個、大ドットと中ドットの合計が3個、大ドットと中ドットと小ドットの合計が4個と復号するのである。
図33は、コード化された個数データをこのように復号するために参照される復号テーブルを概念的に表した説明図である。このように復号しておけば、次のように画素位置を決定する処理を迅速化することができる。例えば、図32において中ドットの画素位置を決定する場合について説明すると、大ドットと中ドットの合計個数が3個と復号されているので、順序値が「1」から「3」までの画素を選択する。そして、既に他のドット(大ドット)が形成されている画素を除いて、選択した画素に中ドットを形成すると判断する。
大ドットが1個、中ドットが2個、小ドットが1個と復号した場合は、中ドットを形成する画素の順序値は大ドットの個数によって異なり、また、小ドットを形成する画素の順序値は大ドットおよび中ドットの個数によって異なってくる。このため、中ドットおよび小ドットを形成する画素位置を決定するに際しては、常に大ドット、あるいは大ドットおよび中ドットの個数を考慮しながら、適切な順序値の画素を選択する必要がある。これに対して、大ドットが1個、大ドットおよび中ドットの合計が3個、大ドットと中ドットと小ドットの合計が4個と復号しておけば、大ドット、あるいは大ドットおよび中ドットの個数を考慮せずとも、適切な順序値の画素を選択することができるので、画素位置を決定する処理を迅速化することが可能となる。
以上に説明した第2実施例の個数データ生成処理では、画素群についての分類番号と画素群階調値とを決定したら、個数データ生成テーブルを参照するだけで、直ちにコード化された個数データと、その画素群で生じる階調誤差ERとを求めることができる。従って、コード化された個数データを極めて迅速に生成することができるとともに、処理内容も極めて簡素なものとすることができる。また、階調誤差ERを周辺の画素群に拡散し、周辺の画素群では、拡散されてきた誤差を考慮に入れながら画素群階調値DTrpを算出することで、誤差を速やかに解消することが可能となり、延いては画質を改善することが可能となる。
また、画素群をひとかたまりと見れば、前述した第1実施例の個数データ生成処理と同様に、上述した第2実施例の個数データ生成処理も、画素群階調値DTrpを多値化する処理と考えることができる。もっとも、前述した第1実施例の個数データ生成処理では、いずれの画素群についても、ドット個数0〜8までの9階調に多値化されたのに対して、第2実施例の個数データ生成処理では、多値化される階調数が画素群毎に異なったものとなる。以下では、この点について若干補足して説明する。
図34は、第2実施例の個数データ生成処理において、画素群階調値が増加するに従って画素群に形成されるドット個数が切り替わり、それに伴って画素群に表現される階調値(表現階調値)が段階的に増加していく様子を示した説明図である。尚、前述した第1実施例と同様に、画素群の分類番号が異なれば、画素群階調値に対して形成されるドット個数も異なったものとなる。そこで、図34では、任意に選んだある分類番号の画素群を例に用いて、画素群階調値に対する表現階調値の変化を表している。
第2実施例では、画素群には大中小の3種類のドットを形成可能としているから、画素群階調値が増加するに従って、これらドットの個数の組合せが切り換わっていく。例えば、画素群階調値「0」のときには、画素群にドットが形成されることはない。従って、画素群に表現される階調値は「0」となる。画素群階調値が増加すると、やがて小ドットが形成される。図34に示した画素群では、画素群階調値が「1」になった時点で小ドットが1つ形成されている。すなわち、この画素群については、画素群階調値が「1」の時には大ドット0個、中ドット0個、小ドット1個が形成されることになる。図中では、これらドット個数の組合せを、(大ドット個数,中ドット個数,小ドット個数)によって表示している。従って、図中に示された(0,0,1)という表示は、画素群に小ドットが1つだけ形成されることを示していることになる。
尚、図34に示した画素群では、画素群階調値が「1」になった時点で、早くも1つ目の小ドットが形成されたが、小ドットが形成され始める画素群階調値は、画素群の分類番号に応じて異なっている。すなわち、前述したように、画素群に形成されるドット個数は、画素群の分類番号と画素群階調値との組合せに応じて決まってくるので、分類番号が異なれば、同じ画素群階調値に対して形成されるドット個数も異なってくるからである。
画素群に1つ目の小ドットが形成されると、その画素群で表現される階調値は、階調値0から小ドット1つ分だけ増加する。この増加量は、小ドットの大きさやインク濃度などによって異なるが、プリンタの仕様によって予め適切な値に設定されている。こうして、表現階調値が小ドット1つ分だけ増加すると、その画素群では階調誤差が発生する。図34に示した例では、画素群階調値が「1」になった時点で早くも小ドットが形成されているから、画素群階調値よりも表現階調値の方が大きな値となっており、これに伴って負の階調誤差(すなわち、マイナスの階調値を有する階調誤差)が生じることになる。図34では、負の階調誤差には、細かいハッチングを付して表している。
画素群階調値「1」で小ドットが1つ形成された後は、画素群階調値が増加してもしばらくの間はドットが形成されることはない。すなわち、表現階調値が一定のまま、画素群階調値だけが増加することになるから、画素群で生じる階調誤差は負の階調値から次第に大きくなっていく。そして、画素群階調値が「11」まで増加すると2つ目の小ドットが形成される。すなわち、画素群に形成されるドット個数が(0,0,1)から(0,0,2)に増加する。これに伴って、その画素群の表現階調値が小ドット1つ分だけ増加し、その結果、階調誤差が再びマイナス側に振れることになる。
更に画素群階調値が増加すると、今度は画素群階調値が「26」になった時点で中ドットが1つ形成され、代わりに小ドットの個数が1つ減少する。すなわち、ドット個数の組合せが(0,0,2)から(0,1,1)に変化する。中ドットが表現する階調値は小ドットが表現する階調値よりも大きいから、中ドットが小ドットに置き換わることで、その画素群の表現階調値も増加することになる。
ここで、画素群階調値の増加に合わせて表現階調値を増加させる観点からは、小ドットに代えて中ドットを形成するのではなく、すなわちドット個数の組合せを(0,0,2)から(0,1,1)に変化させるのではなく、小ドットの形成個数を2個から3個に増やすことによって、すなわちドット個数の組合せを(0,0,2)から(0,0,3)に変化させることも可能である。しかし、図34に示した画素群では、小ドットの形成個数を増加させるのではなく、小ドットを中ドットに置き換えることによって、画素群に表現される画素群階調値を増加させている。これは、図24に示したドット密度データ変換テーブルの設定と、各画素群に対応するディザマトリックスの閾値の設定によるものであり、画素群の分類番号が異なれば、ドット個数の組合せを(0,0,2)から(0,0,3)に変化させることで、表現階調値を増加させる場合も生じ得る。
更に画素群階調値が増加して、画素群階調値が「39」になると、中ドットの形成個数が1つ増加して、ドット個数の組合せが(0,1,1)から(0,2,1)に変化する。中ドットが表現する階調値は小ドットが表現する階調値よりも大きいから、中ドットの形成個数が1つ増加することで、画素群の表現階調値は大きく増加することになる。もちろん、画素群の表現階調値を増加させるためには、このようにドット個数の組合せを(0,1,1)から(0,2,1)に変化させることに限られるものではなく、例えば、(0,1,1)から(0,1,2)に変化させたり、あるいは(0,2,0)にすることも可能である。図34に示した画素群では、たまたま、ドット個数の組合せ(0,1,1)を(0,2,1)へと切り換えることで表現階調値を増加させている。
このように、画素群階調値が増加するに合わせて、ドット個数の組合せがどのように切り換わっていくか、そして、それに伴い画素群の表現階調値がどのように増加していくかは、図24に示したドット密度データ変換テーブルの設定と、各画素群に対応するディザマトリックスの閾値の設定によって決まるものである。従って、画素群の分類番号が異なれば、ドット個数の組合せが(0,1,1)から、(0,1,2)あるいは(0,2,0)に切り換わる画素群も生じ得る。そして、ドット個数の組合せが(0,2,1)または、(0,1,2)、(0,2,0)のいずれに切り換わるかによって、画素群の表現階調値も異なったものとなる。
尚、図34では、画素群階調値の増加に合わせて、表現階調値が直線的に増加するものとして表示している。しかし、画素群階調値が小さな値を取る範囲(すなわち、画像の明度が明るい場合)では、小ドットが主体として形成され、逆に画素群階調値が大きな値を取る範囲(すなわち、画像の明度が暗い場合)では、大ドットが主体として形成される。1つのドットが表現する階調値は、小ドットの方が大ドットよりも小さいから、小ドットを主体としてドットが形成される画素群階調値の低い領域では、大ドットを主体としてドットが形成される画素群階調値の高い領域よりも、細かな階調表現が要求される傾向にある。換言すれば、表現階調値の分解能に対する要求度合いは、画素群階調値が大きい領域よりも小さい領域の方が強い傾向にある。こうした点を考慮して、画素群階調値の増加に合わせて表現階調値を直線的に増加させるのではなく、表現階調値を下に凸の曲線に沿って増加させることとしても良い。こうすれば、画素群階調値が小さな値の領域では、表現階調値の分解能を向上させることができる。
以上、図34を用いて詳しく説明したように、第2実施例の個数データ生成処理では、画素群の表現階調値が段階的に増加する画素群階調値は、画素群の分類番号によって異なったものとなる。更に、画素群の分類番号が同じ場合であっても、表現階調値が段階的に増加する際の増加幅は、一定幅ずつ増加するわけではない。
図35は、異なる分類番号の3つの画素群について、画素群階調値が増加するに伴って画素群の表現階調値が増加する様子を例示した説明図である。図35に示されているように、いずれの画素群についても表現階調値は段階的に増加しているが、表現階調値が増加する画素群階調値は画素群毎に異なっている。また、表現階調値の増加幅も一定ではなく、複雑に切り換わる。このことと対応して、画素群階調値を個数データに変換することにより生じる階調誤差も、複雑に発生パターンが変化することになる。
更に、図35に示した3つの例を比較すれば、表現階調値の切り換わる段階数も画素群毎に異なっていることが分かる。例えば、図35(a)に例示した画素群では、階調値0〜255の範囲で、表現階調値が19段階に変化している。このことは、階調値「0」の状態まで含めれば、画素群階調値を20階調の表現階調値に多値化していると考えることもできる。また、図35(b)に示した画素群では、表現階調値が20段階に変化しており、図35(c)に示した画素群では16段階に変化している。それぞれ、画素群階調値を21階調、17階調に多値化していると考えることができる。
以上のことから、第2実施例の個数データ生成処理は、これを一種の多値化処理と見た場合、次のような特色を有していることが分かる。すなわち、画素群の分類番号が異なれば、同じ画素群階調値に対しても異なった多値化結果が得られるという特色がある。加えて、画素群の分類番号が異なれば、多値化する際の階調数(表現階調値が切り換わる段階数)も異なるという特色がある。ここで、前述したように、画素群には連続して同じ分類番号が付与されることはないから、多値化後の階調値および多値化する際の階調数とが分類番号毎に異なれば、階調誤差の発生パターンは複雑に変化することになる。このため、第2実施例においても、多値化結果に一定の繰り返しパターンが発生して画質を悪化させることを確実に回避することが可能である。
以上、各種の実施例について説明してきたが、本発明は上記すべての実施例に限られるものではなく、その要旨を逸脱しない範囲において種々の態様で実施することができる。例えば、以上の実施例では、印刷用紙上にドットを形成して画像を印刷する場合について説明したが、本発明の適用範囲は画像を印刷する場合に限られるものではない。例えば、液晶表示画面上で輝点を適切な密度で分散させることにより、階調が連続的に変化する画像を表現する液晶表示装置などにも、本発明を好適に適用することができる。