以下、図面を参照して本発明を実施するための最良の形態を説明する。図1は、本発明が適用される画像処理装置20を含むシステム全体の構成を示す図である。図に示すように本システムは階調画像データ出力装置10と、画像処理装置20と、2値画像出力装置30とから構成される。
階調画像データ出力装置10は、画像処理装置20と接続され、処理対象の階調画像データd0を出力する。本実施例において階調画像データd0は、各画素ごと、8ビット構成で0〜255までの256階調値を有している。階調画像データ出力装置10は、例えば、ホストコンピュータ、イメージスキャナ、デジタルカメラ、ビデオカメラなどである。
画像処理装置20は、階調画像データ出力装置10からの階調画像データd0が入力され、誤差拡散法による処理で2階調(0又は1)の画像データBに変換する。かかる画像データBは2値画像出力装置30に出力される。
2値画像出力装置30は、画像処理装置20と接続され、画像処理装置20からの2階調画像データBに基づいて原画像を再生出力する。2値画像出力装置30は、例えば、プリンタ、ディスプレイ、ファクシミリ、複写機、プリンタやファクシミリ等の機能を有する複合機などである。
次に、画像処理装置20の構成について説明する。図1に示すように画像処理装置20は、加算器21と、2値化部22と、減算器23と、重み付け誤差演算部24、及び誤差メモリ25とから構成される。
加算器21は、階調画像データ出力装置10と接続されるとともに、後述する誤差メモリ25、2値化部22、および減算器23と接続される。階調画像データ出力装置10からの階調画像データd0と、誤差メモリ25からの誤差値E0とが入力され、階調画像データd0に誤差値E0を加算した値fを2値化部22に出力する。また、この加算値fは減算器23にも出力される。
2値化部22は、減算器23に接続されるとともに2値画像出力装置30にも接続される。加算器21からの加算値fと閾値とを比較し、その大小によって2階調画像データBに変換する。本実施例では、閾値を“128”とし加算値fが閾値と等しいか大きいときはドット生成を示す“1”、そうでないときはドット無しを示す“0”とすることで2階調の値Bに変換する。この値Bが、2階調画像データとして2値画像出力装置30に出力される。
減算器23は、重み付け誤差演算部24にも接続される。減算器23は、誤差演算手段として機能し、加算器21からの加算値fに対して2値化部22からの2階調の値B’(B=1のときB’=255、B=0のときB’=0)を減算する。減算後の誤差値E’は重み付け誤差演算部24に出力される。
重み付け誤差演算部24は、誤差メモリ25にも接続される。減算器23からの誤差値E’が入力され、拡散マトリックス内の各係数値Wxyで積算(重み付け)し、各画素ごと、重み付け誤差値E’(i’、j’)を誤差メモリ25に出力する。ここでは、注目画素の近傍で2階調画像データBに変換されていない画素に誤差値E’(i’、j’)を拡散することになる。なお、拡散マトリックスは重み付け演算部24に格納され、処理の際にマトリックス内の各係数値Wxyを読み出して処理が行われる。
誤差メモリ25は、重み付け誤差演算部24からの重み付け誤差値E’(i’、j’)を一時記憶する。同じ画素位置に以前の重み付け誤差値E’(i’、j’)が記憶されていれば、記憶された誤差値E’(i’、j’)に重み付け誤差演算部24からの誤差値E’(i’、j’)を加算して記憶することになる。そして、階調画像データd0と同じ画素位置の誤差値E’(i’、j’)を加算器21に出力する。なお、重み付け誤差演算部24と誤差メモリ25とで誤差拡散手段として機能する。
[正負両方の係数を有する拡散マトリックスを用いた誤差拡散処理]
以上のように構成された画像処理装置20の動作について図2のフローチャートを参照しながら説明するが、その前に誤差拡散法による処理で用いる、本発明に係る拡散マトリックについて説明する。
誤差拡散法による処理は、画素ごとに加算値f(階調画像データd0の入力階調値と誤差値との加算値)と閾値とを2値化部22で比較し、2値化された値との誤差を減算器23で演算している。そして、その誤差を拡散マトリックス内にある係数Wxyで積算し、その値を注目画素の周辺に拡散させている。この拡散マトリックスの例を図3(A)に示す。
図3(A)に示すように本発明に係る拡散マトリックス241は、注目画素(図中“*”で示す)の周辺に“0.5”、さらに注目画素の2つ下の画素に“−0.5”の係数を持つ。すなわち、正の誤差値に対して注目画素に近い画素には多くの誤差値が拡散され、注目画素から遠い画素にはそれよりも小さな誤差値が拡散されるように係数を有している。注目画素に近い画素位置に大きな値の係数を有することで、より絶対値の大きな誤差値が近くの画素に拡散され、その後誤差値と入力階調値とを加算すればそれだけ早くドットが生成されることになる。なお、図3(A)に示すように図面上右方向が主走査方向で、下方向が副走査方向である。
図3(B)には、従来から存在するFloyd and Steinbergの拡散マトリックスを示す。このマトリックス241で注目画素の右隣には、“7/16”で図3(A)に示す“0.5”より小さい係数である。さらに、注目画素の下と右斜め下の係数はさらに小さい係数である。したがって、図3(B)のマトリックス241により拡散される誤差値は注目画素の近くでは図3(A)のマトリックスよりも誤差値の絶対値が小さいものとなる。
図3(C)には、従来からのJarvis、Judice and Ninkeの拡散マトリックスを示す。このマトリックス241は、図3(A)に示すマトリックス241と比較して係数はより小さな値となっている。この場合も、周りの画素に拡散される誤差値は注目画素の近くでは図3(A)の場合よりも低い値となっている。
ドット密度の低い領域の立ち上がり部分で発生する「ドット発生の遅延」は、拡散マトリックス241での係数が小さな値となっていることに加え、入力階調値が低い値のため周辺画素に拡散する誤差値が非常に小さく閾値に達するまで時間がかかることが原因である。また、エッジ部分で発生する「尾ひき」についても、例えばドット密度の低い領域からドット密度の高い領域に変わる領域において、誤差値が非常に小さいためにあるドット密度の低い領域で蓄積された誤差がドット密度の高い領域で相殺されるまで時間がかかることが原因である。
そこで、図3(A)に示すように拡散マトリックス241の係数を注目画素に近い画素には大きな係数を、注目画素から遠い画素には小さな係数となるように構成している。より具体的には、注目画素に隣接する画素(注目画素の右隣、右斜め下、下、左斜め下の最大4つの画素)に与える係数の合計値が1よりも大きな値となるように構成する。すなわち、注目画素に隣接する画素に拡散される重み付け誤差の合計が誤差値よりも絶対値を大きくとるように係数Wxyを与える。例えば、図3(A)の例では主走査方向、副走査方向を図面のようにとったときに、右隣と、下、及び左斜め下の画素(この例では右斜め下の画素に与える係数はない)に与える係数の合計値は“1.5”となっている。これにより、大きな誤差値が拡散され「ドット発生の遅延」等の問題を解消することができる。
しかしながら、大きな係数となるように拡散マトリックス241を構成しても、誤差値として拡散される値が本来の誤差値とは異なる値となっては、画像全体の平均階調値の誤差を最小にするという誤差拡散法の特徴を失うことになる。例えば、入力階調値が“10”で誤差値が“10”となったとき、ドットの生成を早めるために周辺の画素に“20”、“30”などの誤差値を拡散させると、画像全体の誤差が多くなってしまう。
そこで、注目画素の近い画素に大きな係数を割り当てたとき、遠くの画素に負値の係数を割り当て、拡散される値が全体としてみると誤差値と等しくなるようにする。図3(A)の例では、注目画素から2つ下の画素位置に負値である“−0.5”を割り当て、全体として“1.0”としている。これにより、注目画素での誤差値分を拡散させることになる。
拡散マトリックス241に負値の係数を割り当てる例としては、図3(D)や図3(E)に示すマトリックス241であってもよい。ちなみに、これらの拡散マトリックス241において注目画素に隣接する画素に与える係数の合計値はそれぞれ“23/16”、“62/48”である。
次に、図4(A)に示す入力階調値を例にとって図2に示すフローチャートを説明する。拡散マトリックス241は図3(A)に示すものを用いるものとする。なお、図4(A)に示す入力バッファ11は入力階調値d0を格納するためのもので各座標位置は全体画像の座標位置に対応する。誤差メモリ25や出力バッファ31の座標位置も同様である。出力バッファ31は2値化後の値Bを格納するためのものである。
ここで、入力バッファ11は本実施例においては階調画像データ出力装置10にあり、出力バッファ31は2値画像出力装置30にあるものとするが、入力バッファ11と出力バッファ31とは処理の動作を理解し易くするために示したものである。よって画像処理装置20に入力バッファ11や出力バッファ31があってもよいし、バッファ11、31自体なくてもよい。
まず、本発明にかかる誤差拡散法による処理が開始される(ステップS10)と、注目画素の指定を行う(ステップS11)。注目画素について最初は(1,1)に位置する画素である。図4(B)に示すように注目画素を太線で示す。なお、最初に画素(1,1)に対する処理を行うと次の注目画素として(2,1)となり、以後主走査方向に順次移動することになる。
次いで、注目画素の階調値d0と注目画素の誤差値E0とを加算器21にて加算する(ステップS12)。図4(B)の例では、注目画素の階調値d0は“16”、当該画素の誤差値E0は“0”なので、加算後の値fは“16”となる。
次いで、加算後の値fに対して2値化部22において2値化を行う(ステップS13)。図4(B)の例では、加算値fは“16”であるから閾値“128”と比較し2値化すると“0”となる(図4(B)の出力バッファ31参照)。
次いで、2値化したことによる誤差値E’を減算器23で演算する(ステップS14)。すなわち、加算値fから2値化後の値B’を減算する。図4(B)の例では、加算値fは“16”で2値化後の値B’は“0”、したがって誤差値E’“16”を得る。
次いで、重み付け誤差演算部24において重み付け誤差値E’(i’、j’)を演算する(ステップS15)。すなわち、誤差値E’に拡散マトリックス241の各係数Wxyを積算する。上述の例では、図3(A)に示すマトリックス241から注目画素(1,1)に対して画素(2,1)と画素(1,2)には“8”(=16×0.5)、画素(1,3)には“−8”(=16×(−0.5))となる。すなわち、E’(2,1)=E’(1,2)=8、E’(1,3)=−8を得る。
次いで、重み付け誤差値E’(i’、j’)を加算して誤差メモリ25に格納する(ステップS16)。上述の例では、図4(B)の誤差メモリ25に示すように(2,1)と(1,2)の位置に“8”、(1,3)の位置に“−8”が格納される。なお、ここでは図示しないが、画素位置(−1,2)に拡散される誤差E’(−1,2)=8も画素(−1,2)の誤差を格納する誤差メモリ25に加算される。
次いで、未処理画素があるか否か判断し(ステップS17)、未処理画素があれば(“YES”のとき)ステップS11に移行し上述の処理を繰り返す。未処理画素がないと(“NO”のとき)本処理は終了する(ステップS18)。図4(B)に示す例では、未処理画素があるため処理を繰り返すことになる。
以下、図4(B)の例で処理を進めると、図5(A)に示すように注目画素を(2,1)とし(ステップS11)、当該画素位置の入力階調値d0“16”と誤差メモリ25の当該画素位置の誤差値E0“8”とを加算する(ステップS12)と加算値f“24”を得る。閾値“128”と比較することで2値化すると“0”となる(ステップS13、図5(A)の出力バッファ31参照)。誤差値E’は“24”(ステップS14)で、拡散マトリックス241から重み付け誤差値E’(i’、j’)を演算する(ステップS15)。そして、誤差メモリ25に誤差値E’(i’、j’)を加算して格納する(ステップS16)と、図5(B)の誤差メモリ25に示す状態となる。以後、同様の処理を繰り返し、画素(4,1)まで処理を終了したときの入力バッファ11、誤差メモリ25、出力バッファ31の状態を図6(A)に示す。
ここで、誤差メモリ25に格納された各値を検討する。図6(B)には従来例の拡散マトリックス241により同じ画素位置(4,1)まで同じ処理を行ったときの誤差メモリ25と出力バッファ31の状態を示す。
両者の誤差メモリ25に格納された値を比較すると、処理が行われた画素位置のすぐ下の画素には図6(A)の方が図6(B)より多くの誤差値が拡散されていることがわかる。
このことから、多くの誤差値が拡散された画素では閾値よりも高くなる可能性が高まり、ドットが生成されやすくなる。すなわち、ハイライト領域の立ち上がり部分でドットの生成が遅れる「ドット発生の遅延」が解消される可能性が高くなる。また、入力画像のドット密度の低い領域から高い領域に変化するようなエッジ部分でも多くの誤差値が拡散されるためドット密度の高い領域でドットが生成されやすくなるため、「尾ひき」の問題も解消される可能性が高くなる。
また、本処理において注目画素位置で入力階調値d0と誤差値E0とを加算した加算値fと閾値とを比較して2値化するだけであって、隣接画素との入力階調値の差によって閾値を変更するような複雑な条件分岐を行うことがないためその分処理が早くなる。
さらに、図6(A)で誤差メモリ25に拡散された値の合計値は“56”、処理済みの4画素((1,1)〜(4,1)の4画素)の入力階調値の合計値は“64”で、ほぼ処理済みの階調値の合計値が周辺の画素に拡散されており、入力階調値よりも大きな値を拡散させるようなことはしていないことになる。すなわち、画像全体の平均階調値の誤差を最小にするという誤差拡散法本来の特徴を失っていないと言える。
図6(A)の処理を(5,3)の画素まで行ったときの例を図7(A)に示す。この図に示すように、(3,3)の画素位置でドットが生成されている。一方、図7(B)は図6(B)に示す従来例での拡散マトリックス241により処理を行ったときの例である。この例ではドットが生成されていない。すなわち、本発明に係る拡散マトリックス241による処理を行うことで「ドット発生の遅延」が解消されている。なお、図2の動作に戻ると、(5,3)を最後の画素としたとき、当該画素に対して処理が終了すると未処理画素がなくなるためステップS17で“NO”が選択され、一連の処理が終了することになる(ステップS18)。
次に全体画像による本発明の有効性について検討する。図8(A)、(B)は従来例の拡散マトリックス(図3(B)に示す拡散マトリックス241)を用いた場合の本処理後の再生画像の例である。図8(C)、(D)は本発明に係る拡散マトリックス(図3(D)の拡散マトリックス241)を用いた場合の再生画像の例である。入力画像は、図8(A)、(C)については入力階調値“15”の領域に入力階調値“180”の線が存在している例で、図8(B)、(D)については入力階調値“240”の領域に入力階調値“15”の四角形が存在している例である。
図8(A)では画像の左上の領域にドットの発生が遅れる「ドット発生の遅延」が生じ、画像中央の縦線、横線の右斜め下方向にドットが打たれていない「尾ひき」が生じている。また、図8(B)についても画像の左上の領域で白ドットの発生が遅れており、四角形の右斜め下方向でも白ドットが打たれていない。
一方、図8(C)、(D)に示すように本発明に係る拡散マトリックス241を用いて処理を行った場合には、画像の左上の領域でドットの発生が遅れる「ドット発生の遅延」が解消され、また、エッジの右斜め下方向にドットが打たれない「尾ひき」の問題も解消されている。理由は上述したように、拡散マトリックス241内で注目画素に近い画素位置に大きな係数、すなわち、注目画素に隣接する画素に与える係数の合計値を1よりも大きくしているからである。
以上、本発明によれば、誤差拡散法本来の特徴を失うことなく「ドット発生の遅延」と「尾ひき」の問題を解決し、さらに処理の速い誤差拡散法を用いた画像処理装置や方法、及びプログラムを提供することができる。
[重心位置に注目画素が位置するように係数を配置した拡散マトリックスによる誤差拡散処理]
次の実施例として、誤差拡散法で用いる拡散マトリックスで注目画素にマトリックスの重心位置が位置するように係数を配置した例について説明する。まず、従来例の拡散マトリックス241を例にとって説明する。図9(A)にその例を示す。
図9(A)の例は、注目画素の位置(“*”で示す)を(0,0)としたとき、(1,0)、(−1,1)、(0,1)、(1,1)の位置に“0.25”の係数を配置させた例である。このときの拡散マトリックス241内の重心位置を以下の式によって求める。
(ここで(m1,m2)は重心位置の位置座標を示す)
以後の重心位置は[数1]を用いて演算する。実際に演算すると、(m1,m1)=(0.25,0.75)となる。この位置243を図面上、黒丸で示す。一方、注目画素(0,0)に着目すると、当該位置には拡散対象の入力階調値があり、その重心位置は当該画素(0,0)の中央に位置する。注目画素の重心位置242を図中白丸で示す。図9(A)に示すように、本来の重心位置242に対して実際の重心位置243がずれている。すなわち、注目画素から離れた位置に拡散マトリックス241の重心が位置する。
この重心位置のずれは、入力階調値を誤差値として周囲の画素に拡散させたときにも生じる。すなわち、図9(B)で示す入力階調値に対して注目画素を(2,1)とし、その階調値“16”が誤差値として周囲の画素に拡散させると、誤差メモリ25には同図に示すように拡散する。このとき、誤差メモリ25内の注目画素の本来の重心位置242は(2,1)で、実際の重心位置243は(2.75,1.75)となり、2つの重心位置にずれが生じている。
このように拡散マトリックス241内での重心位置の右斜め下方向(図3(A)に示す主走査方向、副走査方向を図面上にとったときの右斜め下方向)へのずれは、誤差値に対しても右下方向へのずれとなって現れ、全体として見ると入力階調値(誤差値)の移動が右斜め下方向に生じることになる。つまり、この右斜め下方向の入力階調値の移動が「ドット生成の遅延」や「尾ひき」が右斜め下方向に向けて発生している原因となっている。
例えば、上述した図6(B)の例でも、本来の重心位置242は図9(C)に示すように(2.5,1)に位置するはずであるが、実際の重心位置243は(2.97,1.91)と右斜め下方向にずれ、「ドット生成の遅延」等が右斜め下方向に発生することになる。
このときにドットの発生位置に着目すると、全体として入力階調値が重心位置のずれの方向に沿って移動するため、本来の重心位置にドットが打たれる可能性が低くなる。すなわち、拡散マトリックス241の重心位置のずれによって、入力階調値に忠実なドットが生成される可能性が低くなる。拡散マトリックス241によって、いわば、入力階調値を歪ませてしまい、歪んだ領域に対する誤差拡散処理と同等の処理を行っていることになる。
そこで、本発明は拡散マトリックス241の重心位置のずれに着目し実際の重心位置を本来の重心位置、すなわち注目画素の位置にマトリックス241の係数を配置することで、入力階調値に忠実なドットを生成させるようにする。
例えば、図9(A)の拡散マトリックス241で重心位置を注目画素に近づけるようにするには、図10(A)に示すようにさらに周囲の画素位置に負値の係数を配置させるようにすればよい。そうすると、矢印で示すように重心位置が移動するはずである。
重心位置が注目画素に位置する拡散マトリックス241の例としては、図10(B)に示すものがある。これは、上述した図3(A)と同じ拡散マトリックス241である。重心位置を求めると、(0,0)で注目画素の画素位置、すなわち本来の重心位置(0,0)と一致する。注目画素が重心位置となる係数の配置となっている。
図10(C)に示すように、上述の例で画素(4,1)までの処理が終了した時点での誤差メモリ25の状態において、誤差値の重心位置243は(2.86,0.86)となる。本来の重心位置242の近傍に位置している。前述の図9(C)と比較しその差は歴然である。ドットは、図7(A)に示すように(3,3)の画素位置に発生する。本来は(3,2)の位置にドットが発生するはずであるが、(1,1)の画素や(5,1)の画素等、端部で拡散されていない誤差があるため若干の歪みが生じているためである。
しかしながら、拡散マトリックス241内に負の係数を与えなくても、係数を工夫することで、「ドット発生の遅延」等が右斜め下方向(すなわち、主走査方向かつ副走査方向)に発生する問題を改善することは可能である。
例えば、図11(A)や図11(B)に示す拡散マトリックス241で考察してみる。図11(A)に示すマトリックス241は、係数に着目すると、(1,0)と(1,1)の係数の和は“7/16”で、(−1,1)の係数“7/16”と同じ値となっている。すなわち、注目画素を中心にして左右対称(主走査方向で対称)の係数が配置されている。重心位置を演算すると、(0,0.625)で、左右方向(主走査方向)へのずれが生じないことになる。すなわち、「ドット発生の遅延」等が発生したとき、主走査方向への遅延等は改善することができる。
図11(B)の拡散マトリックス241も注目画素を中心にして左右対称の係数が配置されている。重心位置は(0,0.5)となる。
以上から、拡散マトリックス241内の係数を注目画素に対して左右対称(主走査方向で対称)にするなどして、重心位置と注目画素の位置とでその主走査方向成分を等しくすれば、「ドット発生の遅延」等が生じたときに主走査方向への「ドット発生の遅延」等を解消し、さらに重心位置に近い位置にドットが生成される。
実際に図11(B)に示す拡散マトリックス241による誤差拡散処理の例を以下に示す。本実施例においても誤差拡散処理が行われる画像処理装置20の構成は図1に示すもので、その動作は図2に示すフローチャートに従う。入力階調値の例も上述の例と同様に図11(B)に示す例を用いる。
まず、注目画素を指定する(ステップS11)。最初は(0,0)の画素位置である(図12(A)の入力バッファ11参照)。誤差メモリ25内の当該画素位置の誤差は“0”であるので加算値fは“16”となる(ステップS12)。閾値“128”との比較により2値化すると“0”(ステップS13、図12(A)の出力バッファ31参照)、誤差値E’は“16”となる(ステップS14)。拡散マトリックス241により重み付け誤差値E’(i’、j’)を演算する(ステップS15)と、E’(2、1)=“8”(=16×0.5)となり、誤差メモリ25にすでに格納された値“0”とを加算して格納する(ステップS16、図12(A)の誤差メモリ25参照)。まだ未処理画素が存在するので(ステップS17で“YES”)、同様の処理を繰り返すことになる。
(4,1)の画素位置まで処理を終了したときの状態を図12(B)に示す。一方、従来の拡散マトリックス241を用いた場合の当該画素位置まで処理を終了したときの状態は図6(B)である。図6(B)に示す誤差メモリ25に格納された誤差値の重心位置は(2.97,1.91)、一方、図12(B)に示す誤差メモリ25内での重心位置は(2.79,1.17)である。(1,1)から(4,1)までの4画素の重心位置は(2.5,1)であるから、本発明に係る拡散マトリックス241を用いた方が従来のマトリックス241を用いたものよりも本来の重心位置に近づいている。したがって、従来のマトリックス241を用いたものよりも重心位置に近づいてドットが発生する。
以後、未処理画素がなくなるまで処理を進めると図13(A)に示す状態となる。この場合、出力バッファ31に示すようにドットが生成されていないが、同じ階調値でさらに広域の領域での処理を行うと、図6(B)に示す拡散マトリックス241を用いた場合と比較して、重心位置に対して右斜め下方向にドットが生成するのではなく、重心位置の下方向(副走査方向)にドットが生成するはずである。
図14には、図8と同じ入力画像に対して図11(A)に示す拡散マトリックス241を用いて処理を行ったときの再生画像の例を示す。副走査方向に対して「ドット発生の遅延」と「尾ひき」が発生しているものの、主走査方向に対しては発生していないことがわかる。上述したように、図11(A)の拡散マトリックス241ではその重心位置243が注目画素から主走査方向にずれがなく、副走査方向にのみずれているためである。
このように本発明によれば、拡散マトリックス241の重心位置を注目画素に位置するよう係数を配置したり、注目画素に近づけるよう係数を配置することで入力階調値に忠実なドットを生成させ、画質劣化のない再生画像を得ることができる。
[正負両方の係数を有するとともに、重心位置に注目画素が位置するように係数を配置した拡散マトリックスによる誤差拡散処理]
図11(A)、(B)で示した拡散マトリックス241はその係数が注目画素に対して左右対称のため、その重心位置は主走査方向に対しては注目画素に位置している。しかしながら、副走査方向に対しては重心位置は注目画素に位置していない。したがって、係数の与え方によっては「ドット発生の遅延」等が主走査方向で解消されても副走査方向で解消されないことになる(図14(A)、(B)参照)。
そこで、負の係数を拡散マトリックス241内に与え、かつ、重心位置に注目画素が位置するように係数を配置させることで、主走査及び副走査方向への「ドット発生の遅延」等を解消することができる。
上述した図10(B)の例で考察してみると、この拡散マトリックス241は注目画素内に重心位置242が位置している(本来の重心位置242と実際の重心位置243とが一致する)。したがって入力階調値に忠実なドットを生成させる可能性が高くなる。しかも、注目画素に隣接する画素に多くの係数(その係数の和が1よりも大きい、すなわち誤差値よりも絶対値が大きな値を当該画素に拡散させる)を与えているため、「ドット発生の遅延」等自体を解消させることができる。さらに、本来の誤差値と異なる誤差値を与えないようにするために注目画素から遠くの画素位置に負の係数を与えている。そして、注目画素を含めた(1,0)、(−1,1)、(0,1)、の4つの画素に注目するとその係数は左右対称であり、「ドット発生の遅延」等が主走査方向に発生することはないが、副走査方向へ発生することも考えられる。ここで、(0,2)の画素位置に係数“−0.5”を与えることで重心位置が注目画素に位置することになり、副走査方向への「ドット発生の遅延」等を解消することができる。
本実施例における画像処理装置20の構成及び動作はそれぞれ図1及び図2に示すものと同様である。よって、上述の例と同様に複雑な条件分岐の処理を行うことがないので、処理の速い誤差拡散処理を行うことができる。図10(B)に示す拡散マトリックス241の例は図3(A)に示すマトリックス241と同様である。そのドット発生の過程は上述した図4乃至図7を用いて説明したのでここでは省略する。
図3(D)、(E)に示す拡散マトリックス241も、正負両方の係数を与え、かつ、その重心位置は(0,0)となり、注目画素の重心位置に一致し、上述の効果を得ることができる。
なお、拡散マトリックス241内に負の係数を与える位置によって、主走査方向や副走査方向への「ドット発生の遅延」等の解消、及び注目画素に対して左下方向(図3等に示す主走査方向、副走査方向としたときの左下方向)へ誤差値を残しやすくなる、ことが言える。負の係数を与える拡散マトリックス241は上述の例では3ラインで実現しているが、例えば、図13(B)に示す拡散マトリックス241でもよい。すなわち、注目画素の右方向(主走査方向と副走査方向を図のようにとったときの右方向)の画素に拡散される重み付け誤差の合計が誤差値と同じ値になるよう係数を与えるとともに、注目画素の誤差値と異なる値が誤差として全体に拡散されないよう、かつ、主走査方向で重心位置が注目画素の位置と等しくなるように負の係数を注目画素から右斜め下方向の画素に与えるようする。ただし、かかるマトリックス241では隣接する画素に誤差値よりも絶対値の大きな誤差値を与える作用があるとは限らないが、図面上右方向に誤差値と合計で同じ値の誤差を拡散させるとともに、図面上左下方向に誤差を残すようにすることで「ドット発生の遅延」等の問題を解決するようにしている。
[他の実施例]
図1に示すように本発明にかかる画像処理装置20はハードウェア構成により実現したが、上述した機能をソフトウェアにより実現することもできる。その例を図15に示す。すなわち、画像処理装置20の機能が図15に示すCPU32、ROM33、RAM34により実現される。図2のフローチャートはROM33に格納されたプログラムをCPU32が読み出して実行することで処理が行われる。この例では、2値画像出力装置30の例としてプリンタを用いた場合の例であり、この出力装置30内に画像処理装置20の機能を有することになる。なお、本発明に係る拡散マトリックス241は、ROM33又はRAM34に格納され、CPU32によって処理の際に適宜読み出され処理が行われる。
また、図16に示す階調画像データ出力装置10内に画像処理装置20の機能を有するようにしてもよい。すなわち、この図に示す画像処理部16が本発明に係る画像処理装置20に対応する。この例では、階調画像データ出力装置10がホストコンピュータ12であり、2値画像出力装置30がそのホストコンピュータ12に接続されたプリンタ30の例である。図15及び図16に示すシステムにおいても上述したものと全く同様の作用効果を奏する。
さらに、階調画像データ出力装置10からは256階調(8ビット)の画像データが入力するものとして説明したが、もちろんこれ以外にも128階調(7ビット)、64階調(6ビット)、さらに512階調(9ビット)等であってもよい。また、上述の画像処理装置20内で2値化部22において2値化するとして説明したが、3値、4値等、入力階調値の階調数と同じかそれ以下に階調化するようにしてもよい。この場合、図1の2値化部22が3値、4値等への変換部、又は量子化部として構成される。
さらに、上述した例ではモノクロデータを例にして説明したが、カラーデータに対しても同様の作用効果を奏する。すなわち、図1の階調画像データ出力装置10からは色変換処理後のC(シアン)、M(マゼンタ)、Y(イエロー)、K(ブラック)の各色ごとの階調データが入力され、それぞれの色の階調値に対して上述した拡散マトリックス241を用いて誤差拡散処理を行えばよい。もちろん、カラーを表現する色成分としてC、M、Y、Kの4色以外にもライトシアン、ライトマゼンダを含めた6色や、さらにそれ以外の色成分を含めた複数色の場合でも同様の効果を得ることができる。
10 階調画像データ出力装置、 12 ホストコンピュータ、 20 画像処理装置、 21 加算器、 22 2値化部、 23 減算器、 24 重み付け誤差演算部、 25 誤差メモリ、 30 2値画像出力装置、 241 拡散マトリックス、242 注目画素の重心位置、 243 拡散マトリックス内での係数を考慮した重心位置