本発明の作用・効果をより明確に説明するために、本発明の実施の形態を、次のような順序に従って以下に説明する。
A.発明の概要:
B.第1実施例:
B−1.装置構成:
B−2.画像データ変換処理の概要:
B−3.第1実施例の階調数変換処理:
B−4.変形例:
C.第2実施例:
C−1.第2実施例の階調数変換処理における閾値の格納方法:
C−2.第2実施例の階調数変換処理:
C−3.変形例:
D.第3実施例:
D−1.第3実施例の階調数変換処理:
D−2.変形例:
A.発明の概要:
図1を参照しながら、本発明の概要について説明する。図1は、印刷システムを例にとって、本発明の概要を概念的に示した説明図である。本印刷システムは、本発明の画像処理装置10と、プリンタ20とから構成されている。画像処理装置10は、画像データを受け取って所定の画像処理を施した後、ドットの形成有無による表現形式の印刷データに変換して、プリンタ20に出力する。図中には、画像処理装置10が画像データに画像処理を施してデータを変換する処理の概要が、フローチャートの形式で示されている。画像処理装置10に供給される画像データは、二次元的に配列された複数の画素の各々に階調値が対応づけられた形式で表現されている。こうした画像データは、デジタルカメラやカラースキャナなどの画像機器で撮影した画像や、各種のアプリケーションプログラムを用いてコンピュータ上で作成した画像に所定の変換を施すことによって、生成することができる。
画像処理装置10はこうした画像データを受け取ると、大まかには次のような流れで画像処理を施していく。先ず、画像データの中からドット形成の有無を判断しようとする画素(対称画素)を選択し(ステップS10)、対称画素に対応づけられた階調値と、該対象画素に所定の方法で対応付けられた閾値とを読み出す(ステップS20)。閾値の値は、マトリックス状に複数の閾値が予め記憶されている。本明細書では、閾値を記憶しているこうしたマトリックスを閾値マトリックスと呼ぶ。図1には、一例として縦横6個ずつの合計36個の閾値が記憶された閾値マトリックスが表示されているが、もちろん閾値マトリックスには、より多数の閾値を記憶しておくことが可能である。ステップS20では、画像データ上に閾値マトリックスを重ねたときに、対称画素に相当する位置に記憶されている閾値を、その対象画素に対応付けられた閾値として読み出す。
図1の中で「対称画素選択」と表示した枠内には、画像データ上に閾値マトリックスを重ねている様子を概念的に示している。表示中の細い破線は、二次元的に配列された複数の画素を示しており、太い破線は閾値マトリックスを示している。通常、閾値マトリックスの大きさは、画像データの大きさよりも小さいので、閾値マトリックスは位置を移動させながら繰り返して使用される。こうして閾値を読み出したら、対象画素の階調値と比較することにより、対象画素についてのドット形成の有無を判断する(ステップS30)。次いで、画像データを構成する全ての画素についてドット形成有無の判断を行ったか否かを判断し(ステップS40)、全ての画素について判断を完了するまで、上述した一連の処理を繰り返し行う。
ここで、本発明の画像処理装置10では、画像データを迅速に変換するために、対象画素を所定の方法で順次選択していく。図中の「対象画素選択」と表示した枠内には、対象画素を選択する様子が例示されている。説明の都合上、二次元的に配列された複数の画素の中の画素列をラスタと呼び、画像データは複数本のラスタが集まって構成されているものと考える。また、これらラスタには符番が付されており、「ラスタ1」,「ラスタ2」・・・と、それぞれのラスタを識別するものとする。
対象画素の選択に際しては、先ず初めに、所定本数の隣接するラスタをまとめてラスタ群を形成する。図中の例示では、ラスタ1とラスタ2、ラスタ3とラスタ4、あるいはラスタ5とラスタ6、というように2本ずつのラスタをまとめてラスタ群を形成している。すなわち、図示した例では、1つのラスタ群には、ラスタ2本分に相当する複数の画素が含まれていることになる。次いで、ラスタ群を構成するこれら複数の画素の中から、所定の順番に従って順次、対象画素を選択していく。図中の例示に従って説明すると、先ず初めに、ラスタ1の左端の画素を対象画素として選択し、次いでラスタ2の左端の画素を選択する。その次は、ラスタ1の左から2番目の画素を選択し、続いてラスタ2の左から2番目の画素を選択する。こうして、ラスタ1とラスタ2とから、交互に対象画素を選択していく。図中で、ラスタ1およびラスタ2の上を左端から右方向に向かってジグザグ状に進む実線は、これら2つのラスタから交互に対象画素が選択される様子を模式的に表したものである。このように、2つのラスタから交互に対象画素を選択しながらドット形成の有無を判断することで、ラスタ1およびラスタ2が並行してドット列に変換されることになる。
以上のようにしてラスタ1およびラスタ2の全画素について、ドット形成の有無を判断したら、今度はラスタ3およびラスタ4の画素から対象画素を選択する。すなわち、ラスタ3の左端の画素を対象画素として選択し、次いでラスタ4の左端の画素、ラスタ3の左から2番目の画素、ラスタ4の左から2番目の画素というように、ラスタ3およびラスタ4の画素を交互に対象画素として選択していく。図中でラスタ2の直ぐ下に、右側からラスタ3の左端の画素に向かう太い破線の矢印は、ラスタ1およびラスタ2の処理が終了して、ラスタ3およびラスタ4の処理に移ったことを模式的に示している。そして、ラスタ3およびラスタ4の画素を交互に選択しながら、全て画素についてドット形成の有無を判断したら、今度はラスタ5およびラスタ6の画素から対象画素を選択する。ラスタ5およびラスタ6の処理を終了したら、その次はラスタ7およびラスタ8、というようにラスタ群毎に複数のラスタを並行してドット列に変換していく。
尚、以上の説明では、それぞれのラスタ群は2本のラスタから構成されているものとして説明したが、より多数のラスタから構成することも可能である。また、ラスタ群を構成する各画素を順次、対象画素として選択する順序は、以上に説明したものに限られず、ラスタ群を構成するラスタが並行してドット列に変換されるような順序であれば、種々の順序とすることができる。
このようにラスタ群を構成する複数のラスタを並行してドット列に変換することとすれば、次のような種々の理由から迅速に変換することが可能である。
一般に画像データは、近傍の画素間には近似した階調値が対応付けられる傾向がある。複数の画素について連続してドット形成の有無を判断する場合、これらの画素が互いに近似した階調値を有していれば、判断を行うためにCPUが内部で生成する実行コードがキャッシュメモリに残っている可能性が高くなる。実行コードが残っていれば、CPUはキャッシュメモリから実行コードを読み出して処理を進めることができるので、実行コードを生成する必要が無くなり、その分だけ処理を迅速化することが可能となる。尚、このように必要な実行コードあるいはデータなどがキャッシュメモリに残っている確率は、キャッシュのヒット率と呼ばれることがある。ここで、画素は二次元的に配列されているから、縦横斜めのいずれの方向に近接する画素にも同様に近似した階調値が対応付けられている可能性が高い。例えば、図1に示されたラスタ1の左端の画素を例にとって説明すれば、この画素の周辺の画素、すなわちラスタ1の左端から2番目の画素、ラスタ2の左端あるいは左端から2番目の画素はいずれも、ラスタ1の左端にある画素と近似した階調値が対応付けられている可能性が高い。従って、ラスタ1およびラスタ2の画素から交互に対象画素を選択してドット形成有無を判断して行けば、二次元的に広がる画素の中から階調値の近似した画素を連続して処理することができるので、その分だけキャッシュのヒット率を向上させて、処理を迅速化することが可能となる。
また、画像処理を行うCPUがパイプライン処理、あるいはパイプライン処理の分岐予測を行っている場合は、次のような理由から、複数のラスタを並行して処理することでより一層の迅速化を実現することができる。階調値が近似した画素を連続して処理する場合、同様な処理が繰り返される可能性が高くなる。例えば、連続して処理する画素の階調値が充分に低い場合は、いずれの画素についてもドットを形成しないと判断される可能性が高くなる。すなわち、これらの画素を処理している間は、CPUの内部では同様な処理が連続して行われる可能性が高くなる。このため、パイプライン処理の効率や分岐予測の的中率が向上し、その結果、処理を高速化することができる。上述したように、複数のラスタを並行して処理してやれば、縦横斜め方向に近接した画素を連続して処理することができるので、ラスタ1本ずつドット列に変換する場合よりも、階調値が近似した画素を連続して処理することができる。その結果、パイプライン処理の効率や分岐予測の的中率を向上させることができ、その分だけ処理を迅速化することが可能となる。
本発明の画像処理装置には、種々の態様が存在している。以下では、これら各種の態様について、実施例を用いて詳細に説明する。
B.第1実施例:
B−1.装置構成:
図2は、第1実施例の画像処理装置としてのコンピュータ100の構成を示す説明図である。コンピュータ100は、CPU102を中心に、ROM104やRAM106などを、バス116で互いに接続して構成された周知のコンピュータである。また、CPU102にはキャッシュメモリが内蔵されており、ROM104やRAM106などから情報を読み出す際には、先ずキャッシュメモリにアクセスして、必要な情報が残っていればキャッシュメモリから読み出すことで、処理の高速化を図っている。更に、CPU102の内部では、いわゆるパイプライン処理と呼ばれる並列演算方式により処理の高速化が図られており、パイプライン処理を効果的に機能させるために分岐予測制御も行われている。
コンピュータ100には、フレキシブルディスク124やコンパクトディスク126のデータを読み込むためのディスクコントローラDDC109や、周辺機器とデータの授受を行うための周辺機器インターフェースP−I/F108、CRT114を駆動するためのビデオインターフェースV−I/F112等が接続されている。P−I/F108には、後述するカラープリンタ200や、ハードディスク118等が接続されている。また、デジタルカメラ120や、カラースキャナ122等をP−I/F108に接続すれば、デジタルカメラ120やカラースキャナ122で取り込んだ画像を印刷することも可能である。また、ネットワークインターフェースカードNIC110を装着すれば、コンピュータ100を通信回線300に接続して、通信回線に接続された記憶装置310に記憶されているデータを取得することもできる。
図3は、第1実施例の画像処理装置に組み合わせて使用されるカラープリンタ200の概略構成を示す説明図である。カラープリンタ200はシアン,マゼンタ,イエロ,ブラックの4色インクのドットを形成可能なインクジェットプリンタである。もちろん、これら4色のインクに加えて、染料濃度の低いシアン(淡シアン)インクと染料濃度の低いマゼンタ(淡マゼンタ)インクとを含めた合計6色のインクドットを形成可能なインクジェットプリンタを用いることもできる。更には、明度の低い(暗い)イエロ(ダークイエロ)インクを加えた合計7色のインクドットを形成可能なインクジェットプリンタを用いても良い。尚、以下では場合によって、シアンインク,マゼンタインク,イエロインク,ブラックインク,淡シアンインク,淡マゼンタインク,ダークイエロインクのそれぞれを、Cインク,Mインク,Yインク,Kインク,LCインク,LMインク,DYインクと略称するものとする。
カラープリンタ200は、図示するように、キャリッジ240に搭載された印字ヘッド241を駆動してインクの吐出およびドット形成を行う機構と、このキャリッジ240をキャリッジモータ230によってプラテン236の軸方向に往復動させる機構と、紙送りモータ235によって印刷用紙Pを搬送する機構と、ドットの形成やキャリッジ240の移動および印刷用紙の搬送を制御する制御回路260とから構成されている。
キャリッジ240には、Kインクを収納するインクカートリッジ242と、Cインク,Mインク,Yインクの各種インクを収納するインクカートリッジ243とが装着されている。キャリッジ240にインクカートリッジ242,243を装着すると、カートリッジ内の各インクは図示しない導入管を通じて、印字ヘッド241の底面に設けられた各色毎のインク吐出用ヘッド244ないし247に供給される。図4は、印字ヘッド241の底面に、複数のノズルNzが設けられている様子を示す説明図である。図示されてるように、印字ヘッド241の底面には各色のインク吐出用ヘッド毎に、複数のノズルNzが一定のノズルピッチkで千鳥状に2列に配列されている。
図3に示した制御回路260は、CPU261とROM262とRAM263等から構成されており、キャリッジモータ230と紙送りモータ235の動作を制御することによってキャリッジ240の主走査と副走査とを制御するとともに、コンピュータ100から供給される印刷データに基づいて、各色毎のインク吐出用ヘッドを駆動し適切なタイミングでインク滴を吐出する。こうして、制御回路260の制御の下、印刷媒体上の適切な位置に各色のインクドットを形成することによって、カラープリンタ200はカラー画像を印刷することができる。
尚、各色のインク吐出用ヘッドを駆動してインク滴を吐出する方法には、種々の方法を適用することができる。すなわち、ピエゾ素子を用いてインクを吐出する方式や、インク通路に配置したヒータでインク通路内に泡(バブル)を発生させてインク滴を吐出する方法などを用いることができる。また、インクを吐出する代わりに、熱転写などの現象を利用して印刷用紙上にインクドットを形成する方式や、静電気を利用して各色のトナー粉を印刷媒体上に付着させる方式のプリンタを使用することも可能である。
更には、インク吐出ヘッドから吐出するインク滴の大きさを制御したり、あるいは微細なインク滴を複数個吐出して、吐出するインク滴の数を制御するといった方法を用いて、印刷用紙上に形成されるインクドットの大きさを制御な可能なプリンタ、いわゆるバリアブルドットプリンタを用いることも可能である。
B−2.画像データ変換処理の概要:
図5は、第1実施例の画像処理装置としてのコンピュータ100が、受け取った画像データに所定の画像処理を加えることにより、該画像データを印刷データに変換する処理の流れを示すフローチャートである。かかる処理は、コンピュータ100のオペレーティングシステムがプリンタドライバを起動することによって開始され、CPU102の機能を用いて実行される。以下、図5に従って、第1実施例の画像データ変換処理について簡単に説明する。
プリンタドライバは、画像データ変換処理を開始すると、先ず初めに、カラー画像データの読み込みを開始する(ステップS100)。ここで読み込まれるカラー画像データは、二次元的に配列された複数の画素に、赤色(R),緑色(G),青色(B)の各色についての階調値が対応付けられたいわゆるRGB画像データである。
次いで、取り込んだ画像データの解像度を、カラープリンタ200が印刷するための解像度に変換する(ステップS102)。カラー画像データの解像度が印刷解像度よりも低い場合は、補間演算を行うことで隣接画像データ間に新たなデータを生成し、逆に印刷解像度よりも高い場合は、一定の割合でデータを間引くことによって画像データの解像度を印刷解像度に変換する。また簡便には、補間演算を行う代わりに、隣接する画素の間に、いずれかの画素と同じ階調値の画素を新たに生成することもできる。
こうして解像度を変換すると、カラー画像データの色変換処理を行う(ステップS104)。色変換処理とは、R,G,Bの階調値の組み合わせによって表現されているRGB画像データを、C,M,Y,Kなどのカラープリンタ200で使用する各色の階調値の組み合わせによって表現された画像データに変換する処理である。色変換処理は、色変換テーブル(LUT)と呼ばれる3次元の数表を参照することで迅速に行うことができる。
色変換処理を終了すると、次は階調数変換処理を開始する(ステップS106)。階調数変換処理とは次のような処理である。色変換処理によって得られた画像データは、C,M,Y,Kの各色毎に256階調の階調幅を持つデータとなっている。これに対し、第1実施例のカラープリンタ200では、「ドットを形成する」,「ドットを形成しない」のいずれかの状態しか採り得ない。すなわち、本実施例のカラープリンタ200は局所的には2階調しか表現し得ない。そこで、256階調を有する画像データを、カラープリンタ200が表現可能な2階調で表現された画像データに変換する必要がある。このような階調数の変換を行う処理が階調数変換処理である。
第1実施例の階調数変換処理では、いわゆるディザ法と呼ばれる手法を用いて処理を行う。ディザ法とは、画素の階調値と、その画素に対応付けられた閾値とを比較して、階調値の方が大きければその画素にドットを形成すると判断し、階調値の方が小さければドットを形成しないと判断することによって、画像データをドット形成の有無による表現形式のデータに変換する手法である。ディザ法では、画素に対応付けられる複数の閾値は、マトリックス状に配列した状態で記憶されており、ドット形成の有無を判断しようとする画素の画像データ中での位置に応じて、マトリックス中の適切な閾値が対応付けられている。本明細書では、こうした複数の閾値を記録したマトリックスを閾値マトリックスと呼ぶことにする。
図6(a)は、閾値マトリックスの一部を拡大して、複数の閾値が記憶されている様子を例示した説明図である。例示の閾値マトリックスには、縦横それぞれ64画素の正方形のマトリックスに合計4096画素分の閾値が記憶されている。もちろん、閾値マトリックスの大きさはこれに限らず、必要に応じて種々の大きさとすることができる。また、必ずしも正方形のマトリックスに限らず、例えば縦横の画素数の異なるマトリックスとすることも可能である。尚、図6(a)に示すような大きな閾値マトリックスを用いたのでは説明が煩雑になってしまうので、以下では、閾値マトリックスは図6(b)に示すような小さなマトリックスであるものとして説明する。
図7は、画像データに閾値マトリックスを適用して、画素毎にドット形成の有無を判断している様子を概念的に示した説明図である。図7で細い破線で示された矩形は、1つ1つが画素を表している。画像データは、二次元的に配列された複数の画素の各々に階調値が対応付けられた形式で表現されている。説明を簡単にするために、ここでは全ての画素に、階調値64が対応付けられているものとする。図7(a)は、こうした画像データに閾値マトリックスを適用した様子を模式的に示している。図7(a)では、閾値マトリックスを太い実線で表している。前述したように閾値マトリックスのそれぞれのマス目には、予め閾値が記憶されている。図7(a)に示すように、画像データの上に閾値マトリックスを重ねることにより、画像データを構成する各画素と、閾値マトリックスの各マス目とを対応付けることができる。
ディザ法では、こうして画像データの画素と閾値マトリックスのマス目とを対応付けた後、各画素の階調値と、各マス目に記憶されている閾値とを比較する。そして、画素の階調値の方が大きい画素にはドットを形成すると判断し、そうでない画素にはドットを形成しないと判断する。ここでは、全ての画素には階調値64が記憶されているものとしているから、閾値マトリックスに記憶された閾値が63以下の画素については「ドットを形成する」と判断され、閾値が64以上の画素については「ドットを形成しない」と判断されることになる。図7(a)では、ドットを形成すると判断された画素には、ハッチングを付して表示している。
画像データは非常に多くの画素から構成されているので、通常は閾値マトリックスよりも大きなサイズとなっている。従って、全ての画素についてのドット形成有無を判断するために、閾値マトリックスの位置を画像データに対して移動させながら、同じマトリックスを繰り返し使用する。図7(b)は、こうして全ての画素についてドット形成の有無を判断した結果を示している。以上のようにしてドット形成の有無を判断することにより、画像データの階調値に応じた適切な比率で、しかも各ドットを互いに分散させた状態で形成することができる。例えば、ここでは画像データの階調値は64であるとしており、これは、フルスケールの階調値256に対して約1/4に相当する。これに対応して図7(b)では、全画素の約1/4の画素にドットが形成されている。ドットが形成される密度は、画像データの階調値が大きくなれば高くなり、階調値が小さくなればそれに連れて低くなる。この様に、ディザ法では閾値マトリックスの適切な閾値を設定してやることにより、画像データの階調値に応じて適切な密度でドットを形成することができる。
以上の説明では、あたかも閾値マトリックス内の全画素についてドット形成の有無を判断し、その後、閾値マトリックスの位置をずらしてマトリックスを新たな画素に対応付けて、これら画素についてのドット形成有無を判断するかのように説明した。しかし、これは説明の都合上の理由によるものであり、実際には、閾値マトリックス毎にドット形成有無を判断するのではなく、ラスタ単位でドット形成の有無を判断している。すなわち、1本のラスタ上を左端から右方向の進みながらドット形成の有無を判断し、ラスタ上の全画素について判断を終了したら、下のラスタの処理を開始する。このように、実際には、ラスタ1本ずつドット形成の有無を判断していた。これに対して、本実施例の階調数変換処理では、複数のラスタのドット形成の有無を並行して判断することにより、迅速な処理が可能となっている。複数ラスタのドット形成有無の判断を並行して行う方法については、後ほど詳述する。
図5に示した画像データ変換処理では、以上のようにして階調数変換処理を終了した後、インターレース処理を開始する(図5のステップS108)。インターレース処理は、ドット形成の有無による表現形式に変換された画像データを、ドットの形成順序を考慮しながらカラープリンタ200に転送すべき順序に並び換える処理である。プリンタドライバは、インターレース処理を行って得られた画像データを、最終的に印刷データとしてカラープリンタ200に出力する(ステップS110)。カラープリンタ200は、こうして供給された印刷データに従って印刷媒体上に各色のインクドットを形成する。その結果、画像データに対応したカラー画像が印刷媒体上に印刷される。
以下では、第1実施例の階調数変換処理において、複数のラスタについて並行してドット形成の有無を判断することにより、画像データの階調数を迅速に変換する処理について説明する。
B−3.第1実施例の階調数変換処理:
図8は、第1実施例の階調数変換処理の流れを示すフローチャートである。かかる処理は、コンピュータ100のプリンタドライバが、図5に示した画像データ変換処理の中で行う処理である。尚、図8に示した処理は、C,M,Y,Kの各色毎に行われるが、説明が煩雑なることを避けるために、以下では特に色を特定することなく説明する。また、図9は、プリンタドライバが第1実施例の階調数変換処理に従って、ドット形成の有無を判断している様子を概念的に示した説明図である。以下、図9を参照しながら、図8のフローチャートに従って説明する。
プリンタドライバは、階調数変換処理を開始すると先ず初めに、所定本数の隣接するラスタをまとめてラスタ群を形成する処理を行う(ステップS200)。ここでは、ラスタを2本ずつまとめてラスタ群を形成するものとする。もちろん、2本に限らず、より多数のラスタをラスタ群としてまとめることとしても良い。図9では、画像の一番上にある「ラスタ1」とその下にある「ラスタ2」とにハッチングを施すことによって、これらラスタをラスタ群としてまとめていることを表している。
次いで、ラスタ群に含まれている複数の画素の中から、ドット形成の有無を判断しようとする対象画素を1つ選択する(ステップS202)。初めは、画像データの一番左上にある画素、すなわちラスタ1の左端の画素を対象画素として選択する。図9では、この画素は、[1]と符番して表示されている。
その後、選択した対象画素の階調値Dtを読み込み(ステップS204)、次いで対象画素に対応する閾値thを閾値マトリックスから読み込む処理を行う(ステップS206)。ここで、対象画素に対応する閾値とは、図7(a)を用いて前述したように、画像データ上に閾値マトリックスを重ねたときに、対象画素に重なるような位置の、閾値マトリックスのマス目に記憶されている閾値である。図9中に太い破線で示した矩形は、画像データの上に閾値マトリックスが重ねられている様子を模式的に表したものである。
こうして対象画素の階調値Dtと、対応する閾値thとを読み出したら、これらの大小関係を比較する(ステップS208)。そして、階調値Dtの方が大きい場合は(ステップS208:yes)、対象画素にドットを形成すると判断して、ドット形成の有無の判断結果を示す変数Drに、ドットを形成することを意味する値「1」を書き込む(ステップS210)。逆に、閾値thの方が大きい場合は、判断結果を示す変数Drに、ドットを形成しないことを意味する値「0」を書き込む処理を行う(ステップS212)。
以上のようにして、選択した対象画素についてのドット形成の有無を判断したら、ラスタ群に含まれる全ての画素を対象画素として選択したか否かを判断する(ステップS214)。ここでは、未だ、図9中で「1」と符番した画素しか処理しておらず、ラスタ群には未処理の画素が多数残っている。そこで、ステップS214の処理においては「no」と判断し、ステップS202に戻って、新たな対象画素を選択する。
新たな対象画素は、ラスタ群に含まれる各ラスタから順次、対象画素が選択されるように、所定の規則に従って行われる。ここでは、次のような規則に従って対象画素を選択するものとする。
<<規則1>>: 対象画素が奇数番目のラスタ上にあるときは、対象画素の直ぐ下にある画素を新たな対象画素として選択する。すなわち、左右方向には画素位置を変更することなく、ラスタの番号を1つだけインクリメントさせる。
<<規則2>>: 対象画素が偶数番目のラスタ上にあるときは、対象画素の直ぐ右上にある画素を新たな対象画素として選択する。すなわち、ラスタ番号を1つだけデクリメントするとともに、画素位置を示す番号は1つだけインクリメントさせる。
この様な規則に従って新たな対象画素を選択する結果、図9で[1]と符番した画素の次には、図中で[2]と符番した画素が新たな対象画素として選択されることになる。こうして選択した符番[2]の画素について、上述した様にステップS204ないしステップS214の処理を行った後、再びステップS202に戻って、次の対象画素を選択する。上述した規則に従えば、符番[2]の画素の次には、符番[3]の画素が新たな対象画素として選択される。以下、同様にして、符番[4]の画素、符番[5]の画素、符番[6]の画素と順次、対象画素が選択されて、それぞれの画素についてドット形成の有無が判断されていく。
また、図9に示すように、符番[12]の画素について判断した時点で、閾値マトリックスの右端に達してしまうので、符番[13]の画素についてドット形成の有無を判断する際には、閾値マトリックスを右方向に移動させればよい。図9に示した矢印は、閾値マトリックスを移動させる様子を模式的に表現したものである。
以上のようにして、ラスタ群に含まれる複数の画素から、所定の順序に従って、対象画素を順次選択しながらドット形成の有無を判断していく。こうすれば、ラスタ1およびラスタ2を並行させながら、ドット形成の有無を判断することができる。
こうしてラスタ1およびラスタ2に含まれる全ての画素についてドット形成の有無を判断したら、すなわち図8のステップS214において「yes」と判断されたら、今度は、画像データに含まれる全てのラスタの処理を終了したか否かを判断する(ステップS216)。ここでは、ラスタ1およびラスタ2の2つのラスタしか処理しておらず、未だ多数のラスタが未処理のまま残っているので、ステップS216では「no」と判断され、ステップS200に戻って、ラスタ3およびラスタ4を新たなラスタ群を生成する処理を行う。こうして生成した新たなラスタ群についても、同様にして対象画素を選択することにより、ラスタ3およびラスタ4を並行しながらドット形成の有無を判断していく。そして、ラスタ3およびラスタ4について全ての画素について判断を終了したら、今度はラスタ5およびラスタ6を新たなラスタ群として生成し、これらラスタについてドット形成の有無を判断する。画像データに含まれるラスタを全て処理してしまう迄、以上のような一連の処理を繰り返す。そして、全ラスタの処理を終了したら(図8のステップS216:yes)、図8に示した第1実施例の階調数変換処理を抜けた後、図5の画像データ変換処理に復帰する。
以上に説明したように、第1実施例の階調数変換処理によれば、ラスタ群としてまとめられた2本のラスタについて、並行してドット形成の有無を判断することができる。前述したように、画像データ中の近接した画素には、互いに近似した階調値が対応付けられる傾向にあるから、こうして複数のラスタを並行して処理すれば、キャッシュのヒット率、パイプライン処理の効率、あるいは分岐予測の的中率が向上するので、階調数変換処理を迅速に行うことができる。その結果、画像データをドット形成有無による表現形式のデータに迅速に変換することができるので、画像を速やかに印刷することが可能となる。
B−4.変形例:
以上に説明した第1実施例では、ラスタを2本ずつ、ラスタ群としてまとめるものとして説明したが、2本ではなくより多数のラスタをラスタ群としてまとめることとしても良い。
図10(a)は、一例として、ラスタ3本ずつをラスタ群としてまとめている様子を示している。図中で、太い破線で示した矩形は、3本のラスタをラスタ群としてまとめた様子を模式的に示したものである。このように3本のラスタをラスタ群としてまとめた場合も、所定の規則に従って、これらのラスタから対象画素を順次選択してやればよい。こうすれば、これら複数のラスタを並行させてドット形成の有無を判断することができる。例えば、対象画素の番号を3で割ったときの余りに着目して、次のような規則に基づいて対象画素を選択することができる。
<<規則3>>: 対象画素があるラスタの番号が3で割り切れない場合は、左右方向には画素位置を変更することなく、ラスタの番号を1つだけインクリメントさせる。
<<規則4>>: 対象画素があるラスタの番号が3で割り切れる場合は、ラスタ番号を2つだけデクリメントするとともに、画素位置を示す番号は1つだけインクリメントさせる。
この様な規則に基づいて対象画素を順次選択していけば、図10(a)に矢印で示したように、符番[1]の画素、符番[2]の画素、符番[3]の画素、符番[4]の画素と順番に対象画素を選択して、これら画素について順次ドット形成の有無を判断することができる。
また、ラスタ群を構成する複数の画素から対象画素を選択する方法は、上述したものに限られず種々の方法を適用することが可能である。例えば、図10(b)に矢印で示したように、ラスタ群を斜め方向に横切るようにして順次、対象画素を選択することとしても良い。
あるいは、ラスタ群を小さなブロックに区分けし、それぞれのブロックを構成する画素を、所定の順番で順次選択することとしても良い。例えば、図10(c)に示した例では、2本のラスタからなるラスタ群を、縦横2画素ずつ合計4画素からなる矩形の小さなブロックに区分けし、各ブロック内の画素を所定の順序で選択する。図10(c)に即して説明すると、初めに[1]と符番された画素を選択し、次に右隣の[2]と符番された画素を選択する。その次は、符番[1]の画素の真下にある[3]と符番された画素を選択し、最後は、その右隣にある[4]と符番された画素を選択する。こうして各ブロック毎にブロック内の画素を順番に選択しても良い。
また、この様にして各ブロック内の画素を選択すれば、ブロック内で最初に選択した符番[1]からの距離にほぼ対応して、ブロック内の画素を順次選択することができる。画素間の距離が近いほど、近似した階調値が対応付けられている可能性が高くなることから、距離にほぼ対応するようにして画素を順次選択してやれば、キャッシュのヒット率、パイプライン処理の効率、あるいは分岐予測の的中率を向上させることができ、延いては階調数変換処理を高速化することが可能となる。
また、図10(c)に示した例示では、初めにラスタ1の画素(図中で[1]および[2]と符番した画素)を全て選択し、その後、ラスタ2の画素(図中で[3]および[4]と符番した画素)を全て選択している。このように、ラスタ群が小さなブロックに区分けされている場合は、ブロック内ではラスタ単位で対象画素を選択することとしてもよい。この様にしても全体として見れば、ラスタ群を構成するラスタを並行して処理することが可能である。
C.第2実施例:
上述したように、複数のラスタをラスタ群としてまとめ、各ラスタから対称画素を所定の順序で選択しながら階調数変換処理を行う場合には、画素を選択する順序を考慮しながら閾値マトリックスの閾値を格納することで、処理の高速化を図ることが可能である。以下では、こうした第2実施例の階調数変換処理について説明する。
C−1.第2実施例の階調数変換処理における閾値の格納方法:
説明の便宜上、閾値マトリックスを構成する各マス目を、次の様に符番する。例えば、閾値(m,n)は、閾値マトリックスのm行n列目のマス目に記憶されている閾値を示すものとする。こうして各マス目を識別することにより、閾値マトリックスに記憶されている複数の閾値を識別することが可能となる。図11は、閾値マトリックスに記憶されている各閾値がこのようにして符番され、識別されている様子を表した説明図である。
第2実施例の階調数変換処理では、各ラスタから対称画素を選択する順序を考慮して、閾値マトリックスの各閾値を格納する。以下では、対称画素を図9に示した順序で選択する場合を例にとって、第2実施例の階調数変換処理について説明する。前述したように、図9に示した例では、ラスタ2本ずつをまとめてラスタ群を構成し、対称画素が奇数番目のラスタ上にあるときは、対称画素の直ぐ下の画素を新たな対称画素として選択し(前述の規則1を参照)、対称画素が偶数番目のラスタ上にあるときは、対称画素の直ぐ斜め右上の画素を新たな対称画素として選択する(前述の規則2を参照)。
対称画素をこのような順序で選択することに対応して、第2実施例では、閾値マトリックスの閾値を次のような順番で格納する。先ず、閾値マトリックスの1行目と2行目とを組にする。便宜上、以下ではこの組を「ユニットA」と呼ぶことにする。これは、対称画素の選択に際して、隣接するラスタを2本ずつまとめてラスタ群を形成することに対応している。
そして、先ず初めに、閾値マトリックスの1行1列目のマス目に記憶されている閾値(1,1)を記憶し、次いでその真下のマス目に記憶されている閾値(2,1)を記録する。これは、対称画素を選択する際の上述した<<規則1>>、すなわち、対称画素が奇数番目のラスタ上にあるときは、直ぐ下の画素を新たな対称画素として選択することに対応している。またハードウェア上では、このことは、コンピュータ100のROM104、あるいはRAM106の所定のアドレスに閾値(1,1)が記憶され、その次のアドレスに閾値(2,1)が記憶されることに相当する。
次いで、2行1列目のマス目の直ぐ右上のマス目に記憶されている閾値(1,2)を記憶する。これは、対称画素を選択する際の上述した<<規則2>>、すなわち、対称画素が偶数番目のラスタ上にあるときは、直ぐ右上の画素を新たな対称画素として選択することに対応している。ハードウェア上では、閾値(2,1)が記憶されているアドレスの次のアドレスに、閾値(1,2)が記憶されることになる。
閾値(2,1)を記憶したら、再び規則1に対応して直ぐ下のマス目の閾値(1,2)を記憶し、次いで規則2の対応させて閾値(2,2)を記憶する。以下、同様にして、閾値(1,3)、閾値(2,3)、閾値(1,4)と順次記憶していく。こうして、閾値マトリックスの1行目および2行目(すなわちユニットA)に含まれている閾値をすべて記憶したら、今度は3行目の閾値と4行目の閾値とをまとめて「ユニットB」を形成する。そして、ユニットBに含まれる閾値についても、規則1および規則2に対応させた順序で順次記憶していく。すなわち、先ず初めにユニットBの左上隅のマス目に記憶されている閾値(3,1)を記憶し、次いで、その真下のマス目の閾値(4,1)を記憶する。更に直ぐ右上のマス目の閾値(3,2)を記憶し、以下同様に、閾値(4,2)、閾値(3,3)と順次記憶していく。こうして、ユニットBに含まれるすべての閾値を記憶し終わったら、今度は、閾値マトリックスの5行目の閾値および6行目の閾値を「ユニットC」としてまとめ、ユニットCに含まれる閾値も同様にして順次記憶していく。
図12(a)は、このように閾値マトリックスを2行ずつの3つのユニットに区分けし、ユニット内では規則1および規則2を反映させながら、閾値を順次記憶する様子を模式的に示した説明図である。図中でカギ括弧内に示した数字は、閾値が記憶される番数を示している。例えば、閾値マトリックスのマス目に示された[5]という表示は、そのマス目の閾値が、すべての閾値の中で5番目に記憶されることを示している。図12(b)は、コンピュータ100のROM104あるいはRAM106上で、これら閾値が連続したアドレスに順次記憶されている様子を模式的に示している。
C−2.第2実施例の階調数変換処理:
このように、複数のラスタをラスタ群としてまとめ、各ラスタを並行させながら画像データの階調数を変換する場合には、各ラスタから対称画素を選択する順序を考慮しながら閾値マトリックスの閾値を格納することで、階調数変換処理を迅速に行うことができる。以下では、図8および図9を流用しながら第2実施例の階調数変換処理について説明する。
図8のフローチャートを用いて前述したように、第2実施例の階調数変換処理においても、先ず初めに隣接する所定のN本のラスタをラスタ群としてまとめる(図8のステップS200相当)。そして、ラスタ群を構成する複数の画素の中から、所定の順番に従って対称画素を順次選択し、対称画素の階調値と閾値とを比較して対称画素にドットを形成するか否かを判断する処理を、繰り返し行う(図8のステップS202ないしステップS214相当)。ラスタ群に含まれるすべての画素についてドット形成の有無を判断したら(ステップS214:yesに相当)、新たなラスタ群を生成して(ステップS200相当)、新たなラスタ群の各画素について同様の処理を繰り返す。こうして画像データに含まれるすべてのラスタについて処理を完了するまで、同様の処理を繰り返す。
一例として、隣接するラスタを2本ずつラスタ群としてまとめ、前述した規則1および規則2に従って、ラスタ群に含まれる複数の画素から対称画素を順次選択した場合は、図9に模式的に示すようにして階調数変換処理が行われる。すなわち、先ず初めに、ラスタ1の左端の画素(図9中で[1]と符番された画素)について階調値と閾値とが読み出され、これらの大小関係に基づいてドットを形成するか否かが判断される。次いで、図9中で[2]と符番された画素について階調値と閾値とが読み出され、ドット形成の有無が判断される。以下、同様にして[3]、[4]、[5]と符番された画素について、それぞれ階調値と閾値とが読み出されてドット形成有無が判断される。
ここで画像データは、実際にはコンピュータ100のRAM106上に記憶されているから、符番[1]の画素、符番[2]の画素、符番[3]の画素と階調値を読み出すためには、CPU102は階調値を読み出す度にアドレス計算を行って、RAM106上でこれら画素の階調値が記憶されているアドレス値を算出する必要がある。これに対して、閾値については、対象画素が選択される順序を考慮して予め記憶されているから、閾値を読み出すために複雑なアドレス計算を行う必要がない。例えば、図9に示す順序で対象画素が選択されることを考慮して、図12に示したように閾値マトリックスの各閾値を記憶しておけば、図9上で符番[1]の閾値が記憶されているアドレスを求めてやれば、それ以降はアドレス値を1つずつインクリメントするだけで、符番[2]から符番[12]までの画素の閾値を順次読み出すことができる。すなわち、図12に示したユニットAの閾値を先頭から順番に読み出すだけで、各画素に対応した閾値を読み出すことができる。
また、符番[13]の画素については、前述したように閾値マトリックスの位置を画像データに対してラスタ方向に移動させる結果、符番[1]の画素と同じ閾値が使用される。従って、符番[13]の画素の閾値は、符番[1]についての閾値が記憶されているアドレスから読み出せばよい。それ以降は同様にして、アドレス値を1つずつインクリメントしながら、ユニットAの閾値を順番に読み出すことで、符番[14]から符番[24]までの画素の閾値を順次読み出すことができる。これ以降の画素についても全く同様にして閾値を読み出すことができ、結局、ラスタ1およびラスタ2からなるラスタ群を処理している間は、ユニットAの閾値を繰り返し読み出すだけで各画素についての閾値を読み出すことができる。
ラスタ1およびラスタ2に含まれる画素をすべて処理したら、今度はラスタ3およびラスタ4をラスタ群としてまとめ、対象画素を順次選択して、各画素の階調値と閾値とを読み出しながらドット形成の有無を判断する。ここで、対象画素の閾値は、図12を用いて前述した閾値マトリックスのユニットBの閾値を繰り返し読み出すだけでよい。ラスタ3およびラスタ4の画素をすべて処理したら、今度はラスタ5およびラスタ6をラスタ群としてまとめ、今度は閾値マトリックスのユニットCの閾値を繰り返し読み出しながら、各画素についての階調数変換処理を行う。こうして、ラスタ5およびラスタ6についての処理を終了したら、ラスタ7およびラスタ8をラスタ群としてまとめて、再びユニットAの閾値を繰り返し読み出しながら各画素についての階調数変換処理を行う。以降のラスタにつても全く同様にして、閾値マトリックスの各ユニットから、繰り返し閾値を読み出して行けばよい。
図13は、コンピュータ100のROM104あるいはRAM106上に記憶されている閾値マトリックスの閾値を、ユニット毎に繰り返し読み出している様子を模式的に示した説明図である。図示するように、閾値マトリックスの閾値は、ユニットA、ユニットB、ユニットCの各ユニットに分けて記憶されており、そして各ユニット内では各閾値は、階調数変換処理中で対象画素を選択する順序を考慮した所定の順番で、連続したアドレスに記憶されている。
コンピュータ100のプリンタドライバが、ラスタ1およびラスタ2のラスタ群の階調数変換処理を行っている間は、図13の細い実線の矢印で示したように、ユニットA内に記憶されている閾値を順番に繰り返し読み出して使用する。階調数変換処理を行うラスタ群が、ラスタ3およびラスタ4からなるラスタ群に移った場合は、図中に細い破線の矢印で示したように、ユニットB内に記憶されている閾値を順番に繰り返し読み出して使用し、処理するラスタ群が、ラスタ5およびラスタ6からなるラスタ群に移った場合は、図中に細い一点鎖線の矢印で示したように、ユニットC内に記憶されている閾値を順番に繰り返し読み出して使用する。次いで、処理するラスタ群がラスタ7およびラスタ8からなるラスタ群に移った場合には、図中に太い実線の矢印で示したように、再び先頭のアドレス値に戻って、ユニットA内に記憶されている閾値を順番に繰り返し読み出して使用する。以降、画像データに含まれる全画素について階調数変換処理を終了するまで、同様にしてユニット内の閾値を読み出していけばよい。
以上に説明したように、第2実施例の階調数変換処理においては、対象画素を選択する順序を考慮して、閾値マトリックスの各閾値を適切な順番で記憶しておく。こうすることで、ドット形成有無を判断するに際して、対象画素に対応する閾値を読み出すための複雑なアドレス計算を行うことなく、閾値を読み出してドット形成有無を判断することが可能となる。そのため、第2実施例の階調数変換処理では、迅速な変換を行うことが可能となっている。
以上の説明では、対象画素を図9に示した順番で選択する場合、すなわち、ラスタを2本ずつまとめてラスタ群を構成し、前述した<<規則1>>および<<規則2>>に従って、対象画素を順次選択する場合を例にとって説明した。もちろん、ラスタ群を構成するラスタの本数や、対象画素を選択する順番が異なれば、これに応じて閾値マトリックスの各閾値を記憶する順序も異なったものとなる。
例えば、対象画素を選択する順番が、図10(b)に示すようなものである場合は、閾値マトリックスの閾値は、図14(a)に示す順序で記憶しておけばよい。すなわち、図10(b)において3本のラスタでラスタ群を構成していることに対応して、閾値マトリックスを3行ずつの2つのユニットにまとめる。そして、対象画素を選択する順序に合わせて、ユニットを斜めに横切るような順番で各閾値を記憶すればよい。ここで、図14中でカギ括弧内に示した数字は、閾値を記憶する順番を示している。また、対象画素を図10(c)に示すような順番で選択している場合は、図14(b)に示すように、閾値マトリックスを2行ずつユニットにまとめて、対象画素を選択する順序に合わせて各閾値を記憶しておけばよい。
また、以上の説明では、対象画素を選択する順序と、各閾値を記憶する順序とが完全に一致する場合について説明しているが、これらの順番は必ずしも完全に一致している必要はなく、多少であれば、順番にずれが生じていても構わない。例えば、対象画素を選択する順番が、図10(c)に示すようなものである場合に、閾値マトリックスの各閾値を、図12(a)に示す順番で記憶しておくこととしても良い。図10(c)と図12(a)とを比較すれば明らかなように、対象画素を選択する順番と閾値を記憶する順番とは、符番[2]の画素と符番[3]の画素との間で順番が入れ替わった関係にある。同様に、符番[6]の画素と符番[7]の画素とについても順番が入れ替わっている。このように、符番の数字を4で割ったときに余りが2となる画素と、余りが3となる画素とで、対象画素を選択する順番と閾値を記憶する順番とが入れ替わっているが、その他の画素については一致している。この様な場合、閾値マトリックスに閾値が記憶される順序が、対象画素を選択する順序と完全には一致していないにもかかわらず、複雑なアドレス計算を行うことなく閾値を読み出すことが可能である。例えば、対象画素の順番を4で割ったときに余りが2になれば、一つ後ろの順番の閾値を読み出し、また、対象画素の順番を4で割ったときに余りが3になれば、一つ前の順番の閾値を読み出すことによって、対象画素に対応する閾値を簡便に読み出すことができる。あるいは、1つ1つの閾値を順番に読み出すのではなく、例えば4つずつまとめて読み出しておき、これらの4つの閾値の中から適切な閾値を選択することとしても良い。いずれにしても、閾値マトリックスに閾値を記憶する順番は、対象画素を選択する順番を考慮した順番であれば足り、閾値を記憶する順番と対象画素を選択する順番とは完全には一致している必要はない。
このように、第2実施例の階調数変換処理においては、ラスタ群に含まれる複数の画素の中から対象画素を選択する順序を考慮しながら、閾値マトリックスの各閾値を適切な順番で格納しておく。こうすれば、複雑なアドレス計算を行うことなく、対応する閾値を次々と読み出すことが可能となり、階調数変換処理を迅速に行うことができる。
また、第2実施例の階調数変換処理においては、前述した第1実施例と同様に、複数のラスタをラスタ群としてまとめ、対象画素を所定の順序で選択することで、各ラスタを並行して処理している。このため、第1実施例と同様に、キャッシュのヒット率や、パイプライン処理の効率、分岐予測の的中率が向上するので、このことによる処理速度の高速化も図ることができる。
もっとも、こうしたキャッシュのヒット率や、パイプライン処理の効率、分岐予測の的中率が向上する現象は、画像データ中で近接した画素の階調値には互いに近似した値となる傾向があるという事実によるものである。従って、ラスタ群を構成するラスタの本数があまりに多くなると、ラスタ群内の画素についても互いの階調値が近似した値を取らなくなるので、キャッシュのヒット率や、パイプライン処理の効率、分岐予測の的中率が向上する度合いは小さくなり、処理速度を高速化できる程度も少なくなってしまう。しかし、第2実施例の階調数変換処理のように、対象画素を選択する順序を考慮して閾値マトリックスの各閾値を格納しておけば、例えキャッシュのヒット率や、パイプライン処理の効率、分岐予測の的中率を向上させることができない場合でも、依然として迅速に階調数変換処理を行うことができる。
更に、第2実施例の階調数変換処理は、次のような場合にも処理速度を効果的に向上させることができる。例えば、JPEG形式で圧縮された画像データを解凍する場合は、ラスタ1本ずつ解凍されるのではなく、8画素×8画素をひとまとまりとして、各画素の階調値のデータに展開される。従って、こうして展開された階調値をラスタの順番に並べ換えることなく、そのままの順序で、換言すれば、これらひとかたまりのデータを8行8列の複数の画素に展開した順序のまま、各画素についての階調数変換処理を行えば、処理を高速化することができる。このとき、これら8行8列をひとまとまりとする複数の画素には、毎回同じ順序で階調値が展開される。従って、第2の階調数変換処理においては、これら複数の画素に階調値が順次展開される順番を考慮して、閾値マトリックスの各閾値を適切な順番で格納しておけば、処理速度の更なる向上を図ることができる。具体的には、閾値マトリックスを8行ずつのユニットにまとめ、各ユニット内を更に8行8列のブロックに区分する。そして、ブロック内の閾値を、圧縮された画像データが展開される順序に従って記憶してやる。こうすれば、各画素に展開されたデータをそのままの順序で階調数変換処理を行う際に、複雑なアドレス計算を行うことなく閾値を読み出すことができるので、処理をより一層迅速に行うことが可能となる。
以上の説明は、画像データがJPEG形式で圧縮されている場合を例に取って説明したが、同様の理由で処理の高速化が可能なケースは他にも種々存在する。例えば、画像データの解像度に対してプリンタの印刷解像度の方が高いために、補間演算を行って1画素の画像データから、縦方向にn画素、横方向にm画素分の画像データを生成する場合には、これらn行m列の複数の画素をひとまとまりとして処理してやることで処理の迅速化を図ることができ、閾値マトリックスの各閾値をこれらの画素を処理する順序を考慮して記憶してやれば、処理速度をより一層迅速化することが可能となる。
C−3.変形例:
前述したように、閾値マトリックスのサイズは画像データのサイズよりも小さいので、すべての画素についてドット形成の有無を判断するために、閾値マトリックスは画像データに対して位置を移動させながら繰り返し使用される。上述した各種の実施例では、閾値マトリックスをいずれもラスタに沿った方向に移動させている。このように移動させた場合、一つのラスタに着目すると、閾値マトリックスの同じ部分の閾値が繰り返し使用されることになる。このため、画像データによっては同一ラスタ内のドット形成に一定のパターンが発生が生じることになる。これは、特にラスタごとにばらつき要素を有する出力機器、例えばラスタを任意のノズルを用いて印画するのではなく、結果として特定のラスタを特定のノズルの組合せを用いて印画するシリアル走査のインクジェットプリンタなどに出力した場合、特定のノズルのドット着弾位置にばらつきがあると、それがラスタ方向の一定のパターンと重なって、出力画質を悪化させてしまうことがあった。このような問題の発生を回避するためには、画像データに対して閾値マトリックスを移動させる際に、ラスタの方向に完全に一致させて移動させるのではなく、ラスタ方向に対して少し傾きを持たせて移動させることが効果的である。こうすれば、ひとつのラスタに着目した場合、閾値マトリックスの位置を移動させる度に、マトリックス中の少しずつ異なる部分に記憶された閾値が使用されることになる。従って、ドットの形成に一定のパターンが発生することを確実に回避することが可能である。
上述した第2実施例の階調数変換処理では、閾値マトリックスを複数のユニットに区分けし、各ユニットに含まれる閾値を適切な順序で記憶しているが、閾値マトリックスを移動させる度に、マトリックスをラスタと交差する方向にもずらすこととして、このずらし量を適切な値に設定することで、階調数変換処理をより一層迅速に行うことが可能である。以下では、こうした第2実施例の変形例について説明する。
図15(a)は、閾値マトリックスを画像データに対して相対的に移動させながら、1つのマトリックスを繰り返し用いて階調数変換処理を行う様子を示している。図中に、細い破線で示した小さな矩形は画素を模式的に示したものであり、太い破線は閾値マトリックスを模式的に示している。また、ここでは、ラスタ群は2本のラスタによって構成され、ラスタを2本ずつ並行させながら階調数変換処理を行うものとする。図15(a)中で、ラスタ1およびラスタ2に付したハッチングは、これらラスタをラスタ群としてまとめて階調数変換処理を行っていることを表したものである。
図15(a)に示した階調数変換処理では、閾値マトリックスをラスタに沿って移動させる際に、ラスタと交差する方向にもラスタ2本分だけずらしながら移動させる。より一般的に表現すれば、ラスタ群を構成するラスタ本数をN本としたときに、ラスタの上方向あるいは下方向に、Nの整数倍に相当するラスタ本数だけずらしながら閾値マトリックスを移動させる。図15(a)中に示した矢印は、ラスタ2本分ずつずらしながら閾値マトリックスを移動させている様子を模式的に表したものであり、これは、特にラスタ群を構成するラスタの本数と、閾値マトリックスのずらし量(閾値マトリックスがずれていくラスタ本数)とが一致している場合を例示している。このように、閾値マトリックスのずらし量を、ラスタ群を構成するラスタ本数の整数倍としておけば、階調数変換処理を迅速に行うことが可能である。以下では、図15の例示を参照しながらこの理由について説明する。
前述したように、第2実施例の階調数変換処理では、閾値マトリックスの閾値は、対象画素を選択する順序を考慮して、ユニット毎に適切な順序で記憶されている。ここでは、図15(b)に示すように、ユニットAないしユニットCの3つのユニットに区分されて、コンピュータ100のメモリ上の連続したアドレスに記憶されている。
画像データの階調数変換処理を開始すると、先ず初めは、閾値マトリックスのユニットAに含まれる閾値を読み出しながら、各画素についてのドット形成の有無を判断する。ユニットAの閾値はドット形成の有無を判断する順序を考慮して予め適切な順序で記憶されているから、アドレス値を1つずつインクリメントさせながら読み出すだけで適切な閾値を順次読み出すことができる。
ユニットA内の閾値を全て読み出してしまっても、処理中のラスタには未処理の画素が残っているから、閾値マトリックスを画像データに対して移動させて、これらの画素についてドット形成有無を判断する処理を継続する。ここで、図15(a)に示すように、閾値マトリックスをラスタ方向に移動させるに際して、ラスタと交差する方向にラスタ2本分だけずれた位置に移動させる。閾値マトリックスのずらし量をラスタ2本分としているのは、ラスタ群が2本のラスタから構成されていることに対応する。こうして閾値マトリックスをずらしてやれば、処理中のラスタ群に対応するユニットがずれるので、続く画素のドット形成有無を判断するために読み出す閾値は、ユニットBの中から読み出すことになる。ここで、ユニットB内の閾値についても、ドット形成の有無を判断する順序を考慮して予め適切な順序で記憶されているから、アドレス値を1つずつインクリメントさせるだけで適切な閾値を順次読み出すことができる。
こうしてユニットB内の閾値を全て読み出したら、図15(a)に示すように、再び閾値マトリックスを画像データに対して移動させる。このとき、ラスタと交差する方向にラスタ2本分だけずらした状態で移動させる。こうして閾値マトリックスをずらすことにより、続く画素のドット形成有無を判断するために読み出す閾値は、ユニットCに含まれている閾値となる。ユニットC内の閾値を全て読み出したら、再び閾値マトリックスを移動させ、今度はユニットA内の閾値を読み出しながらドット形成有無の判断を継続する。
図16は、上述したように、閾値マトリックスを画像データに対して移動させる際に、ラスタ群を構成するラスタ本数と同じ本数だけ、ラスタと交差する方向にずらしながら閾値マトリックスを移動させることによって、閾値が読み出されるユニットが順次切り変わる様子を模式的に示した説明図である。
先頭のラスタ群を処理する場合には、図16の最上段に示されているように、初めにユニットAから閾値が読み出され、次いでユニットBから、その次はユニットCから閾値が読み出され、以降はユニットA,ユニットB,ユニットCの順番で次々と閾値が読み出される。ここで、前述したように各ユニット内では閾値は連続したアドレスに記憶されているから、ユニットBをユニットAにマージした状態で、すなわちユニットAの最後尾アドレスに続けてユニットBを記憶し、更にユニットCをユニットBにマージした状態で記憶しておけば、アドレス値を1つずつインクリメントさせるだけで、閾値マトリックスに記憶されている全ての閾値を連続して読み出すことができる。
こうして処理中のラスタ群の全画素の処理を終了し、新たなラスタ群の処理を開始したら、今度は、図16の上から2段目に示されているように、ユニットBの先頭アドレスからアドレス値を1つずつインクリメントさせながら、次々と閾値を読み出してやる。図中で、最上段から2段目に向かって表示されている破線の矢印は、最初のラスタ群の処理が終了して、次のラスタ群の処理に移ったことを模式的に示したものである。2つ目のラスタ群の処理を終了したら、今度は、ユニットCの先頭アドレスからアドレス値を1つずつインクリメントさせながら、次々と閾値を読み出してやればよい。3つ目のラスタ群の処理を終了したら、再びユニットAに戻って、ユニットAの先頭アドレスから順番に閾値を読み出してやる。以降、画像データの全ての画素についてのドット形成有無を判断してしまうまで、同様の処理を繰り返す。
以上に説明したように、閾値マトリックスを画像データに対して移動させる際に、上述したようにラスタと交差する方向に、ラスタ群を構成するラスタ本数と同じだけずらしながら移動させれば、複雑なアドレス計算を行うことなく適切な閾値を順次読み出すことができるので、階調数変換処理を迅速に行うことが可能となる。
尚、以上の説明においては、閾値マトリックスは、画像データに対して上方向に、ラスタ群と同じラスタ数だけずらすものとしているが、これに限らず、例えば画像データに対して下方向にずらした場合でも、あるいはラスタ群を構成するラスタ本数の整数倍だけずらした場合でも、階調数変換処理を高速化することができる。以下では、このような場合について説明する。
図17は、ラスタ群を構成するラスタ本数の2倍に相当するラスタ数だけ、すなわちラスタ4本分だけ、閾値マトリックスをずらしながら移動させた場合を例示した説明図である。図17(a)は、画像データに対して閾値マトリックスを移動させながら、ドット形成有無を判断しようとする画素(対象画素)と閾値マトリックスに記憶されている閾値とを対応付けている様子を模式的に示している。また、図17(b)は、閾値マトリックスを移動させるに伴って、閾値を読み出すユニットが次々と切り変わる様子を模式的に示している。図示されているように、先頭のラスタ群を処理する場合は、ユニットAの閾値が読み出され、ユニットAの閾値を全て読み出してしまうと今度はユニットCの閾値が読み出される。ユニットCの閾値を全て読み出してしまうと、再びユニットAに戻って先頭の閾値から順番に読み出していく。以降、先頭のラスタ群の全ての画素についての処理を終了するまで、ユニットA、ユニットCの順番で繰り返し閾値を読み出しながらドット形成の有無を判断する。
先頭のラスタ群を全て処理してしまうと、次のラスタ群については、今度はユニットB、ユニットAの順番で繰り返し閾値を読み出しながらドット形成の有無を判断する。そして、3つ目のラスタ群については、ユニットC、ユニットBの順番で繰り返し閾値を読み出しながらドット形成の有無を判断していく。以降、画像データの全ての画素についての処理を終了するまで、同様にして次々と閾値を読み出しながらドット形成の有無を判断していけばよい。
結局、図17に示すようにして閾値マトリックスをずらしてやれば、少なくともユニット内では連続したアドレス値に記憶されている閾値を順番に読み出してやればよく、複雑なアドレス計算が不要となるので、階調数変換処理を迅速に行うことができる。また、各ユニットを読み出す順番も、1つのラスタ群を処理している間は、同じパターンで繰り返し読み出せばよいので、複雑なアドレス計算は不要である。以上では、閾値マトリックスを移動させる際に、ラスタ群を構成するラスタ本数の2倍に相当する本数だけずらした場合について説明したが、一般に、閾値マトリックスのずらし量を、ラスタ群を構成するラスタ本数の整数倍としておけば、全く同様のことが成り立ち、従って階調数変換処理を高速化することが可能となる。
D.第3実施例:
上述した各種の実施例では、いわゆるディザ法と呼ばれる手法を用いて階調数変換処理を行ったが、階調数変換を行う代表的な手法には、いわゆる誤差拡散法と呼ばれる手法も存在する。以下に説明する第3実施例では、ディザ法と誤差拡散法とを組み合わせて階調数変換処理を行う。
D−1.第3実施例の階調数変換処理:
初めに、ディザ法と誤差拡散法とを組み合わせて階調数変換処理を行う際の基本的な考え方について、図18を用いて説明する。カラー画像データは、通常、各色の画像データが組み合わされて表現されている。図18に示した例では、カラー画像データは、シアン(C)色の画像データと、マゼンタ(M)色の画像データと、イエロ(Y)色の画像データと、ブラック(K)色の画像データの組み合わせとして表現されている。ディザ法と誤差拡散法とを組み合わせて使用する場合は、これらの手法を色毎に使い分けて適用する。ここで、ディザ法は誤差拡散法に比べて迅速に処理することができるという利点があるが、その反面、誤差拡散法に比べると画質が劣る場合がある。そこで、比較的画質への影響が少ない色の画像データについてはディザ法を用いて階調数変換処理を行い、その他の色の画像データについては誤差拡散法を用いて階調数変換処理を行うものとする。
図18(b)は、対象画素からC,M,Y,K各色の画像データを読み出している様子を概念的に示した説明図である。図中で細い波線で示した小さな矩形は画素を模式的に表したものであり、対象画素にはハッチングを付して表示している。C,M,Y,K各色の画像データの中では、Y色が最も画質への影響が少ない画像データである。そこで、以下に説明する第3実施例では、Y色の画像データについてはディザ法を用いて階調数変換処理を行い、他の色の画像データについては誤差拡散法を用いて階調数変換処理を行う。
図19は、第3実施例の階調数変換処理において、C,M,Y,Kの各色毎にディザ法と誤差拡散法とを使い分けながらドット形成の有無を判断する処理の流れを示すフローチャートである。かかる処理は、図5に示した画像データ変換処理中でコンピュータ100のCPU102の機能を利用して、プリンタドライバによって実行される。
第3実施例の階調数変換処理を開始すると、先ず初めに所定本数の隣接するラスタをまとめてラスタ群を形成する処理を行う(ステップS300)。次いで、ラスタ群を構成する複数の画素の中から、ドット形成の有無を判断しようとする対象画素を1つ選択する(ステップS302)。そして、対象画素に対応付けて記憶されているC,M,Y,K各色の画像データを読み込む処理を行う(ステップS304)。尚、ここでは画像データがC,M,Y,Kの各色データの組合せによって構成されているものとして説明しているが、カラー画像データに、例えば淡シアン(LC)や淡マゼンタ(LM)などの他色の画像データが含まれている場合には、これら各色の画像データも同時に読み込んでやる。また、これら各色の画像データは、コンピュータ100のメモリ上の連続したアドレスに記憶しておくこととしても良いが、各色の画像データ毎に異なる領域に記憶しておくことも可能である。
こうして各色の画像データを読み込んだら、Yの画像データか否かを判断する(ステップS306)。かかる判断は、例えば対象画像について画像データを読み込んだ順番に基づいて判断したり、あるいは画像データに予め識別用のデータを付加しておき、この識別用のデータに基づいて判断することができる。そして、Yの画像データである場合は(ステップS306:yes)、ディザ法を適用して対象画素についてのドット形成の有無を判断し(ステップS308)、Yの画像データでない場合には(ステップS306:no)誤差拡散法を適用してドット形成の有無を判断する(ステップS308)。これら処理の詳細については後述する。尚、各色の画像データに、LCあるいはLMの画像データが含まれている場合には、Yの画像データに加えて、これらLC,LMの画像データについても、ディザ法を適用してドット形成有無を判断する。
対象画素についてのドット形成の有無を判断したら、処理中のラスタ群に含まれる全ての画素についてのドット形成有無を判断したか否かを判断し(ステップS312)、未処理の画素が残っていれば(ステップS312:no)、ステップS302に戻って続く一連の処理を繰り返す。ラスタ群内の全画素について判断を終了したら(ステップS312:yes)、今度は、画像データに含まれる全てのラスタについての処理を終了したか否かを判断する(ステップS314)。そして、未だ処理していないラスタが残っている場合は、ステップS300に戻って新たなラスタ群を生成し、かかるラスタ群について上述した一連の処理を行う。こうして全てのラスタについての処理を終了したら、第3実施例の階調数変換処理を抜けて、図5に示した画像データ変換処理に復帰する。
図20は第3実施例の階調数変換処理中で、ディザ法を適用して対象画素についてのドット形成の有無を判断する処理の流れを示したフローチャートである。また、図21は、第3実施例の階調数変換処理中で、対象画素を選択しながらドット形成の有無を判断している様子を模式的に示した説明図である。図21中でカギ括弧の中に示した数字は、対象画素を選択する順番を示している。図21では、隣接するラスタを2本ずつまとめてラスタ群を構成している。以下、図21を参照しながら、図20のフローチャートに従って説明する。
ディザ法を適用してドット形成の有無を判断する処理では、処理中の対象画素に対応した閾値thを閾値マトリックスから読み込む処理を行う(ステップS330)。閾値thを読み込む処理は、前述の各種実施例において説明したいずれかの方法を適用することができる。ここでは、詳細な説明は省略するが、例えば次のようにして閾値を読み込む。一例として、図21中で[1]と符番した画素が対象画素として選択されている場合は、画像データに閾値マトリックスを重ねた時に、かかる画素の位置に来るマス目を閾値マトリックスの中から選択し、該マス目に記憶されている閾値を読み込めばよい。
次いで、ステップS330において読み込んだ閾値thと、対象画素の画像データ(ここではYの画像データ)とについて、階調値の大きさを比較する。対象画素の画像データは、図19に示した階調数変換処理中でステップS304において既に読み込まれている。そして、画像データの方が大きければ(ステップS332:yes)対象画素にドットを形成すると判断し、ドット形成の有無の判断結果を示す変数Drに、ドットを形成することを意味する値「1」を書き込む(ステップS334)。逆に、閾値thの方が大きい場合は、判断結果を示す変数Drに、ドットを形成しないことを意味する値「0」を書き込む処理を行う(ステップS336)。以上のようにしてドット形成の有無を判断したら、ディザ法によるドット形成有無の判断処理を抜けて、図19に示した階調数変換処理に復帰する。こうして、階調数変換処理で選択した対象画素を処理していく。その結果、Yの画像データについてはディザ法を適用しながら、図21に示すように複数のラスタを並行させてドット形成有無を判断することができる。
Y以外の画像データについては、誤差拡散法を用いてドット形成の有無を判断する。ここで、対象画素は図21に示した順序で選択されるものとしているから、誤差拡散法によるドット形成有無の判断も、図21に示した順序で行う。以下、誤差拡散法を適用して対象画素についてのドット形成有無を判断する処理について説明する。
図22は、誤差拡散法を適用してドット形成有無を判断する処理の流れを示すフローチャートである。尚、かかる処理はC,M,Kの各色毎に行われるが、説明が煩雑となることを避けるために、以下では色を特定せず説明する。
誤差拡散法による処理を開始すると、先ず初めに、対象画素に拡散されている拡散誤差erを読み込む処理を行う(ステップS360)。周知のように誤差拡散法では、ある画素についてドットを形成したこと、あるいはドットを形成しなかったことにより、その画素で発生した階調表現の誤差(階調誤差)を周辺の未処理の画素に対応付けて拡散しておく。そして、新たな画素についてのドット形成有無を判断するに際しては、周辺の画素から、その画素に対応付けて拡散された誤差を考慮して、誤差が解消されるようにドット形成の有無を判断する。ステップS360では、既にドット形成有無を判断した画素から対象画素に向かって拡散されてきた誤差(拡散誤差er)を読み込む処理を行う。階調表現の誤差を拡散する処理については後述する。
次いで、読み込んだ拡散誤差erと対象画素の画像データDtとを加算することにより、補正データDcを算出する(ステップS362)。そして、得られた補正データDcと所定の閾値therとの大小関係を判断する(ステップS364)。閾値therは予め適切な値が設定されている。補正データDcの方が閾値therより大きいと判断された場合は(ステップS364:yes)、対象画素にドットを形成すると判断し、判断結果を示す変数Drにドットを形成することを意味する値「1」を書き込む(ステップS366)。逆に、補正データDcの方が閾値therより小さい場合は、判断結果を示す変数Drに、ドットを形成しないことを意味する値「0」を書き込む処理を行う(ステップS368)。
こうして対象画素についてドット形成するか否かを判断したら、かかる判断によって生じた階調表現の誤差(階調誤差)を算出した後、得られた階調誤差を周辺の未判断の画素に拡散する処理を行う(ステップS370)。階調誤差は、ドット形成有無を判断した結果として対象画素に表現される階調値(この階調値を結果値と呼ぶ)を、対象画素の階調値から減算することによって算出する。例えば、対象画素にドットを形成しないと判断した場合は、その画素にはドットが形成されないから、結果値は階調値「0」となる。また、対象画素にドットを形成すると判断した場合は、実際にドットを形成したときにその画素が表現する階調値(通常は、階調値「255」)となる。従って、対象画素の階調値から、これらの結果値を減算することで階調誤差を求めることができる。
こうして算出した階調誤差は、所定の重みを付けて周辺の画素に分配される。図23は、誤差を分配する際に用いられる重み係数を例示した説明図である。図中の小さな矩形は画素を示している。また、*印が記載された画素は対象画素を示し、各矩形の中に示された数値は重み係数を示している。例えば、図23(a)に示した例では、対象画素の右隣の画素には重み係数1/4を用いて階調誤差が分配される。換言すれば、対象画素で生じた階調誤差の1/4の階調値が、右隣の画素に分配される。同様に、対象画素の右下、真下、左下にあるそれぞれの画素にも、階調誤差の1/4の階調値がそれぞれ分配される。また、対象画素の上側あるいは左隣の画素は既にドット形成の有無が判断されているので、これらの画素には誤差は分配しない。このように、図23(a)に示した重み係数を用いて階調誤差を拡散すれば、各画素に階調誤差を分配する結果、対象画素の周辺にある4つの未判断画素に、対象画素で生じた階調誤差が1/4ずつ分配されることになる。尚、本明細書中では、「階調誤差を分配する」とは、階調誤差に所定の重み係数を乗算した階調値を、ある画素に対応付けられたメモリ上に加算することを意味するものとする。「階調誤差を拡散する」とは、複数の画素に階調誤差を分配することを意味するものとする。また、周辺の画素から階調誤差が分配された結果、ある画素に対応付けて蓄積されている誤差を「拡散誤差」と呼ぶものとする。
階調誤差を拡散させるために用いる重み係数は、図23(a)に例示したものに限らず、良好な画質が得られるように、例えば、図23(b)に示すような種々の重み係数を用いることができる。こうして対象画素で生じた階調誤差を周辺に未判断画素に拡散したら(図22のステップS370)、図22に示した誤差拡散法によるドット形成判断処理を抜けて、図19に示す第3実施例の階調数変換処理に復帰する。
以上に説明したように、第3実施例の階調数変換処理においては、カラー画像データを構成する各色のデータについての階調数変換処理を行うに際して、色の違いによる画質への影響の違いを考慮して、ディザ法と誤差拡散法とを適切に使い分けながら階調数変換処理を行う。そして、ディザ法を適用して階調数変換処理を行う場合には、隣接する複数本のラスタをラスタ群としてまとめ、かかるラスタについて並行して階調数変換処理を行うことにより、処理の高速化を図ることが可能である。
また、第3実施例の階調数変換処理においては、ディザ法による判断を、複数ラスタを並行させながら行うことに対応して、誤差拡散法による判断も複数ラスタを並行させて行うことになる。この結果、誤差拡散法による処理も高速化することができるので、ディザ法における処理の高速化と併せて、全体の階調数変換処理をより一層高速化することができる。以下では、複数のラスタを並行させて処理することで、誤差拡散法によるドット形成有無の判断を迅速に行うことができる理由について説明する。
ここでは、2本のラスタでラスタ群を構成し、ラスタ群に含まれる画素の中から図21に示した順番で対象画素を選択するものとして説明する。図24は、ラスタ3およびラスタ4に含まれる画素から対象画素を順次選択して、ドット形成の有無を判断している様子を示した説明図である。図中の小さな矩形は画素を示し、画素中のカギ括弧の中に記載した数字は、ラスタ群中でその画素を処理する順番を示している。
図24(a)はラスタ群の中で最初に選択した対象画素(図中で[1]と符番した画素)から、周辺の画素に階調誤差を拡散している様子を模式的に示している。図中の実線の矢印は、所定の重み係数に従って階調誤差が周辺の画素に分配されている様子を模式的に表している。尚、ここでは図23(a)に示した重み係数に従って誤差を拡散するものとする。符番[1]の画素で生じた階調誤差を拡散したら、右隣にある符番[2]の画素についてドット形成の有無を判断する処理を開始する。すなわち、符番[2]の画素に対応付けて記憶されている拡散誤差を読み出して補正データを算出し、所定の閾値と比較することによってドット形成の有無を判断する。そして判断に伴って生じた階調誤差を算出したら、得られた階調誤差を周辺の未判断画素に拡散する。図24(b)は、符番[2]で生じた階調誤差を周辺の画素に拡散している様子を模式的に示している。尚、図24(b)では、既にドット形成有無を判断済みの画素を、ハッチングを付して表示している。
次いで、符番[3]の画素についてのドット形成有無を判断する。かかる判断に際しては、周辺の画素から符番[3]の画素に分配されてきた拡散誤差を読み出して、符番[3]についての補正データを算出することによってドット形成の有無を判断する。ここで、図24(c)から明らかなように、符番[3]の画素に分配される階調誤差は、符番[1]の画素からの誤差と符番[2]の画素からの誤差だけである。符番[2]の画素から分配されてきた誤差は、直前の処理で算出したばかりであり、符番[1]の画素から分配されてきた誤差についても、その前の処理で算出したばかりである。従って、これらの誤差はいずれもコンピュータ100のキャッシュメモリに残っているので、極めて高速に読み出すことができる。こうして誤差を高速に読み出すことができれば、補正データを迅速に算出して符番[3]についてのドット形成有無の判断を迅速に行うことができる。尚、ここでは符番[1]あるいは符番[2]から分配されてきた誤差の値を、キャッシュメモリから読み出すものとして説明したが、分配された誤差を読み出すのではなく、これら画素で発生した階調誤差をキャッシュメモリから読み出して、符番[3]に分配される誤差を算出するものとしても良い。これらの処理は実質的には等価な処理と考えることができる。
以上の説明は、符番[3]の画素についてのドット形成有無を判断する場合について説明したが、符番[2]の画素について判断する場合にも、同様の理由により、処理を高速化することが可能である。すなわち、符番[2]の画素についてドット形成有無を判断する際には、符番[2]の画素に対応付けて蓄積されている拡散誤差をメモリから読み出して、補正データを算出する。符番[2]の画素に蓄積される拡散誤差には、符番[1]の画素を含む複数の画素からの誤差も蓄積されるが、符番[1]の画素からの誤差は直前の処理で算出されている。従ってこの誤差については、符番[2]に対応付けて既にメモリ上に蓄積されている拡散誤差に加算するのではなく、メモリ上に一時的に蓄えておいてもよい。そして、符番[1]からの誤差が未だ分配されていない拡散誤差をメモリから読み出して、一時的に蓄えておいた誤差とCPU102上で加算することにより、符番[2]についての拡散誤差を算出することとしても良い。こうすれば、符番[1]の画素から符番[2]の画素に分配される誤差を、符番[2]の画素に対応付けられたメモリに既に蓄積されている拡散誤差に加算する処理が不要となるので、ドット形成の有無を判断する処理を迅速に行うことが可能となる。
尚、こうして他の画素からの誤差と加算されることなく、単独でメモリ上に蓄えられる誤差は、あくまでも一時的に蓄えられるものであって、ほどなくドット形成有無の判断に使用される。従って、これら誤差が多数蓄えられることはないので、これらの誤差は、レジスタなどの高速に読み書き可能なメモリに蓄えておくことができる。こうして高速に読み書き可能なメモリに蓄えることとすれば、ドット形成の有無を判断する処理をより一層迅速に行うことが可能となる。
また、図24(a)で符番[2]の画素からの誤差を分配する画素はいずれも、程なくドット形成の有無を判断する画素である。従って、これらの誤差については、周辺画素に対応付けられたメモリ上に蓄積するのではなく、誤差のまま、メモリ上に一時的に蓄えておくこととしても良い。こうすれば、上述した説明と同様の理由により、ドット形成有無を判断する処理をより一層迅速に行うことが可能となる。
一方、符番[3]の画素で生じた階調誤差は、図24(c)に示すように、ラスタ4の画素とラスタ5の画素とに拡散される。ここでは、ラスタ2本ずつ、すなわちラスタ3とラスタ4とを並行して処理するものとしているから、ラスタ5に含まれる画素については、しばらくの間はドット形成の有無が判断されることはない。従って、符番[3]の画素からラスタ5の画素に分配される誤差は、これら画素に対応付けられたメモリに分配しておく。これら画素に、他の画素からの誤差が分配されてきたときには、既に蓄えられている誤差に加算した値をメモリに蓄えておけばよい。図24中の実線の矢印は、誤差を画素に対応付けて分配するのではなく、誤差の値を一時的にメモリに蓄えることを示し、白抜きの矢印は、誤差を周辺の未判断画素に対応付けてメモリ上に分配することを示している。
符番[3]の画素についての処理が終了したら、今度は符番[4]の画素についての処理を開始する。処理に際しては、符番[4]に対応付けて記憶されている画像データおよび拡散誤差をメモリから読み出す。そして、左隣の画素(符番[2]の画素)からの誤差を加算することによって補正データを算出し、得られた補正データと所定の閾値との大小関係に基づいてドット形成の有無を判断する。次いで、判断によって発生した階調誤差と所定の重み係数とに基づいて、各画素に分配すべき誤差を算出し、得られた誤差をメモリ上に一時的に記憶しておく。こうして、符番[4]の画素についての処理が終了したら、続く、符番[5]以降の画素についても同様の処理を繰り返す。
このように、第3実施例の階調数変換処理では、ラスタ群を構成する複数本のラスタを並行して処理することにより、ディザ法を適用した処理の高速化を図ることが可能なだけではなく、誤差拡散法を適用してドット形成の有無を判断する処理も高速化することが可能である。
D−2.変形例:
上述した第3実施例の階調数変換処理では、ラスタ群を構成する複数のラスタを並行して処理することで、ディザ法を適用した処理も、誤差拡散法を適用した処理も、いずれについても処理速度を向上させることが可能である。もっとも、ラスタ群に含まれる複数のラスタを並行して処理する方法は、上述した方法に限られるものではない。以下に説明する変形例では、ラスタ群を複数のブロックに区分けして、ブロック毎にドット形成有無を判断することにより、複数本のラスタを並行して処理している。こうすることによっても、階調数変換処理の高速化を図ることが可能である。図25は、第3実施例の変形例としての階調数変換処理の流れを示すフローチャートである。また、図26は、変形例の階調数変換処理が画像データをドット形成有無による表現形式のデータに変換している様子を例示した説明図である。以下、図26を参照しながら、図25に示すフローチャートに従って説明する。
第3実施例の変形例の階調数変換処理を開始すると、先ず初めに隣接するN本のラスタをまとめてラスタ群を生成する(ステップS400)。図26では、ラスタ群が2本のラスタによって構成されているものとして、ラスタ1およびラスタ2の2本のラスタをラスタ群としてまとめた様子を示している。
次いで、ラスタ群中の画素を、隣接する所定数ずつまとめて複数のブロックに区分し、ドット形成の有無を判断しようとする処理ブロックを設定する(ステップS402)。ブロックは、図26中では太い破線で示した矩形によって表されている。図示した例では、ラスタ群は、縦横2画素ずつ合計4つの画素からなる複数のブロックに区分されている。ステップS402では、こうして区分された複数のブロックの中から一番左端のブロックを、ドット形成の有無を判断するブロック(すなわち、処理ブロック)として設定する。
こうして設定した処理ブロックに含まれる各画素から、C,M,Y,K各色の画像データを読み込む(ステップS404)。すなわち、図26に示した例では、図中で[1]と符番した画素、および[2]と符番した画素、[3]と符番した画素、[4]と符番した画素の合計4つの画素について、各色の画像データを読み込む。次いで、画像データがY色の画像データか否かを判断し(ステップS406)、Y色の画像データであれば(ステップS406:yes)、ディザ法を適用することにより処理ブロック内の各画素についてのドット形成有無の判断を判断する(ステップS408)。すなわち、処理ブロックに含まれる4つの画素を、図26中に符番された番号の若い画素から順番に、ディザ法を適用してドット形成の有無を判断していけばよい。ドット形成の有無を判断するための具体的な方法には上述した各種実施例の方法を適用することができる。処理の詳細については、先に行った説明と重複するので、ここでは説明を省略する。
ステップS406において、画像データがY色の画像データではない場合は(ステップS406:no)、誤差拡散法を適用しながらブロック単位でドット形成の有無を判断する(ステップS410)。かかる処理の詳細については後述する。
こうして処理ブロックについてのドット形成の有無を判断したら、処理中のラスタ群に含まれるすべての画素について処理を終了したか否かを判断する(ステップS412)。そして、ラスタ群に未処理の画素が残っていると判断された場合には、ステップS402に戻って、すべての画素の処理を終了するまで続く一連の処理を繰り返し行う。ラスタ群の全ての画素を処理していると判断された場合は(ステップS412:yes)、今度は、画像データに含まれる全てのラスタについての処理を終了したか否かを判断する(ステップS414)。そして、未処理のラスタが残っている場合には(ステップS414:no)、ステップS400に戻って、続く一連の処理を行う。画像データに含まれる全てのラスタについて処理を終了したと判断した場合は(ステップS414:yes)、図25に示した変形例の階調数変換処理を終了して、図5の画像データ変換処理に復帰する。
以下では、ステップS410の処理、すなわち誤差拡散法を適用しながら処理ブロック内の各画素について、ドット形成の有無を判断する処理について説明する。尚、以下に説明する処理は、C,M,K各色の画像データについても全く同様に行われる。
図27は、誤差拡散法を適用しながら、処理ブロック内の各画素についてのドット形成有無を判断する処理の流れを示すフローチャートである。処理を開始すると、先ず初めに、処理ブロックに含まれる各画素についての階調値の総和Sを算出する(ステップS450)。処理ブロック内の各画素についての階調値は、図25を用いて前述した第3実施例の変形例の階調数変換処理中で既に読み込まれている。
次いで、処理ブロック内の各画素に対応付けて記憶されている拡散誤差erを読み込む処理を行う(ステップS452)。例えば、図26に示したブロックの中で、先頭のブロックについて処理している場合は、符番[1]ないし符番[4]の各画素に向かって分配されてきた拡散誤差erを読み出してやる。
こうして読み出した各画素の拡散誤差erと先に算出しておいた総和Sとを加算することにより、処理ブロックについての補正データBxを算出する(ステップS454)。そして、得られた補正データBxと所定の閾値th1 とを比較する(ステップS456)。補正データBxの方が閾値th1 よりも小さい場合は、その処理ブロックの画素にはいずれもドットを形成しないと判断する(ステップS458)。
一方、ステップS456において、補正データBxが閾値th1 よりも大きいと判断された場合には、更に所定の閾値th2 との比較を行う(ステップS460)。ここで、閾値th2 と閾値th1 とは、th1 <th2 の関係が成り立つように設定されている。補正データBxの値が閾値th2 よりは小さい場合、すなわち、閾値th1 よりは大きいが閾値th2 よりは小さい場合(ステップS460:no)は、処理ブロックに含まれる画素の中の1つの画素にのみ、ドットを形成すると判断する(ステップS462)。
図28は、処理ブロックに含まれる4つの画素の中の1画素にのみ、ドットを形成している様子を示している。処理ブロック中の1画素にのみドットを形成する方法は、図28に示した4通りの方法がある。本実施例ではステップS462の処理において、処理ブロック中の1画素にのみドットを形成する場合は、これら4通りの中から毎回ランダムに選択した位置の画素にドットを形成するものとする。もちろん、毎回同じ位置の画素にドットを形成することとしても良いし、あるいは、処理ブロックに含まれる画素の中で、階調値の最も大きな画素にドットを形成するものとしても良い。
以上のようにして、処理ブロックに含まれる画素にドットを形成しないと判断したか(ステップS458)、あるいは1つの画素にのみドットを形成すると判断したら(ステップS462)、こうした判断によって処理ブロックに生じた階調表現の誤差を算出する(ステップS464)。処理ブロックで生じた階調誤差は、その処理ブロックの補正データBxの階調値から、そのブロックについての結果値を減算することで算出することができる。ここで、処理ブロックについての結果値とは、そのブロックを構成する各画素についての結果値(ドットが形成されたこと、あるいは形成されなかったことによって、画素に表現される階調値)の総和値である。
例えば、処理ブロック内のいずれの画素にもドットを形成しない場合(ステップS458の場合)は、各画素の結果値はいずれも「0」であるから、その着目ブロックの結果値も「0」となる。従って、処理ブロックでは、補正データBxの階調値がそのまま階調誤差として発生する。同様に、処理ブロック内の1画素にのみドットが形成される場合(ステップS462の場合)は、処理ブロックの結果値は、ドットが形成される画素についての結果値となる。従って、補正データBxからドットを形成した画素の結果値を減算すれば、その処理ブロックでの階調誤差を算出することができる。
こうして処理ブロックに発生した階調誤差を算出したら、この誤差を周辺の画素に拡散する処理を行う(ステップS466)。図29は、処理ブロックで生じた階調誤差を周辺の未判断画素に拡散させる様子を概念的に示した説明図である。図中にハッチングを付して示した大きな矩形は、階調誤差が発生した処理ブロックを示しており、処理ブロックの周囲に実線で示した小さな矩形は階調誤差を分配する周辺画素を示している。例えば、階調誤差を処理ブロックに隣接する画素に拡散する場合は、図29(a)に各画素に記載した重み係数を用いて各画素に誤差を分配する。また、処理ブロックの周辺の画素に均等に誤差が拡散されるように、図29(b)に例示するような重み係数を用いても良い。
尚、図29(a)中に細い破線で示した大きな矩形は、処理ブロックに隣接した周辺のブロックを示している。図29(a)に示した例では、処理ブロックで生じた階調誤差が、隣接する周辺のブロックに均等に分配されるように、各画素の重み係数が定められている。重み係数をこのように設定しておけば、各ブロックには均等に誤差を分配することができるので、比較的良好な画質を簡便に得ることができる。もちろん、隣接するブロック内の一部の画素に誤差を分配した場合、誤差が分配された画素では誤差が分配されない画素と比べてドットの形成のされ方が異なることが予想される。しかし、図27に示したフローチャートからも明らかなように、処理ブロックで発生した階調誤差をまとめて拡散するのは、画像データの階調値が小さい領域、換言すれば、ドットがまばらにしか形成されない領域である。この様な領域では、ブロック内の各画素でドットの形成のされ方が多少異なったとしても、画質に大きな影響を与えることはない。
尚、図29に示した重み係数は例示であり、従って、得られた画像を確認しながら、各画素への重み係数を修正していくことで、より良好な画質を得ることができるのは言うまでもない。
図27のステップS460において、処理ブロックの補正データBxが所定の閾値th2 よりも大きいと判断された場合は(ステップS460:yes)、誤差拡散法を適用しながら処理ブロック内の各画素毎にドットの形成の有無を判断する処理を行う(ステップS468)。図30を参照しながら、かかる処理の内容について説明する。
図30は、誤差拡散法を適用して階調誤差を周辺の画素に拡散しながら、処理ブロック内の画素毎にドット形成の有無を判断する様子を模式的に示した説明図である。図26に太い破線の矩形で示した各ブロック毎にかかる処理を行うことで、各画素についてドット形成の有無を判断することができる。説明を一般化するために、以下では、処理ブロック中の左上の画素を画素Pa、右上の画素を画素Pb、左下の画素を画素Pc、右下の画素を画素Pdと呼ぶことにする。従って、画素Paは、図26中でそれぞれ符番[1],[5],[9]…が付された画素に相当する。同様に、画素Pbは、図26中でそれぞれ符番[2],[6],[10]…が付された画素に相当し、画素Pcは符番[3],[7],[11]…が付された画素に、画素Pdは符番[4],[8],[12]…が付された画素に相当している。
図30中で、破線で示した大きな矩形は処理ブロックを示し、処理ブロック中に実線で示した小さな矩形は、ブロック内の各画素を示している。図30(a)は、画素Paについてドット形成有無を判断することによって生じた階調誤差ERaを周辺の未判断画素に拡散している様子を模式的に示している。ここでは、ブロック毎に処理を行うものとしているから、処理ブロックの左側の画素は、既にドット形成の有無を判断済みである。図30では、ドット形成有無を判断済みの画素にハッチングを付して表示している。そこで、図30(a)に示すように、画素Paで生じた階調誤差ERaは、処理ブロック内の3つの画素に所定の重み係数で拡散させる。図31は、階調誤差を換算させるための重み係数を例示した説明図である。図中に示した*印は、ドット形成有無を判断したことにより階調誤差が生じた画素を示しており、周辺の画素内の数値は、その画素に誤差を分配するための重み係数を示している。
画素Paで生じた階調誤差に、図31(a)に示した重み係数を乗算することにより、処理ブロック内の各画素に分配すべき誤差を算出することができる。ここで、誤差を分配すべき各画素は、ほどなくドット形成有無を判断される画素であるから、これら誤差はメモリ上に一時記憶しておく。図30中で、画素から隣接する画素に向かう実線の矢印は、算出した誤差を周辺の画素に分配してメモリ上で蓄積するのではなく、誤差そのものを一時的に記憶しておくことを表している。
画素Paに続いて、画素Pbのドット形成有無を判断する。判断に際しては、画素Pbの画像データと、画素Pbに対応付けて記憶されている拡散誤差と、メモリ上に一時的に蓄えておいた誤差(画素Paの階調誤差ERaに所定の重み係数を乗算した階調値)とを読み出し、これらを加算して補正データを算出する。こうして得られた補正データと所定の閾値とを比較することによって、画素Pbについてのドット形成有無を判断することができる。次いで、ドット形成の判断結果に応じて画素Pbで生じた階調誤差ERbを算出し、図31(b)に示した重み係数を用いて周辺の未判断画素に分配すべき誤差を算出する。こうして得られた誤差を分配すべき画素も、ほどなくドット形成有無を判断する画素であると考えられる。そこで、得られた誤差はいずれもメモリ上の一時的に蓄えておく。尚、図31(b)に示した重み係数は、誤差拡散法をブロック単位で行うことを考慮して、処理中のブロック外の画素よりもブロック内の画素により多くの誤差が分配されるように設定されている。もちろん、周辺の画素に均等に誤差が分配されるような重み係数としても良い。
ここで、画素Pbから右隣の画素、および右下の画素に分配される誤差を、メモリ上に一時的に記憶している理由について補足して説明する。図27を用いて説明したように、処理ブロックについてのドット形成有無の判断を、画素毎に行うか、それとも図28を用いて説明したように、ブロックをまとめて行うかは、処理ブロックの補正データの階調値によって決定される。従って、処理ブロックの右隣のブロックについては、必ずしも画素毎にドット形成有無を判断するとは限らない。すなわち、画素Pbから右隣の画素あるいは右下の画素に分配される誤差が、程なく使用されるのは、右隣のブロックも画素毎にドット形成有無が判断される場合である。しかし画像データは、ほとんどの場合、近傍の画素ではほぼ同じ様な階調値を取るから、処理中のブロックを画素毎に判断していれば、右隣のブロックについてもかなりの高い確率で画素毎に判断すると考えることができる。そうであれば、画素Pbから右隣の画素および右下の画素に分配すべき誤差も、一時的にメモリ上に蓄えておくことで、ドット形成有無を判断する処理を高速化することが可能である。この様なことを考慮して、ここでは、画素Pbから周辺画素に分配すべき誤差は、メモリ上に一時的に蓄えることとしている。そして、仮に右隣のブロックが、ブロックをまとめてドット形成有無が判断される場合は、メモリ上に一時的に蓄えておいた誤差をこれらの画素に分配してやればよい。また、より簡便には、一時的に蓄えた誤差をこれらの画素に分配することなく、処理を行うこととしてもよい。ブロック全体としてドット形成有無を判断する領域では、ドットがまばらに形成されるから、隣接するブロックからの誤差の拡散を省略したとしても、これによる影響は限定的であり、処理を簡素なものとすることで、処理速度の更なる向上を図ることができる。
以上のようにして、画素Pbについての処理を終了したら、画素Pcについての処理を開始する。画素Pcについても同様にしてドット形成の有無を判断し、判断によって生じた階調誤差ERcを算出する。次いで、図31(c)に示した重み係数に従って、周辺の各画素に分配すべき誤差を算出する。画素Pcからの誤差を拡散する場合、処理中のブロック内の画素は右隣の画素Pdしか存在しない。そこで、画素Pcの階調誤差の拡散には、周辺の画素に誤差が均等に分配されるような図31(c)に示す重み係数を使用している。もちろん、処理中のブロック内の画素に、より多くの誤差が分配されるように設定された重み係数を用いても良い。
画素Pcの周辺画素の中で、右隣にある画素Pdについては、直ぐ後にドット形成有無が判断される。これに対して、他の画素、すなわち左下の画素、真下の画素、右下の画素についてのドット形成有無の判断は、処理中のラスタ群に含まれる全ての画素についての判断を終了した後になる。そこで、画素Pcから右隣の画素に分配すべき誤差については、メモリ上の一時的に記憶しておき、その他の誤差については、それぞれの画素に分配する。すなわち、メモリ上の所定のアドレスに各画素に対応付けて記憶しておき、他の画素からの誤差が分配されてきた場合は、既に記憶されている誤差に加えて、誤差を蓄積していく。前述したように、図30中で、画素から隣接する画素に向かう実線の矢印は、算出した誤差を一時的に蓄えておくことを示しているが、これに対して、画素から隣接する画素に向かう白抜きの矢印は、誤差を一時的に記憶するのではなく、これら画素に分配することを表している。
こうして画素Pcについての処理を終了したら、画素Pdについてのドット形成の有無を判断する。図30に示した例では、画素Pdには分配される誤差は、画素Paないし画素Pcの3つ画素からの誤差のみであり、これら誤差は前述したようにメモリ上に一時的に記憶されている。従って、画素Pdについての判断に際しては、画素Pdの画像データを読み出して、メモリ上に一時的に蓄えておいた誤差を加算することによって補正データを算出することができる。こうすれば、画素Pdに対応付けて記憶されている拡散誤差をメモリ上から読み出す処理が不要となるので、補正データを迅速に算出することができ、延いては、ドット形成有無の判断を迅速に行うことができる。また、一時的に蓄えておく誤差は、データ数が限られており、従ってレジスタなどの高速に読み書き可能なメモリに蓄えておくことができる。こうすれば、より一層の高速化を図ることができる。更に、これら誤差を意図的にレジスタを記憶するのではなく、一般的なメモリ上に記憶する場合でも、実際には、これら誤差はキャッシュメモリから読み出される可能性が高く、従って通常は迅速に読み出すことができる。このため、補正データを迅速に算出することができ、延いてはドット形成有無を判断する処理を高速化することが可能となる。
画素Pdについてのドット形成有無を判断したら、判断によって生じた階調誤差ERdを算出し、周辺の画素に分配する処理を行う。図30(d)は、画素Pdで生じた階調誤差ERdを拡散する様子を模式的に示している。各画素へ分配すべき誤差は、図30(c)に示した重み係数を用いて算出する。そして、画素Pdの左下、真下、右下の各画素へは、算出したそれぞれの誤差を分散させ、画素Pdの右隣の画素へ分配すべき誤差は、メモリ上に一時的に蓄えておく。
尚、図30(d)に示されているように、画素Pdに右上にも未判断画素が存在している。そこで、画素Pdで生じた階調誤差を、右上の画素にも分配することとしても良い。このように、右上の画素にも誤差を拡散すれば、画質を効果的に改善できる場合がある。図31(d)は、このような場合に使用される重み係数の設定を例示している。画素Pdの右上の画素は、画素Pdに続いてドット形成有無を判断する画素であるから、この画素への誤差はメモリ上に一時的に記憶しておく。図30(d)中で画素Pdから右上の画素に向かう破線の矢印は、この画素への誤差をメモリ上に一時的に蓄えることを表している。
図27に示したステップS468では、以上の様にして、誤差拡散法を適用しながら処理ブロック内の各画素毎にドットの形成の有無を判断する処理を行う。こうして、処理ブロック内の全ての画素についてのドット形成の有無を判断したら、図27のフローチャートに示した処理を抜けて、図25に示した第3実施例の変形例の階調数変換処理に復帰する。階調数変換処理では、処理中のラスタ群の全画素についての処理を終了したか否かを判断し(図25のステップS412)、未処理の画素が残っていれば、処理ブロックを1ブロックだけ右方向に移動させて、続く一連の処理を繰り返す。
以上に説明したように、第3実施例の変形例の階調数変換処理では、ラスタ群を複数のブロックに区分けして、ブロック毎にドット形成有無を判断する。こうすれば、ラスタ群内の複数のラスタを並行して処理することに加えて、ブロック内の各画素を一括してドット形成有無を判断することで、階調数変換処理の高速化を図ることができる。例えば、処理しようとするブロックの補正データに応じて、ブロック内の画素を区別することなく、ドット形成有無を判断してやれば、処理を迅速化することが可能である。
尚、以上の説明では、処理ブロックについての補正データBxを算出し、得られた補正データBxと所定の閾値とを比較することによって、該ブロックについての処理方法を使い分けるものとしたが、簡便には、ブロック内の総和Sに基づいて判断することとしても良い。こうすれば、補正データを算出することなくドット形成有無を判断することができるので、処理を高速化することができる。
また、上述した説明では、ブロックは縦横2画素ずつ合計4画素から構成されているものとしたが、ブロックの構成は、必要に応じて種々の構成とすることができる。例えば、より多くの画素によって構成しても良く、また縦方向と横方向とで画素数を異ならせても良い。
更に、ブロック内で、各画素を処理する順番についても、上述した順番に限らず必要に応じて適切な順番とすることができる。
また、階調誤差を拡散する範囲も、図29あるいは図31に例示したものに限られず、より遠方の画素に拡散させることとしても良い。
以上、各種の実施例について説明してきたが、本発明は上記すべての実施例に限られるものではなく、その要旨を逸脱しない範囲において種々の態様で実施することができる。例えば、上述の機能を実現するソフトウェアプログラム(アプリケーションプログラム)を、通信回線を介してコンピュータシステムのメインメモリまたは外部記憶装置に供給し実行するものであってもよい。もちろん、CD−ROMやフレキシブルディスクに記憶されたソフトウェアプログラムを読み込んで実行するものであっても構わない。
また、上述した各種実施例では、階調数変換処理を含む画像データ変換処理はコンピュータ内で実行されるものとして説明したが、画像データ変換処理の一部あるいは全部をプリンタ側、あるいは専用の画像処理装置を用いて実行するものであっても構わない。
更には、画像表示装置は、必ずしも印刷媒体上にインクドットを形成して画像を印刷する印刷装置に限定されるものではない。例えば、液晶表示画面上で輝点を適切な密度で分散させることにより、階調が連続的に変化する画像を表現する液晶表示装置に対しても、本発明を効果的に適用することが可能である。