本発明の作用・効果をより明確に説明するために、本発明の実施の形態を、次のような順序に従って以下に説明する。
A.発明の概要:
B.装置構成:
C.画像データ変換処理の概要:
D.第1実施例:
D−1.ユニット単位で行う階調数変換処理:
D−2.ユニット内多値化処理:
D−3.第1実施例のユニット内多値化処理:
D−4.変形例:
E.第2実施例:
E−1.第2実施例のユニット内多値化処理:
E−2.第2実施例の変形例:
A.発明の概要:
実施例の詳細な説明を開始する前に、理解の便宜を図るため、本発明の概要について簡単に説明しておく。図1は、印刷システムを例にとって、本発明の概要を示した説明図である。図1に示した印刷システムは、画像処理装置としてのコンピュータ10と、カラープリンタ20等から構成されている。コンピュータ10は、デジタルカメラやカラースキャナなどの画像機器からRGB各色の階調値によって表現されたカラー画像データを受け取ると、該画像データを、カラープリンタ20で印刷可能な各色ドットの形成有無により表現された印刷データに変換する。かかる画像データの変換は、プリンタドライバ12と呼ばれる専用のプログラムを用いて行われる。尚、RGB各色によるカラー画像データは、各種アプリケーションプログラムを用いてコンピュータ10で作成することもできる。
また、カラープリンタ20には、印刷媒体上にドットを形成するヘッドが各色毎に設けられており、カラープリンタ20は、プリンタドライバ12によって生成された印刷データに従って、ヘッドを印刷媒体上で往復動させながらドットを形成することによって画像を印刷する。この時、ヘッドが往復動しながら印刷媒体上に形成するドット列は「ラスタ」と呼ばれるが、カラープリンタ20は、主に画質上の要請から、1本のラスタを1回の往復動で形成するのではなく、複数回の往復動に分けて形成している。このように、1本のラスタを形成するために行う往復動の回数は、「パス数」と呼ばれることがある。
プリンタドライバ12は、解像度変換モジュール,色変換モジュール,階調数変換モジュール14,インターレースモジュールといった複数のモジュールから構成されている。これら各モジュールで行われる処理については後述する。このうち、階調数変換モジュール14では、画像データをドット形成の有無により表現されたデータに変換する処理を行っている。ここで、処理を迅速化するため、本実施例の階調数変換モジュールでは、次のようにユニット単位の処理を行っている。すなわち、隣接する複数個の画素をまとめてユニットを生成し、各画素についてのドット形成有無の判断をユニット単位でまとめて行う。ドット形成有無の判断をユニット単位で行う方法については後述する。また、前述したようにカラープリンタ20は、1本のラスタを形成するためにヘッドを所定の複数回往復動させることとしているが、複数の画素をユニットとしてまとめる際には、少なくともラスタの方向には、パス数の整数倍に相当する個数ずつ連続した画素をまとめている。
図1中で、階調数変換モジュール14を表す枠の下方に、矢印で示した概念図は、階調数変換モジュール14において画像データがドットデータに変換されている様子を示したものである。概念図中で破線で示した小さな正方形は画素を模式的に示したものである。1つのユニットは、縦横2列ずつの4つの画素で構成されている。ユニットとしてまとめられる画素の個数は、カラープリンタ20のパス数(図1の例示では2)を基準として、次のようにして選択されたものである。すなわち、ユニットとしてまとめられる複数の画素が、少なくともラスタの方向には、パス数の整数倍の個数の連続した画素となるように選択されている。図中で細かい斜線を付して示したユニットは、処理中のユニット、すなわち画像データをドットデータに変換中のユニットを示したものである。また、粗い斜線を付して示した領域は、ドット形成有無が判断されてドットデータに変換された領域を示している。ドット形成有無の判断をユニット単位で行う場合、各ユニットについては同様な処理が行われる。このため、特に画像データの階調値があまり変化しない領域を処理した場合などには、複数のユニットに亘って一定のパターンでドットが形成されるおそれがある。一定のパターンでドットが形成された領域が発生すると、これが視認されて画質の悪化を招くことが懸念される。
図1中の概念図では、ドットが一定のパターンで形成される一例として、連続するユニット内の同じ画素位置にドットが形成される場合を示している。図示されているように、処理中のユニット(細かい斜線を付したユニット)の左側には、左上隅の画素にドットが形成されたユニットが2つ連続している。仮に、処理中のユニットでも左上隅の画素にドットが形成されると、連続して3つのユニットで同じ位置の画素にドットが形成されることになり、これがパターンとして視認されて画質が悪化するおそれがある。もちろん、ドットが一定のパターンで形成される例としては、連続するユニット内の同じ画素位置にドットが形成される場合に限られず、複数のユニットを周期として一定のパターンでドットが形成される場合も起こり得る。
この様な問題の発生を回避するために、図1に示した印刷システムにおける階調数変換モジュール14では、既に処理したユニットについてドットを形成すると判断した画素を、階調数変換結果記憶部に記憶しておく。ユニット単位でドット形成有無を判断するに際しては、階調数変換結果記憶部から判断結果を読み出して、ドットが一定のパターンで形成されることを回避しながら判断していく。例えば、図1中の概念図に示した例では、連続したユニットで同じ画素位置にドットが形成されているから、同じ位置の画素に連続してドットが形成されないようにしながら、処理ユニットについてのドット形成有無を判断していく。このように、視認され易いパターンでドットが形成されることを回避しながらドット形成の有無を判断する。こうすれば、ユニット単位でドット形成の有無を判断することによって迅速な処理を行いながら、画質を悪化させることなく高画質な画像を印刷することが可能となる。また、ユニットとしては、少なくともラスタの方向には、カラープリンタ20のパス数の整数倍に相当する個数の連続する複数の画素が選択されている。詳細には後述するが、このような複数の画素をユニットしてまとめておけば、複数のユニットに亘ってドットが一定のパターンで形成されることを回避すると同時に、周期的なパターンの発生には至らずとも色ムラが発生して画質が悪化してしまう現象も回避することが可能となる。以下では、このような画像処理について、実施例に基づき詳細に説明する。
B.装置構成:
図2は、本実施例の画像処理装置としてのコンピュータ100の構成を示す説明図である。コンピュータ100は、CPU102を中心に、ROM104やRAM106などを、バス116で互いに接続して構成された周知のコンピュータである。
コンピュータ100には、フレキシブルディスク124やコンパクトディスク126のデータを読み込むためのディスクコントローラDDC109や、周辺機器とデータの授受を行うための周辺機器インターフェースPIF108、CRT114を駆動するためのビデオインターフェースVIF112等が接続されている。PIF108には、後述するカラープリンタ200や、ハードディスク118等が接続されている。また、デジタルカメラ120やカラースキャナ122等をPIF108に接続すれば、デジタルカメラ120やカラースキャナ122で取り込んだ画像を印刷することも可能である。また、ネットワークインターフェースカードNIC110を装着すれば、コンピュータ100を通信回線300に接続して、通信回線に接続された記憶装置310に記憶されているデータを取得することもできる。
図3は、第1実施例のカラープリンタ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とが装着されている。キャリッジ240にインクカートリッジ242,243を装着すると、カートリッジ内の各インクは図示しない導入管を通じて、印字ヘッド241の下面に設けられた各色毎のインク吐出用ヘッド244ないし247に供給される。各色毎のインク吐出用ヘッド244ないし247には、48個のノズルNz が一定のノズルピッチkで配列されたノズル列が1組ずつ設けられている。
制御回路260は、CPU261と、ROM262、RAM263等から構成されている。制御回路260は、キャリッジモータ230と紙送りモータ235とを適切に駆動することを通じて、キャリッジ240の主走査と副走査とを制御するとともに、コンピュータ100から供給される印刷データに基づいて、各ノズルから適切なタイミングでインク滴を吐出する。こうして、制御回路260の制御の下、印刷媒体上の適切な位置に各色のインクドットを形成することによって、カラープリンタ200はカラー画像を印刷することができる。
尚、各色のインク吐出ヘッドからインク滴を吐出する方法には、種々の方法を適用することができる。すなわち、ピエゾ素子を用いてインクを吐出する方式や、インク通路に配置したヒータでインク通路内に泡(バブル)を発生させてインク滴を吐出する方法などを用いることができる。また、インクを吐出する代わりに、熱転写などの現象を利用して印刷用紙上にインクドットを形成する方式や、静電気を利用して各色のトナー粉を印刷媒体上に付着させる方式のプリンタを使用することも可能である。
更には、吐出するインク滴の大きさを制御したり、あるいは一度に複数のインク滴を吐出して、吐出するインク滴の数を制御することにより、印刷用紙上に形成されるインクドットの大きさを制御可能な、いわゆるバリアブルドットプリンタを使用することもできる。
以上のようなハードウェア構成を有するカラープリンタ200は、キャリッジモータ230を駆動することによって、各色のインク吐出用ヘッド244ないし247を印刷用紙Pに対して主走査方向に移動させ、また紙送りモータ235を駆動することによって、印刷用紙Pを副走査方向に移動させる。制御回路260は、印刷データに従って、キャリッジ240の主走査および副走査を繰り返しながら、適切なタイミングでノズルを駆動してインク滴を吐出することによって、カラープリンタ200は印刷用紙上にカラー画像を印刷している。
C.画像データ変換処理の概要:
図4は、本実施例の画像処理装置としてのコンピュータ100が、受け取った画像データに所定の画像処理を加えることによって、画像データを印刷データに変換する処理の流れを示すフローチャートである。かかる処理は、コンピュータ100のオペレーティングシステムがプリンタドライバ12を起動することによって開始される。以下、図4に従って、本実施例の画像データ変換処理について簡単に説明する。
プリンタドライバ12は、画像データ変換処理を開始すると、先ず初めに、変換すべきRGBカラー画像データの読み込みを開始する(ステップS100)。次いで、取り込んだ画像データの解像度を、カラープリンタ200が印刷するための解像度に変換する(ステップS102)。カラー画像データの解像度が印刷解像度よりも低い場合は、線形補間を行うことで隣接する画像データ間に新たなデータを生成し、逆に印刷解像度よりも高い場合は一定の割合でデータを間引くことによって、画像データの解像度を印刷解像度に変換する。
こうして解像度を変換すると、カラー画像データの色変換処理を行う(ステップS104)。色変換処理とは、R,G,Bの階調値の組み合わせによって表現されているカラー画像データを、C,M,Y,Kなどのカラープリンタ200で使用する各色の階調値の組み合わせによって表現された画像データに変換する処理である。色変換処理は、色変換テーブルと呼ばれる3次元の数表を参照することで迅速に行うことができる。
プリンタドライバ12は、色変換処理に続いて階調数変換処理を開始する(ステップS106)。階調数変換処理とは次のような処理である。色変換処理によって、RGB画像データはC,M,Y,K各色の階調データに変換される。これら各色の階調データは、階調値0から255の256階調を有するデータである。これに対し、本実施例のカラープリンタ200は、「ドットを形成する」,「ドットを形成しない」のいずれかの状態しか採り得ない。そこで、256階調を有する各色の階調データを、カラープリンタ200が表現可能な2階調で表現された画像データに変換する必要がある。このような階調数の変換を行う処理が階調数変換処理である。後述するように、本実施例のプリンタドライバ12は、画素を所定数ずつユニットにまとめ、ユニット単位で階調数変換処理を行うことによって迅速な処理を可能としている。また、処理済みのユニットについては、ドットを形成すると判断した画素を記憶しておき、このデータを反映させながら階調数変換を行う。更に、詳細には後述するが、ユニットの大きさは、カラープリンタ200のパス数を基準として所定の大きさに設定されている。こうすることで、ユニット単位で階調数変換処理を行った場合に懸念される、ドットが一定のパターンで形成される現象が発生することを確実に回避すると同時に、周期的なパターンの発生には至らずとも色ムラが発生して画質が悪化することも回避可能となっている。階調数変換処理については、後ほど詳細に説明する。
こうして階調数変換処理を終了したら、プリンタドライバはインターレース処理を開始する(ステップS108)。インターレース処理とは、ドットの形成有無を表す形式に変換された画像データ(ドットデータ)を、ドットの形成順序を考慮しながらカラープリンタ200に転送すべき順序に並べ替える処理である。プリンタドライバ12は、インターレース処理を行って最終的に得られた画像データを、印刷データとしてカラープリンタ200に出力する(ステップS110)。カラープリンタ200は、印刷データに従って、各色のインクドットを印刷媒体上に形成する。その結果、画像データに対応したカラー画像が印刷媒体上に印刷される。
D.第1実施例:
以下、図4に示した画像データ変換処理の中で行われる第1実施例の階調数変換処理について説明する。前述したように、本実施例の階調数変換処理では、複数の画素をユニットにまとめて、階調数変換処理をユニット単位で行っている。そこで、第1実施例の階調数変換処理について説明するための準備として、先ず、階調数変換処理をユニット単位で行う方法について説明し、その後、第1実施例の階調数変換処理において、処理済みのユニットでの判断結果を、ドット形成有無の判断に反映させる処理について説明する。
D−1.ユニット単位で行う階調数変換処理:
図5は、ユニット単位で行う階調数変換処理の流れを示すフローチャートである。この処理は、コンピュータ100のCPU102によって行われる。尚、本実施例のカラープリンタ200は、前述したようにC,M,Y,Kの4色のインクドットを形成可能なプリンタであり、図5に示す処理も各色毎に行っている。しかし、以下では説明が煩雑となることを避けるために、色を特定せずに説明することとして、特段の明示がない限り、色を特定せずに説明した場合は、各色について同様な処理が行われることを意味するものとする。
ユニット単位の階調数変換処理を開始すると、先ず初めに、処理するユニットの位置を設定する(ステップS200)。ユニット単位で行う階調数変換処理では、所定の複数個の隣接する画素をユニットとしてまとめ、各画素にドットを形成するか否かの判断をユニット単位で行う。そこで、ユニット単位の階調数変換処理を開始すると、先ず初めに、画像中でドットの形成有無を判断しようとするユニット(処理ユニット)の位置を設定する処理を行う。
図6は、隣接する所定の複数個の画素をまとめて、処理ユニットの位置を設定している様子を概念的に示した説明図である。図6中に、複数表示されている小さな正方形は、画素を模式的に表示したものである。図示されているように、画像は格子状に配列された複数の画素によって構成されている。図6(a)に示した例では、縦横2列ずつに並んだ隣接する4つの画素をまとめて処理ユニットを設定している。図6(a)中で、4つの画素を囲む太い破線は、これら画素が処理ユニットとして設定されていることを模式的に示したものである。説明の便宜上、ユニットを構成する4つの画素の中で、左上の画素を「Pa 」、右上の画素を「Pb 」、左下の画素を「Pc 」、右下の画素を「Pd 」と呼んで区別するものとする。尚、以下では、ユニットは縦横2列に並んだ4つの画素で構成されているものとして説明するが、もちろん、このような構成のユニットに限定されるものではない。例えば、図6(b)に示すような隣接する4つの画素をまとめることによって処理ユニットを設定しても良い。また、処理ユニットとしてまとめる画素の個数も4つに限られるものではない。
処理ユニットを設定したら、続いてユニット内の各画素についての画像データおよび拡散誤差の読み込みを行う(図5のステップS202)。ここで読み込む画像データは、前述した色変換処理(図4のステップS104)によって色変換して得られたC,M,Y,K各色の階調データである。また、拡散誤差とは、階調数を変換することにより生じた階調誤差が、周辺のユニットから処理ユニットの各画素に拡散されてきた誤差である。画像データがC,M,Y,Kの各色毎の階調データであることから、階調誤差はこれら各色毎に発生し、従って拡散誤差もこれら各色毎の階調データとなっている。階調数を変換することに伴って階調誤差が発生し、発生した誤差が拡散誤差として周辺の画素に拡散される様子については後述する。
ここでは、図6(a)に示すように、処理ユニットは画素Pa 、画素Pb 、画素Pc 、画素Pd の4つの画素で構成されているとしているから、図5のステップS202の処理では、それぞれの画素について、画像データDTa 、DTb 、DTc 、DTd および拡散誤差EDa 、EDb 、EDc 、EDd が読み込まれることになる。処理ユニットについて読み込んだこれらのデータは、コンピュータ100のRAM106に記憶される。
こうして各画素の画像データおよび拡散誤差を読み込んだら、処理ユニットを構成する各画素について、ドット形成の有無を判断する処理を開始する(ステップS204)。ここでは、図6(a)に示したように処理ユニットは4つの画素で構成されているとしているから、ステップS204の処理ではこれら4つの画素について所定の順序でドット形成の有無を判断していく。尚、本明細書中では、このようにユニット内の各画素についてドット形成の有無を判断する処理を、「ユニット内多値化処理」と呼ぶことがあるものとする。ユニット内多値化処理の詳細な内容については後述する。
処理ユニットを構成する各画素についてのドット形成有無の判断を終了したら、判断に伴って処理ユニット内で生じた階調誤差を、周辺のユニットに拡散する処理を行う(ステップS206)。処理ユニット内で生じた階調誤差とは、処理ユニット全体で表現すべき画像データの階調値と、該ユニット内の各画素にドットを形成することによって実際に表現された階調値との偏差を表す誤差である。処理ユニットで生じる階調誤差を算出する方法については、ユニット内多値化処理の説明の中で説明する。ステップS206においては、この偏差を示す階調値を、処理ユニットで生じた階調誤差として周辺の未処理のユニットに拡散させる処理を行う。
図7は、処理ユニットで生じた階調誤差を、周辺の未処理のユニットに拡散させる様子を概念的に示した説明図である。図7中に示した複数の小さな正方形は、それぞれ画素を模式的に表示したものである。また、太い破線で示した大きな正方形は処理ユニットを示しており、細い破線で示した大きな正方形は、処理ユニットに隣接する未処理のユニットを示している。処理ユニットで生じた階調誤差は、周辺の未処理ユニットを構成する画素に所定の割合で拡散する。図7中で処理ユニットから周辺の6つの画素に伸びる黒抜きの矢印は、処理ユニットで生じた階調誤差を、これら6つの画素に所定の割合で拡散していることを模式的に示している。
図8は、処理ユニットで生じた階調誤差を、処理ユニット周辺の未処理のユニットを構成する画素に拡散させる割合が設定されている様子を例示したものである。図8中で、太い実線で示した大きな正方形は処理ユニットを表したものであり、処理ユニットに隣接して細い破線で示した大きな正方形は、処理ユニット周辺の未処理のユニットを示したものである。これら未処理のユニットの中に細い実線で示した複数の小さな正方形は、処理ユニットからの誤差が拡散される画素を表示したものである。
図8(a)に示した例では、処理ユニットの右側にある2つの画素には、処理ユニットで生じた階調誤差が1/8の割合でそれぞれ拡散され、処理ユニットの下側にある2つの画素にも同様に、階調誤差が1/8の割合でそれぞれ拡散される。また、処理ユニットの左下の画素あるいは右下の画素には、階調誤差が1/4の割合でそれぞれ拡散される。このような割合で階調誤差を拡散させれば、処理ユニットの周辺のユニットに均等に、それぞれ階調誤差の1/4の割合で拡散されることになる。また、図8(b)に示した例では、処理ユニットで生じた階調誤差が、処理ユニット周辺のユニットを構成するすべての画素に、同じ割合で拡散される。もちろん、同じユニットに拡散する誤差をそのユニットの1つの画素にまとめて拡散するようにしても良い。
図5のステップS206においては、以上のようにして、処理ユニットで生じた階調誤差を周辺のユニットに拡散させる。処理ユニットについて、上述したすべての処理を終了したら、画像を構成する全てのユニットについて処理を終了したか否かを判断し(ステップS208)、未処理のユニットが残っていればステップS200に戻って続く一連の処理を繰り返す。こうして、すべてのユニットについての処理を完了したら、ユニット単位の階調数変換処理を終了する。
以上に説明したユニット単位で階調数変換処理を行えば、画素毎に処理した場合に比べて、以下のような利点を得ることができる。すなわち、階調数変換処理を画素毎に行う場合は、1つの画素についてのドット形成有無を判断する度に、その画素に対応付けて記憶されている拡散誤差を読み出さなければならず、また、ドット形成有無の判断によって生じた階調誤差を周辺の未判断画素に誤差を拡散しなければならない。このため、階調数変換処理を画素毎に行うと、処理時間が長くなってしまう傾向にある。これに対して、階調数変換処理をユニット単位で行った場合は、ユニット単位で画像データを読み出し、階調誤差を拡散させた後、拡散誤差をユニット単位でメモリに書き込むことができる。こうしてデータの読み出しおよび書き込みをユニット単位でまとめて行えば、処理に要する時間を短縮化することが可能である。
D−2.ユニット内多値化処理:
上述したユニット単位の階調数変換処理で行われるユニット内多値化処理(図5のステップS204)について説明する。図9は、ユニット内多値化処理の流れを示したフローチャートである。以下、フローチャートに従って説明する。
ユニット内多値化処理を開始すると、先ず初めに、処理ユニットを構成する画素の中から、ドット形成の有無を判断する画素(着目画素)を1つ設定する(ステップS300)。前述したようにユニットは複数の画素から構成されているので、これら複数の画素について所定の順序で1画素ずつドット形成の有無を判断することとして、着目画素を1つ選択する。ここでは、図6(a)に示したユニットを構成する4つの画素を、左上にある画素から右下の画素に向かって画素Pa 、画素Pb 、画素Pc 、画素Pd の順番にドット形成有無を判断することとして、ステップS300では、先ず初めに、左上隅にある画素Pa を着目画素として設定する。
次いで、設定した着目画素(ここでは、画素Pa )についての補正データCx を算出する(ステップS302)。補正データCx は、着目画素の画像データと着目画素に拡散されて記憶されている拡散誤差とを加算することによって求めることができる。処理ユニットを構成する各画素についての画像データおよび拡散誤差は、図5に示した階調数変換処理中のステップS202において既に読み込まれているので、ユニット内多値化処理の数轍鮒S302においては、これらのデータの中から着目画素の画像データと拡散誤差とを加算して補正データCx を算出する。
着目画素Pa の補正データCx を算出したら、得られた補正データCx と所定の閾値thとの大小関係を判断する(ステップS304)。そして、補正データCx の方が大きければ着目画素(ここでは画素Pa )にドットを形成すると判断し(ステップS3306)、そうでなければ、着目画素にはドットを形成しないと判断する(ステップS308)。判断の結果は、各画素についての判断結果を示す変数に蓄えられる。
こうして着目画素についてのドット形成有無を判断したら、判断に伴って着目画素に生じた階調誤差を算出する(ステップS310)。階調誤差は、ドットを形成したこと、あるいはドットを形成しなかったことによって着目画素に表現される階調値(以下では、この階調値を結果値と呼ぶ)を、着目画素の補正データCx から減算することによって算出することができる。
着目画素で生じた階調誤差を算出したら、処理ユニット内の全画素の処理を終了したか否かを判断し(ステップS312)、未処理の画素が残っている場合は(ステップS312:no)、これら未処理の画素中で着目画素周辺にある画素に誤差を拡散させる処理を行う(ステップS314)。この処理について、図10を参照しながら説明する。
図10は、処理ユニット内の画素から着目画素を1つずつ選択してドット形成の有無を判断することにより、ドット形成の有無をユニット単位で判断している様子を模式的に示した説明図である。図中の4つの正方形は、処理ユニットを構成する画素Pa 、画素Pb 、画素Pc 、画素Pd をそれぞれ示している。また、画素Pa を示す正方形の中に示したDTa およびEDa は、画素Pa に対応付けて、画像データDTa と拡散誤差EDa とがRAM106に読み込まれていることを概念的に示したものである。同様に、画素Pb には画像データDTb と拡散誤差EDb とが、画素Pc には画像データDTc と拡散誤差EDc とが、画素Pd には画像データDTd と拡散誤差EDd とが対応付けられて、それぞれRAM106に記憶されている。
前述したように、着目画素は、先ず初めはこれら4つの画素の中の画素Pa に設定されている。画素Pa についての画像データと拡散誤差とを読み出して補正データCx を算出し、閾値thと比較することによって画素Pa についてのドット形成の有無を判断する。画素Pa についてドット形成の有無を判断した時点では、図10(a)に示すように、同じユニット内には画素Pb と画素Pc と画素Pd の3つの画素が未判断画素として残っている。そこで、画素Pa で生じた階調誤差を、これら3つの画素に1/3ずつ均等に分配して、これら誤差を、各画素毎に記憶されている拡散誤差に加算する処理を行う。例えば画素Pb には、図10(a)に示すように、既に拡散誤差EDb が対応付けて記憶されている。画素Pa で生じた階調誤差は、その1/3の階調値が画素Pb に分配されて、拡散誤差EDb に加算される。その結果、画素Pb に対応づけて記憶されていた拡散誤差EDb は、画素Pa からの誤差が加算された新たな拡散誤差EDb に更新される。
他の画素Pc および画素Pd についても同様な処理を行う。簡単に説明すると、画素Pa からの誤差が画素Pc に拡散されると、画素Pc に記憶されていた拡散誤差EDc と画素Pa からの誤差とが加算され、新たな拡散誤差EDc として画素Pc に対応付けて記憶される。また、画素Pd についても同様に、画素Pd に記憶されていた拡散誤差EDd と画素Pa からの誤差とが加算され、新たな拡散誤差EDd として画素Pd に対応付けて記憶される。図10(a)中で画素Pa から他の3つ画素に向かって表示されている白抜きの矢印は、画素Pa で生じた誤差がこれら3つの画素に拡散されることを模式的に示したものである。尚、階調誤差は、必ずしも周辺の未判断画素に均等に分配する必要はなく、各画素に所定の割合で分配することも可能である。
以上のようにして画素Pa で階調誤差をユニット内の周辺画素に拡散したら、図9のステップS300に戻って、新たな着目画素を設定する処理を行う。処理ユニット中の画素Pa については、既にドット形成の有無を判断済みであるから、ステップS300では、今度は画素Pa の右隣の画素Pb を着目画素として設定する。こうして設定した新たな着目画素について、上述した処理とほぼ同様の処理を行う。以下、画素Pa における処理との相違点を中心に簡単に説明する。
画素Pb についての処理を行う場合にも画素Pa における場合と同様に、先ず初めに、補正データCx を算出する(ステップS302)。ここで、画素Pb に対応付けて記憶されている拡散誤差EDb には、先に画素Pa で生じた階調誤差が拡散されて、新たな拡散誤差EDb として更新されている。そこで、画素Pb についての画像データDTb と、画素Pa からの階調誤差が拡散された新たな拡散誤差EDb とを加算することにより、画素Pb についての補正データCx を算出する。こうして算出した補正データCx と所定の閾値thとの大小関係を判断し(ステップS304)、補正データCx の方が大きければ画素Pb にはドットを形成すると判断し(ステップS306)、そうでなければ画素Pb にはドットを形成しないと判断する(ステップS308)。次いで、画素Pb について発生した階調誤差を算出する(ステップS310)。階調誤差は、画素Pa の場合と同様に、画素Pb の補正データCx から結果値を減算することによって算出することができる。
着目画素Pb で生じた階調誤差を算出したら、処理ユニット内のすべての画素について処理を終了したか否かを判断し(ステップS312)、未処理の画素が残っていれば、算出しておいた階調誤差を、これら未処理の画素に拡散させる処理を行う(ステップS314)。前述したように、ユニット内の画素Pa については既に判断を終了しているから、未判断画素として残っているのは画素Pc および画素Pd の2つの画素である。そこで、画素Pb で生じた階調誤差はこれら2つの画素に拡散させることになる。再び、図10を参照しながら、画素Pb からの誤差を拡散させる処理について説明する。
図10(b)は、画素Pb で生じた階調誤差を拡散している様子を概念的に示した説明図である。図中で、画素Pa に斜線が施されているのは、画素Pa については既にドット形成の有無を判断済みであることを模式的に示したものである。画素Pb についてドット形成の有無を判断した時点では、処理ユニット内には未判断画素として画素Pc 、画素Pd の2つの画素が残っている。そこで、画素Pb で生じた階調誤差は、図10(b)に示したように、これらの画素Pc および画素Pd にそれぞれ、1/2ずつ拡散されることになる。図中で、画素Pb から画素Pc および画素Pd に向かって伸びる白抜きの矢印は、画素Pb で生じた階調誤差がこれら画素に拡散されていることを模式的に示している。こうして誤差が拡散される結果、各画素の拡散誤差は、拡散されてきた誤差が加算された新たな拡散誤差に更新される。尚、ここでは、階調誤差は処理ユニット内の未判断画素に均等に拡散されるものとしているが、もちろん、均等に拡散させるのではなく、所定の割合で誤差を拡散させることとしても構わない。
こうして画素Pb で生じた階調誤差を周辺の画素に拡散したら、再び図9のステップS300に戻って、今度は着目画素を画素Pc に移動させた後、着目画素Pc について同様の処理を行う。以下では、かかる処理について、図10(c)を参照しながら説明する。画素Pc についての処理を開始すると、先ず初めに画素Pc の画像データDTc と拡散誤差EDc とを加算して補正データCx を算出する。ここで、画素Pc についてのドット形成有無を開始した時点では、画素Pc の拡散誤差EDc は、元々記憶されていた拡散誤差に加えて、画素Pa からの誤差と画素Pb からの誤差とが加算されて、新たな拡散誤差EDc として更新されている。このことから、画素Pc の補正データCx の算出に際しては、画素Pc の画像データDTc に、新たな拡散誤差EDc が算出されることになる。こうして得られた補正データCx と、所定の閾値thとを比較することによって、画素Pc についてのドット形成有無を判断する。こうして画素Pc についてのドット形成有無を判断した時点では、処理ユニット内に残る未判断画素は、図10(c)に示すように画素Pd のみである。そこで、画素Pc で生じた階調誤差は全て画素Pd に拡散され、画素Pd に元々記憶されていた拡散誤差に加算されて、新たな拡散誤差EDd として更新される。
着目画素Pc で生じた階調誤差を拡散したら、図9のステップS300に戻って着目画素を画素Pd に移動した後、画素Pd についてのドット形成有無の判断を開始する。すなわち、画素Pd に対応づけられた新たな拡散誤差EDd と画素Pd の画像データDTd とを加算して補正データCx を算出する(ステップS300、ステップS302)。次いで、補正データCx と閾値thとを比較し(ステップS304)、補正データCx の方が大きい場合は画素Pd にはドットを形成する(ステップS306)と判断し、そうでない場合は画素Pd にはドットを形成しないと判断する(ステップS308)。
こうして画素Pd についてのドット形成の有無を判断したら、画素Pd で生じた階調誤差を算出した後(ステップS310)、処理ユニット内の全画素の処理を終了したか否かを判断する(ステップS312)。図10(d)に示したように、画素Pd について処理を開始した時点で、もはや処理ユニット内には未判断の画素は残っておらず、画素Pd についての判断が終了した後のステップS312においては、処理ユニット内の全画素についての処理が終了したと判断される。そこで、図9に示したユニット内の多値化処理を終了して、図5を用いて前述したユニット単位で行う階調数変換処理に復帰する。図5に示されているように、ユニット単位の階調数変換処理では、ユニット内多値化処理から復帰すると、処理ユニットで生じた階調誤差を周辺のユニットに拡散する処理を行う(図5のステップS206)。
ここで、処理ユニットで生じた階調誤差の値としては、ユニット内多値化処理のステップS310において画素Pd について求めた階調誤差の値を用いることができる。これは、着目画素で生じた階調誤差をユニット内の未判断画素に拡散しながらドット形成有無の判断を行っているために、ユニット内で生じた階調誤差が、最後に判断する画素Pd に拡散誤差EDd として累積されることによる。以下、図10を参照して詳しく説明する。
画素Pa で生じた階調誤差は処理ユニット内の画素Pb 、画素Pc 、画素Pd の3つの画素に拡散される。画素Pb のドット形成有無の判断に際しては、画素Pa からの誤差を考慮して、画素Pb に拡散されている誤差ができるだけ解消されるようにドット形成の有無が判断される。仮に、画素Pb についてドット形成有無を判断することにより、画素Pb に拡散されている誤差を解消することができたものとする。この場合は、画素Pb では新たな階調誤差は発生せず、また、画素Pb から画素Pc 、画素Pd に拡散される誤差も生じない。他の2つの画素Pc 、画素Pd についても同様に、ドット形成の有無を判断したことで、それぞれの画素に拡散されている誤差を解消することができたものとすると、これらの画素では階調誤差は生じない。結局、この場合は、画素Pa で生じた階調誤差を、周辺の未判断画素Pb 、画素Pc 、画素Pd で解消したこととなって、処理ユニット全体としては階調誤差の発生を避けることができる。
ここでは、画素Pb のドット形成有無の判断によって、画素Pb での誤差を解消するものとしたが、画素Pb で新たな階調誤差が発生した場合には、この誤差は周辺の未判断画素Pc および画素Pd に拡散されて、その結果、これらの画素には、画素Pa で生じた階調誤差と画素Pb で生じた階調誤差とが拡散されることになる。しかし、これら画素Pc 、画素Pd についてドット形成の有無を判断することで、それぞれの画素に拡散された誤差を解消することができれば、依然としてユニット全体としてみれば階調誤差は生じない。
画素Pc についてドット形成有無を判断することで、画素Pc に拡散されている拡散誤差を解消することができない場合も、全く同様にして、画素Pd で誤差を解消することができれば、ユニット全体としては階調誤差が生じることはない。換言すれば、画素Pd で解消しきれずに残った誤差が、ユニット全体で生じた階調誤差となる。このように、着目画素で生じた階調誤差をユニット内の未判断画素に拡散しながらドット形成有無を判断していくと、各画素で解消しきれずに残った階調誤差が後続する画素に集約されていくので、ユニット内で最後に判断する画素Pd で生じた階調誤差を、処理ユニット全体で生じた階調誤差として用いることが可能となるのである。
尚、以上の説明では、処理ユニット内で最後にドット形成有無を判断する画素Pd で生じた階調誤差の値を、処理ユニット全体で生じた階調誤差として用いるものとしたが、もちろん、処理ユニットを構成する各画素毎に階調誤差を算出し、これら階調誤差の総和を処理ユニットの階調誤差としても構わない。
また、図10に示した例では、着目ユニットを構成する各画素のドット形成有無を判断するに際しては、画素Pa 、画素Pb 、画素Pc 、画素Pd の順番で判断を行ったが、必ずしもこの順番で判断する必要はなく、例えば、画素Pa 、画素Pc 、画素Pb 、画素Pd の順番でドット形成有無を判断しても構わない。処理ユニット内で着目画素を設定する順番は、良好な画質が得られる順番を選択しておくことができる。
D−3.第1実施例のユニット内多値化処理:
以上に説明したようにして、ユニット単位で階調数変換処理を行う場合、ユニット毎に同じ処理が繰り返されることになる。このことから、あるユニットでドットを形成すると判断した画素は、後続するユニットでも、同じ位置にドットが形成されると判断され易い傾向がある。あるいは、個々のユニットについてはドットが形成されるユニットとされないユニットが生じるものの、複数のユニットを周期として一定のパターンでドットが形成されることがある。例えば、画像データが一定の領域が続く場合など、複数のユニットを周期としてほとんど同じ処理が繰り返されることになり、ユニット内の同じ位置の画素に周期的にドットが形成されることが起こり得る。もちろん、ドット自体の大きさは視認が困難なほどに小さいが、複数のユニットに亘って周期的なパターンでドットが形成されると、この様な領域の存在が視認されて画質を悪化させるおそれがある。
更には、本実施例のカラープリンタ200のように、1本のラスタを複数回の主走査によって形成するプリンタでは、周期的なパターンが視認されるまでには至らずとも、ユニット内の特定の画素位置に偏ってドットが形成されると、色ムラが発生するなどして画質が悪化してしまうことがある。すなわち、主走査を複数回行っているものの、特定の主走査で集中してドットが形成されてしまうために、ラスタを複数回に分けて形成していることによる画質改善の効果が得られず、色ムラや白筋などの画質上の問題が発生してしまう場合がある。
この様な問題の発生を回避するために、第1実施例では、ユニット内の多値化処理を行い、画像データをユニット単位でドットデータに変換するに際して、既に処理したユニット中でドットが形成された画素位置を検出し、検出結果を反映させながらドット形成の有無を判断している。このように、処理済みのユニット内でドットが形成される画素位置の履歴を考慮しながら、処理ユニット内のドット形成有無を判断すれば、画像データをユニット単位で変換することによって生じ得る画質の悪化を回避することができる。また、本実施例では、ユニットには、少なくとも主走査方向には、カラープリンタ200のパス数の整数倍に相当する個数ずつ連続した画素をまとめることとしている。後述するように、ユニットをこのような大きさとしておけば、周期的なパターンの発生を回避することで、色ムラや白筋が発生するといった問題が発生することも同時に回避することが可能である。以下では、こうした第1実施例のユニット内多値化処理について説明する。
上述したように、本実施例のユニット内多値化処理では、ユニットの大きさが、少なくとも主走査方向には、カラープリンタ200のパス数の整数倍となるように設定されている。具体的には、図6に示したように、少なくとも主走査方向には2画素ずつの複数の画素がまとめられている。これは、本実施例のカラープリンタ200が、1つのラスタを2回の主走査に分けて(すなわち2パスで)形成していることに対応したものである。この点につき、若干補足して説明する。
図11は、カラープリンタ200が、1本のラスタを2パスで形成する様子を概念的に示した説明図である。図中に示した小さな矩形は、画素を模式的に表したものである。今、図中の上段に示した一列の画素の上に、ドットの列(ラスタ)を形成するものとする。また説明の便宜上、図11では、各画素を識別するために画素番号を付してある。1本のラスタを2パスで形成する場合は、各パスでは画素1つおきにドットを形成する。図11に示した例では、パスAでは画素番号が奇数の画素にドットを形成し、パスBでは画素番号が偶数の画素にドットを形成している。図11では、理解の便宜を図るため、パスAで形成されるドットは斜線を付した丸印で表し、パスBで形成されるドットは斜線を付した三角印で表すことによって区別している。このように、各パスでは飛び飛びの画素にドットを形成しながらも、2パス終了後には、図11の下段に示したように1本のラスタが形成されることになる。
このように、本実施例ではカラープリンタ200が2パスでラスタを形成することに対応して、主走査方向および副走査方向に2画素ずつの合計4つの画素をユニットとしてまとめている。ユニットしてまとめる画素は、少なくとも主走査方向の画素数がパス数2の倍数となりさえすれば、どのようなものであっても良い。例えば、図12に示すように、主走査方向に4画素ずつ連続した合計8つの画素をユニットとしてまとめることも可能である。
尚、ここでは、カラープリンタ200のパス数が「2」であるものとして説明しているが、ここで説明している事柄は、他のパス数である場合にも同様に適用することができる。すなわち、1本のラスタを3回のパスで形成するパス数3のプリンタの場合には、主走査方向に3の倍数個(すなわち、3,6,9・・・のいずれか)ずつの画素をユニットしてまとめればよいし、パス数4のプリンタであれば、主走査方向に4の倍数個ずつの画素をユニットとしてまとめてやればよい。
図13は、こうしたユニットを、ユニット単位で多値化処理する流れを示すフローチャートである。かかる処理は、図9を用いて前述したユニット内多値化処理に対して、処理済みのユニット内でドットが形成された画素位置を検出し、検出結果を反映させながら階調数変換処理を行っている点が大きく異なっている。以下、前述したユニット内多値化処理との相違点を中心として、第1実施例のユニット内多値化処理について説明する。
第1実施例のユニット内多値化処理においても、処理を開始すると先ず初めに、処理ユニットの中から着目画素を1つ設定し(ステップS400)、設定した着目画素についての補正データCx を算出する(ステップS402)。補正データCx は、着目画素の画像データと着目画素に拡散されて記憶されている拡散誤差とを加算することによって求めることができる。また、処理ユニットを構成する各画素の画像データおよび拡散誤差は、図5に示した階調数変換処理中のステップS202において既に読み込まれており、これらデータの中から着目画素についてのデータを用いて補正データCx を算出する。
次いで、第1実施例のユニット内多値化処理においては、処理済みのユニット内でドットが形成される画素位置の履歴を検出し、検出結果に基づいて閾値thを適切な値に設定する処理を行う(ステップS404)。この処理(履歴検出・閾値設定処理)について、図14を参照しながら説明する。
図14は、履歴検出・閾値設定処理の流れを示すフローチャートである。履歴検出・閾値設定処理を開始すると、先ず初めに、履歴データを読み出す処理を行う(ステップS500)。履歴データとは、処理済みのユニットについてドットを形成すると判断された画素位置を記録したデータであり、RAM106上の特定の領域に確保された専用のバッファ(履歴検出用バッファ)に記憶されている。
図15(a)は、履歴データの構造を概念的に示した説明図である。図15(a)に示した履歴データは、12bitの長さを有しており、それぞれのbitが画素位置に対応している。前述したように、ここでは1つのユニットは4つの画素から構成されているとしているから、12bit分の履歴データには、3つのユニット分の画素が記憶されていることになる。尚、ここでは履歴データには3ユニット分のデータが蓄えられているものとして説明するが、より多数のユニットのデータを蓄えることとしても構わない。以下、図15(a)を参照しながら具体的に説明する。
図示するように、履歴データは連続する4bitを1つのブロックとして、3つのブロックに分けて解釈することができる。これら3つのブロックは、下位側(図上では右側)から順番に、処理中のユニットの直前に処理したユニット(「1つ前のユニット」)、その直前に処理したユニット(「2つ前のユニット」)、更にその直前に処理したユニット(「3つ前のユニット」)にそれぞれ対応している。また、各ブロックを構成する4つのbitは、下位側から、対応するユニット内の右下隅にある画素(画素Pd )、左下隅にある画素(画素Pc )、右上隅にある画素(画素Pb )、左上隅にある画素(画素Pa )にそれぞれ対応している。履歴データ中のあるbitに値「1」が記録されていることは、そのbitが対応する画素にドットが形成されることを意味しており、逆にbitに値「0」が記憶されている場合は、そのbitが対応する画素にはドットが形成されないことを意味している。
尚、図15において、4bitを1ブロックとして解釈しているのは、ここでは1つのユニットが4つの画素から構成されているとしたことに対応したものである(図6(a)参照)。従って、1つのユニットをN個の画素から構成されているとした場合は、履歴データは連続するNbitを1つのブロックとして解釈される。また、ここでは、履歴データは12bit分のデータであるとして説明するが、1つのユニットがN個の画素から構成されていて、処理ユニットからMユニット前に処理したユニットまでのドット形成状況を参照する場合には、履歴データは、N×Mbitの長さを有するデータとすればよい。
一例として、図15(b)に示すような履歴データを想定する。履歴データの下位側の4つのbitからなるグループに着目すると、このグループ内の最上位(左端)のbitおよび最下位(右端)のbitには値「1」が設定されており、他のbitについては値「0」が設定されている。これは、処理中のユニットの直前に処理したユニット(「1つ前のユニット」)では、画素Pa および画素Pd の2つ画素にドットが形成され、その他の画素位置にはドットが形成されないことを意味している。同様に、履歴データの中央にあるグループについては、いずれのbitにも値「0」が記憶されているから、処理ユニットの2つ前に処理したユニットでは、いずれの画素にもドットが形成されていないことを意味している。履歴データの上位側にあるグループについては、グループ内の最上位のbitに値「1」が記憶されているから、処理ユニットの3つ前に処理したユニットでは画素Pa の画素位置にドットが形成されることを意味している。このようにして履歴データを解釈することにより、図15(b)で想定した履歴データからは、図15(c)に示したドットの形成状況を知ることができる。
図14のステップS500では、RAM106上の所定の領域に確保された履歴検出用バッファから、このような履歴データを読み出す処理を行う。こうして、履歴データを読み出したら、続いて、履歴検出用データを設定する処理を開始する(ステップS502)。かかる処理について、図16を参照して説明する。
図16は、履歴検出用データを設定する様子を概念的に示した説明図である。一例として、処理ユニット中の画素Pa について、ドット形成有無を判断しようとしている場合を考える。図16(a)で、斜線を付して示した破線の大きな正方形は、処理ユニットを示しており、処理ユニット中の黒い正方形は着目画素を示している。前述したようにユニット内多値化処理では、各画素のドット形成有無の判断をユニット単位で行うために、同じ画素位置にドットが形成され易くなる場合がある。この理由について、少し詳しく説明する。
例えば、画像中で処理している領域が、画素36個につき1画素の割合でドットが形成されるような、比較的低階調の画像データの領域(明るい画像の領域)であるとする。この様な領域では、縦横6画素の合計36画素から構成される正方形の領域に、ほぼ1つずつの割合でドットが形成されることになる。この様な画像データの領域を、4画素(縦横2画素)を1ユニットとするユニット単位でドット形成有無を判断した場合、3ユニット(6画素分)を周期として同じ処理が繰り返されることになり、3ユニット目の同じ画素位置にドットが形成されてしまうことが起こり得る。こうした一定の周期でドットが形成された場合、これらドットを形成する印字パスが、後述するように特定のパスに偏ってしまい、色ムラが発生して画質を悪化させることが起こり得る。
そこで、図16(a)に示した例では、処理ユニットから3つ前のユニットまでの範囲で、各ユニットの画素Pa にドットが形成されているか否かを検出する。図16(a)中で、各ユニットの画素Pa に示された「?」は、これらの画素位置でドットの形成状況を検出することを模式的に示したものである。
図16(b)は、これら画素位置でのドット形成状況を検出するために設定された履歴検出用データを、概念的に示した説明図である。履歴検出用データも、前述した履歴データと同様に12bitの長さを有しており、4bitを1グループとして、3つのグループに分けて解釈される。履歴検出用データが3つのグループから構成されているのは、3つのユニットでのドット形成状況を検出することに対応したものである。また、4bitで1グループを構成しているのは、本実施例では、4つの画素を1つのユニットとしてまとめて処理していることに対応したものである。履歴検出用データの各グループとユニットとの対応関係、および各bitとユニット内の画素位置との対応関係は、図15に示した履歴データの場合と同様であるため、ここでは説明は省略する。尚、ここでは、履歴検出用データは、図15に示した履歴データと同じ長さのデータとして説明するが、これに限られるものではない。
図16(a)に示したように、ここでは、各ユニットの画素Pa でのドット形成状況を検出しようとしている場合を想定しているから、履歴検出用データは、各ユニットの画素Pa に対応するbitのみ値「1」を設定し、他のbitには値「0」を設定したデータとすればよい。
また、着目画素が画素Pb に設定されている場合は、同様にして、処理ユニットから3つ前のユニットまでの範囲で、各ユニットの画素Pb にドットが形成されているか否かを検出すればよい。図16(c)は、着目画素が画素Pb に設定されている場合に、各ユニットでのドット形成状況を検出する画素位置を示す説明図である。図中に「?」を表示した画素が、ドット形成状況を検出する必要のある画素となる。図16(d)は、この様な画素でのドット形成状況を検出するために設定される履歴検出用データを概念的に示した説明図である。図示されているように、このような場合の履歴検出用データは、各ユニットの画素Pb に対応するbitの値を「1」として、他のbitは値「0」を設定したデータとすればよい。
図14のステップS502では、以上に説明したようにして、着目画素の位置に応じて履歴検出用データを設定する処理を行う。
こうして履歴検出用データを設定したら、ステップS500で読み込んだ履歴データに、設定した履歴検出用データを作用させることによって、検出対象としているドットの形成状況(以下、履歴検出用データを設定して検出しようとしているドットの形成状況を「対象履歴」と呼ぶことがあるものとする)を検出する(ステップS504)。
図17(a)は、履歴データに履歴検出用データを作用させて、対象履歴を検出する様子を概念的に示した説明図である。図17(a)の上段には、履歴データを示し、履歴データの下段には履歴検出用データを示している。対象履歴の検出に際しては、先ず、履歴データと履歴検出用データとの間で、対応するbit同士の論理積を算出する。本明細書中で「履歴データに履歴検出用データを作用させる」とは、このように、履歴データと履歴検出用データとの間で、対応するbit同士の論理積を採ることにより中間データを算出することを言う。次いで、こうして得られた中間データの各bitの論理和、あるいは算術和を取ることによって対象履歴を検出することができる。図17(a)では、履歴データに履歴検出用データを作用して算出した中間データを、履歴検出用データの下段に示している。前述したように、履歴検出用データには、各ユニット中で検出しようとする画素位置にのみ値「1」が設定され、検出不要の画素位置には値「0」が設定されているから、履歴データと履歴検出用データとでbit同士の論理積を算出すると、検出しようとする画素位置にドットが形成されている場合にのみ、その画素位置に対応するbitの値が「1」に設定される。
上述した処理を、図17(a)中に示した「1つ前のユニット」に着目して、具体的に説明する。履歴データに示されているように、処理ユニットの「1つ前のユニット」には画素Pa および画素Pd にドットが形成されている。ここで、ドットの形成状況を検出しようとしている画素位置は、履歴検出用データに示されているように画素Pa のみであるから、中間データは、図17(a)に示すように、画素Pa に対応するbitのみが値「1」となり、他のbitは値「0」となる。このように、中間データのいずれかのbitが値「1」となっていることは、そのユニットには、検出しようとしている画素位置にドットが形成されていることを意味している。次いで、各ユニットの論理和を取って、その値が「1」であれば、検出しようとする画素位置のいずれかにドットが形成されていることになる。また、各ユニットの算術和を取れば、検出しようとする画素位置に何個のドットが形成されているかを検出することが可能となる。
図14のステップS504では、以上のようにして、中間データの各bitの論理和(あるいは算術和)を採って検出結果を算出する処理を行う。こうして得られた検出結果に基づいて、対象履歴が検出されたか否かを判断する(ステップS506)。検出結果の値が「0」である場合は、対象履歴は検出されていないものと判断する。すなわち、検出結果(すなわち中間データの各bitの論理和)の値が「0」となったことは、検出対象とするいずれのユニットにおいても、検出しようとしている画素位置にはドットが形成されていないことを意味している。そこで、検出結果の値が「0」であれば、対象履歴は検出されていないものと判断することができる。逆に、検出結果の値が「1」であれば、検出対象としているユニット中のいずれかのユニットにおいて、検出しようとしている画素位置にドットが形成されていることを意味しており、対象履歴が検出されたものと判断することができる。また、中間データの各bitの算術和を取った場合は、得られた値が所定値以上であれば対象履歴が検出されたものと判断し、算術和の値が所定値未満であれば対象履歴は検出されていないものと判断すればよい。
図17(a)に示した中間データには、「1つ前のユニット」および「3つ前のユニット」の中のbitが値「1」に設定されているので、このような中間データの各bitの論理和を採って検出結果を算出すると値「1」が得られる。従って、この場合には対象履歴が検出されることになる。
参考として、図17(a)の上段に示す履歴データが表しているドットの形成状況を、図17(b)に示した。図17(a)に示したように、中間データから算出された検出結果は値「1」となり、画素Pa にドットが形成されていることを示す結果が得られる。図17(b)に示されているように、処理ユニットの「1つ前のユニット」および「3つ前のユニット」の画素Pa の位置には、確かにドットが形成されている。このことから、履歴データに履歴検出用データを作用させる方法を用いることで、ドットの形成状況を正確に検出可能であることが確認できる。
図14の履歴検出・閾値設定処理では、こうして検出した対象履歴に基づいて、閾値thの値を適切な値に設定する処理を行う。すなわち、ステップS506において対象履歴が検出されなかった場合には、通常値Vn を閾値thとして設定し(ステップS508)、逆に、対象履歴が検出された場合には、通常値Vn よりも大きな値に設定された割増値Vp を、閾値thとして設定する(ステップS510)。ここで設定した閾値thは、ユニット内多値化処理中で着目画素にドットを形成するか否かを判断するために参照される。こうして閾値thを設定したら、図14の履歴検出・閾値設定処理を終了して、図13に示した第1実施例のユニット内多値化処理に復帰する。
履歴検出・閾値設定処理から復帰すると、ステップS402において算出しておいた補正データCx と、閾値thとの大小関係を判断する(ステップS406)。この閾値thは、履歴検出・閾値設定処理中で対象履歴を検出することにより、適切な値に設定されている。そして、補正データCx の方が大きい場合には(ステップS406:yes)、着目画素にはドットを形成すると判断し(ステップS408)、そうでない場合には(ステップS406:no)、着目画素にはドットを形成しないと判断する(ステップS410)。図14を用いて説明したように、対象履歴が検出されると閾値thの値は、通常用いられる値(通常値Vn )よりも大きな所定の割増値(Vp )に変更されることから、結局、対象履歴が検出された場合には着目画素にはドットが形成され難くなることとなる。こうして判断した結果は、各画素についての判断結果を示す変数に蓄えられる。
以上のようにして着目画素についてのドット形成有無を判断したら、判断に伴って生じる階調誤差を算出する(ステップS412)。階調誤差の算出方法は、図9に示したユニット内多値化処理と同様であり、ここでは説明を省略する。ついで、処理ユニット内の全画素の処理を終了したか否かを判断する(ステップS414)。未処理の画素が残っている場合は(ステップS414:no)、ユニット内にあるそれらの周辺画素に誤差を拡散させる処理を行った後(ステップS416)、ステップS400に戻って着目画素を移動させて、続く一連の処理を繰り返す。ステップS416において処理ユニット内の画素に誤差を拡散させる処理は、図9、図10を用いて説明した前述のユニット内多値化処理と同様にして行うことができる。
一方、ステップS414において、処理ユニット内の全画素の処理を終了したと判断された場合は(ステップS414:no)、処理ユニット内の各画素についての判断結果を、履歴検出用バッファに書き込む処理を行う(ステップS418)。かかる処理について、図18、図19を参照して説明する。
図18は、処理ユニットの各画素についての判断結果を、履歴検出用バッファに書き込む処理の流れを示したフローチャートである。履歴検出用バッファに書き込む処理を開始すると、先ず初めに、バッファに記憶されているデータを、上位方向に1ユニット分だけシフトさせる処理を行う(ステップS600)。図19は、かかる処理を模式的に示した説明図である。図中に示された小さな正方形の列は、履歴検出用バッファを模式的に示したものであり、図中の上側に示した履歴検出用バッファはデータをシフトする前の状態を、図中の下側に示し履歴検出用バッファはデータをシフトした後の状態を示している。図18のステップS600においては、図19に示されているように履歴検出用バッファのデータを1ユニット分だけ上位方向にシフトさせる。このとき、履歴検出用バッファの最上位側のユニットのデータは破棄される。また、シフトさせた後の最下位ユニットの各bitには、念のために、いずれのbitにも値「0」を書き込んでおく。尚、図19では、履歴検出用バッファは、ユニット3つ分のデータを記憶可能であるとしているが、もちろんより多数のユニットのデータを記憶可能としてもよい。
こうして1ユニット分のデータを上位方向にシフトさせたら(図18のステップS600)、次いで、処理ユニット内の各画素の判断結果に応じた4bit長のデータを設定する処理を行う(ステップS602)。かかるデータのそれぞれのbitは、処理ユニットを構成する各画素に対応付けられている。具体的には、最上位bitは処理ユニットの画素Pa に、上位から2番目のbitは画素Pb に、3番目のbitは画素Pc に、最下位bitは画素Pd にそれぞれ対応付けられている。ステップS602においては、処理ユニット内でドットが形成される画素に対応するbitには値「1」を書き込み、ドットが形成されない画素に対応するbitには値「0」を書き込む処理を行う。例えば、ある処理ユニットでは、画素Pb にのみドットが形成され、他の画素にはドットが形成されなかったとすると、ステップS602の処理では、処理ユニットに対応する4bit長のデータとして「0100( 2)」が設定されることになる。尚、( 2)は二進数表示されていることを示すものとする。
続くステップS604では、こうして設定したデータを、履歴検出用バッファの最下位ユニットの領域に書き込む処理を行う。図19で、最下位ユニットの各bitに向かう白抜きの矢印は、設定されたデータがこれらbitに書き込まれる様子を模式的に示したものである。
以上のようにして、処理ユニット内の各画素の判断結果を履歴検出用バッファに書き込む処理を終了したら、図13に示した第1実施例のユニット内多値化処理を終了して、図5の階調数変換処理に復帰する。
尚、以上の説明では、対象履歴が検出された場合には、ドット形成有無の判断に使用する閾値thの設定値を大きな値に変更して、着目画素にはドットが形成され難くするものとした。もちろん、対象履歴が検出された場合には、着目画素にはドットを形成しないと判断することも可能である。このようにすれば、複数のユニットを周期として同じ画素位置にドットが形成されることを、簡便に回避することができる。
また、以上の説明では、履歴データに履歴検出用データを作用させて中間データを生成し、中間データの各bitの論理和あるいは算術和を取って検出結果を算出した。これに対して、中間データの各bitの論理積を取って、この値を検出結果としても良い。この場合は、ドットの形成状況を検出しようとしている全ての画素位置にドットが形成されている場合にのみ、検出結果の値が「1」となる。従って、例えば、ドットがある程度の密度で形成されている状況で、視認されやすい特定のパターン形成されたドットだけを、確実に検出することが可能となる。
上述したように、第1実施例のユニット内多値化処理においては、履歴検出・閾値設定処理中で対象履歴の有無を検出し、対象履歴が検出された場合には閾値thの値を大きくすることによって、着目画素にドットが形成され難くしている。このため、ユニット単位で階調数変換処理を行った場合でも、複数のユニットを周期として同じ画素位置にドットが形成される領域が発生し、この領域が視認されて画質を悪化させることを回避することができる。
また、ユニットの大きさは、少なくとも主走査方向にはパス数の整数倍となるように設定されている。このため、複数のユニットに亘って同じ画素位置にドットが形成されることを回避しておけば、特定のパスに偏ってドットが形成されてしまって画質が悪化することも同時に回避することが可能となる。以下、この理由について説明する。
図20は、ユニットの大きさが、主走査方向にはパス数の整数倍となっていない場合、複数ユニットに亘ってドットが一定のパターンで発生することを回避しようとすると、ドットを形成するパスが特定のパスに偏ってしまうことがある理由を示した説明図である。図中に示した小さな正方形は画素を示しており、破線で示した大きな矩形はユニットを示している。尚、説明の便宜から、ここでは1つのラスタに着目して説明することとして、図20では着目しているラスタのみを表示している。また、ラスタは2パスで形成されているものとして、ユニットは少なくとも主走査方向には、3画素ずつまとめて形成されている場合を示している。3画素という値は、パス数2の整数倍ではない値として例示されたものであり、ここでの説明は、5画素や7画素など、2の倍数ではない他の値についても同様に適用することができる。
今、印刷しようとする画像中に、9画素に1個の割合でドットが形成されるような領域が存在していたものとする。主走査方向に3画素ずつユニットとしてまとめ、ユニット単位でドット形成の有無を判断した場合、このような領域では、図13および図14に示した特別な制御を行わない限り、3画素飛びにドットが形成されるという一定のパターンが発生し易い。図20(a)には、特別な制御を行わない場合に、3画素飛びにドットが形成される様子が示されている。図中で、画素を示す正方形の中に表示された斜線を付した表示した丸印は、その画素に形成されるドットを表している。本実施例では、このようにドットが一定のパターンで形成されて画質を悪化させることを回避するために、図13および図14に示したように、既に処理済みのユニットでのドット形成有無の判断結果を検出し、一定のパターンでドットが形成される場合には、その画素にはドットが形成され難くする。
図20(b)は、このようにして、ドットが一定のパターンで形成されることが回避されている様子を表している。例えば、図中の左から2番目のユニットについては、ユニット内の左上隅の画素位置にドットが形成されると、先頭のユニットと同じ画素位置に連続してドットが形成されることになる。そこで、2番目のユニットの左上隅の画素についてはドットを形成され難くして、その結果、ドットの形成される画素位置が隣の画素にずれている様子を表している。左から4番目のユニットについても同様にして、ドットが形成される画素位置が隣の画素にずれた様子を表している。
図20(b)に示されているように、こうしてドットの形成位置をずらしてやることで、ドットが一定のパターンで形成されることを回避することができる。しかし、こうしてドットをずらしたために、ドットを形成するパスが特定のパスに偏ってしまうことが起こり得る。ここでは、1本のラスタをパスAとパスBの2パスで形成するものとして、パスAでは奇数番目の画素にドットを形成し、パスBでは偶数番目の画素にドットを形成するものとする。図20(a)に示すように、ドットの形成位置をずらす前は、パスAとパスBとでほぼ同じような割合でドットが形成されている。これに対して、ドットの形成位置をずらした後は、図20(b)に示すように、全てのドットがパスAで形成されている。このように、ドットを形成するパスが特定のパスに偏ってしまうと、ラスタを複数のパスで形成することによる画質の改善効果を得ることができず、色ムラや白筋が発生して画質を低下させることがある。特に、カラープリンタ200のように、多色のインクを用いてカラー画像を印刷する場合は、こうした色ムラが発生し易い傾向にある。これは、複数色のインクドットを形成する場合、色の異なるインクドットがどのような順序で形成されるかによって、インク同士の混ざり具合や、後から形成したドットの滲み具合が異なって発色に微妙な差が生じるので、ある色のインクが特定のパスで偏って形成されると、その領域では周囲と異なる特定の順序でドットが形成されるため発色が異なってしまい、これが色ムラと認識されてしまうためである。
本実施例では、こうした点を考慮して、ユニットの大きさが、少なくとも主走査方向にはパス数の整数倍となるように設定されている。図21は、ユニットの主走査方向の大きさをパス数の整数倍とすることで、ドットを形成するパスが特定のパスに偏ってしまうことを回避している様子を示した説明図である。ここでは、カラープリンタ200はラスタを2パスで形成するものとしているから、ユニットの主走査方向の大きさは、4画素に設定されている。もちろん、ユニットの主走査方向の大きさは、4画素に限らず、2画素あるいは6画素など、パス数である2の倍数でありさえすれば、どのような大きさとすることもできる。
ユニットを、主走査方向に4画素ずつの複数の画素で構成し、ユニット単位でドット形成の有無を判断した場合、図13および図14を用いて前述した特別な制御を行わなければ、複数のユニットに亘って一定のパターンでドットが形成されることが生じ得る。図21(a)は、一例として、4画素飛びにドットが形成されている様子を示している。本実施例では、こうした一定のパターンの発生を回避するために、図13および図14を用いて説明したように、既に処理済みのユニットでのドット形成有無の判断結果を検出する。そして、一定のパターンでドットが形成される場合には、その画素にはドットが形成され難くする。
図21(b)は、こうして、ドットが一定のパターンで形成されることを回避している様子を表している。図中の左から2番目のユニットおよび4番目のユニットでは、ドットの形成される画素位置が、ユニット内の左上隅の画素位置から、隣の画素位置にずらされている。こうすることで、先頭のユニットから連続して同じ画素位置にドットが形成されることを回避することができる。また、印字パスについても、ドット位置をずらした図21(b)では、パスAとパスBとでほぼ同じ割合でドットが形成されている。これに対して、ドット位置がずらされていない図21(a)では、パスAに偏ってドットが形成されている。これら図21(a)および図21(b)を比較すれば明らかなように、ドットを形成する画素位置をずらすことによって、印字パスがパスAからパスBに変更され、その結果、パスAに偏っていた印字パスが分散されている。すなわち、ユニットの大きさを、少なくとも主走査方向にはパス数の整数倍に設定しておけば、ユニット内の同じ画素位置に形成されるドットは同じパスで形成されることになる。このため、複数のユニットに亘るパターンの発生を回避しようとしてドット位置をずらしてやると、そのことが直ちに、印字パスを分散させることに繋がることになる。このため、複数のユニットに亘って同じ画素位置にドットが形成されることを回避しておけば、特定のパスに偏ってドットが形成されてしまって画質が悪化することも同時に回避することが可能となるのである。
D−4.変形例:
上述した第1実施例の履歴検出・閾値設定処理には、種々の変形例が存在している。以下、これらの各種変形例について説明する。
(1)第1の変形例:
上述した第1実施例の履歴検出・閾値設定処理では、常に3ユニット分だけ遡ってドットの形成状況を検出するものとして説明したが、遡るユニット数を可変とすることもできる。以下では、こうした第1の変形例について説明する。
図22は、第1の変形例の履歴検出・閾値設定処理の流れを示すフローチャートである。かかる処理は前述した第1実施例の処理に対して、処理ユニット内の画像データに応じて、遡るユニット数を変更可能な点が大きく異なっている。以下、相違点を中心として、フローチャートに従って説明する。
第1の変形例の履歴検出・閾値設定処理を開始すると、先ず初めに処理ユニットを構成する各画素についての画像データの総和値を算出する(ステップS700)。処理ユニットを構成する各画素の画像データは、図5に示した階調数変換処理中のステップS202において予め読み込まれており、各画素の画像データの総和値は容易に算出することができる。
第1の変形例においては、ドットの形成状況を何ユニット前まで遡って調べるかを、処理ユニットの画像データの総和値に基づいて設定する。これは次のような理由による。総和値が小さい場合は、画像データの階調値が小さな領域(すなわち明るい画像の領域)を処理していると考えられる。この様な領域では、ドットはまばらに形成されることになるので、ユニット単位で処理したことによってドットの形成にパターンが生じた場合にも、長い周期のパターンになるものと考えられる。このことから、画像データの階調値が小さな領域では長い周期のパターンも検出可能とすべく、遡るユニット数を大きな値に設定するのである。具体的に遡るユニット数は、総和値の値に応じて、段階的にいくつかの適切な数値が予め設定されている。ステップS702においては、総和値に応じて遡るユニット数を設定した後、前述した履歴検出用バッファから、ユニット数に相当するbit長のデータを読み出す処理を行う。
こうして履歴検出用バッファから履歴データを読み出したら、続いて履歴検出用データを設定する(ステップS704)。かかる処理は、図14を用いて前述した第1実施例の履歴検出・閾値設定処理とほぼ同様であるが、処理ユニットによって履歴検出用データのbit長が変わることのみ異なっている。すなわち、第1の変形例においては、処理ユニットを構成する各画素の画像データの総和値を算出し、総和値に応じたユニット数だけ遡ってドットの形成状況を検出することとしているので、これに対応して履歴検出用データも総和値に応じた長さのデータに設定されるのである。
次いで、履歴データに履歴検出用データを作用させて、対象履歴(検出しようとしているドットの形成状況)の有無を検出し、対象履歴が検出された場合には閾値thの値を大きな値(Vp )に変更し、対象履歴が検出されなかった場合には閾値thの値を通常値Vn に設定する(ステップS706ないしステップS712)。以上の処理を終了したら、第1の変形例の履歴検出・閾値設定処理を抜けて、図13に示したユニット内多値化処理に復帰する。
以上に説明した第1の変形例の履歴検出・閾値設定処理によれば、処理中の画像データの階調値に応じて、適切なユニット数だけ遡ってドットの形成状況を検出することができる。このため、画質の悪化をより確実に防止することが可能となる。尚、上述した第1の変形例においては、処理ユニット内の各画素についての総和値を算出し、総和値が小さければ、明るい画像領域(画像データの階調値が小さな領域)を処理中であると判断するものとして説明した。もちろん、処理中の領域が明るい画像領域であることを異なる方法を用いて検出することとしても良い。例えば、周辺の領域の画像データの平均値を利用して検出することも可能である。また、上述した第1の変形例の履歴検出・閾値設定処理では、ドット形成有無を遡って検出するユニット数は、処理ユニット内の各画素の総和値に応じて設定されているものとして説明したが、これに限らず、各画素の階調値に応じて、遡るユニット数あるいはユニット内の画素位置を設定するものとしてもよい。こうすれば、遡るユニット数をよりきめ細かく適切な値とすることが可能となるので好ましい。
(2)第2の変形例:
上述した各種実施例においては、処理済みのユニットの中でドットの形成有無を検出しようとする画素位置が、処理中のユニットの着目画素と同じ画素位置である場合を中心として説明した。もちろん、処理済みのユニット中でドットの形成状況を検出する画素位置は、前述した履歴検出用データを適切に設定することにより、必要に応じて自由に設定することができる。以下では、こうした第2の変形例について説明する。
図23は、こうした第2の変形例において、履歴検出用データを設定する様子を例示した説明図である。例えば、処理ユニットの画素Pa についてのドット形成有無を判断するに際して、図23(a)に示すように、処理ユニットの「1つ前のユニット」については画素Pa のドット形成状況を検出し、「2つ前のユニット」および「3つ前のユニット」については、いずれも画素Pc のドット形成状況を検出するものとする。図中に示した「?」印は、該当する画素についてのドット形成状況を検出することを模式的に示したものである。ドットの形成状況を検出する画素位置をこの様に設定しておけば、4ユニットを周期として、「左下の画素」、「左下の画素」、「左上の画素」、「左上の画素」のパターンで周期的にドットが形成されることを回避することができる。
図23(b)には、図23(a)で「?」印を示した画素位置を検出するために設定される履歴検出用データを示している。前述したように、履歴検出用データは、隣接する4bitをひとまとまりとする3つのグループから構成されており、図23(b)に示すように、それぞれのグループが図23(a)に示した3つのユニットに対応している。また、各グループを構成する4つのbitは、上位側(図上では左側)から順に、画素Pa ,画素Pb ,画素Pc ,画素Pd にそれぞれ対応している。履歴検出用データは、検出しようとする画素位置に対応するbitには値「1」を設定し、その他のbitには値「0」を設定することによって得ることができる。尚、図23(c)は、こうして得られた履歴検出用データを16進数表示したものである。前述したように、履歴検出用データは4bitで1つのユニットを表しているから、4bitをまとめて16進数表示すれば履歴検出用データを簡便に表記することができる。図23(b)に示した履歴検出用データは、16進数表示することにより「0x228」と表すことができる。尚、「0x」は16進数表示していることを意味している。
尚、上述した実施例では、ドットの形成状況を検出する画素は、各ユニットに1画素ずつであるものとしたが、もちろんユニット当たり複数の画素位置について、ドットの形成状況を検出することとしても良い。図24は、複数の画素位置でドット形成状況を検出する様子を示す説明図である。ここでは、図24(a)に示すように、処理ユニットの「1つ前のユニット」については3つの画素位置でドット形成状況を検出するものとしている。図24(b)は、この様な画素位置でのドット形成状況を検出するために設定される履歴検出用データを示した説明図である。図示されているように、「1つ前のユニット」については、画素Pa に加えて、画素Pb および画素Pd の2つの画素位置についても、ドットの形成状況を検出するものとしている。このことに対応して、履歴検出用データの下位側の4bitの中で、画素Pa 、画素Pb 、画素Pd にそれぞれ対応する3つのbitには値「1」が設定される。すなわち、16進数表示で「D」が設定される。また、「2つ前のユニット」および「3つ前のユニット」については、図23の場合と同様に、画素Pa のドット形成状況を検出することとしているから、これらユニットについては16進数表示で「8」が設定され、結局、履歴検出用データとしては、図24(c)に示すように「0x88D」のデータが設定されることになる。
以上に説明したように、履歴検出用データを適切に設定することで、処理済みのユニットの中でドットの形成状況を検出する画素位置を自由に設定することが可能である。従って、複数のユニットに亘って特定のパターンでドットが形成される易くなっている場合でも、この様なパターンの発生を確実に回避することができる。加えて、ユニットの大きさは、少なくとも主走査方向にはパス数の整数倍に設定されているので、パターンの発生を回避することで、ドットが特定のパスに偏って形成されてしまうことも同時に回避することができる。また、図24に示したように、処理ユニットの近傍の画素位置についてのドット形成状況を検出しておけば、着目画素の近傍にドットが形成されることを回避することができる。このため、ドットの分散性を向上させて、画質をより改善することが可能となる。
(3)第3の変形例:
ドットの形成状況を検出しようとする画素位置を、乱数を用いて設定することも可能である。例えば、先ず初めに、遡ってドット形成状況を検出しようとするユニット数を乱数を用いて設定し、次いで、各ユニットについて検出しようとする画素位置を乱数を用いて設定することとしても良い。こうすれば、ドットの形成状況を検出する画素位置の設定にも規則性が無くなるので、複数ユニットに亘って周期的なパターンが発生することを確実に回避することが可能となる。
E.第2実施例:
上述した第1実施例のユニット内多値化処理中で行われる履歴検出・閾値設定処理においては、処理済みのユニットのドット形成状況を表す履歴データが、1つの履歴検出用バッファに記憶されているものとして説明した。ユニットには複数の画素が含まれているから、第1実施例においては、各画素についてのドット形成有無を表すデータが履歴検出用バッファ上で混在して記憶されていることになる。これに対して、ユニットを構成する画素の数だけバッファを設けておき、各画素のドット形成有無を判断したら、ユニット内の画素位置に対応付けて異なるバッファに判断結果を記憶することとしても良い。以下、このように画素位置毎に専用のバッファを用いた第2実施例について説明する。
E−1.第2実施例のユニット内多値化処理:
図25は、第2実施例のユニット内多値化処理の流れを示すフローチャートである。かかる処理は、図13を用いて前述した第1実施例のユニット内多値化処理に対して、履歴検出用バッファが画素位置毎に設けられている点が大きく異なっている。また、この様な相違点から派生して、着目画素についてのドット形成有無を判断するたびに、判断結果を対応する履歴検出用バッファに書き込んでいる点でも、第1実施例とは異なっている。以下では、これら、第1実施例との相違点を中心として、第2実施例のユニット内多値化処理について説明する。
処理を開始すると、先ず初めに、処理ユニットを構成する複数の画素の中から、ドットの形成有無を判断しようとする着目画素を検出し(ステップS800)、着目画素の画像データと拡散誤差とを加算して補正データCx を算出する(ステップS802)。処理ユニットを構成する各画素についての画像データおよび拡散誤差は、図5に示した階調数変換処理中で既に読み込まれているデータを使用する。
こうして着目画素についての補正データCx を算出したら、第2実施例の履歴検出・閾値設定処理を開始する(ステップS804)。前述したように第2実施例においては、ユニット内の画素位置に応じて設けられた専用の履歴検出用バッファを使用する。そこで、かかる処理の内容について説明する前に、第2実施例の履歴検出・閾値設定処理で用いられる履歴検出用バッファについて説明しておく。
図26は、ユニット内の画素位置に対応付けて設けられた履歴検出用バッファを模式的に示した説明図である。図中に示した「履歴検出用バッファA」は、ユニット内の画素Pa に対応付けられているバッファである。このバッファには、画素Pa ついてのドット形成判断結果が記憶される。また、「履歴検出用バッファB」は、ユニット内の画素Pb に対応付けられて、画素Pb についての判断結果が記憶されるバッファである。同様に、「履歴検出用バッファC」にはユニット内の画素Pc についての判断結果が記録され、「履歴検出用バッファD」には画素Pd についての判断結果が記憶される。このように第2実施例においては、ユニット内の画素位置に対応付けられた専用のバッファが設けられており、それぞれのバッファに履歴データが記憶されている。
次に、「履歴検出用バッファA」を例にとって、記憶されている履歴データのデータ構造について説明する。履歴検出用バッファAの各bitは、下位側(図26では右側)から順番に、処理ユニットから1つずつ前のユニットに対応付けられている。すなわち、最下位bit(図上では右端のbit)は処理ユニットの「1つ前のユニット」に対応付けられており、下位から2つめのbitは「2つ前のユニット」に、下位から3つめのbitは「3つ前のユニット」に、というように、各bitがそれぞれのユニットに順番に対応付けられている。これらのbitに値「1」が設定されていることは、対応するユニットの画素Pa にドットが形成されることを表しており、逆に値「0」が設定されていることは、対応するユニットの画素Pa にはドットが形成されないことを表している。
以上の説明から明らかなように、履歴検出用バッファAに記憶されている図26に例示の履歴データは、処理ユニットから1つ前、3つ前、5つ前、8つ前にの各ユニットについては、画素Pa にドットが形成されており、他のユニットについては画素Pa にドットが形成されていないことを表している。尚、図26では、それぞれの履歴検出用バッファは、8bit分のデータ長を有するものとしたが、より多いbit数のデータとしても構わない。
こうした履歴検出用データを用いて行われる第2実施例の履歴検出・閾値設定処理について、以下に説明する。第2実施例の履歴検出・閾値設定処理は、前述した第1実施例の処理に対して、画素位置毎に履歴検出用バッファが設けられている点が異なっており、他の処理はほぼ同様である。そこで以下では、第1実施例の履歴検出・閾値設定処理について説明した図14のフローチャートを流用しながら説明する。尚、かかる処理は、図25のユニット内多値化処理において着目画素が設定された後(ステップS800)、かかる着目画素に対してステップS804で実行される処理である。
第2実施例の履歴検出・閾値設定処理を開始すると、先ず初めに、履歴検出用バッファから履歴データを読み出す処理を行う(図14のステップS500相当)。図26を用いて説明したように、第2実施例では画素位置に応じて履歴検出用バッファが設けられており、かかる処理では、着目画素と同じ画素位置に対応するバッファから、必要なデータ量の履歴データを読み出す。例えば、着目画素が画素Pa にあるとして、5ユニット分だけ遡ってドットの形成状況を検出するものとすれば、「履歴検出用バッファA」の下位側から5bit分のデータを読み出すことになる。この結果、図26に示した例では、履歴データとして「10101 (2)」が読み出される。ここで、(2) は2進数表示されていることを示している。尚、着目画素が画素Pb ,画素Pc ,画素Pd に設定されている場合は、履歴検出用バッファB,履歴検出用バッファC,履歴検出用バッファDにそれぞれ記録されている履歴データを読み出せばよい。
こうして履歴データを読み出したら、続いて、履歴検出用データを設定する処理を行う(図14のステップS502相当)。かかる処理について、図27を参照しながら説明する。例えば、処理ユニットから5つ前のユニットまで遡って、ドットの形成状況を検出するものとする。図27(a)は、ドットの形成状況を検出しようとしている画素位置の分布を概念的に示した説明図である。図中の小さな正方形はそれぞれ画素を模式的に示したものである。また、太い破線で示した大きな正方形は処理中のユニットを模式的に示したものであり、細い破線で示した大きな正方形は、既に処理済みのユニットを模式的に示したものである。処理ユニット中で斜線を付した画素は着目画素を示しており、処理済みのユニット中で図中で「?」を付した画素は、ドットの形成状況を検出しようとしている画素を示している。
図27(b)は、このような画素についてのドット形成状況を検出するために用いられる履歴検出用データを示したものである。ここでは、処理ユニットから5つ前のユニットまで遡って検出するとしているから、履歴検出用データは、最下位bitから5bitまでのbitに値「1」が設定され、6bitより上位側のbitには値「0」が設定されている。このように、検出しようとするユニットに対応するbitに値「1」を設定し、他のbitには値「0」を設定することによって、履歴検出用データを設定することができる。図27(c)はこうして設定された履歴検出用データを16進数表示したものである。
こうして履歴検出用データを設定したら、設定した履歴検出用データを先に読み出した履歴データに作用させることによって、対象履歴(検出しようとしている画素位置でのドットの形成状況)を検出する(図14のステップS504相当)。対象履歴の検出は、第1実施例と同様にして行う。すなわち、履歴データと履歴検出用データとの間で、対応するbit同士の論理積を採ることにより中間データを算出し、得られた中間データの各bitの論理和(あるいは算術和)を採って検出結果を算出する。得られた検出結果が値「1」であれば対象履歴が検出されたものと判断して、閾値thに割増値Vp を設定する。検出結果が値「0」であれば、対象履歴は検出されなかったものと判断して、閾値thに通常値Vn を設定する。以上のようにして閾値thを適切な値に設定したら、第2実施例の履歴検出・閾値設定処理を終了して、図25に示すユニット内多値化処理に復帰する。尚、ここでは、中間データの各bitの論理和(あるいは算術和)を採って検出結果を算出するものとしたが、中間データの各bitの論理積を採って検出結果を算出するものとしてもよい。
以上のようにして閾値thを設定して、図25に示す第2実施例のユニット内多値化処理に復帰したら、続いて、着目画素の補正データCx と閾値thとの大小関係を判断する(図25のステップS806)。補正データCx の方が大きい場合には着目画素にドットを形成すると判断し(ステップS808)、そうでなければドットを形成しないと判断する(ステップS810)。次いで、ドットの形成有無を判断したことで生じる階調誤差を算出した後(ステップS812)、着目画素についての判断結果を対応する履歴検出用バッファに書き込む処理を開始する(ステップS814)。かかる処理について、図28を用いて説明する。
図28は、第2実施例のユニット内多値化処理において、着目画素についての判断結果を履歴検出用バッファに書き込む様子を概念的に示した説明図である。今、着目画素が画素Pa に設定されているものとすると、ドット形成有無の判断結果は、履歴検出用バッファAに書き込まれることになる。判断結果を書き込むにあたっては、先ず、履歴検出用バッファAに記憶されている履歴データを、1bit分だけ上位側(図上では左側)にシフトさせる。図28の上段はシフトする前の履歴検出用バッファAに記憶されている履歴データを示しており、下段はシフトした後のバッファに記憶されている履歴データを示している。履歴データをシフトさせることに伴って、最上位bitに記憶されたデータは破棄される。次いで、着目画素についての判断結果に対応する値を、最下位のbitに書き込む処理を行う。着目画素にドットを形成すると判断された場合は、最下位のbitには値「1」が書き込まれ、着目画素にドットを形成しないと判断された場合は、値「0」が書き込まれる。以上の説明では、着目画素が画素Pa に設定されているものとして説明したが、着目画素が他の画素位置に設定されている場合も同様にして、着目画素の画素位置に対応する履歴検出用バッファに判断結果に応じた値を書き込んでやればよい。図25のステップS814では、こうして着目画素についての判断結果を、着目画素に対応する履歴検出用バッファに書き込む処理を行う。
こうして着目画素の判断結果を書き込む処理を終了したら(図25のステップS814)、処理ユニット内の全ての画素についての処理を終了したか否かを判断し(ステップS816)、未処理の画素が残っていればステップS800に戻って上述した一連の処理を繰り返す。全ての画素についての処理を終了したら、ユニット内多値化処理を抜けて、図5に示した階調数変換処理に復帰する。
以上に説明した第2実施例のユニット内多値化処理においては、履歴検出用バッファのそれぞれのbitが、処理済みのユニット1つ1つに対応付けられている。従って、ドットの形成状況を遡って調べるユニット数が多くなった場合でも、ユニット数と同じbit長のデータを読み込むだけでよい。例えば、処理中のユニットから8ユニット分だけ遡ってドットの形成状況を検出する場合、1ユニットが4つの画素で構成されているとして、前述した第1実施例においては32bitの履歴データを読み込む必要があるが、第2実施例では8bitのデータを読み込むだけで足りる。このため、第2実施例においては、遡るユニット数が多い場合であっても、迅速な処理を行うことができる。
E−2.第2実施例の変形例:
上述した第2実施例では、ドット形成状況を検出する画素位置は、着目画素と同じ画素であるものとして説明した。しかし、第1実施例において、ドットの形成状況を検出しようとする画素位置を自由に設定可能であったのと同様に、第2実施例においても、ドットの形成状況を検出する画素を、ユニット毎に任意の画素位置に設定することが可能である。以下では、こうした第2の実施例の変形例について説明する。
図29は、第2実施例において、任意の画素位置でのドットの形成状況を検出する方法を示した説明図である。図29(a)は、検出しようとする画素位置の分布を例示した説明図である。図中に示した小さな正方形は画素を模式的に示したものであり、破線で示した大きな正方形はユニットを示している。ドットの形成状況を検出しようとする画素位置は、画素中に「?」印を付して示している。検出しようとする画素位置および画素数は任意に設定することができるが、以下では、図29(a)に示した画素位置でのドット形成状況を検出するものとして説明する。
図29(b)は、第2実施例において、任意の画素位置でのドット形成状況を検出する方法を示す説明図である。第2実施例では、前述したように、ドット形成有無の判断結果を各ユニットの画素位置毎に記憶していることから、任意の画素位置でのドット形成状況を検出しようとする場合でも、各ユニットの画素位置に着目した方法で検出する。すなわち、図29(a)に示した例では、画素Pa の画素位置について、ドット形成状況を検出しようとしているのは、処理ユニットの「1つ前のユニット」、「2つ前のユニット」、「3つ前のユニット」の3つのユニットである。また、画素Pb の画素位置については、処理ユニットの「1つ前のユニット」と、「2つ前のユニット」の2つのユニットである。更に、画素Pc あるいは画素Pd の画素位置については、いずれも処理ユニットの「1つ前のユニット」でのみドットの形成状況を検出している。このように、画素位置毎に、ドット形成状況を検出しようとするユニット位置を検出した後、検出したユニットにドットが形成されているか否かを画素位置毎に判断すれば、任意の画素位置でのドット形成状況を検出することが可能となる。以下、図29(a)に示した場合に即して具体的に説明する。
初めに画素Pa のドット形成状況を検出する場合について説明する。図29(b)には、こうして画素Pa の画素位置でのドット形成状況を検出する様子が模式的に示されている。先ず初めに、画素Pa でのドット形成判断結果を記憶したバッファ(履歴検出用バッファA)から3ユニット分の履歴データ(最下位から3bit分のデータ)を読み出す。もちろん、より多数のユニットを遡って検出する場合は、それに応じて読み出すデータ長を長くすればよい。
次いで、この履歴データに履歴検出用データを作用させる。履歴検出用データは、画素Pa でのドット形成状況を検出しようとしているユニットに応じて設定される。図29(a)に示すように、画素Pa については処理ユニットの「1つ前のユニット」、「2つ前のユニット」、「3つ前のユニット」の3つのユニットでドット形成状況を検出しようとしているから、これに対応して履歴検出用データは、最下位bitから3つのbitに値「1」を設定する。こうして設定した履歴検出用データ(2進数表示で「111 (2)」)を、読み出した履歴データに作用させて中間データを算出する。「履歴検出用データを履歴データに作用させる」とは、前述したように、2つのデータの対応するbit間で、論理積を採ることである。こうして中間データが得られたら、中間データの各bit間の論理和(あるいは算術和)を算出することにより、画素Pa についての検出結果を得ることができる。
こうして画素Pa について得られた検出結果は、次のことを意味している。すなわち、検出結果が値「0」であることは、検出しようとしているユニットのいずれにも画素Pa にはドットが形成されていないことを意味している。逆に、検出結果としての論理和が「1」であることは、検出しようとしているユニットのいずれかには、画素Pa にドットが形成されていることを意味している。また、算術和を取ることによって検出結果を得た場合は、得られた数値は形成されているドットの個数を表している。もちろん、中間データの各bitの論理和(あるいは算術和)を採る代わりに、論理積を採ることとしても良い。中間データの各bitの論理積を採った場合、検出結果の値が「1」であることは、検出しようとしている全てのユニットの画素Pa に、ドットが形成されていることを意味することになる。
同様の方法により、画素Pb についての検出結果を得ることができる。図29(c)には、画素Pb についてのドット形成状況を検出している様子を模式的に示している。図29(b)を参照して簡単に説明すると、先ず、画素Pb についてのドット形成有無を記録したバッファ(履歴検出用バッファB)から3ユニット分の履歴データを読み出す。次いで、このデータに履歴検出用データを作用させて中間データを算出する。画素Pb については、処理ユニットの「1つ前のユニット」、および「2つ前のユニット」でのドット形成状況を検出しようとしているから、これに対応して履歴検出用データは、最下位bitから2つのbitが値「1」に設定されたデータ(2進数表示で「011 (2)」)を使用する。こうして、得られた中間データの各bit間の論理和(あるいは算術和)を求めることにより、画素Pb についての検出結果を得ることができる。
画素Pc 、画素Pd についても同様にして、それぞれの画素についての検出結果を算出することができる。これら画素については、ドット形成状況を検出しようとしているユニットは、処理ユニットの「1つ前のユニット」のみであるから、これら画素については、履歴検出用データとして最下位bitにのみ値「1」が設定されたデータ(2進数表示で「001 (2)」)を使用すればよい。画素Pc についての検出結果を算出する様子を図29(d)に、また、画素Pd についての検出結果を算出する様子を図29(e)にそれぞれ示した。
こうして各画素についての検出結果が得られたら、これら検出結果の論理和を算出することによって、最終的な検出結果を得ることができる。すなわち、図29(a)に「?」印で示した画素のいずれかにドットが形成されていれば、検出結果として値「1」が得られ、逆にいずれの画素にもドットが形成されていない場合は検出結果として値「0」が得られることになる。もちろん、各画素についての検出結果の論理積を採ることによって、最終的な検出結果を算出することとしても良い。こうした場合は、図29(a)に「?」印で示した全ての画素にドットが形成されている場合に、最終的な検出結果の値が「1」得られることになる。
以上に説明した方法を用いれば、ドットの形成状況を検出しようとする画素位置を、既に処理済みのユニットの中から自由に設定することが可能である。従って、ユニット単位でドットの形成有無を判断する場合であっても、所定の画素位置でのドット形成状況を検出し、検出結果を踏まえてドットの形成有無を判断することにより、複数のユニットに亘って所定のパターンでドットが形成されることを効果的に回避することが可能となる。加えて、ユニットの大きさは、少なくとも主走査方向にはパス数の整数倍に設定されているので、パターンの発生を回避することで、ドットが特定のパスに偏って形成されてしまうことも同時に回避することができる。
以上、各種の実施例について説明してきたが、本発明は上記すべての実施例に限られるものではなく、その要旨を逸脱しない範囲において種々の態様で実施することができる。
例えば、上述した各種実施例では、ユニットを構成する各画素についてのドット形成有無を判断する手法として、いわゆる誤差拡散法を用いているが、これに限らず、例えばディザ法などの周知な他の手法を適用することもできる。
また、上述した各種実施例においては、処理済みのユニットの中で、所定の画素位置にドットが形成されていることが検出された場合には、着目画素についてドットが形成され難くするものとして説明した。これに対して、所定の画素位置にドットが形成されていない場合には、着目画素にドットが形成され易くする様にしても良い。こうすれば、例えば、ドットが高い密度で形成されるような領域では、ドットが形成されない画素が複数のユニットに亘って周期的に発生する場合に、画質の悪化を効果的に回避することができる。
上述した機能を実現するソフトウェアプログラム(アプリケーションプログラム)を、通信回線を介してコンピュータシステムのメインメモリまたは外部記憶装置に供給し実行するものであってもよい。もちろん、CD−ROMやフレキシブルディスクに記憶されたソフトウェアプログラムを読み込んで実行するものであっても構わない。
上述した各種実施例では、階調数変換処理を含む画像データ変換処理はコンピュータ内で実行されるものとして説明したが、画像データ変換処理の一部あるいは全部をプリンタ側、あるいは専用の画像処理装置を用いて実行するものであっても構わない。
更には、画像表示装置は、必ずしも印刷媒体上にインクドットを形成して画像を印刷する印刷装置に限定されるものではなく、例えば、液晶表示画面上で輝点を適切な密度で分散させることにより、階調が連続的に変化する画像を表現する液晶表示装置であっても構わない。