A.第1実施形態:
(1)ハードウェア構成:
図1は、第1実施形態としての画像処理装置を含むプリンター20の概略構成図である。プリンター20は、双方向印刷を行なうシリアル式インクジェットプリンタであり、図示するように、プリンター20は、紙送りモータ74によって印刷媒体Pを搬送する機構と、キャリッジモータ70によってキャリッジ80をプラテン75の軸方向に往復動させる機構と、キャリッジ80に搭載された印刷ヘッド90を駆動してインクの吐出及びドット形成を行なう機構と、これらの紙送りモータ74,キャリッジモータ70,印刷ヘッド90、メモリカードスロット98及び操作パネル99との信号のやり取りを司る制御ユニット30とから構成されている。
キャリッジ80をプラテン75の軸方向に往復動させる機構は、プラテン75の軸と平行に架設され、キャリッジ80を摺動可能に保持する摺動軸73と、キャリッジモータ70との間に無端の駆動ベルト71を張設するプーリ72等から構成されている。
キャリッジ80には、カラーインクとして、シアンインクC、マゼンタインクM、イエロインクY、ブラックインクK、ライトシアンインクLc、ライトマゼンタインクLmをそれぞれ収容したカラーインク用のインクカートリッジ82~87が搭載される。キャリッジ80の下部の印刷ヘッド90には、上述の各色のカラーインクに対応するノズル列が形成されている。キャリッジ80にこれらのインクカートリッジ82~87を上方から装着すると、各カートリッジから印刷ヘッド90へのインクの供給が可能となる。
制御ユニット30は、CPU40や、ROM42、RAM60がバスで相互に接続されて構成されている。ROM42に記憶されたプログラムをRAM60に展開し、CPU40が、このブログラムを実行することにより、プリンター20の動作全般を制御する。CPU40は、制御プログラムを実行することにより、入力部41、画像処理部50、印刷部46としても機能する。このうち、入力部41は、メモリカードスロット98に装着されたメモリカードMCから、画像データを読込んだり、操作パネル99からの操作を読込むといった機能を実現する。また、印刷部46は、上述した印刷ヘッド90や各種モータなどを制御して、印刷媒体Pへの印刷を 行なう機能を実現する。
画像処理部50は、誤差拡散法に従ったハーフトーン処理を行なう複数の誤差拡散ユニット(以下、ED1~EDnユニットとも呼ぶ)501~50nを備える。これらの複数のED1~EDnユニット501~50nは、誤差拡散法に従うハーフトーン処理をハードウェアにより行なうユニットとして個別に用意されている。もとよりCPU40をマルチコアタイプのものとし、各コアに並列的に動作するハーフトーン処理を割り当てることで実現してもよい。各ED1~EDnユニット501~50nは、共有メモリー52を介して、直接的にデータ交換を行なうことが可能である。こうした共有メモリー52としては、マルチコアタイプのCPUではL2キャッシュなどを利用しても良い。ED1~EDnユニット501~50nの動作については、図4、図5のフローチャートを用いて後で詳しく説明する。
ROM42は、制御プログラムの他、誤差拡散マトリクス43等を記憶している。誤差拡散マトリクス43は、後述する誤差拡散法に従うハーフトーン処理において、注目している画素において発生した誤差を注目画素の周辺の画素に格差する際の重み付け係数を集めたものである。誤差拡散マトリクス43の実例は後で具体的に説明する。
RAM60は、上述した制御ブログラムの他、CPU40による演算に必要なデータを一時的な保存したりする目的で用いられる。こうしたデータとしては、以下のものがある。
[1]ハーフトーン処理される原画像の画像データDn
[2]ハーフトーン処理された結果得られた印刷用のドットデータ
[3]着目画素の周辺の各画素に拡散される誤差を記憶する拡散誤差データ
このうち[3]については、各ED1~EDnユニット501~50n毎に必要になるため、RAM60には、第1誤差バッファ601~第n誤差バッファ60nが用意されている。
制御ユニット30には、メモリカードスロット98が接続されており、メモリカードスロット98に挿入したメモリカードMCから、入力部41を介して、画像データORGを読み込んで入力することができる。本実施例においては、メモリカードMCから入力する画像データORGは、レッド(R)、グリーン(G)、ブルー(B)の3色の色成分からなるデータである。
以上のようなハードウェア構成を有するプリンター20は、キャリッジモータ70を駆動することによって、印刷ヘッド90を印刷媒体Pに対して主走査方向に往復動させ、また、紙送りモータ74を駆動することによって、印刷媒体Pを副走査方向に移動させる。制御ユニット30は、キャリッジ80が往復動する動き(主走査)や、印刷媒体の紙送りの動き(副走査)に合わせて、印刷データに基づいて適切なタイミングでノズルを駆動することにより、印刷媒体P上の適切な位置に適切な色のインクドットを形成する。こうすることによって、プリンター20は、印刷媒体P上にメモリカードMCから入力したカラー画像を印刷することが可能となっている。本実施形態のプリンター20は、印刷ヘッド90が印刷媒体Pの幅方向、つまり主走査方向に往復動する、いわゆるシリアルプリンターの構成を採用しているが、プリンター20の形式は、シリアルプリンターに限定されず、ラインプリンターやページプリンターであっても適用可能なことは勿論である。
(2)印刷処理および画像処理:
実施形態における印刷処理と、印刷処理において行なわれる画像処理との概要を説明する。図2は、プリンター20における印刷処理の流れを示すフローチャートである。ここでの印刷処理は、ユーザが操作パネル99等を用いて、メモリカードMCに記憶された所定の画像の印刷指示操作を行なうことで開始される。印刷処理を開始すると、CPU40は、まず、入力部41の処理として、メモリカードスロット98を介してメモリカードMCから印刷対象であるRGB形式の画像データORGを読み込んで入力する(ステップS110)。
画像データORGを入力すると、CPU40は、ROM42に記憶されたルックアップテーブル(図示せず)を参照して、画像データORGについて、RGB形式をCMYKLcLm形式に色変換する(ステップS120)。色変換処理は周知のものなので、その説明は省略する。
その後、画像を分割する処理を行なう(ステップS130)。画像の分割は、本実施形態では、図3に例示するように、主走査方向に3つの領域に分割するものとした。もとより分割の数は2以上であれば、いくつでもよい。画像の分割は、画像処理部50が備えるEDユニットの数に応じて行なわれるが、EDユニットの数より少ない数に分割しても差し支えない。以下の説明では、分割された画像を、画像1、画像2、画像3と呼ぶことがある。これに対応して、画像処理部50は、同時に動作可能な3個のED1~ED3ユニット501~503を用いる。各画像や各EDユニットは、主走査方向に何番目のユニットであるかをサフィックスiで、表わすものとする。従って、分割画像やEDユニットは、どの分割画像か、あるいはどのユニットかを特定しない場合には、画像iやEDiユニット50iのように表記することがある。また、画像iやEDiユニット50iを、単に画像i-1 、画像i 、画像i+1 あるいはEDi-1 、EDi、EDi+1 のように表記して、隣接する画像やユニットの関係を示す場合がある。ここで、二つのEDユニットとして、EDi-1 、EDiを取り上げると、EDi-1 が、「一の誤差拡散処理部」に相当し、EDiが、「他の誤差拡散処理部」に相当する。また、二つのEDユニットとして、EDi 、EDi+1 を取り上げると、EDi が、「一の誤差拡散処理部」に相当し、EDi+1 が、「他の誤差拡散処理部」に相当する。
説明の便を図って、この実施形態では、図3に示したように、元画像は主走査方向に3a個、副走査方向にb個の画素から構成されているものとする。a,bは、いずれも2以上の整数である。従って、画像1、2、3は、いずれも、横縦a×b個の画素から構成されている。この分割された画像iの画素は、主走査方向をx方向、副走査方向をy方向として、座標(x,y)により特定可能である。xの範囲は、画像1については値1~a、画像2については値1+a~2a、画像3については値2a+1~3a、となるが、各画像iに着目すれば、いずれもx方向にa個の画素が並んでいることになることから、以下の説明では、EDiユニット50iが処理する際の画素は、x方向に1~aの座標を指定するものとして説明する。y方向については、1~bの座標が指定される。従って、各画像iにおいて、処理が開始される左上の画素OP1~OP3は、いずれもOPi(1,1)のように指定される。なお、着目画素と明記するか否かにかかわらず、ハーフトーン処理の対象となっている画素については、画素OPのように、記載し、それら以外の画素については、単に画素(x,y)のように、座標を用いて記載する場合がある。こうした画像の分割に応じて、各EDiは、画素OP(1,1)を開始点として、ここから主走査方向にa個の画素を処理し、副走査方向にb個の画素(ラスター)を処理する。後述する誤差拡散処理は、このラスターに沿って、x座標が次第に大きくなる方向に実施される。この方向を、以下、主走査方向あるいは順方向と呼ぶことがある。また順方向とは反対向きの方向を、以下、逆方向と呼ぶことがある。
画像の分割(ステップS130)を行なった後、CPU40は、画像処理部50の処理として、分割された各画像i毎にEDiユニット50iを起動し、画像データを、誤差拡散法を用いて、各色のドットのON/OFFを画素毎に定めたドットデータに変換する誤差拡散処理を行なう(ステップS200)。ここでの誤差拡散処理の詳細については後述する。なお、本明細書では、「誤差拡散処理」は、ドットのON/OFFの2値化処理に限らず、大小ドットや大中小ドットなどのON/OFFなど、3以上の階調値への多値化処理を含んだ階調数変換(低減)処理一般としても実現可能である。また、ステップS200に供する画像データは、解像度変換処理やスムージング処理などの画像処理が施されたものであってもよい。
誤差拡散処理(ステップS200)を分割した各画像ごとに行なうと、CPU40は、分割された画像毎に生成されたドットデータを組み合わせて、元の画像に対応したドットデータとした上で、これを並び替えるインタレース処理(ステップS150)を行なう。プリンター20のノズル配置や紙送り量などに合わせは、ラスター単位のドットデータの並びと必ずしも一致しないからである。印刷ヘッド90の1回の主走査単位で印画するドットパターンデータに並び替えた後、CPU40は、印刷部46の処理として、印刷ヘッド90、キャリッジモータ70、モータ74等を駆動させて、印刷媒体P上への各色インクドットの形成、つまり印刷を実行する(ステップS160)。
(3)ハーフトーン処理:
各EDiユニット50iが実行する誤差拡散処理(ステップS200)の詳細について、図4以下を用いて説明する。この誤差拡散処理は、分割した画像毎に、つまり並列に実行される。各EDiユニット50iは、図3に示したように、分割された画像の左上の画素OPiを開始点とし、主走査方向の座標をx、副走査方向の座標をyとして、順次処理を行なう。但し、以下に説明するように、各EDiユニット50iの開始タイミングは同一ではない。第1実施形態では、ED1ユニット501(以下、簡略にED1とも言う)が最初の1ラスター(y=1)についての全画素(x=1~a)の処理を終えて、次の1ラスター(y=2)の処理に入るのと並行して、隣接するED2ユニット502(以下、簡略にED2とも言う)が最初の1ラスター(y=1)の処理を開始し、このED2が最初の1ラスター(y=1)についての全画素(x=a+1~2a)の処理を終えて、次のラスター(y=2)の処理に入るのと並行して、から、隣接するED3ユニット503(以下、簡略にED3もと言う)が最初の1ラスター(y=1)の処理を開始する。
以下の説明では、副走査方向yの何番目のラスターにおいて、主走査方向xの何番目の画素を着目画素として処理を行なうと言った場合、着目画素OP(x,y)のように、表記する。従って、着目画素OP(x,y)と、同じラスターにおいて主走査方向に隣接する画素は、画素OP(x+1,y)と表記し、副走査方向に隣接する画素は、画素OP(x,y+1)と表記する。また、何番目のラスターであるかを問わない場合には、N番目のラスターとも呼ぶ。このN番目のラスターに副走査方向に隣接するラスターは、N+1番目のラスターと呼ぶ。
図4に示した各EDi(i=1~3)がハーフトーン処理を開始すると、まず、注目画素の位置を示す変数x,yを共に値1に初期化する(ステップS210)。次に、入力部41を介して対応する分割画像iから1ラスター分の画像データを入力する処理を行なう(ステップS220)。ここで、1ラスター分の画像データとは、各分割画像iに対応する1ラスター分のデータであり、各EDiにとっては、x=1~aまでの画素の各色の階調値を示すデータである。これを着目画素の階調値Dn(x,y)と呼ぶ。なお、位置に関係なく階調値を扱う場合には、単に階調値Dnと呼ぶことがある。各EDiは、読込んだ1ラスター分の画像データをRAM60の所定の領域に格納する。
次に、各EDiは、R端部誤差入力処理(ステップS300)とL端部誤差入力処理(ステップS400)とを順次実行する。R端部誤差入力処理(ステップS300)は、各EDiが分割画像iの右端(x=a)の近傍、つまり右端付近で処理した結果発生した誤差を、そのEDiの右側に位置するEDi+1 が受け取る処理である。ここで「右端」とは、各分割画像iにおいて、誤差拡散処理が行なわれるラスターの主走査方向の端部を言う。右端は、「R端部」とも言う。他方、L端部誤差入力処理(ステップS400)は、各EDiが分割画像iの左端(x=0)の近傍、つまり左端付近で処理した結果発生した誤差を、そのEDiの左側に位置するEDi-1 が受け取る処理である。ここで「左端」とは、各分割画像iにおいて、誤差拡散処理が行なわれるラスターの主走査方向逆方向側の端部を言う。左端は、「L端部」とも言う。これらの処理は、全ての着目画素OP(x,y)に対する処理の際に行なわれるのではなく、所定のタイミングで行なわれる。そのタイミングも含めて、これらの処理は、後で詳述する。
続いて、EDiは、誤差拡散法処理(ステップS500)とこの処理によるハーフトーン結果の出力処理(ステップS230)とを実行する。誤差拡散法処理(ステップS500)の詳細を図5に示した。誤差拡散法処理を開始すると、各EDiは、先に読込んでRAM60に記憶した着目画素の階調値Dn(x,y)を入力する(ステップS510)。次にこの着目画素の階調値Dn(x,y)に、拡散誤差erb(x,y)を加えて、階調値補正値DCnを求める処理を行なう(ステップS520)。拡散誤差erb(x,y)とは、近傍の誤差拡散法処理済み画素から着目画素OP(x,y)に拡散されてきた誤差を順次累積して記憶したものである。拡散誤差erb(x,y)は、誤差バッファ60iに記憶されている。この拡散誤差erb(x,y)についても後で説明する。
階調値補正値DCnを求めた後、次のこの階調値補正値DCnと閾値THnとを比較する(ステップS530)。ここで閾値THnは、着目画素の階調値Dnが値0~255の範囲をとるのであれば、その中央値128を用いることができる。なお、閾値THnを画像データDnの関数として求めることも差し支えない。
階調値補正値DCnと閾値THnとを比較した結果、階調値補正値DCnが閾値THn以上であれば、着目画素にドットを形成するとして、ハーフトーン結果を「ドットON」とし(ステップS540)、結果値RSTに値255を設定する(ステップS550)。他方、階調値補正値DCnと閾値THnとを比較した結果、階調値補正値DCnが閾値THn未満であれば、着目画素にドットを形成しないとして、ハーフトーン結果を「ドットOFF」とし(ステップS560)、結果値RSTに値0を設定する(ステップS570)。その後、誤差演算を行なう(ステップS580)。誤差演算とは、階調誤差Ed(x,y)を、階調値補正値DCnと結果値RSTとの差分として求める演算である。その後、演算した階調誤差Ed(x,y)を着目画素の周辺画素に拡散する誤差拡散処理(ステップS590)を行なう。
これらの誤差拡散法処理の一例を図6に示した。図6では、着目した画素の階調補正値が値159の場合と値96の場合とを示している。このとき、閾値THn(128)と比較して(ステップS530)、ドットのON・OFFを決定すると、階調補正値159の画素は、ドットを形成すると判断され(ステップS540)、結果値RSTに値255が設定される(ステップS550)。結果値RSTを値255に設定するのは、ドットが形成された場合、その画素に対応した印刷媒体P上の位置の階調値が最大(255)になると擬制しているからである。同様に、階調補正値96の画素は、ドットを形成しないと判断され(ステップS560)、結果値RSTに値0が設定される(ステップS570)。結果値RSTを値0に設定するのは、ドットが形成されない場合、その画素に対応した印刷媒体P上の位置の階調値は、印刷媒体Pの地色、つまり一般に白色に対応して最小(0)になると擬制しているからである。実際に形成されるドットの大きさやインクの濃度などに応じて、結果値RSTは適宜設定される。
上記条件で、階調誤差Ed(x,y)を求めると、ドットを形成する場合は、
Ed(x,y)=159-255=-96
ドットを形成しない場合は、
Ed(x,y)=96-0=96
となる(ステップS580)。そこで、この階調誤差Ed(x,y)を、着目画素の周辺の画素に拡散する(ステップS590)。周辺の画素への拡散は、図6に示す誤差拡散マトリクス43に記憶された重み付け係数に従って行なわれる。図6に示した例では、重み付け係数は、着目画素*の周辺の7つの画素について規定されており、着目画素OP(x,y)に対して画素(x+1,y)と画素(x,y+1)では1/4であり、画素(x+2,y)と画素(x+1,y+1)と画素(x-1,y+1)では1/8であり、画素(x+2,y+1)と画素(x-2,y+1)では1/16である。従って、階調誤差Edが±96であれば、各画素に拡散される誤差は、図示するように、重み付け係数が1/4であれば±24となり、重み付け係数が1/8であれば±12となり、重み付け係数が1/16であれば±6となる。これらの値が、各画素への拡散誤差erbとして、RAM60に用意された第i誤差バッファ60iに加算して格納される。具体的には、以下の式(1)に従って求められた拡散誤差erbが、RAM60に用意された誤差バッファに格納される。
erb(x+1,y )=erb(x+1,y )+Ed×(1/4)
erb(x+2,y )=erb(x+2,y )+Ed×(1/8)
erb(x-2,y+1)=erb(x-2,y+1)+Ed×(1/16)
erb(x-1,y+1)=erb(x-1,y+1)+Ed×(1/8)
erb(x ,y+1)=erb(x ,y+1)+Ed×(1/4)
erb(x+1,y+1)=erb(x+1,y+1)+Ed×(1/8)
erb(x+2,y+1)=erb(x+2,y+1)+Ed×(1/16)
… (1)
この式(1)から分るように、本実施形態では、階調誤差Edは、着目画素OP(x,y)と同じラスターyとその一段下のラスターy+1とに拡散される。このため、各EDi用に用意された第i誤差バッファ60iの大きさは、2つのラスター分の拡散誤差を記憶できれば足りる。着目画素と同じラスターyの各画素に累積される拡散誤差erb(x,y)を記憶する領域を、第1領域誤差バッファと呼び、着目画素の次のラスターy+1の各画素に累積される拡散誤差erb(x,y+1)を記憶する領域を、第2領域誤差バッファと呼ぶ。1つのラスターの処理が終れば、第1領域誤差バッファの内容は全て使い尽くされるので、第2領域誤差バッファerbを第1領域誤差バッファとし、第1領域誤差バッファを全て値0にリセットした上で、第2領域誤差バッファerb用に置き換えれば良い。この処理を、誤差バッファの更新処理と呼ぶ。
各ラスターの端部で上記式(1)による階調誤差Edの拡散を行なうと、誤差の拡散範囲は、主走査方向の画素OP(1,y)からOP(a,y)までの範囲を超える。この範囲は、誤差拡散マトリクス43の大きさによって異なるが、図6に示した誤差拡散マトリクスであれば、ラスターの右端においては4画素分、ラスターの左端においては2画素分となる。1つの分割画像において主走査方向に処理される画素のx座標が1~aであることから、ラスターの右端において必要となる余剰の範囲のうち、N番目のラスターの画素からの拡散誤差であって、第1領域誤差バッファに記憶されるものを、拡散誤差erb(a+1,y)、erb(a+2,y)と表記し、第2領域誤差バッファに記憶されたものを、拡散誤差erb(a+1,y+1)、erb(a+2,y+1)と表記する。他方、ラスターの左端において必要となる余剰の範囲のうち、N番目のラスターの画素からの拡散誤差であって、第2領域誤差バッファに記憶されたものを、拡散誤差erb(-2,y+1),erb(-1,y+1)と表記する。ラスターの左端では、着目画素より左側の同じラスターに拡散される誤差は存在しないので、第1領域誤差バッファには余剰の範囲を確保する必要がない。この範囲の拡散誤差の取扱いについては、後で詳しく説明する。
着目画素が移動していくことにより、図6に示した誤差拡散マトリクスの例では、誤差バッファ内の特定の画素に対応する記憶領域への拡散誤差の加減算は、初期値を0として、各着目画素毎に計7回行なわれ、最終的な値が定められる。
上述した誤差拡散法処理(ステップS500)を行なった後、閾値THnとの比較により決定されたドットのON・OFFをハーフトーン処理の結果として出力する(図4:ステップS230)。ハーフトーン処理の結果は、RAM60の所定の領域に記憶される。
その後、L端部誤差出力処理(ステップS600)とR端部誤差出力処理(ステップS700)とを行なう。L端部誤差出力処理(ステップS600)およびR端部誤差出力処理(ステップS700)は、L端部誤差入力処理(ステップS400)およびR端部誤差入力処理(ステップS300)の前提となる処理である。そこで、これらの処理も、R端部誤差入力処理(ステップS300)およびL端部誤差入力処理(ステップS400)と共に後でまとめて説明する。
その後、着目画素の主走査方向の座標xを値1だけインクリメントし(ステップS240)、座標xが値aより大きい、つまり1つのラスターについての誤差拡散処理が右端まで到達したかを判断する(ステップS250)。主走査方向の座標xが値aを越えていなければ、1ラスター処理が未了であると判断し、ステップS400に戻って、上述した処理(ステップS400~S250)の処理を、着目画素が主走査方向端部(右端)に至るまで繰り返す。
着目画素が右端に至ったと判断すれば(ステップS250)、各EDiは、座標xを値1に初期化すると共に、副走査方向の座標yを値1だけインクリメントし(ステップS260)、座標yが値bより大きい、つまり1つの分割画像についての誤差拡散処理が最後のラスターまで到達したかを判断する(ステップS270)。副走査方向の座標yが値bを越えていなければ、1つの分割画像の処理が未了であると判断し、ステップS220に戻って、1ラスター分の画像データの入力から上述した処理(ステップS220~S270)の処理を、処理が分割画像の下端に至るまで繰り返す。処理が分割画像の下端に至れば(ステップS270:YES)、ENDに抜けて、EDによるハーフトーン処理を終了する。
(4)EDユニット間の誤差のやり取り:
次に、上述したEDによるハーフトーン処理(図4)において行なわれ各EDユニット間の誤差の受け渡しについて説明する。各EDユニット間での誤差の受け渡しには、次の2種類がある。一つは、EDi-1 の右端で生じた階調誤差に基づく拡散誤差を、主走査方向に隣接するEDiに受け渡すものである。この場合の誤差の受け渡しは、EDi-1 によるR端部誤差出力処理(ステップS700)により誤差を共有メモリー52に出力し、これをEDiによるR端部誤差入力処理(ステップS300)により入力することにより実現される。
もうひとつの誤差の受け渡しは、EDiの左端で生じた階調誤差に基づく拡散誤差を、主走査方向逆向きに隣接するEDi-1 に受け渡すものである。この場合の誤差の受け渡しは、EDiによるL端部誤差出力処理(ステップS600)により誤差を共有メモリー52に出力し、これをEDi-1 によるL端部誤差入力処理(ステップS400)により入力することにより実現される。
これらの誤差の受け渡しの概要を、図7を用いて説明する。図7では、分割画像1を誤差拡散処理するED1と分割画像2を誤差拡散処理するED2との間で誤差を受け渡す場合を例示している。誤差拡散処理を行なうED1が、座標yのラスター上において着目画素を一つずつ主走査方向に移動しながら、誤差拡散法処理(ステップS500)を実施し、右端(a,y)に至った場合を考える。着目画素が分割画像の右端に至ると、右端(a,y)より主走査方向側には、ドットデータが形成されるべき画素は存在しないが、誤差拡散法処理(ステップS500)では、階調誤差Edは、着目画素OP(a,y)の周辺に、誤差拡散マトリクス(図6参照)により規定された重み付けで拡散される。分割画像の右端では、着目画素OP(a,y)よりも主走査方向側の4つの画素に対応する範囲に誤差が拡散される。
着目画素OP(a,y)より主走査方向右側に拡散されるべき拡散誤差は、分割画像1では参照されることがないが、上述したように、4つの画素に対応する範囲であって、第1,第2領域誤差バッファの拡張された領域に、拡散誤差erb(a+1,y)、erb(a+2,y)、erb(a+1,y+1)、erb(a+2,y+1)として保存される。もとより、この分割画像1の領域外への拡散誤差は、着目画素OP(a-1、yー1)、(a,y-1)、(a-1,y)の時にも発生するから、第1領域誤差バッファに記憶された拡散誤差erb(a+1,y)、erb(a+2,y)、erb(a+1,y+1)、erb(a+2,y+1)は、これらを累積したものである。着目画素が、yラスターの右端(a,y)まで至っていれば、拡散誤差erb(x+1,y)、erb(a+2,y)、erb(a+1,y+1)、erb(a+2,y+1)は、yラスターから拡散される誤差としては、確定している。
これらの範囲に保存された確定した拡散誤差は、共有メモリー52を介して、隣接するED2に転送される。これらの範囲の拡散誤差が保存される共有メモリー52上の領域を、共有バッファerR00,erR01,erR10,erR11と呼ぶ。この領域を、図7では、右斜め線のハッチングを施した。yラスターの主走査方向右端での拡散誤差を、共有メモリー52の共有バッファerR00,erR01,erR10,erR11に出力する処理が、R端部誤差出力処理(ステップS700)に相当する。本実施形態では、後述する様に、着目画素が、yラスターの右端一つ手前の画素OP(a-1,y)に至った時点で求められた拡散誤差erb(a+1,y)、erb(a+1,y+1)を共有メモリー52の共有バッファに出力し、更に、着目画素が、yラスターの右端の画素OP(a,y)に至った時点で求められた拡散誤差erb(a+1,y)、erb(a+2,y)、erb(a+1,y+1)、erb(a+2,y+1)を共有メモリー52の誤差バッファに出力し、誤差バッファ上で加算処理を行なって、yラスターから拡散される拡散誤差を確定させるものとした。もとより、着目画素が、yラスターの右端(a,y)に至るまでは拡散誤差を仮バッファに記憶しておき、着目画素がyラスターの右端(a,y)まで至って全ての拡散誤差が確定してから、R端部誤差出力処理をまとめて行なうものとしてもよい。
こうして、ED1により共有メモリー52の共有バッファerR00,erR01、erR10、erR11に出力された拡散誤差は、本来、分割画像2の着目画素OP(1,y)、(2,y)、(1,y+1)、(2,y+1)での誤差拡散法処理において参照されるべきものである。そこで、ED2では、共有メモリー52の共有バッファerR00の値を拡散誤差erb(1,y)として、共有バッファerR10の値を拡散誤差erb(2,y)として、共有バッファerR01の値を拡散誤差erb(1,y+1)として、共有バッファerR11の値を拡散誤差erb(2,y+1)として、それぞれED2における誤差バッファ60iに加算する。この処理が、R端部誤差入力処理(ステップS300)に相当する。分割画像2、3を処理するED2、ED3が、N番目のラスターについて行なうR端部誤差入力処理(ステップS300)は、分割画像1、2にしてED1、ED2がN番目のラスターについて行なうR端部誤差出力処理(ステップS700)の完了後に実行可能となる。
次に、L端部誤差の入力および出力について説明する。分割画像2、3における主走査方向左端の画素OP(1,y)について誤差拡散法処理(図5)が行なわれると、図6に示したように、着目画素OP(1,y)より主走査方向逆方向にも階調誤差は拡散される。分割画像1では、この階調誤差は拡散されても対応する画像は存在しないが、分割画像2、3では、この階調誤差は、隣接する分割画像1、2の右端の画素に本来は拡散されるべきものである。既に説明した様に、第1領域誤差バッファには、分割画像の左端の画素OP(1,y)における誤差拡散法処理により生じた階調誤差を左端の画素OP(1,y)より主走査方向逆方向側、つまり分割画像の外側に拡散する際の拡散誤差を記憶する領域が確保されている。この第1領域誤差バッファ上に記憶される拡散誤差が、拡散誤差erb(-2,y)、erb(-1,y)である。
第1領域誤差バッファに記憶された拡散誤差erb(-2,y)、erb(-1,y)は、共有メモリー52を介して、隣接するED1、2に転送される。これらの範囲の拡散誤差が保存される共有メモリー52上の領域を、共有バッファerL(-2)、erL(-1)と呼ぶ。この領域を、図7では、縦線のハッチングを施した。yラスターの主走査方向左端での拡散誤差を、共有メモリー52の共有バッファerL(-2)、erL(-1)に出力する処理が、L端部誤差出力処理(ステップS600)に相当する。着目画素が、yラスター上の左端(1,y)にある場合には、第1領域誤差バッファに記憶された拡散誤差erb(-2,y)、erb(-1,y)のうち、拡散誤差erb(-2,y)は確定しているが、拡散誤差erb(-1,y)は、まだ確定していない。着目画素が、yラスター上の左端(1,y)から隣の画素OP(2,y)となり、誤差を拡散する処理が終った時点で、拡散誤差erb(-1,y)は確定する。つまり、画素OP(1,y)の誤差拡散法処理が終った時点では拡散誤差erb(-2,y)が、画素OP(2,y)の誤差拡散法処理が終った時点では拡散誤差erb(-1,y)が、それぞれ確定する。そこで、本実施形態では、着目画素が左端(1,y)の場合、確定した拡散誤差erb(-2,y)と共に、拡散誤差erb(-2,y)を共有バッファに出力し、着目画素が隣接する画素OP(2,y)に進んだ際には、誤差erb(-1,y)を共有バッファに加算して書込むものとした。もとより、第1領域誤差バッファに記憶された拡散誤差erb(-1,y)を一旦仮のバッファに書込んでおき、値が確定してから、共有バッファerL(-1)に書込む形でL端部誤差出力処理(ステップS600)を行なうものとしても差し支えない。
こうして、ED2により共有メモリー52の共有バッファerL(-2)、erL(-1)に出力された拡散誤差は、図7に示したように、分割画像1の着目画素OP(a-1,y+1)、(a,y+1)での誤差拡散法処理において参照されるべきものである。そこで、ED1では、この拡散誤差を共有メモリー52から、第2領域誤差バッファに、拡散誤差erb(a-1,y+1)、erb(a,y+1)として入力する。この処理が、L端部誤差入力処理(ステップS400)に相当する。分割画像2、3にしてED2、3がN番目のラスター上の着目画素について行なう誤差拡散法処理によりN+1番目のラスター上の画素へのL端部誤差出力処理(ステップS600)は、分割画像1、2を処理するED1、2が、N+1番目のラスターについて行なうL端部誤差入力処理(ステップS400)の実施までに完了していればよい。換言すれば、分割画像1、2に対するED1、2によるL端部誤差入力処理(ステップS400)は、分割画像2、3に対するED2、3によるL端部誤差出力処理(ステップS600)の完了後に実行可能となる。
これらの端部処理のうち、まずR端部誤差入力処理(ステップS300)およびR端部誤差出力処理(ステップS700)の詳細を、図8~図10を用いて説明する。図8は、R端部誤差入力処理(ステップS300)の詳細を示すフローチャート、図9は、R端部誤差出力処理(ステップS700)の詳細を示すフローチャートである。図4に示したハーフトーン処理では、R端部誤差入力処理(ステップS300)は、誤差拡散法処理(ステップS500)の実行に先立って実行される。図8に示した処理が開始されると、EDiは、まず順方向拡散誤差に相当するR端部誤差が共有メモリー52の共有バッファerR00,01,10,11に用意されたかを判断する(ステップS310)。分割画像1を処理するED1では、ED1より主走査方向逆方向に隣接する分割画像は存在しないので、そもそもR端部誤差入力処理(ステップS300)は実行されない。従って、ED1は、図4に示したハーフトーン処理のステップS400以下を、直ちに実行する。
これに対して、分割画像2、3を処理するED2、3では、まず隣接するED1、2が共有メモリー52の共有バッファerR00,01,10,11に、R端部誤差を書込んだかを判断する。この判断は、共有メモリー52にR端部誤差の書込みの完了を示すフラグを準備し、前段のEDiが、後述するR端部誤差出力処理(ステップS700)を完了した際に、このフラグをセットするようにすれば、後段のEDi+1 は、R端部誤差の書込みの完了を、このフラグにより容易に判断することができる。L端部誤差の書き込みの完了も同様に行なうことができる。分割画像2、3を処理するED2、3は、前段のED1、2がR端部誤差を共有メモリー52の共有バッファerR00,01,10,11に準備するまで、ステップS310の判断を繰り返し、待機する。
ED2、3がステップS310の判断を繰り返しているうちに、ED1は、ステップS400以下の処理を繰り返す。具体的には、着目画素を主走査順方向に進めながら、誤差拡散法処理(ステップS500)、ハーフトーン処理結果の出力(ステップS230)、L端部誤差出力処理(ステップS600)とこれに続くR端部誤差出力処理(ステップS700)を実行する。R端部誤差出力処理の詳細を図9に示した。R端部誤差出力処理(ステップS700)では、EDiは、まず主走査方向のx座標が、a-1またはaであるか否かの判断を行なう(ステップS710)。x座標が、a-1またはaでなければ、着目画素は、まだR端部誤差の出力処理を行なう位置にないとして、何も行なわずに「NEXT」に抜けて、R端部誤差出力処理(ステップS700)を一旦終了する。
ステップS710の判断において、x座標が、a-1であれば、第1領域誤差バッファに記憶された拡散誤差erb(a+1,y)、第2領域誤差バッファに記憶された拡散誤差erb(a+1,y+1)を、共有メモリー52の共有バッファerR00,erR01に書込む処理を行なう(ステップS735)。着目画素が、右端の1つ手前の画素OP(a-1,y)なので、図6に示した誤差拡散マトリクスの大きさでは、隣接するEDi に転送される拡散誤差は、第1領域誤差バッファに記憶されている拡散誤差erb(a+1,y)、第2領域誤差バッファに記憶されている拡散誤差erb(a+1,y+1)に限られるからである。ステップS735を実行した場合には、「NEXT」に抜けて本処理ルーチンを一旦終了する。
また、x座標がaに等しければ、着目座標は、処理しているラスターの右端に至っているとして、第1領域誤差バッファに記憶された拡散誤差erb(a+2,y)、第2領域誤差バッファに記憶された拡散誤差erb(a+2,y+1)を、共有メモリー52の共有バッファerR10,erR11に書込む(ステップS720)。第1領域誤差バッファに記憶された拡散誤差erb(a+2,y)、および第2領域誤差バッファに記憶された拡散誤差erb(a+2,y+1)は、いずれもラスターy上の右端の画素を処理したことで生じた拡散誤差として確定しているとして、ED1からED2に引き渡される。続いて、第1領域誤差バッファに記憶された拡散誤差erb(a+1,y)、第2領域誤差バッファに記憶された拡散誤差erb(a+1,y+1)を、共有メモリー52の共有バッファerR00,erR01に加算して書込む(ステップS730)。ここで、共有バッファに加算して書込むとは、対応する共有バッファに既に拡散誤差が書込まれている場合、これに新たな拡散誤差を加算することを意味する。拡散誤差は、マイナスの値である場合もあるため、実際には、加減算処理が行なわれる。第1領域誤差バッファに記憶された拡散誤差erb(a+1,y)、および第2領域誤差バッファに記憶された拡散誤差erb(a+1,y+1)は、加減算処理により、いずれもラスターy上の右端の2つの画素を処理したことで求められた拡散誤差として確定しているとして、ED1からED2に引き渡される。なお、ラスターy+1上の画素に周辺の画素から拡散される拡散誤差は、ラスターy上の画素からの拡散誤差とラスターy+1上の画素からの拡散誤差とがあるので、この時点で、隣接するED2における拡散誤差erb(1,y+1)、erb(2,y+1)は、誤差拡散法処理において階調補正値を求めるための拡散誤差としては確定していない。これらの拡散誤差erb(1,y+1)、erb(2,y+1)が階調補正値を求めるたの拡散誤差として確定するのは、ED1において、ラスターy+1上の画素の誤差拡散法処理が完了した時点である。
分割画像の右端で拡散誤差が隣接するユニットに受け渡される様子を図10に例示した。図10は、分割画像i-1 のyラスターでの誤差拡散法処理(ステップS500)がyラスターの右端、つまり着目画素OP(a,y)に至った場合の拡散誤差の出力の様子を示している。このとき、着目画素OP(a,y)における階調誤差Edが、周辺の7画素に対応する範囲に拡散される。このとき、着目画素より右側の位置に拡散される拡散誤差は、共有メモリー52の共有バッファerR00,01に加算して書込まれ、erR10,11に書込まれる。
ステップS710において、x座標がaに等しいと判断された場合には、上述したステップS720,S730に続いて、誤差バッファの更新処理(ステップS740)を実行する。この処理は、既述したように、1つのラスターについての誤差拡散法処理が終了したので、使用済みのラスターyに対応する第1領域誤差バッファの内容をクリアし、これをラスターy+1の処理時に、ラスターy+2への拡散誤差を記憶する新たな第2領域バッファとする。また同時に現在の第2領域誤差バッファは、ラスターy+1の処理時には、そのまま第1領域誤差バッファとする。
ED1が、図9に示したR端部誤差出力処理(ステップS700)を実行すると、共有メモリー52の共有バッファerR00,01,10,11には、分割画像1の主走査方向右端での誤差拡散法処理による拡散誤差が保存される。従って、図8に示したように、ED1が最初のラスター1(一般化すれば、N番目のラスター)の誤差拡散処理を完了するまで待機していたED2は、これを受けて、ステップS320以下の処理、即ち分割画像2のラスター1(一般化すればN番目のラスター)の処理を開始する。ステップS320では、画素(1,y)、(2,y)へ拡散すべき拡散誤差を共有メモリー52の共有バッファerR00,erR10から読込む処理を行なう。また、続けて、座標(1,y+1)、(2,y+1)へ拡散すべき拡散誤差を共有メモリー52の共有バッファerR01,erR11から読込む処理を行なう(ステップS330)。
その上で、共有バッファerR00,erR10から読込んだこれらの拡散誤差を、第1領域誤差バッファに、拡散誤差erb(1,y),erb(2,y)として書込む処理(ステップS340)と、共有バッファerR01,erR11から拡散誤差を第2領域誤差バッファにerb(1,y+1),erb(2,y+1)として書込む処理(ステップS350)とを行なう。この様子も、図10に示した。以上で、ED2は、R端部誤差入力処理(ステップS300)を終了する。この実施形態では、上記のように、ED1が処理したR端部誤差は、まとめて隣接するED2が読込むものとしたが、R端部誤差は、二度に分けて受け渡してもよい。つまり、ED1が、ラスターy上の画素OP(a-1,y)についての処理を終えた時点で、隣接するED2に一度目の受け渡しを行ない、ED1が画素OP(a,y)についての処理を終えた時点で、ED2に二度目に受け渡しを行なうものとしてもよい。この場合、隣接するED2が画素OP(1,y)において階調補正値を求めるための拡散誤差erb(1,y)は、ED2側で加算されて確定される。画素OP(2,y)についての拡散誤差erb(2,y)は、二度目の受け渡しの際に確定した値として受け渡される。
以上説明したように、分割画像1、2を処理するED1、ED2間では、主走査方向側に位置する画像2を処理するED2は、主走査方向逆方向側に位置する画像1を処理するED1が、N番目のラスターに相当するラスターy(最初はラスター1)の右端まで誤差拡散法処理を終えるのを待ち、ED1がラスターyの右端の画素OP(a,y)での誤差拡散の処理を終えると、共有メモリー52を介して、ラスターyでの処理により確定された拡散誤差の引き渡しを受け、N番目のラスターに相当するラスターy(最初はラスター1)の処理を開始する。このとき、ED2は、ED1から誤差を引継いでいるので、画像1と画像2との境界でも誤差は引継がれ、ハーフトーン処理された画像に擬似輪郭などが生じることがない。なお、この関係は、分割画像2、3を処理するED2、3間でも同様である。
ED2は、R端部誤差入力処理(ステップS300)を終えると、ステップS400以下の処理を開始する。ステップS400は、L端部誤差入力処理(ステップS400)である。このL端部誤差入力処理(ステップS400)は、図8、図9に示したR端部の誤差に関する入力処理および出力処理(ステップS300、S700)が対になっていたのと同様に、L端部誤差出力処理(ステップS600)と対になった処理である。以下、両処理(ステップS400,S600)を、図11~図13を用いて説明する。
L端部誤差入力処理(ステップS400)は、図11に示すように、開始されると、まずL端部の拡散誤差が準備されたか否かの判断を行なう(ステップS410)。L端部誤差は、図6に例示した様に、分割画像iのN番目のラスター上の画素を順次処理するEDiの主走査方向逆方向の端部(左端)の画素での誤差拡散法処理で生じたN+1番目のラスター上の画素への拡散誤差である。この拡散誤差は、分割画像iの主走査方向逆方向側(左側)に位置する画像i-1 を処理するEDi-1 に転送される。従って、EDi-1 は、EDiがL端部誤差出力処理(ステップS600)により、L端部誤差を共有メモリー52の共有バッファerL(-2),erL(-1)に準備するまでは、何も行なわず、「NEXT」に抜けて、本処理ルーチンを一旦終了する。このため、EDi-1 は、L端部誤差を入力することなく、誤差拡散法処理(ステップS500)を実行し、着目画素のx座標を1つずつ移動しながら、ハーフトーン処理を継続する。
この間に、隣接するEDiは、分割画像iの各ラスターの先頭の画素、つまり画素OP(1,y)において、誤差拡散法処理(ステップS500)とハーフトーン処理結果出力処理(ステップS230)とを行ない、続いてL端部誤差出力処理(ステップS600)を実行する。このL端部誤差出力処理(ステップS600)を図12に示した。L端部誤差出力処理(ステップS600)では、まず主走査方向のx座標が、値1または2であるか否かの判断を行なう(ステップS610)。図4に示したハーフトーン処理が分割画像iに対して初めて実行された時には、x座標は値1であり、二度目に実行された時には、x座標は値2である。
従って、分割画像iに対して処理が開始された直後では、x=1となり、誤差拡散法処理(ステップS500)で着目画素の周辺に拡散された拡散誤差のうち、拡散誤差erb(-2,y+1)、erb(-1,y+1)を第2領域誤差バッファから読み出し、共有メモリー52の共有バッファerL(-2),erL(-1)に書込む(ステップS620)。このとき、拡散誤差erb(-2,y+1)は、ED2からED1に引き渡される拡散誤差としては確定した拡散誤差である。他方、2度目にこの処理が実行された場合には、x=2となり、誤差拡散法処理(ステップS500)で着目画素の周辺に拡散された拡散誤差のうち、拡散誤差erb(-1,y+1)を第2領域誤差バッファから読み出し、共有メモリー52の共有バッファerL(-1)に加算して書込む(ステップS630)。共有バッファに拡散誤差を加算して書込むとは、共有バッファに拡散誤差が既に書込まれていれば、これに加算することを意味する。拡散誤差は、マイナスの値である場合もあるため、実際には、加減算処理が行なわれる。第2領域誤差バッファに記憶された拡散誤差erb(-2,y+1)、erb(-1,y+1)は、加減算処理により、いずれもED2からED1に引き渡される拡散誤差としては確定する。つまり、EDiがL端部誤差出力処理(ステップS600)により、L端部誤差を共有メモリー52の共有バッファerL(-2),erL(-1)に準備する場合、EDiが画素OP(1,y)についての誤差拡散法処理を終えた時点で、共有バッファerL(-2)の内容は確定し、EDiが画素OP(2,y)についての誤差拡散法処理を終えた時点で、共有バッファerL(-1)の内容は確定する。
主走査方向のx座標が、値1と値2で処理を分けているのは、図6に示した誤差拡散マトリクスの大きさでは、x=2の場合、書込まれるのは、第2領域誤差バッファに記憶されている拡散誤差erb(-1,y+1)に限られるからである。処理が進んで、x座標が値3以上になれば(ステップS610:「NO」)、「NEXT」に抜け、L端部誤差出力処理(ステップS600)では何も行なわない。
この様子を、図13に示した。こうして、L端部誤差が共有バッファに準備されると、L端部誤差入力処理(図11、ステップS400)におけるステップS410での判断は「YES」となり、EDi-1 は、共有バッファerL(-2)、erL(-1)に保存された拡散誤差を読込み(ステップS420)、これを第2領域誤差バッファに拡散誤差erb(a-1,y+1)、erb(a,y+1)に加算して書込む(ステップS430)。共有メモリー52の共有バッファから、拡散誤差が転送される様子を、図10に例示した。なお、この例では、L端部誤差が準備されたと判断されるのは、L端部誤差出力処理(図12、ステップS620およびS630)においてx=1,2の場合の処理が行なわれ、第2領域誤差バッファに書込まれた拡散誤差erb(-2,y+1)、erb(-1,y+1)が共有メモリー52の共有バッファerL(-2),erL(-1)に準備されて、拡散誤差として確定された後である。従って、図11に示したL端部誤差入力処理は、拡散誤差erb(-2,y+1)、erb(-1,y+1)が共有バッファerL(-2)、erL(-1)に書込まれて確定された後に一度だけ実行される。もとより、EDi-1 がラスターy+1において画素OP(a-1,y+1)を処理する際に必要になるのは、隣接するEDi が処理した拡散誤差erb(-2,y+1)だけなので、共有バッファerL(-2)に拡散誤差が書込まれた時点で、画素OP(a-1,y+1)の処理に必要な拡散誤差erb(a-1,y+1)を共有バッファerL(-2)から読込み、EDi-1 が画素OP(a-1,y+1)についての誤差拡散法処理を行なうのに備えるものとしても差し支えない。この場合は、隣接するEDi でのラスターy上の画素OP(2,y)での処理が行なわれて、共有バッファerL(-1)に拡散誤差erb(-1,y+1)が書込まれた後で、画素OP(a,y+1)の処理に必要な拡散誤差erb(a,y+1)を共有バッファerL(-1)から読込み、EDi-1 が画素OP(a,y+1)について誤差拡散法処理を行なうのに備えればよい。つまり、隣接するEDi からのEDi-1 へのL端部誤差の受け渡しは、図11,図12に示したように、2画素分まとめて行なってもよいし、一画素ずつ行なっても差し支えない。
以上説明したL端部誤差入力処理(ステップS400)およびL端部誤差出力処理(ステップS600)が、隣接するEDi-1 とEDiとの間で行なわれることにより、隣接する分割画像i-1 と分割画像iとの境界でも、誤差はEDiからEDi-1 側に受け渡される。この結果、境界領域での誤差拡散処理法を用いたハーフトーン処理結果に擬似輪郭などが生じることがない。
以上説明したハーフトーン処理(図4)を各EDiが行なうと、処理は実際には次のように進行する。
〈1〉分割画像1を処理するED1が起動し、1ラスター分の画像データを入力し、これをx=1から順方向に順次誤差拡散法処理によりハーフトーン処理して、その処理結果を、RAM60の所定の領域に書き出していく。
〈2〉ED1が、1ラスターの処理を進め、処理が右端に至ると、R端部誤差出力処理(ステップS700)が実行され、ED2に引き渡すべきR端部誤差が共有バッファerR00~11に準備される。
〈3〉これを受けて、分割画像2の1ラスター分の画像データを入力して待機していたED2が、R端部誤差入力処理(ステップS300)を実行し、ED1が準備したR端部誤差を自らの第1,第2領域誤差バッファに入力し、その後、x=1から誤差拡散法処理(ステップS500)を実行する。
〈4〉ED2は、画素OP(1,y)、OP(2,y)についての誤差拡散法処理(ステップS500)を終えると、L端部誤差出力処理(ステップS600)を実行する。この結果、ED1に引き渡すべき拡散誤差erL(-2),erL(-1)が準備される。
〈5〉これと平行して、ED1は、次のラスターy+1の画像データを入力し、L端部誤差入力処理(ステップS400)からR端部誤差出力処理(ステップS700)までを繰り返し実行して、ラスターy+1についてのハーフトーン処理を継続しており、ED2により、L端部誤差が共有バッファerL(-2),erL(-1)に準備されると、L端部誤差入力処理(ステップS400)により、これを自らの誤差バッファに入力する。L端部誤差を共有バッファerL(-2),erL(-1)から誤差バッファに入力するL端部誤差入力処理(ステップS400)は、ED1により誤差拡散法処理が、そのラスターy+1について右端、正確にはx座標a-1に至るまでに行なわれれば、いずれのタイミングで行なってもよい。仮に、処理がx座標a-2に至って、画素OP(a-2,y+1)についての誤差拡散法処理が終了してもまだL端部誤差が共有バッファerL(-2),erL(-1)に用意されていない場合には、L端部誤差が用意されまで待機するものとすればよい。
上記の処理により、ED1とED2との間では、ED1の順方向拡散誤差であるR端部誤差がED2に引き渡されて、ED2での誤差拡散法処理(ステップS500)で用いられ、ED2の逆方向拡散誤差であるL端部誤差がED1に引き渡されて、ED1での誤差拡散法処理(ステップS500)で用いられる。この結果、2つの分割画像1、2の境界においても、誤差拡散法処理における拡散誤差が引継がれることになる。同じ処理が、ED2とED3との間でも行なわれる。分割画像が4つ以上あり、EDユニットが4つ以上の場合でも同様に、処理が行なわれることは勿論である。
以上説明した第1実施形態のプリンター20では、ハーフトーン処理の対象である画像を3つの分割画像1、2、3に分けて誤差拡散法による処理を、ED1、2、3で行なう。このとき、各EDiは、担当する分割画像の主走査方向xに画素数aのラスター2本分の容量の第1,第2領域誤差バッファを準備するだけで良い。各ED1、2、3は、まずED1が動作を開始し、処理しているラスターyの右端(a,y)まで処理して、R端部誤差を共有メモリー52の共有バッファに出力すると、ED1に隣接するED2が、R端部誤差入力処理(ステップS300)を開始する。ED2が、R端部誤差を入力して、誤差拡散法処理(ステップS500)を実施すると、x=1、またはx=2の位置で、つまりED2が図4の誤差拡散処理を開始した直後に、L端部誤差出力処理(ステップS600)を実行するので、ED1が処理している着目画素がラスターの右端に至るよりかなり前に、ED1にとってのL端部誤差が準備される。このため、ED1が、ラスターy+1の右端の処理をする時点では、L端部誤差は準備されている。
同様の処理が、ED2とED3との間でも行なわれる。従って、分割画像1、2、3は、1ラスター分の誤差拡散法処理(ステップS500)が完了する程度の時間差、つまり1つのラスターについてR端部誤差入力処理(ステップS300)からR端部誤差出力処理(ステップS700)までの処理に必要な時間差ずつ遅れて順次実行されることになる。
このため、画像を誤差拡散法により処理するのに必要が時間を、1つのEDユニットが画像全体を処理する時間の約1/3程度に短縮できる。しかも、EDユニットの数を増やせば、ほぼその数に応じて、処理時間を短縮することができる。EDユニットの数が増えても、上述した処理(図4)を各EDユニットが実行すればよく、ユニットの数の増加を対して、処理内容を修正する必要がほとんどない。つまりプリンター20をEDユニットの増減に対して、フレキシブルに対応できる、いわゆるスケーラブルな構成とすることができる。また、本実施形態のプリンター20によれば、L端部誤差出力処理(ステップS600)やR端部誤差出力処理(ステップS700)を実行している間は、誤差拡散法処理(ステップS500)は実行されない。このため、ラスターを構成する各画素の誤差拡散法処理(ステップS500)と、隣接する誤差拡散処理部への拡散誤差の受け渡しの処理とを分離して、両処理を共に確実に行なうことができる。
(5)他の実施形態:
上述した第1実施形態は、以下の点で異なる実施形態で実施可能である。まず、上記実施形態では、分割画像のx方向の大きさは同じとしたが、必ずしも同じである必要はなく、分割画像毎に異なる大きさでも良い。この場合、x方向の画素数が少ない分割画像を担当したEDユニットは、主走査方向手前に位置するEDユニットからR端部誤差を入力するR端部入力処理(ステップS300)を開始するまでに待ち時間が発生する場合も有り得るが、複数のEDユニットにより、全体の画像処理時間を短縮できることに変りはない。また一番目の分割画像においては、L端部誤差出力処理(ステップS600)が必要ないこと、末尾の分割画像においてはR端部誤差出力処理(ステップS700)が必要ないことから、一番目と末尾の分割画像を若干大きくして、全EDユニットの処理時間を平均化することも可能である。なお、両端の分割画像を処理するEDユニットでは、L端部誤差出力処理(ステップS600)やR端部誤差出力処理(ステップS700)は行なわないが、ラスターの両端で、領域外の画素に対応する位置、例えば座標(-2,y)等に拡散誤差を拡散する処理は、そのまま行なえば良い。
誤差拡散マトリクスの大きさは、図6以外の大きさであっても差し支えない。着目画素がラスターy上にあるとき、誤差の拡散範囲をy+1のみならず、y+2など、y方向に拡張することも差し支えない。また、誤差拡散法処理の対象となる画素の階調値やラスター内の着目画素の位置に応じて、誤差拡散マトリクリスの大きさや重み付けを切換えるようにすることも可能である。
上記の実施形態では、R端部誤差出力処理(ステップS700)やL端部誤差出力処理(ステップS600)において、画素OP(a-1,y)、OP(a,y)や、画素OP(1,y)、OP(2,y)について、別々に出力処理を行なったが、画素OP(a-1,y)での誤差、画素OP(1,y)での誤差は、次の位置の画素OP(a,y)や、画素OP(2,y)での処理でそれぞれ加算されるので(ステップS730,S630)、毎回共有メモリー52に書き出さず、EDユニット内に一時的に記憶し、まとめて共有メモリー52の共有バッファに書き出すようにしてもよい。また、その場合、同一の共有バッファに加算して書き込みを行なう誤差は、書き込み前にEDユニット内で加算処理を行なっておくことで、共有バッファへの書き込みを1回で済ませることもできる。上記の実施形態ではR端部誤差用に同一ラスターへの拡散誤差を記憶する共有バッファerR00,erR10と次のラスターへの拡散誤差を記憶する共有バッファerR01,erR11との2ラスター分の共有バッファを用意したが、これを同一ラスターへの拡散誤差用に用いた共有バッファerR00,erR10だけですませることもできる。その場合は、上記の実施形態で共有バッファerR01,erR11に書き込んでいた次のラスターへの拡散誤差は、EDユニットの内のメモリに用意した内部バッファerR01i,erR11iに記憶しておいて、次のラスターの処理に移る。これにより、共有バッファerR00,erR10へ同一ラスターからの拡散誤差を書き込む時点では、内部バッファerR01i,erR11iには、1つ前のラスターからの拡散誤差が記憶されている状態となる。そこで、共有バッファerR00には同一ラスターからの拡散誤差に加え、内部バッファerR01iに記憶しておいた1つ前のラスターからの拡散誤差を加算して書き込み、同様に共有バッファerR10には同一ラスターからの拡散誤差に加え、内部バッファerR11iに記憶しておいた1つ前のラスターからの拡散誤差を加算して書きこむ。その後に、使用済みとなった内部バッファerR01i,erR11iに、次のラスターへの拡散誤差を書きこんで記憶すればよい。
上記実施形態では、各EDユニットの誤差バッファは第1領域誤差バッファと第2領域誤差バッファとの2つを用いたが、その記憶容量を減らすことも可能である。これは、階調誤差Edが拡散されると、着目画素OP(x,y)の同じラスターyの主走査方向側の拡散誤差は、順次誤差拡散法での判断に用いられて役目を終える一方で、着目画素の1つ下のラスターy+1では、図6に示した誤差拡散マトリクスを用いていれば、x座標で、x+3より大きな位置の拡散誤差は、存在しないことを利用する。この場合、役目を終えた第1領域誤差バッファを、同じラスター位置の第2領域誤差バッファに転用していくことで、1つのEDユニット当りに必要となる誤差バッファの容量を、1ラスター分の画素数+α+β程度に抑制することができる。ここで、αは、ラスターyとラスターy+1とで重複している画素数である。図6に示した誤差拡散マトリクスでは、主走査方向でx+1とx+2とで重複しているので、α=2である。この場合、ラスターy+1の座標x+1とx+2のα画素への拡散誤差は、別途用意したα個の誤差バッファ領域に一時的に記憶しておき、対応する画素の第2領域誤差バッファが使用可能となった段階で、一時的に記憶しておいた内容を反映してゆけばよい。またβは、隣接するEDユニットとの間での拡散誤差のやり取りをするために必要となるバッファの数である。第1実施形態では、R端部誤差のために4個、L端部誤差のために2個必要となり、合計でβ=6である。
第1実施形態では、EDユニット間の拡散誤差のやり取りに共有メモリー52用いたが、EDユニット間の拡散誤差のやり取りは、図14~図18に示すように、種々の構成を採用可能である。図14に示す構成では、各EDi-1 、EDi、EDi+1 がそれぞれ入力部41と出力部44とに接続されている。ここで出力部44は、ハーフトーン処理結果を印刷部46に出力する際(図4、ステップS230)のインタフェース部である。図14では、各EDi-1 、EDi、EDi+1 は、入力部41とも出力部44ともそれぞれ単独でデータを授受可能であり、かつEDi-1 、EDi、EDi+1 間でもR端部誤差やL端部誤差を直接やり取り可能な構成を採用している。こうすれば、各EDi-1 、EDi、EDi+1 が直接、各部と画像や拡散誤差をやり取りできるので、例えば、R端部誤差とL端部誤差とのやり取りを同時に行なうことも可能となる。また、図14の構成を採用すれば、各EDi-1 、EDi、EDi+1 が分割画像i-1 、分割画像i、分割画像i+1 を入力部41を介して受け取るとき、各EDi-1 、EDi、EDi+1 が1ラスターずつ、独立に受け取ることができる。このため、入力部41と接続されたデータの転送路が各EDi-1 、EDi、EDi+1 からのデータ要求を受けて輻輳することがない。
CPU40の内部構成としては、各EDi-1 、EDi、EDi+1 と外部とのやり取りを、入力部41と出力部44に分けず、1つの入出力部45を介して行なう構成を取ることも差し支えない。この場合の構成を図15に示した。図15では、各EDi-1 、EDi、EDi+1 と外部とのやり取りが、入出力部45に統一されている点以外は、図14と同じである。分割画像から1ラスター分のデータを受け取るタイミング(図4、ステップS220)と、ハーフトーン処理結果の出力のタイミング(ステップS230)とは分離できるので両者が競合することはなく、全体構成をコンパクトなものとすることができる。
図16,図17は、図14,図15に示した構成において、各EDi-1 、EDi、EDi+1 と入力部41、各EDi-1 、EDi、EDi+1 と出力部44とのやり取りを、それぞれ専用の転送路100、110、120を用いて行なうように変更した場合の構成を示す。図16、図17に示した構成では、各EDi-1 、EDi、EDi+1 は、単独で入力部41や出力部44、あるいは入出力部45でデータをやり取りするのではなく、共通の転送路100、110、120を用いて行なう。このため、新たなEDユニットを加える場合でも、単に転送路100、110、120に接続するものとし、各EDi-1 、EDi、EDi+1 には、入力部41、出力部44あるいは入出力部45とのデータをやり取りするプロトコルをインストールしておけば良い。入力部41や出力部44などを、接続するEDユニットの数に応じて作り替え必要がなく、全体構成を、より柔軟な構成にできる。この構成では各ユニットへのデータ入力は同時には行なえず、時系列でEDi-1 、EDi、EDi+1の順に1ラスター分のデータ入力を行なう。また、データ出力についても同様である。この場合、EDiへの1ラスター分のデータ入力を行なっている間に、既にデータ入力を終えたEDi-1はハーフトーン処理を開始してもよい。図16,図17において、転送路100、110は、それぞれデータ転送を一方向に行なうものであり、転送路120は、双方向に行なうものである。また、図16,図17に示した構成では、各EDユニット間のR端部誤差やL端部誤差のやり取りは、直接、各EDユニット間で行なう。
図18、図19は、各EDi-1 、EDi、EDi+1 間のデータのやり取り、つまりR端部誤差やL端部誤差のやり取りも、転送路130、140を用いて行なう場合の構成を示す。図18に示した構成では、転送路130を用いた制御を行なう入力部+転送部47が用いられる。各EDi-1 、EDi、EDi+1 は、この転送路130を用いて、各分割画像から1ラスター分の画像データを入力部+転送部47の入力部から入力する処理(図4、ステップS220)や、入力部+転送部47の転送部を介したR端部誤差の入出力処理(ステップS300およびS700)、更にはL端部誤差の入出力処理(ステップS400およびS600)を、行なう。複数のEDi-1 、EDi、EDi+1 がこれらのデータを1つの転送路130を用いて行なうので、各EDi-1 、EDi、EDi+1 間で直接データをやり取りする転送路を別途設ける必要がない。他方、転送路130に対する要求を調停(アービトレーション)する機能が入力部+転送部47に必要となる。図19に示した構成では、ハーフトーン処理結果の出力も転送路140および入出力部+転送部48を用いて行なわれるので、更に構成をシンプルなものにすることができる。他方、転送路140に対する使用の要求は更に高まり、バスアービトレーションの必要性は一層高まる。
図4に示したように、分割画像の1ラスター分のデータ入力(ステップS220)の直後にR端部誤差入力処理(ステップS300)が行なわれるので、各EDi-1 、EDi、EDi+1 間の処理は、少なくとも1ラスターの誤差拡散法処理(ステップS500)の完了、つまりR端部誤差を出力可能となるまでの時間だけ、後段のEDユニットの処理の開始が遅れることになる。他方、前段のEDユニットが次の1ラスターの画像データの処理を終える前には、L端部誤差入力処理(ステップS400)が可能となっていなければならず、つまりそれまでには、後段のEDユニットは、L端部についての誤差拡散法処理(ステップS500)を終えて、L端部誤差出力処理(ステップS600)が可能となっていなければならない。換言すれば、これらの条件さえ満たしていれば、各EDi-1 、EDi、EDi+1 間の処理のタイミングは自由に設定可能である。このため、転送路130や転送路140を用いる場合でも、転送路130等の競合が起きないように、例え競合が起きてもバスアービトレーションによる待ち時間が少なくなるように、各EDユニットの処理タイミングを設定すれば良い。
上記の実施形態では、誤差拡散法処理は、画素を単位として行なったが、複数の画素、例えば2×2の4画素をひとつのブロックとして扱い、各ブロック間で誤差を拡散するようにしても良い。図20はこうしたブロック間誤差拡散の手法を例示する説明図である。図示するように、1つのブロックBij内に含まれる画素についてドットのON・OFFを決定し、それによって発生した誤差を、誤差拡散マトリクスに設定された重み付けで、周辺のブロックに拡散する。各ブロック内の画素についてのドットのON・OFFの決定は、ブロック内の画素の階調値の平均値を用いてディザ法により決定してもよい。こうしたブロック間の誤差拡散法処理については、例えば特開2016-116105号公報などに詳しく示されている。
(6)その他の実施態様:
[1]本開示の画像処理装置は、次の態様で実施可能である。第1の態様は、複数の画素からなる縦横2次元の画像を、前記縦横のうちの一方向を主走査方向として順次ハーフトーン処理する画像処理装置としての態様である。この画像処理装置は、前記画像を前記主走査方向にn個(nは2以上の整数)に分割した分割画像の各々に対応して設けられ、前記分割画像の前記主走査方向の画素の並びであるラスターに属する画素を順次着目画素とし、前記着目画素に誤差拡散法を適用して前記ハーフトーン処理を行なうn個の誤差拡散処理部と、n個の前記誤差拡散処理部が処理した結果を併せ、前記分割画像が備える階調値未満の階調値を有する処理済みデータを出力する出力部とを備える。ここで、前記n個の誤差拡散処理部のうち、主走査方向に隣接する2つの分割画像にそれぞれ前記ハーフトーン処理を施す2つの誤差拡散処理部は、前記主走査方向手前に位置する一の分割画像のN+1番目(Nは1以上の整数)のラスターについての前記ハーフトーン処理の少なくとも一部と、前記一の分割画像に隣接する他の分割画像のN番目のラスターについての前記ハーフトーン処理の少なくとも一部とを、同時に行ない、前記主走査方向手前に位置する分割画像を処理する一の誤差拡散処理部は、N番目のラスターについて前記主走査方向端部まで処理したことにより、前記主走査方向端部において前記N番目のラスター上の着目画素の周辺の画素に拡散する拡散誤差を求めたとき、前記拡散誤差のうち、前記他の誤差拡散処理部が用いる拡散誤差である順方向拡散誤差であって、少なくともN番目のラスターについて確定した順方向拡散誤差を、前記他の誤差拡散処理部による前記他の分割画像のN番目のラスターについての前記ハーフトーン処理の開始より以前に、前記他の誤差拡散処理部に受け渡し、前記他の誤差拡散処理部は、前記一の誤差拡散処理部から前記一の分割画像のN番目のラスターにおける前記確定した順方向拡散誤差を受け取った後で、前記他の分割画像のN番目のラスターについての前記ハーフトーン処理を開始し、前記主走査方向とは逆方向の端部において前記N番目のラスター上の着目画素の周辺の画素に拡散する拡散誤差を求めた後で、前記拡散誤差のうち、前記一の誤差拡散処理部が前記一の分割画像のN+1番目のラスターについての前記ハーフトーン処理において用いる拡散誤差である逆方向拡散誤差のうち、少なくともN+1番目のラスターに関して確定した逆方向拡散誤差を、前記一の誤差拡散処理部による前記N+1番目のラスターについての前記ハーフトーン処理が前記主走査方向端部に至るまでに受け渡すものとしてよい。
こうすることで、画像の誤差拡散法を用いたハーフトーン処理を短時間に行なうことができ、しかも、誤差拡散処理部の数が増減しても、互いに隣接する2つの誤差拡散処理部間では、主走査方向に手前側の分割画像を処理する誤差拡散処理部を一の誤差拡散処理部とし、他方を他の誤差拡散処理部として、各誤差拡散処理部が処理を行なえば良い。従って、誤差拡散処理部の増減を極めて容易に行なうことができる。更に、この画像処理装置では、誤差拡散のために周辺の画素に拡散する拡散誤差を記憶する記憶容量を低減することができる。
[2]こうした画像処理装置において、前記一の誤差拡散処理部と前記他の誤差拡散処理部とは、直接データのやり取り可能な経路を有し、少なくとも前記確定した順方向拡散誤差および前記確定した逆方向拡散誤差を、前記経路を介してやり取りするものとしてよい。こうすれば、順方向拡散誤差および逆方向拡散誤差を誤差拡散処理部間で直接やり取りすることができる。
[3]こうした画像処理装置において、前記経路は、前記2つの誤差拡散処理部から読み書き可能な共有メモリーとしてよい。共有メモリーを用いれば、読み書きのためにデータをやり取りするプロトコルなどを設定する必要がない。
[4]こうした画像処理装置において、前記n個の誤差拡散処理部は、データのやり取りが可能な転送路を共有し、前記一の誤差拡散処理部と前記他の誤差拡散処理部とは、少なくとも前記確定した順方向拡散誤差および前記確定した逆方向拡散誤差を、前記転送路を介してやり取りするものとしてもよい。こうすれば、各誤差拡散処理部間の拡散誤差のやり取りなどを転送路に集約して行なうことができ、誤差拡散処理部間の接続を簡略なものにできる。また、各誤差拡散処理部同士の接続が転送路に集約されるので、誤差拡散処理部の増減に対して、柔軟に対応できる。
[5]こうした画像処理装置において、前記一の誤差拡散処理部は、前記確定した順方向拡散誤差を前記他の誤差拡散処理部に向けて出力している間は、前記誤差拡散法を適用した前記ハーフトーン処理は実行せず、前記他の誤差拡散処理部は、前記確定した逆方向拡散誤差を前記一の誤差拡散処理部に向けて出力している間は、前記誤差拡散法を適用した前記ハーフトーン処理は実行しないものとしてもよい。こうすれば、ラスターを構成する各画素の誤差拡散法処理と、隣接する誤差拡散処理部への拡散誤差の受け渡しとを確実に行なうことができる。
[6]上記の画像処理装置において、前記他の誤差拡散処理部は、前記一の誤差拡散処理部からの前記確定した順方向拡散誤差を入力している間は、前記誤差拡散法を適用した前記ハーフトーン処理は実行しないものとしてもよい。こうすれば、更に確実に、ラスターを構成する各画素の誤差拡散法処理と、隣接する誤差拡散処理部への拡散誤差の受け渡しとを行なうことができる。
[7]本開示の第2の態様は、印刷装置としての態様である。この印刷装置は、上記の画像処理装置のいずれか1つと、その画像処理装置の出力部が出力する処理済みデータに対応した階調値のドットを形成することにより、印刷媒体に印刷を行なう印刷部と、を備える。この印刷装置によれば、画像の誤差拡散法を用いたハーフトーン処理を短時間に行なうことができ、印刷完了に要する時間を端主することができる。また、印刷装置に備えられた画像処理装置において、誤差拡散処理部の増減を極めて容易に行なうことができる点や、誤差拡散のために周辺の画素に拡散する拡散誤差を記憶する記憶容量を低減することができるなどのメリットを享受できることは、画像処理装置単体と同様である。
[8]本開示の第3の態様は、複数の画素からなる縦横2次元の画像を、前記縦横のうちの一方向を主走査方向として順次ハーフトーン処理する画像処理方法として態様である。この画像処理方法は、前記画像を前記主走査方向にn個(nは2以上の整数)に分割した分割画像の各々に対応して設けられ、前記分割画像の前記主走査方向の画素の並びであるラスターに属する画素を順次着目画素とし、前記着目画素に誤差拡散法を適用して前記ハーフトーン処理を行なうn個の誤差拡散処理部を用意して実行される。この画像処理装置では、前記n個の誤差拡散処理部のうち、主走査方向に隣接する2つの分割画像にそれぞれ前記ハーフトーン処理を施す2つの誤差拡散処理部は、前記主走査方向手前に位置する一の分割画像のN+1番目(Nは1以上の整数)のラスターについての前記ハーフトーン処理の少なくとも一部と、前記一の分割画像に隣接する他の分割画像のN番目のラスターについての前記ハーフトーン処理の少なくとも一部とを、同時に行なう。ここで、前記主走査方向手前に位置する分割画像を処理する一の誤差拡散処理部は、N番目のラスターについて前記主走査方向端部まで処理したことにより、前記主走査方向端部において前記N番目のラスター上の着目画素の周辺の画素に拡散する拡散誤差を求めたとき、前記拡散誤差のうち、前記他の誤差拡散処理部が用いる拡散誤差である順方向拡散誤差であって、少なくともN番目のラスターについて確定した順方向拡散誤差を、前記他の誤差拡散処理部による前記他の分割画像のN番目のラスターについての前記ハーフトーン処理の開始より以前に、前記他の誤差拡散処理部に受け渡し、前記他の誤差拡散処理部は、前記一の誤差拡散処理部から前記一の分割画像のN番目のラスターにおける前記確定した順方向拡散誤差を受け取った後で、前記他の分割画像のN番目のラスターについての前記ハーフトーン処理を開始し、前記主走査方向とは逆方向の端部において前記N番目のラスター上の着目画素の周辺の画素に拡散する拡散誤差を求めた後で、前記拡散誤差のうち、前記一の誤差拡散処理部が前記一の分割画像のN+1番目のラスターについての前記ハーフトーン処理において用いる拡散誤差である逆方向拡散誤差のうち、少なくともN+1番目のラスターに関して確定した逆方向拡散誤差を、前記一の誤差拡散処理部による前記N+1番目のラスターについての前記ハーフトーン処理が前記主走査方向端部に至るまでに受け渡し、n個の前記誤差拡散処理部が処理した結果を併せ、前記分割画像が備える階調値未満の階調値を有する処理済みデータを出力する。かかる画像処理方法によっても、上記画像処理装置と同様の効果を奏することができる。
本開示は、上述の実施形態、実施態様に限られるものではなく、その趣旨を逸脱しない範囲において種々の構成で実現することができる。例えば、発明の概要の欄に記載した各形態中の技術的特徴に対応する実施形態の技術的特徴は、上述の課題の一部又は全部を解決するために、あるいは、上述の効果の一部又は全部を達成するために、適宜、差し替えや、組み合わせを行うことが可能である。また、その技術的特徴が本明細書中に必須なものとして説明されていなければ、適宜、削除することが可能である。例えば、上記実施形態においてハードウェアにより実現した構成の一部は、ソフトウェアにより実現することができる。また、ソフトウェアにより実現している構成の少なくとも一部は、ディスクリートな回路構成により実現することも可能である。