(57)【要約】【課題】サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得る。【解決手段】入力階調データに対して分版関数を用いてＳ成分とＬ成分とに分離する。ＣＣ法によるハーフトーン処理は、ドット密度が低い方の成分から先に処理を行う。処理の際に各画素の階調値をドット密度の高い成分に加算する。密度の低い成分に対する処理が終了した後、加算したドット密度の高い成分に対する減算処理を行う。そして、減算後の成分に対してＣＣ法による処理を行う。ディザ法、誤差拡散法によるハーフトーン処理は、分離したＳ成分、Ｌ成分に対して各画素位置ごとにドット密度を比較しＳ疎データ、Ｌ疎データ、Ｓ疎＋Ｌ密データ、Ｓ密＋Ｌ疎データを生成する。まず、Ｓ疎データに対してディザ又は誤差拡散法による処理を行い、その後Ｓ疎＋Ｌ密データから処理後のＳ疎データを減算する。減算後のＬ密データをディザ又は誤差拡散法による処理を行う。同様にＬ疎データ、Ｓ密＋Ｌ疎データに対して処理を行う。【選択図】図３
2005064941.tif 000002
【特許請求の範囲】
【請求項１】
画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理装置において、
前記階調データをドットサイズに応じた少なくとも２つのデータに分離し、前記分離された第１のデータと第２のデータのドット密度を検出する検出手段と、
前記検出手段によりドット密度が低いとされた前記第１のデータ又は前記第２のデータから先に前記Ｍ種類のレベル値を有するデータに変換する第１の変換手段と、
前記検出手段によりドット密度が高いとされた前記第２のデータ又は前記第１のデータに対して、前記第１の変換手段で前記Ｍ種類のレベル値に変換された画素に対応する画素において当該画素のレベル値から所定値を減算する減算手段と、
前記減算手段で減算した前記第２のデータ又は前記第１のデータに対して前記Ｍ種類のレベル値を有するデータに変換する第２の変換手段と
を備えることを特徴とする画像処理装置。
【請求項２】
請求項１記載の画像処理装置において、
前記第１の変換手段及び前記第２の変換手段は、所定の閾値が格納された閾値マトリックスを用いて、前記Ｎ種類のレベル値を前記Ｍ種類のレベル値に変換する、ことを特徴とする画像処理装置。
【請求項３】
請求項２記載の画像処理装置において、
前記第１の変換手段は、前記検出手段による前記第１のデータと前記第２のデータとのドット密度を検出した結果、さらに前記第１のデータをドット密度の低い成分と高い成分に分離するとともに、前記第２のデータをドット密度の低い成分と高い成分に分離し、前記第１のデータ又は前記第２のデータのドット密度の低い成分から先に前記Ｍ種類のレベル値に変換する、ことを特徴とする画像処理装置。
【請求項４】
請求項３記載の画像処理装置において、
さらに、前記分離したドット密度の高い前記第１のデータ又は前記第２のデータの成分に対して、それぞれドット密度の低い前記第１のデータ又は前記第２のデータの成分を加算する加算手段を備え、
前記減算手段は、前記加算手段で加算した前記第１のデータ又は前記第２のデータのドット密度の高い成分に対して減算する、ことを特徴とする画像処理装置。
【請求項５】
請求項１記載の画像処理装置において、
前記第１の変換手段及び前記第２の変換手段は、前記Ｎ種類の各レベル値と閾値とを比較して前記Ｍ種類のレベル値に変換するとともに、前記Ｍ種類のレベル値に変換したときの誤差を前記第１のデータ又は前記第２のデータの各レベル値に加算して前記閾値と比較する、ことを特徴とする画像処理装置。
【請求項６】
請求項５記載の画像処理装置において、
前記第１の変換手段及び前記第２の変換手段は、拡散マトリックスに格納された誤差分の値を拡散させる比率に基づいて各画素に前記誤差分を拡散させる、ことを特徴とする画像処理装置。
【請求項７】
請求項１記載の画像処理装置において、
前記第１の変換手段及び前記第２の変換手段は、さらに、
前記ドット密度が低い第１のデータ又は第２のデータの画素を選択、又は前記減算後の前記第１のデータ又は前記第２のデータを選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する生成手段と、生成した画素群の所定画素に対して前記Ｍ種類のレベル値を付与する付与手段と、をそれぞれ備えることを特徴とする画像処理装置。
【請求項８】
請求項１記載の画像処理装置において、
前記第１の変換手段及び前記第２の変換手段は、さらに、
前記ドット密度が低い第１のデータ又は第２のデータの画素を選択、又は前記減算後の前記第１のデータ又は前記第２のデータを選択し、選択した画素ごとのレベル値の総和が閾値となるまで画素を選択して画素群を生成する画素群生成手段と、
前記画素群生成手段で生成した画素群の重心位置を決定する重心位置決定手段と、
前記重心位置決定手段で決定した重心に位置する画素に前記Ｍ種類のレベル値を付与する付与手段とをそれぞれ備え、
前記画素群生成手段は、前記重心位置決定手段で決定した重心から最も近い画素を選択して前記画素群を生成することを特徴とする画像処理装置。
【請求項９】
請求項８記載の画像処理装置において、
前記画素群生成手段は、決定した画素が複数あるときはランダムに選択することを特徴とする画像処理装置。
【請求項１０】
画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理装置において、
前記階調データに対してドット密度が低密度となる成分を検出する検出手段と、
前記検出手段によって検出された前記低密度の成分から前記Ｍ種類のレベル値を有するデータに変換する変換手段と、
を備えることを特徴とする画像処理装置。
【請求項１１】
請求項１０の画像処理装置において、
前記検出手段は、前記低密度の成分を検出するとともにドット密度が高密度となる成分を検出し、
さらに、前記検出手段で検出された高密度成分に対して前記低密度成分の階調値を加算する加算手段と、
前記加算手段で加算した高密度成分に対して所定値を減算する減算手段と、
前記減算手段により減算された前記高密度成分に対して前記Ｍ種類のレベル値を有するデータに変換する第２の変換手段と、を備えることを特徴とする画像処理装置。
【請求項１２】
画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理方法において、
前記階調データをドットサイズに応じた少なくとも２つのデータに分離し、前記分離された第１のデータと第２のデータのドット密度を検出する検出工程と、
前記検出工程によりドット密度の低いとされた前記第１のデータ又は前記第２のデータから先に前記Ｍ種類のレベル値を有するデータに変換する第１の変換工程と、
前記検出工程によりドット密度が高いとされた前記第２のデータ又は前記第１のデータに対して、前記第１の変換工程で前記Ｍ種類のレベル値に変換された画素に対応する画素において当該画素のレベル値から所定値を減算する減算工程と、
前記減算工程で減算した前記第２のデータ又は前記第１のデータに対して前記Ｍ種類のレベル値を有するデータに変換する第２の変換工程と
を備えることを特徴とする画像処理方法。
【請求項１３】
画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理方法において、
前記階調データに対してドット密度が低密度となる成分を検出する検出工程と、
前記検出工程によって検出された前記低密度の成分から前記Ｍ種類のレベル値を有するデータに変換する変換工程と、
を備えることを特徴とする画像処理方法。
【請求項１４】
画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるためのプログラムにおいて、
前記階調データをドットサイズに応じた少なくとも２つのデータに分離し、前記分離された第１のデータと第２のデータのドット密度を検出する検出処理と、
前記検出処理によりドット密度の低いとされた前記第１のデータ又は前記第２のデータから先に前記Ｍ種類のレベル値を有するデータに変換する第１の変換処理と、
前記検出処理によりドット密度が高いとされた前記第２のデータ又は前記第１のデータに対して、前記第１の変換処理で前記Ｍ種類のレベル値に変換された画素に対応する画素において当該画素のレベル値から所定値を減算する減算処理と、
前記減算処理で減算した前記第２のデータ又は前記第１のデータに対して前記Ｍ種類のレベル値を有するデータに変換する第２の変換処理と
をコンピュータに実行させるためのプログラム。
【請求項１５】
画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるためのプログラムにおいて、
前記階調データに対してドット密度が低密度となる成分を検出する検出処理と、
前記検出処理によって検出された前記低密度の成分から前記Ｍ種類のレベル値を有するデータに変換する変換処理と、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プリンタなどの画像出力装置における階調画像データのハーフトーン処理に関する。
【背景技術】
【０００２】
従来から、プリンタなどの画像出力装置は、各画素ごとに多値の階調値を有する画像データに対して、ドットの有無を表す２値の値に変換処理して印刷用紙に印刷を行うようになされている。一般には、多値の階調値を２値の値に変換する処理のことをハーフトーン処理と称されている。
【０００３】
かかるハーフトーン処理の方法としては、所定の閾値が格納された閾値マトリックスを利用して、入力階調値が閾値よりも大きいか小さいかにより２値化するディザ法や、同様に閾値を設定しその閾値よりも大きいか小さいかにより２値化するとともにその誤差分をまわりの画素の階調値に加算して処理を進める誤差拡散法などがある。
【０００４】
さらに、入力画像の各画素の階調値の合計が所定の閾値になるまでセルを構成する画素を選択し、セルの中心位置にドットを生成させるようにしたハーフトーン処理も知られている（例えば、特許文献１）。
【特許文献１】特開平１１−２７５２８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、ドットサイズが異なる印刷出力を得ることのできる画像出力装置においては、異なるドットサイズのデータにそれぞれ同じハーフトーン処理を行うとドットの間隔がばらついて発生していた。かかるドットのばらつきは、視覚的に目立ち易いパターンとなり、いわゆる粒状的なドットが発生する原因となっていた。
【０００６】
また、上述した特開平１１−２７５２８においても、セルを構成する画素の選択を所定のテーブルを用いて行っているが、テーブル内で左側に存在する画素は既に処理済みの場合が多く、結果的に生成されるセルが歪んだ形となってしまう。かかる場合に、セルの中心にドットを生成させるとある部分では隣のドットと重なって形成されてしまうことになる。例えば、大ドットと小ドットとなるデータに、それぞれかかる処理を行うと、ある部分ではドットが重なったりあるいは近寄って発生するなど視覚的に不快な印刷出力となっていた。
【０００７】
そこで、本発明は、サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得ることを目的とするものである。
【課題を解決するための手段】
【０００８】
上記の目的を達成するために、本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理装置において、階調データをドットサイズに応じた少なくとも２つのデータに分離し、分離された第１のデータと第２のデータのドット密度を検出する検出手段と、検出手段によりドット密度の低いとされた第１のデータ又は第２のデータから先に前記Ｍ種類のレベル値を有するデータに変換する第１の変換手段と、検出手段によりドット密度が高いとされた第２のデータ又は第１のデータに対して、第１の変換手段でＭ種類のレベル値に変換された画素に対応する画素において当該画素のレベル値から所定値を減算する減算手段と、減算手段で減算した第２のデータ又は第１のデータに対してＭ種類のレベル値を有するデータに変換する第２の変換手段とを備えることを特徴としている。これにより、例えば、サイズの異なるドット同士が重なる確率が低くなり、出力画像の粒状性が改善され、視覚的に快適な印刷出力を得ることができる。
【０００９】
また本発明は、上記画像処理装置において第１の変換手段及び第２の変換段は、所定の閾値が格納された閾値マトリックスを用いてＮ種類のレベル値をＭ種類のレベル値に変換することを特徴としている。これにより、ディザ法を用いてハーフトーン処理を行っても、視覚的に快適な画像出力を得ることができる。
【００１０】
さらに本発明は、上記画像処理装置において第１の変換手段は、検出手段による第１のデータと第２のデータとのドット密度を検出した結果、さらに第１のデータをドット密度の低い成分と高い成分に分離するとともに、第２のデータをドット密度の低い成分と高い成分に分離し、第１のデータ又は第２のデータのドット密度の低い成分から先にＭ種類のレベル値に変換することを特徴としている。これにより、例えば、ドットサイズに応じてドット密度の低い方から先に処理を進めることができ、入力階調値に忠実にドットが分布し、ドットサイズの異なるもの同士が重なって画像が出力される確率を下げることができる。
【００１１】
さらに本発明は、上記画像処理装置において、分離したドット密度の高い第１のデータ又は第２のデータの成分に対してそれぞれドット密度の低い第１のデータ又は第２のデータの成分を加算する加算手段をさらに備え、減算手段は加算手段で加算した第１のデータ又は第２のデータのドット密度の高い成分に対して減算することを特徴としている。これにより、例えば、ドット密度の高い領域に異なるサイズのドットが生成される確率を下げることができる。
【００１２】
さらに本発明は、上記画像処理装置において第１の変換手段及び第２の変換手段は、Ｎ種類の各レベル値を閾値とを比較してＭ種類のレベル値に変換するとともに、Ｍ種類のレベル値に変換したときの誤差を第１のデータ又は第２のデータの各レベル値に加算して閾値と比較することを特徴としている。これにより、例えば、誤差拡散法によるハーフトーン処理でも、サイズの異なるドット同士が重なる確率を下げて粒状性を改善し、視覚的に快適な印刷出力を得ることができる。
【００１３】
さらに本発明は、上記画像処理装置において第１の変換手段及び第２の変換手段は、拡散マトリックスに格納された誤差分の値を拡散させる比率に基づいて各画素に前記誤差分を拡散させることを特徴としている。これにより、例えば、マトリックスを利用して簡易にその誤差分を周囲の画素に拡散させることができる。
【００１４】
さらに本発明は、上記画像処理装置において第１の変換手段及び第２の変換手段は、ドット密度が低い第１のデータ又は第２のデータの画素を選択、又は減算後の第１のデータ又は第２のデータを選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する生成手段と、生成した画素群の所定画素に対してＭ種類のレベル値を付与する付与手段と、をそれぞれ備えることを特徴としている。これにより、例えば、サイズの異なるドット同士でもドット間距離が一定に保たれ、快適な印刷出力を得ることができる。
【００１５】
さらに本発明は、上記画像処理装置において第１の変換手段及び前記第２の変換手段は、さらに、ドット密度が低い第１のデータ又は第２のデータの画素を選択、又は減算後の第１のデータ又は第２のデータを選択し、選択した画素ごとのレベル値の総和が閾値となるまで画素を選択して画素群を生成する画素群生成手段と、画素群生成手段で生成した画素群の重心位置を決定する重心位置決定手段と、重心位置決定手段で決定した重心に位置する画素にＭ種類のレベル値を付与する付与手段とをそれぞれ備え、画素群生成手段は、重心位置決定手段で決定した重心から最も近い画素を選択して前記画素群を生成することを特徴としている。これにより、例えば、サイズの異なるドット同士でもドット間距離が一定に保たれ、快適に印刷出力を得ることができる。
【００１６】
さらに本発明は、上記画像処理装置において画素群生成手段は、決定した画素が複数あるときはランダムに選択することを特徴としている。これにより、例えば、複数の画素から構成されるセルが円状に成長し、ドット間距離を一定に保つことができる。
【００１７】
また、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理装置において、階調データに対してドット密度が低密度となる成分を検出する検出手段と、検出手段によって検出された低密度の成分から前記Ｍ種類のレベル値を有するデータに変換する変換手段と、を備えることを特徴としている。これにより、例えば、サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得ることができる。
【００１８】
また本発明は、上記画像処理装置において検出手段は低密度の成分を検出するとともにドット密度が高密度となる成分を検出し、さらに、検出手段で検出された高密度成分に対して低密度成分の階調値を加算する加算手段と、加算手段で加算した高密度成分に対して所定値を減算する減算手段と、減算手段により減算された高密度成分に対してＭ種類のレベル値を有するデータに変換する第２の変換手段と、を備えることを特徴としている。これにより、例えば、入力階調値に忠実なドット分布を得るとともに、サイズの異なるドット同士が重なる確率を下げることができる。
【００１９】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理方法において、階調データをドットサイズに応じた少なくとも２つのデータに分離し、分離された第１のデータと第２のデータのドット密度を検出する検出工程と、検出工程によりドット密度の低いとされた第１のデータ又は第２のデータから先にＭ種類のレベル値を有するデータに変換する第１の変換工程と、検出工程によりドット密度が高いとされた第２のデータ又は第１のデータに対して、第１の変換工程でＭ種類のレベル値に変換された画素に対応する画素において当該画素のレベル値から所定値を減算する減算工程と、減算工程で減算した第２のデータ又は第１のデータに対してＭ種類のレベル値を有するデータに変換する第２の変換工程とを備えることを特徴としている。これにより、例えば、サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得ることができる。
【００２０】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する画像処理方法において、階調データに対してドット密度が低密度となる成分を検出する検出工程と、検出工程によって検出された低密度の成分からＭ種類のレベル値を有するデータに変換する変換工程と、を備えることを特徴としている。これにより、例えば、サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得ることができる。
【００２１】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるためのプログラムにおいて、階調データをドットサイズに応じた少なくとも２つのデータに分離し、分離された第１のデータと第２のデータのドット密度を検出する検出処理と、検出処理によりドット密度の低いとされた第１のデータ又は第２のデータから先にＭ種類のレベル値を有するデータに変換する第１の変換処理と、検出処理によりドット密度が高いとされた第２のデータ又は第１のデータに対して、第１の変換処理でＭ種類のレベル値に変換された画素に対応する画素において当該画素のレベル値から所定値を減算する減算処理と、減算処理で減算した第２のデータ又は第１のデータに対してＭ種類のレベル値を有するデータに変換する第２の変換処理とをコンピュータに実行させるためのプログラムであることを特徴としている。これにより、例えば、サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得ることができる。
【００２２】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるためのプログラムにおいて、階調データに対してドット密度が低密度となる成分を検出する検出処理と、検出処理によって検出された低密度の成分からＭ種類のレベル値を有するデータに変換する変換処理と、をコンピュータに実行させるためのプログラムであることを特徴としている。これにより、例えば、サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得ることができる。
【発明を実施するための最良の形態】
【００２３】
以下、図面を参照して本発明の実施の形態例を説明する。図１は、本発明が適用されるシステム全体の構成を示す図である。全体としてホストコンピュータ１０と、画像出力装置２０とから構成される。
【００２４】
ホストコンピュータ１０は、アプリケーション部１１とラスタライズ１２とから構成される。アプリケーション部１１では、文字データ、図形データ、ビットマップデータ等の印刷対象のデータが生成される。例えば、ホストコンピュータ１０でワードプロセッサや図形ツールなどのアプリケーションプログラムを使用してキーボード等の操作により文字データや図形データなどが生成される。生成されたこれらのデータは、ラスタライズ部１２へ出力される。
【００２５】
ラスタライズ１２は、アプリケーション部１１から出力された印刷対象のデータを画素ごと（又はドットごと）にモノクロデータからなる階調画像データに変換する。本実施例では、画素ごと０から２５５までの階調値（レベル値）を有する（８ビット）ことになる。ラスタライズ１２における階調画像データの生成は、実際にはホストコンピュータ１０に実装されたドライバによって処理が行われる。ラスタライズ１２から出力される階調画像データは、画像出力装置２０に出力される。
【００２６】
画像出力装置２０は、全体として画像処理部２１と印刷エンジン２２とから構成される。画像処理部２１は、ハーフトーン処理部２１１とパルス幅変調部２１２とから構成される。ハーフトーン処理部２１１は、ホストコンピュータ１０から出力された階調画像データに対して、２値（或いは４値）の値（レベル値）に変換し、量子化データとして印刷エンジン２２に出力する。ハーフトーン処理としては、ディザ処理、誤差拡散処理、複数の画素からなるセルを構成してその重心にドットを生成させる重心利用した処理（Circular Cell法、以下ＣＣ法）がある。各処理の具体的な内容は後述する。
【００２７】
パルス幅変調部２１２は、ハーフトーン処理部２１１から出力された量子化データが入力され、この量子化データ対してドットごと（或いは画素ごと）にレーザ駆動パルス有る又は無しの駆動データを生成する。そして、駆動データが印刷エンジン２２に出力される。
【００２８】
印刷エンジン２２は、レーザドライバ２２１とレーザダイオード（ＬＤ）２２２とから構成される。レーザドライバ２２１は、入力された駆動データから駆動パルス有り又は無し等を示す制御データを生成し、レーザダイオード２２２に出力する。レーザダイオード２２２は、この制御データに基づいて駆動され、さらに図示しない感光ドラムや転写ベルトが駆動されて、印刷用紙等の記録媒体にホストコンピュータ１０からのデータが印刷されることになる。
【００２９】
次に図２を参照して、画像出力装置２０の具体的構成について説明する。ここで、図１の画像出力装置２０のうち、ハーフトーン処理部２１１及びパルス幅変調部２１２は、図２におけるＣＰＵ２４、ＲＯＭ２５、及びＲＡＭ２６に対応する。また、図１の印刷エンジン２２は図２の印刷エンジン２２に対応する。
【００３０】
画像出力装置２０は、全体として、入力インターフェース（Ｉ／Ｆ）２３、ＣＰＵ２４、ＲＯＭ２５、ＲＡＭ２６、印刷エンジン２２とから構成され、バスを介して互いに接続されている。入力Ｉ／Ｆ２３は、ホストコンピュータ１０と画像出力装置２０とのインターフェースの役割を果たす。入力Ｉ／Ｆ２３は、所定の伝送方式により伝送された、ホストコンピュータ１０からの階調画像データが入力され、画像出力装置２０で処理できるデータに変換される。階調画像データは、一旦ＲＡＭ２６に格納される。
【００３１】
ＣＰＵ２４は、バスを介して入力Ｉ／Ｆ２３、ＲＯＭ２５、ＲＡＭ２６、印刷エンジン２２と接続され、ＲＯＭ２５に格納されたプログラムを読み出して、ハーフトーン処理等の各種処理を行う。その詳細は後述する。ＲＡＭ２６は、ＣＰＵ２４で実行される各処理のワーキングメモリとして役割を果たし、処理後の各種データが格納される。そして、印刷エンジン２２のレーザドライバ２２１を駆動させるための駆動データも格納される。ＲＡＭ２６の具体的構成、格納される各種データの詳細についでは後述する。
【００３２】
印刷エンジン２２は、図１の印刷エンジンと同様の構成で、ＲＡＭ２６に格納された駆動データがＣＰＵ２４の制御により入力されて、上述した印刷が行われることになる。
【００３３】
次に、以上のように構成された画像出力装置２０における処理の動作について説明する。なお、処理対象の階調画像データは、入力Ｉ／Ｆ２３に入力され、ＣＰＵ２４の制御によりＲＡＭ２６に格納されたものとして説明する。また、ハーフトーン処理として、ＣＣ法、ディザ法、及び誤差拡散法の３つの方法を用いた処理についてそれぞれ説明することにする。
［ＣＣ法を用いたハーフトーン処理］
まず具体的な処理を説明する前に、ＣＣ法についての概要を説明する。ＣＣ法によるハーフトーン処理は、まず初期画素を選択し、所定の閾値に達するまで初期画素周辺の未処理画素を選択して、複数画素からなるセルを構成する。セルを構成する未処理画素選択の際、それまで構成したセルの重心位置から最も近い画素を選択する。そして、閾値に達するとそのセルの重心位置に位置する画素にドット生成を示す値（例えば“２５５”）を割り当て、それ以外の画素はドットの生成を行わないことを示す値（例えば“０”）を割り当てる。ＣＣ法は、以上の処理を入力画像の全てのデータに対して行うことで、量子化されたデータを得るのである。
【００３４】
上述した特開平１１−２７５２８では、セルに取り込むべき未処理画素の選択にテーブルを利用して予め決められた位置の画素を選択するようにしている。一方、ＣＣ法は重心位置を利用してセルに取り込むべき未処理画素を選択するようにしているため、特開平１１−２７５２８と比較して、セルが円状に成長し、ドット間距離を一定に保つことができ、ドットの分散性を向上させて視覚的に快適な印刷出力を得ることができる。
【００３５】
次に本発明によるＣＣ法を利用したハーフトーン処理の動作の概略を説明する。まず、入力画像データに対して分版関数を用いて異なるサイズのドット成分に分離する。以下ではＬａｒｇｅドット成分（以下Ｌ成分）とＳｍａｌｌドット成分（以下Ｓ成分）に分離することとして説明する。そして、分離された各成分に対してドット密度の比較を行う。ドット密度が低くなる成分から先に処理を進めるためである。
【００３６】
比較した結果、例えばＳドット成分の方がＬドット成分よりも密度が低いとき、Ｓドット成分から先にＣＣ法によるハーフトーン処理を行う。このとき、セルに取り込まれたＳドット成分の画素の階調値をＬドット成分の対応する画素の階調値に加算して処理を進める。その後、Ｓドット成分のセルの階調値の合計が閾値に達すると重心位置にある画素にＳドット生成を示す“２００”を割り当てる。次に、階調値が加算されたＬドット成分に対して加算した分だけ減算処理を行うが、Ｓドット成分でドットが発生する位置に対応する画素から減算する。これにより、Ｓドットが発生する位置と重なってＬドットが発生する確率が下がることになる。また、減算しても加算した分の階調値に達しないときは、さらに対応する画素のまわりから階調値を減算することになる。そして、減算後のＬドット成分に対してＣＣ法によるハーフトーン処理を行うことでＬドットの生成の有無を示す値（本実施例では“２５５”）を割り当てることになる。
【００３７】
逆に、先にドット密度の高い成分から処理を進めると、減算処理の過程で、確率的にドットが生成されない位置に対して減算処理を行い、結果的に入力階調値がさらに分散されて、入力分布に忠実でない階調値からなるデータに処理を行うことになる。その後に生成されるドット分布も入力階調値に忠実でないものとなってしまう。以上の理由から、ドット密度の低い成分から先に処理を進めるようにしているのである。
【００３８】
次に上述した処理の詳細について、図３乃至図１５を用いて説明することにする。このうち、図３乃至図７は処理の動作を示すフローチャートである。図８は、入力階調画像データをＬドット、Ｓドットの２成分に分離するときの分版関数の一例を示す図である。図９乃至図１５は、ＲＡＭ２６に格納された階調画像データの例を示す。以下フローチャートに沿って詳細に本処理について説明する。
【００３９】
まず、図３に示すように、ＣＰＵ２４は本処理を実行するためのプログラムをＲＯＭ２５から読み出して、処理が開始されることになる（ステップＳ１０）。次いで、ＣＰＵ２４は、入力画像データをＬ成分とＳ成分に分離する（ステップＳ１１）。具体的には、分版関数を用いることによって各画素の階調値をＬ成分とＳ成分とに分離する。図８に分版関数の一例を示す。この図で横軸が入力階調値、縦軸が出力階調値を示し、Ｓドット用の関数とＬドット用の関数の２つのグラフを示している。例えば、入力階調値が“３０”のときは、Ｓドット関数からＳ成分の出力値として“３０”を得る。また、入力階調値が“８０”のときは、Ｓドット用関数からＳドット成分として“２０”、Ｌドット用関数からＬドット成分として“６０”を得る。また、入力階調値が“１２８”のときは、Ｌドット成分として“１２８”を得ることになる。かかる分版関数は、例えばＲＯＭ２５などに格納され、ＣＰＵ２４がこの分版関数を読み出すことによって出力値を得ることができる。
【００４０】
その後、２つの成分に分離された各データは、ＣＰＵ２４の制御によってＲＡＭ２６のＳｍａｌｌ入力データ（以下Ｓ成分入力データ）格納領域２６１ａ、Ｌａｒｇｅ入力データ（以下Ｌ成分入力データ）格納領域２６１ｂに格納されることになる。その例を図９（ａ）に示す。この図で示す例では、各領域２６１ａ、２６１ｂは、６行６列で構成されているが、説明を容易にするためであって、例えば画像１フレーム分のデータを格納できる構成でもよい。また、各座標位置に入力される階調値は、全体画像の画素位置に対応するもので、例えばＬ成分入力データ格納領域２６１ａで（０，０）の位置は、全体画像の（０，０）に位置する画素に対応するものである。図９（ａ）に示すように、入力階調値“８０”を有する階調画像データに対して、ＣＰＵ２４は分版関数を用いて、Ｓ成分として“２０”、Ｌ成分として“６０”に分版することになる。
【００４１】
さらに、ＲＡＭ２６には、図９（ａ）に示すようにワーキングメモリ領域２７０と、Ｓｍａｌｌ出力データ（Ｓ成分出力データ）格納領域２６８ａ、及びＬａｒｇｅ出力データ（Ｌ成分出力データ）格納領域２６９ｂを有する。ワーキングメモリ２７０は、演算によって算出した重心位置とセルを構成する画素の階調値の合計値とが格納される。また、Ｓ成分、Ｌ成分の各出力データ格納領域２６８ａ、２６９ｂには、それぞれＳドット（小ドット）、Ｌドット（大ドット）の生成の有無を示す値が格納される。この出力データ格納領域２６８ａ、２６９ｂも各画素位置（ｎ、ｍ）はホストコンピュータ１０で生成された全体画像の画素位置（ｎ、ｍ）に対応するものである。各領域に格納される値は後述する。
【００４２】
図３に戻り、次いでＣＰＵ２４は、Ｌ成分とＳ成分の各成分について未処理画素を決定する（ステップＳ１２）。未処理画素の決定は、ラスター方向に探索して決定する。すなわち、未処理画素のうち全体画像上で最も上側にある画素のうち最も左側にある画素を選択することになる。このように決定することで、生成されるドットが全体的に斜め方向に形成され、人間の視覚に知覚されにくいものとなり、快適な画像出力を得ることができるのである。各入力データ格納領域２６１ａ、２６１ｂ上、図９（ａ）に示す例では、まだ全ての画素について処理を行っていない状態なので、２つの成分とも未処理画素（この場合は初期画素となる）として、（０，０）に位置する画素が選択されることになる。
【００４３】
次いで、図３に戻り、ＣＰＵ２４は、決定した２つの未処理画素に対してドット密度の比較を行う（ステップＳ１３）。ドット密度の低い成分から先に処理を進めて入力階調値に忠実にＬドット、Ｓドットを生成させるためである。ここでドット密度の比較は、ステップＳ１２で選択した未処理画素（初期画素）に対して、（階調値）／（ドットの閾値）を演算して、小さい値の方を選択する。本実施例においてＬ成分は閾値として“２５５”、Ｓ成分は“２００”として処理を行うようにしている。図９（ａ）の例で演算すると、（０，０）に位置する未処理画素に対してＳドット成分のドット密度は２０／２００で、Ｌドット成分のドット密度は６０／２５５となり、Ｓドットの方が小さい値となるので、Ｓドット成分のドット密度が低くなるであろうことが推定される。よって、Ｓドット成分から先に処理を進めることになる（ステップＳ１３で“ＹＥＳ”が選択される）。選択された例を図９（ｂ）に示す。一方、ドット密度を未処理画素に対して演算してＬ成分の方が低くなるとＬ成分から先に処理を進めることになる（ステップＳ１３で“ＮＯ”が選択される）。
【００４４】
Ｓドット成分から先に処理を進めることになるとＣＰＵ２４は、Ｓドット生成処理に移行する（ステップＳ１４）。Ｓドット生成処理の処理のフローチャートを図４に示す。この処理は全体としてドット生成処理と、減算処理の２つの処理から構成される。ドット生成処理は、ステップＳ１４１からＳ１４８で、減算処理がステップＳ１５２からＳ１５７となる。
【００４５】
まず、Ｓドット生成処理に移行すると、ＣＰＵ２４はＳドットの未処理画素を初期画素として初期濃度重心を計算する（ステップＳ１４１）。ここで、初期画素はステップＳ１２で選択した未処理画素である。また、濃度重心の演算は以下の演算式により演算されることになる。
（式１）
ｘ重心＝｛｛（セルの重心のｘ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｘ座標）×（選択した未処理画素の階調値）｝｝
／（セルの階調値の合計＋選択した未処理画素の階調値）
ｙ重心＝｛｛（セルの重心のｙ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｙ座標）×（選択した未処理画素の階調値）｝｝
／（セルの階調値の合計＋選択した未処理画素の階調値）
（ｘ重心、ｙ重心は重心位置の座標）
この演算式はＲＯＭ２５に格納され、重心位置の演算のときにＣＰＵ２４が読み出して演算を行うことになる。ちなみに、初期画素の場合は、セルの重心のｘ、ｙ座標、及びセルの階調値はともに０として演算される。なお、上式で“セルの重心”とあるのはこれまで構成したセルの重心のことであり、“セルの階調値の合計”とはこれまで構成したセルの階調値の合計である。図９（ｂ）の例で初期濃度の重心を演算すると、ｘ重心＝０、ｙ重心＝０となる。演算した重心位置は、ＣＰＵ２４によってワーキングメモリ２７０に格納されることになる（図９（ｃ）の中央図参照）。また、ＣＰＵ２４は、初期画素の階調値もワーキングメモリ２７０に格納する。図９（ｃ）の例では、Ｓ成分の（０，０）に位置する画素の階調値は、“２０”だから、この値が階調値の合計としてワーキングメモリ２７０に格納されることになる。そして、ＣＰＵ２４は、対応するＳ出力データ格納領域２６８ａの位置(図９（ｃ）の例では、（０，０）の位置)にドットを生成しないことを示す“０”を格納する（同じく図９（ｃ）の右から２番目の図参照）。
【００４６】
さらに、ＣＰＵ２４は、Ｓ入力データ格納領域２６１ａの選択した初期画素の位置に、当該画素が選択されたことを示す“−１”を格納する（図９（ｃ）の左図参照）。以後、この画素がセルを構成する画素として選択されないようにするためである。そして、ＣＰＵ２４は、選択したＳ成分の初期画素に対応するＬ成分入力階調データに、Ｓ成分の階調値を加算して、領域２６１ｂの対応する位置に格納する（図９（ｃ）左から２番目の図参照）。図９の例では、（０，０）に位置する画素においては、Ｌ成分の“６０”に対してＳ成分の“２０”が加算され、“８０”の階調値が当該位置に格納される。
【００４７】
図４に戻り、次いでＣＰＵ２４は、セルを構成するＳ成分の未処理画素を選択する（ステップＳ１４２）。未処理画素の選択は、ワーキングメモリ２７０に格納した重心位置の座標をもとに最も近い位置にある画素を選択する。重心を利用してセルを構成する未処理画素を選択するため、上述したようにセルは円状となり、その重心にドットを形成させることで、ＳドットとＭドットとのドット間距離が一定で快適な印刷出力を得ることができるのである。
【００４８】
図９（ｃ）の例では、ワーキングメモリ２７０には重心位置として、ｘ＝０、ｙ＝０が格納されているので、この位置から最も近い位置にある画素は、（１，０）、（０，１）の２つ存在することになる。複数の選択すべき画素がある場合、ＣＰＵ２４は、いずれか１つの画素をランダムに選択することにする。固定順に選択する方法も考えられるが、最終的に構成されるセルが規則的に並びすぎることによって、印刷出力のある領域でドットが周期的に発生する周期パターンを生じてしまう。このようなパターンは視覚に入り易く快適な印刷出力を得ることができない。従って、選択すべき画素が複数あれば、ランダムに選択するのである。図９（ｃ）の例では、ＣＰＵ２４は、（０，１）に位置する画素を選択することにする。また、ＣＰＵ２４は、未処理画素の選択を行うと選択画素の階調値として“−１”を格納する。以後未処理画素として選択されないためである。さらに、選択画素に対応するＳ出力データ格納領域２６８ａの画素位置にＳドットを生成しないことを示す“０”を格納する（図１０（ａ）の左図、右から２番目の図参照）。
【００４９】
図４に戻り、次いでＣＰＵ２４は濃度の合計、すなわち選択した階調値の合計がＳドットの閾値である“２００”を超えるか否か判断する（ステップＳ１４３）。図９（ｃ）の例では、ステップＳ１４２で未処理画素として（０，１）が選択されたため、階調値の合計は“４０”となる。Ｓドットの場合の閾値は上述したように本実施例では“２００”としたため、２つの画素を選択しただけでは閾値を超えずに本ステップで“ＮＯ”が選択されることになる。
【００５０】
ステップＳ１４３で閾値を超えないとき（“ＮＯ”のとき）、ＣＰＵ２４は、ステップＳ１４４に移行し、未処理画素を含めたセルの重心位置を演算する。図９（ｃ）に示す例では、初期画素として（０，０）に位置する画素、未処理画素として（０，１）に位置する画素が選択され、この２つの画素から重心を演算することになる。新たにセル内に取り込んだ画素を含めたセル全体の重心の計算をし直すためである。重心の演算式は上述の（式１）を用いる。この結果、重心位置はｘ＝０、ｙ＝０．５となる。演算結果は、ＣＰＵ２４の制御によりＲＡＭ２６のワーキングメモリ２７０に格納される。その格納された例を図１０（ａ）の中央に示す。
【００５１】
次いでＣＰＵ２４は、セルの階調値の合計を演算する（ステップＳ１４５）。新たにセル内に取り込んだ画素を含めたセル全体の階調値を計算するためである。上述の例では、２つの画素（（０，０）と（０，１）に位置する画素）の階調値の合計は、“４０”となり、同様にＣＰＵ２４の制御によりワーキングメモリ２７０に格納される（図１０（ａ）の中央図参照）。
【００５２】
次いでＣＰＵ２４は、選択画素の階調値をＬ成分に対応する画素の階調値に加算する（ステップＳ１４６）。後で減算処理を行い、最終的に生成されるＳドットとＬドットとが重なる確率を低くし粒状的なドットの生成を抑えて、快適な印刷出力を得るためである。上述の例では、（０，１）に位置するＳ成分の画素の階調値は“２０”で、これをＬ成分の（０，１）に位置する画素の階調値に加算することになる（図１０（ａ）の左から２番目の図参照）。
【００５３】
図４に戻り、次いでＣＰＵ２４は、Ｓ成分におけるセルを構成する画素の階調値の合計が閾値である“２００”と等しいか否か判断する（ステップＳ１４７）。ワーキングメモリ２７０に格納された階調値の合計をＣＰＵ２４が読み出して閾値と等しいか否か判断することになる。図１０（ａ）の例では、合計値は“４０”となるので閾値である“２００”と等しくない。よって、本ステップで“ＮＯ”が選択され、ステップＳ１４２に移行し再び未処理画素の選択を行うことになる。以後上述した処理を繰り返すことになるが、図１０（ａ）の例で説明すると以下のようになる。
【００５４】
ステップＳ１４２に移行するとＣＰＵ２４は、Ｓ成分の未処理画素を選択する。未処理画素の選択は重心位置から最も近い未処理画素を選択する。重心位置は、ワーキングメモリ２７０に格納され、ｘ＝０、ｙ＝０．５なので、（１，０）と（１，１）に位置する画素が選択対象である。複数あればランダムに選択する。ここでは、（１，０）の画素を選択することにする。ＣＰＵ２４は、選択画素の階調値を“−１”とし、対応するＳ成分出力データ格納領域２６８ａに“０”を格納する（図１０（ｂ）の左図、右から２番目の図参照）。
【００５５】
次いでＣＰＵ２４は、濃度の合計が閾値である“２００”を超えるか否か判断する（ステップＳ１４３）。選択した未処理画素を含めた階調値の合計は、“６０”となり閾値を超えないので“ＮＯ”が選択され、ステップＳ１４４に移行する。次いで、ＣＰＵ２４はセルの重心を（式１）を用いて演算し、階調値の合計を演算する（ステップＳ１４４、Ｓ１４５）。演算結果は、ワーキングメモリ２７０に格納される（図１０（ｂ）の中央図参照）。次いでＣＰＵ２４は、ステップＳ１４６に移行し、Ｌ成分に選択した未処理画素の階調値を加算する（図１０（ｂ）の左から２番目の図参照）。次いでＣＰＵ２４は、階調値の合計が閾値と等しいか否か判断するが、合計値は“６０”なので“ＮＯ”が選択される。そして、再びステップＳ１４２に移行し、上述の処理が繰り返される。その結果を図１０（ｃ）に示す。
【００５６】
図１０（ｃ）の場合でも、階調値の合計は“８０”となるので、ステップＳ１４７で“ＮＯ”が選択され再び上述の処理が繰り返されることになる。この処理が繰り返された結果、９個の未処理画素によってセルが構成されて、Ｌ成分入力データ格納領域２６１ｂ、ワーキングメモリ２７０、及び出力データ格納領域２６８ａ、２６８ｂに図１１（ａ）に示す値が格納された場合で以後説明する。
【００５７】
この場合でも、またセルを構成する画素の階調値の合計値は、“１８０”で閾値に達していないのでステップＳ１４７が選択され、ＣＰＵ２４はステップＳ１４２に移行し未処理画素の選択を行う。重心位置はｘ＝１．０、ｙ＝１．０となっているので、この位置から最も近い画素を選択することになるが、選択すべき画素が複数あるのでランダムにいずれか１つを選択する。図１１（ａ）に示すように、ここでは（１，３）に位置する画素を選択することにする。ＣＰＵ２４は、選択画素の階調値として“−１”を格納し、対応するＳ出力データ格納領域２６８ａの位置に“０”を格納する（図１１（ｂ）の左図、右から２番目の図参照）。
【００５８】
次いで、ＣＰＵ２４は濃度の合計が閾値を越えるか否か判断する（ステップＳ１４３）が、合計値は“２００”で閾値 “２００”を越えないので本ステップでは“ＮＯ”が選択される。そして、セルの重心と階調値の合計を演算し（ステップＳ１４４、Ｓ１４５）、図１１（ｂ）の中央に示すように演算結果がワーキングメモリ２７０に格納される。さらに、対応するＬドット成分の階調値に加算して（ステップＳ１４６）、図１１（ｂ）の左から２番目に示すようなＬ成分の入力データを得る。
【００５９】
次いでＣＰＵ２４は、階調値の合計が閾値と等しいか否か判断する（ステップＳ１４７）が、ここでは階調値の合計が閾値と等しくなるので、本ステップで“ＹＥＳ”が選択されステップＳ１４８に移行する。ステップＳ１４８でＣＰＵ２４は、重心位置にＳドット生成を示す“２００”を割り当てる。すなわち、Ｓ出力データ格納領域２６８ａにおいて重心位置に位置する画素に、ドット生成を示す“２００”を格納する。この例では、重心位置はワーキングメモリ２７０からｘ＝１．０、ｙ＝１．２となるので、重心位置に位置する画素は（１，１）となる。図１１（ｃ）にその例を示す。
【００６０】
一方、図４のステップＳ１４３で濃度の合計、すなわちセルを構成する階調値の合計が閾値を超えると“ＹＥＳ”が選択され、閾値を超えた場合の重心演算処理を行う（ステップＳ１４９）。ここでも重心演算のための演算式を用いて重心を得ることになるが、その演算式は以下を用いる。
（式２）
ｘ重心＝｛｛（セルの重心のｘ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｘ座標）×（閾値までに必要な階調値）｝}
／（セルの階調値の合計＋閾値まで必要な階調値）
ｙ重心＝｛｛（セルの重心のｙ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｙ座標）×（閾値までに必要な演算値）｝}
／（セルの階調値の合計＋閾値まで必要な階調値）
（ｘ重心、ｙ重心は重心位置の座標）
（式１）との違いは、選択した未処理画素の階調値をそのまま用いるのではなく、セルの階調値の合計が閾値と同じになるような値を用いる点が異なる。例えば、これまで選択した画素の階調値の合計が“１８０”で、最後に選択した未処理画素の階調値が“６０”とすると、閾値までに必要な階調値は“２０”となり、最後の画素の階調値は“２０”として重心を演算するのである。この演算式は、（式１）の場合と同様に予めＲＯＭ２５に格納されており、ＣＰＵ２４が本ステップを実行する際にＲＯＭ２５から読み出すことで実行される。
【００６１】
次いでＣＰＵ２４は、閾値に達するのに必要な値をＬ成分の階調値に加算する（ステップＳ１５０）。上述の例では、“２０”を最後に選択した画素に対応するＬ成分の画素に加算することになる。そして、ＣＰＵ２４は残った階調値を選択した未処理画素に戻す（ステップＳ１５１）。上述の例では、最後に選択した画素の階調値は“６０”であるが“２０”として重心演算したので、残りの“４０”を当該画素の階調値として戻すのである。セルを構成する画素とは異なる画素に戻すことも考えられるがそれでは入力階調値に忠実にドットを生成させることができなくなるからである。そして、処理はステップＳ１４８に移行し上述した重心位置でＳドットの生成処理を行うことになる。
【００６２】
次に、ＣＰＵ２４は減算処理を行う。すなわち、ステップＳ１４６においてセルを構成するＳ成分の階調値をＬ成分に加算したので、それを減算する処理を行うのである。ここで減算処理は、Ｓドットが打たれる位置から行うことにする。ＳドットとＬドットとが重なる確率を下げることになり、粒状的なドットの生成を抑え快適な印刷出力を得ることができるからである。
【００６３】
具体的に説明すると、まず、Ｓドットに最も近いＬ成分の入力データを選択する（ステップＳ１５２）。すなわち、Ｓドットが生成される画素位置にあるＬ成分の画素を選択することになる。図１２（ａ）の左から２番目の図に示すように、Ｓドットが生成されるのは、（１，１）に位置する画素なので、選択すべきＬ成分の入力データは、（１，１）に位置する画素となる。そして、選択した画素の階調値をワーキングメモリ２７０に格納する（図１２（ｂ）中央図参照）。なお、このワーキングメモリ２７０は、減算処理のため、以前の処理で格納された重心位置等の値は初期化されているものとする。勿論、ワーキングメモリ２７０としてさらに減算処理のための階調値を格納する領域を別個設けていてもよい。
【００６４】
次いでＣＰＵ２４は、選択したＬ画素の階調値の合計がＳドットの閾値を超えるか否か判断する（ステップＳ１５３）。ワーキングメモリ２７０に格納したＬ成分の階調値の合計がＳドットの閾値である“２００”を超えるか否かで判断されることになる。図１２（ａ）の例では選択画素の階調値は“８０”で、閾値に達しないことになるので、本ステップでは“ＮＯ”が選択される。
【００６５】
次いでＣＰＵ２４は、ステップＳ１５２で選択したＬ成分の画素位置に階調値“０”を格納する（ステップＳ１５４）。これにより、Ｓドット生成でＳ成分からＬ成分に加算した階調値のうち、ステップＳ１５２で選択した画素の階調値が減算されることになる。図１２（ｂ）にその例を示す。
【００６６】
次いでＣＰＵ２４は、選択したＬ成分の画素の階調値の合計が閾値と等しいか否かを判断する（ステップＳ１５５）。閾値と等しくないとき（“ＮＯ”のとき）は、ステップＳ１５２に移行して上述の処理を繰り返すことになり、Ｌ成分に加算したＳドットの閾値分の階調値をＬ成分から減算することになる。図１２（ｂ）の例では、閾値である“２００”と等しくないため再びステップＳ１５２に移行することになる。
【００６７】
ＣＰＵ２４は、ステップＳ１５２に移行すると、再びＳドットに最も近いＬ成分の画素を選択することになる。Ｓドットが生成される画素位置のＬ成分は既に選択しているため、選択すべき画素はＳドットが生成される画素位置の上下左右の画素を選択することになる。Ｓドット周辺からＬ成分を減算すれば、Ｓドットが打たれる画素位置にＬドットが打たれる確率が少なくなるからである。図１２（ｂ）の例では、（１，０）、（０，１）、（２，１）、（１，２）の４つの画素が選択されることになる。選択された状態を図１２（ｃ）に示す。なお、選択の対象画素をドットが生成される画素位置の上下左右としたが、これに拘泥せずさらに斜め方向の画素を含めて選択するようにしてもよい（例えば、図１２（ｃ）の例では、（０，０）、（２，０）、（０，２）、（２，２）に位置する画素）。さらに、上下左右の４つの画素を選択して処理を進め、ステップＳ１５５から再び本ステップＳ５２に戻ったときに、この斜め方向の画素を選択するようにしてもよい。
【００６８】
次いでＣＰＵ２４は、選択した画素の階調値の合計が閾値である“２００”を超えるか否か判断される（ステップＳ１５３）。図１２（ｃ）の例では選択した４つの画素を含めた階調値の合計は、８０＋８０×４＝４００となるので閾値を超えることになる。よって、本ステップで“ＹＥＳ”が選択され、処理はステップＳ１５６に移行することになる。
【００６９】
ＣＰＵ２４は、ステップＳ１５６に移行すると、減算すべき階調値の演算を行う。選択したＬ成分の画素の階調値がＳドットの閾値を超える場合に、選択した画素の階調値すべて減算するのは減算しすぎである。そこで、加算した閾値分だけ均等に各画素から減算するように処理を行うのである。図１２（ｃ）の例では、すでに選択した（１，１）に位置する画素の階調値“８０”を減算したので、閾値である“２００”になるには“１２０”分の階調値を減算すればよいことになる。よって、選択した（１，０）、（０，１）、（２，１）、（１，２）に位置する各画素から“３０”（＝１２０／４）づつ階調値を減算すればよい。
【００７０】
次いでＣＰＵ２４は、減算後の残った階調値を選択したＬ成分に戻す処理を行う（ステップＳ１５７）。図１２（ｃ）の例では、均等に４つの画素から“３０”の階調値を減算したので、各画素とも残りの階調値として“５０”を有することになる。この階調値を選択した画素位置に戻すのである。戻した後のＬ成分の入力データの例を図１３（ａ）に示す。
【００７１】
そして、ＣＰＵ２４はステップＳ１５に移行しＳドットの生成処理が終了することになる。一方、ステップＳ１５５で閾値と等しい場合（本ステップで“ＹＥＳ”の場合）は、減算した（Ｌ成分を“０”にした）選択画素の階調値が閾値と等しいのでこれ以上減算処理をしなくてもよいことになるので、同様にＳドットの生成処理が終了しステップＳ１５に移行することになる。
【００７２】
図３に戻り、Ｓドット生成処理が終了すると、ＣＰＵ２４はＬ成分、Ｓ成分ともに未処理画素があるか否か判断する（ステップＳ１５）。処理済みの画素には、上述したように“−１”が格納されるのでこれにより判断することになる。図１３（ａ）に示す例では、まだ未処理画素が存在するので、再びステップＳ１２に移行し処理を繰り返すことになる。すなわち、ステップＳ１２で未処理画素のうち最も上側の最も左側に位置するＳ成分、Ｌ成分の画素を選択して、ドット密度を比較する（ステップＳ１３）。図１３（ｂ）の例では、２０／２００＜６０／２５５で、Ｓ成分の方がドット密度が低いと推定されるのでＳ成分から先に処理が行われる（ステップＳ１３で“ＹＥＳ”の場合、図１３（ｃ）参照）。その後上述した処理が繰り返されることになる。その結果を図１４（ａ）に示す。この図に示すようにＳ成分から先にすべてＣＣ法によるハーフトーン処理が行われている。ドット密度の比較からＳ成分の方がドット密度が低いからである。またＬ成分は、Ｓドットの発生位置周辺の階調値が減算された値が格納されることになる。なお、初期画素選択のときに、Ｌ成分の方がドット密度が低いとＬ成分から先にＣＣ法による処理が行われることになる。さらに、一部の領域でＬ成分から先に処理が行われたり、Ｓ成分から先に処理が行われたりする場合も考えられる。
【００７３】
そして、再びステップＳ１５に移行することになる。図１４（ａ）に示す場合はすべてのＳ成分の処理が終了したことになるので、Ｓ成分については未処理画素が存在しないことになり、ステップＳ１５では“ＮＯ”が選択される。次いで、ＣＰＵ２４はステップＳ１６に移行し、残ったＬ成分のＣＣ法によるハーフトーン処理を行う。すなわち、未処理画素をラスター方向に探索し初期画素を選択する（図１４（ｂ）参照）。次いで閾値である“２５５”となるまでセルを構成する画素を選択し、閾値と等しい又閾値を超えると選択は終了してセルの重心位置に存在する画素にドット生成を示す“２５５”を割り当てる。以後これをすべてのＬ成分に対して行うことになる。その結果を図１４（ｃ）に示す。
【００７４】
次いでＣＰＵ２４は、残ったＳ成分のＣＣ法によるハーフトーン処理を行う（ステップＳ１７）。図１４（ｃ）の例では、残りのＳ成分は存在しないので、処理はステップＳ１８に移行して、一連のＣＣ法によるハーフトーン処理が終了することになる。
【００７５】
一方、ステップＳ１３においてドット密度に関しＬ成分の方がＳ成分よりも低いときは“ＮＯ”が選択されてＬドット生成処理を行う（ステップＳ１９）。Ｌドット生成処理のフローチャートを図６乃至図７に示す。例えば、図１５（ａ）に示すＳ成分の入力データとＬ成分の入力データとがそれぞれＳ成分入力データ格納領域２６１ａ、Ｌ成分入力データ格納領域２６１ｂに格納されたとき、未処理画素である（０，０）に位置する画素のドット密度を比較すると、６０／２００＞２０／２５５であるのでＬ成分から先に処理を行うべくＬドット生成処理（ステップＳ１９）に移行することになる。Ｌドット生成処理もＳドット生成処理（ステップＳ１４、図４乃至図５参照）とほぼ同じ処理であり、全体としてＣＣ法によるハーフトーン処理（ステップＳ１９１からＳ２０１）、減算処理（ステップＳ２０２からＳ２０７）とから構成される。Ｓドット生成処理と重複している処理もあるため、簡単に以下説明することにする。
【００７６】
図６に示すようにＬドット生成処理に移行すると、ＣＰＵ２４はＬ成分の未処理画素を初期画素として濃度の重心を演算する（ステップＳ１９１）。図１５（ａ）に示す例では、Ｌ成分のうち初期画素として（０，０）に位置する画素が選択される。また重心位置は、（式１）を用いる。ＣＰＵ２４は、演算した重心位置、階調値の値をワーキングメモリ２７０に格納する。また、選択された画素は“−１”が格納され以後未処理画素として選択されないようにする。さらに、対応する位置のＬ成分出力データ格納領域２６８ｂに“０”を格納する。
【００７７】
次いでＣＰＵ２４は、Ｌ成分の未処理画素を選択する（ステップＳ１９２）。選択は、重心位置から最も近い画素を選択する。セルを円状に成長させ、ドット間距離を一定に保つためである。複数の画素が存在すればランダムに選択する。規則的にドットが並びすぎることによるドットの周期パターンの発生を抑えるためである。図１５（ａ）に示す例では、（０，１）に位置する画素を選択するものとする。
【００７８】
次いでＣＰＵ２４は、濃度の合計、すなわち階調値の合計がＬドットの閾値を超えるか否か判断する（ステップＳ１９３）。ここではＬドットの閾値として“２５５”として処理を行うものとする。図１５（ａ）の例では階調値の合計は“４０”で閾値に達しないので、“ＮＯ”が選択される。
【００７９】
次いでＣＰＵ２４は、これまで選択した画素により構成したセルの重心位置を演算し（ステップＳ１９４）、階調値の合計を演算し（ステップＳ１９５）、選択画素の階調値をＳ成分の入力データに加算する（ステップＳ１９６）。重心位置の演算は、（式１）を用い、ＣＰＵ２４は演算した重心位置と階調値の合計値をワーキングメモリ２７０に格納する。
【００８０】
以上の処理を閾値と等しくなるまで繰り返す（ステップＳ１９７）ことになる。閾値と等しくなったとき（“ＹＥＳ”のとき）は、ＣＰＵ２４はその重心位置に位置する画素にＬドット生成を示す“２５５”を割り当てる。一方、ステップＳ１９３でセルを構成する画素の階調値の合計が閾値を超えると（“ＹＥＳ”のとき）、閾値を超えた重心演算処理を行う（ステップＳ１９９）。図１５（ａ）に示す例では、全部で１３個の画素を選択すると、階調値の合計が“２６０”となり閾値を超えるためステップＳ１９９に移行することになる（図１５（ｂ）の左から２番目の図参照）。
【００８１】
ステップＳ１９９においてＣＰＵ２４は、上述した（式２）を用いて重心の演算を行う。この場合に、階調値の合計が閾値となるように最後に選択した画素の階調値を演算して、重心位置を決定することになる。そして、その値を対応するＳ成分の画素の階調値に加算し（ステップＳ２００）、残った階調値は最後に選択した当該画素に戻すことになる（ステップＳ２０１）。図１５（ｂ）の左から２番目に示すようにＬ成分の（１，４）に位置する画素についでは、その階調値として、合計値値が閾値である“２５５”となる値、すなわち“１５”として重心位置等の演算で処理を行い、残りの階調値“５”を当該位置の画素に戻している。その後、重心に位置する画素にＬドット生成を示す“２５５”を格納することになる（図１５（ｂ）の右図参照）。
【００８２】
次いで、ＣＰＵ２４は減算処理を行う。すなわち、Ｌドットが生成される位置のＳ成分の画素を選択し（ステップＳ２０２）、選択した画素の階調値がＬドットの閾値を超えないと（ステップＳ２０３で“ＮＯ”のとき）、選択したＳ成分の画素の階調値を“０”とする（ステップＳ２０４）。そして、Ｌドットの閾値と等しくなるまで処理が繰り返される（ステップＳ２０５で“ＮＯ”のとき）ことになる。ステップＳ２０２において最初にＬドットが生成される位置の画素を選択し、再びステップＳ２０２に移行したときは、選択すべき画素としてＬドットの生成されるべき画素位置の上下左右の画素を選択する。図１５（ｂ）の左図に例を示す。もちろん、Ｓドットの生成処理のときと同様に上下左右のみならずさらに斜め方向を含めた８つの画素を選択してもよいし、再びステップＳ２０２に戻ったときに斜め方向の画素を選択するようにしてもよい。
【００８３】
一方、ステップＳ２０３で選択した画素の階調値の合計が閾値を超えるとき（“ＹＥＳ”のとき）、ＣＰＵ２４は減算量を演算し（ステップＳ２０６）、減算後の残った階調値を選択したＳ成分の画素に戻す（ステップＳ２０７）。減算量の演算は階調値を“０”にした画素の階調値を閾値から減算し、残りの値を選択した４つの画素で均等に減算することなる。図１５（ｂ）に示す例では、（１，２）の画素の階調値“８０”を閾値“２５５”から減算し、残りの“１７５”を４で除算することになる。その結果、“４３．７５”を得るが、４つの画素に均等にするよう各画素から４３、４３、４３、４４の値を減算することにする。従って、減算後の４つの画素の階調値は、３７、３７、３７、３６となる(図１５（ｂ）の左図参照)。そして、Ｌドット生成処理が終了してステップＳ１５に移行することになる。ステップＳ２０５で閾値と等しい場合、減算量が加算した値分に達することになるので、減算処理は終了してステップＳ１５に移行することになる。
【００８４】
その後、図３に戻り残りの成分の処理を進めると（ステップＳ１６、Ｓ１７）図１５（ｃ）に示すＳ出力データ、Ｌ出力データを得ることができる。そして、このＳ出力データ、Ｌ出力データがハーフトーン処理部２１１からパルス幅変調部２１２に出力され駆動データが生成される。さらに、この駆動データが印刷エンジン２２に出力されて印刷が行われることになる。
【００８５】
上述の例は、生成されるドットとしてＬａｒｇｅとＳｍａｌｌの２種類であったが、Ｌａｒｇｅ、Ｓｍａｌｌの他、Ｍｉｄｄｌｅのドットサイズを出力することのでき画像出力装置２０であっても、本発明を適用して同様の効果を得ることができる。すなわち、入力データを分版関数により３つの成分に分離し、ドット密度の低い方から先にＣＣ法によるハーフトーン処理を行う。このとき、階調値を他の２つの成分に加算し、先に行った処理が終了した後に加算した階調値の減算処理を行う。この場合も、ドット生成される位置の周辺の画素から階調値を減算するようにすることで、他のドットがその位置に打たれる確率が少なくなる。その後、残る２つの成分でラスター方向に未処理画素を選択し、ドット密度が少なくなるであろうサイズの方から先に処理を行い、加算及び減算処理を行う。最後に残ったサイズの処理を行う。このような処理を行うことで、入力成分の階調値の合計値を変えることなく、２つのドットサイズの場合と同様に、ドット間距離をドットサイズに応じて最適な位置に確保することができるとともに、粒状感の少ない視覚的に快適な画像出力を得ることができる。
【００８６】
なお、このような加算、減算処理により、異なるドットサイズの単位面積あたりのドット密度（濃度）を均一に保つという効果も得ることができる。すなわち、図９（ｃ）以降で説明したように、セルに取り込むべきＳ成分の画素を選択後、その階調値をＬ成分に次々に加算しているが、加算すべき値自体はＬ成分をＳ成分に加算する場合よりも小さい値である。その後図１２（ｂ）で説明したように減算処理を行っているがこれも減算量自体小さい値（“２００”）である。その結果、Ｌ成分の階調値自体の変化はＳ成分に対する加算、減算に比べ少ないものとなり、Ｓドットが生成される比較的近い位置にＬドットが生成されることになる。逆に、Ｓ成分に加算される値は大きな値で減算される量も大きい。その結果、Ｌドットが生成される位置から比較的遠い位置にＳドットが生成されることになる。以上から、濃度の小さいＳドット周辺には狭い空乏の白領域、濃度の大きいＬドット周辺には広い空乏の白領域が確保されることになる。従って、結果的にドットサイズが異なるものであっても、出力画像の単位面積あたりの濃度を均一に保ち、濃度ムラのない快適な画像出力を得るという効果も得ることができるのである。
［ディザ法を用いたハーフトーン処理］
次にディザ法を用いたハーフトーン処理について説明する。一般にディザ法とは、濃淡画像の階調を再現する２値化の手法の１つである。各画素の入力階調値に対して、閾値マトリックスと呼ばれる変換テーブルを用いて、テーブル内に格納された閾値とを比較する。その結果、その入力階調値の方が大きいとドット生成を示す再生データ（量子化データ）と、そうでないとドットなしを示す再生データとを生成する。そして、この再生データをもとに印刷用紙等に印刷を行うようにするものである。
【００８７】
本実施例においても、同様に閾値マトリックスを用いてディザ処理を行うものである。ただし、最初に入力データに対して、分版関数を用いてＳ成分とＬ成分に分版し、ドット密度が低くなるであろう成分のデータ（例えばＳ成分）に対して先にディザ処理を行う。そして、ドット密度の低い成分のデータとドット密度が高い異なるサイズの成分（例えばＬ成分）のデータとの和から、このディザ処理後の成分（例えばＳ成分）のデータを減算して、ドット密度の高い成分（例えばＬ成分）のデータを生成する。
【００８８】
このようにドット密度が低くなるであろうものから先にディザ処理を行い、その後減算処理を行って、サイズの異なる方のドット密度の高いデータを得る。そして、このデータにディザ処理を行い、再生データを得るのである。
【００８９】
このようにドット密度が低くなるであろう方から優先的に処理し、その後減算処理をしているのは、ドット密度の低い成分のデータに対して生成されるドット周辺にドット密度の高い、サイズの異なる成分のドットを生成させないようにするためである。これにより、印刷出力おいて、ある部分だけＳドットとＬドットとが重なり合うことによる粒状的なドット生成を抑えることができ、快適な印刷出力を得ることが可能となる。
【００９０】
逆にドット密度の高い方から先にディザ処理を行うと、ＣＣ法による場合と同様に確率的にドットが生成されない位置に対して減算処理を行ってしまうことになる。これにより、入力階調値に忠実でないドット分布が生成されてしまうことになるのである。
【００９１】
その後同様に、ドット密度が低くなるであろう他の成分（例えばＬ成分）のデータにディザ処理を行い、ドット密度の低い成分のデータとドット密度の高いサイズの異なる成分（Ｓ成分）のデータとの和から、ディザ処理後の成分のデータを減算処理する。この場合も、ドット密度が低いＬ成分のデータに対して生成されるドット周辺に、ドット密度の高いＳ成分のドットを生成させないようにすることができる。その後、減算後に得られるドット密度の高いＳ成分のデータにディザ処理を行う。
【００９２】
最終的に得られた、４つのディザ処理後のデータ、すなわち、ドット密度が高低の２つのＳ成分の再生データと、ドット密度が高低の２つのＬ成分の再生データに対して、それぞれ和を取って、Ｓ成分の再生データとＬ成分の再生データとを生成することになる。この再生データに基づいて、印刷エンジン２２にて印刷が行われることになる。
【００９３】
以上述べた内容についての具体的な処理について以下説明することにする。図１６乃至図１８は、その動作を示すフローチャートである。図１９乃至図２７は、ＲＡＭ２６に格納された各データの内容を示す。なお、入力画像データはＣＣ法による場合と同様に分版関数（図８参照）によって、Ｓ成分の入力データとＬ成分の入力データに分版されるものとする。その例を図１９（ａ）に示す。
【００９４】
このＲＡＭ２６は、ＣＣ法による場合と同様に複数の領域を有し、図１９（ａ）に示す例は、Ｓ成分の入力階調データと、Ｌ成分の入力階調データが各領域の各座標位置に格納されている例を示す。それぞれ、Ｓ成分入力データ格納領域２６１ａと、Ｌ成分入力データ格納領域２６１ｂとする。各領域２６１ａ、２６１ｂは、それぞれｍ行ｎ列の２次元構造を有し、各座標位置はホストコンピュータ１０で生成された画像の画素位置に対応するものである。例えば、Ｓ成分の入力階調データが入力された領域の（ｎ、ｍ）の位置は、全体画像における（ｎ、ｍ）の位置に対応するものである。Ｌ成分の場合も全く同様である。ここでは、説明を簡単にするため各領域とも６行６列で表現されているが、画像１フレーム分の各階調値を格納できる構成であってもよいし、これよりも少ない構成であってもよい。以下フローチャートに沿って説明する。
【００９５】
図１６に示すようにＣＰＵ２４は、本処理を実行するためのプログラムをＲＯＭ２５から読出すことによって、処理が開始されることになる（ステップＳ３０）。次いでＣＰＵ２４は、入力データを分版関数を用いてＳ成分とＬ成分に分離し、さらにＳ成分をドット密度の低い成分（以下Ｓ疎データ）と高い成分（以下Ｓ密データ）とに分離し、Ｌ成分をドット密度の低い成分（以下Ｌ疎データ）と高い成分（以下Ｌ密データ）とに分離する（ステップＳ３１）。
【００９６】
上述した分版関数により入力階調データを分版した結果、図１９（ａ）に示すように、入力階調値が“８０”であるデータをＳ成分“５０”とＬ成分“３０”とに分離し、入力階調値が“１２０”であるデータをＳ成分“４０”とＬ成分“８０”とに分離している。
【００９７】
そして、分離したＳ成分とＬ成分とをそれぞれドット密度が高い成分と低い成分とに分離している。このドット密度の高低は、分離したＳ成分とＬ成分とで同じ画素位置にある画素に対して、ＣＣ法による場合と同様に、（各成分の階調値）／（ドット生成のための閾値）により比較することで高低を判定する。すなわち、図１９（ａ）に示す例では、（０，０）に位置するＳ成分とＬ成分の画素とから、５０／２００＞３０／２５５となるので、当該位置ではＳ成分の方がドット密度が高く、Ｌ成分の方がドット密度が低くなる。本実施例においても、ＣＣ法による場合と同様にＳドット生成のための閾値として“２００”、Ｌドット生成のための閾値として“２５５”を用いるものとする。一方、（０，３）の位置では、４０／２００＜８０／２５５でＳ成分の方がドット密度が低く、Ｌ成分がドット密度が高いものとなる。この高低を各画素位置で判定し、例えばＳ成分でドット密度が低いときはその階調値を、高いときは“０”を対応する画素位置に格納したものがＳ疎データとなる。逆にＳ成分でドット密度が高いときはその階調値を、低いときは“０”を対応する画素位置に格納したものがＳ密データとなる。同様にＬ疎データ、Ｌ密データとを生成する。生成したこれらのうちＳ疎データとＬ疎データとをそれぞれＳ疎データ格納領域２６２ａ、Ｌ疎データ格納領域２６２ｂに格納する。その例を図１９（ｂ）に示す。この領域２６２ａ、２６２ｂも同様に２次元構造を有し、各座標位置が全体画像の画素位置に対応する。
【００９８】
なお、このステップＳ３１で生成したＳ密データとＬ密データは、その後本実施例ではディザ処理等は行わない（ただし、減算処理後に生成したＳ密データとＬ密データに対してディザ処理は行う）。そのため、この２のデータをＲＡＭ２６に格納せず、演算のみＣＰＵ２４で行うようにしている。もちろん、別途Ｓ密データ格納領域２６２ｃ、Ｌ密データ格納領域２６２ｄを用意し図１９（ｂ）に示すようにＳ密データとＬ密データとをそれぞれ各領域２６２ｃ、２６２ｄに格納するようにしてもよい。
【００９９】
図１６に戻り、次いでＣＰＵ２４は、Ｓ疎データとＬ密データとの和（Ｓ疎＋Ｌ密）と、Ｓ密データとＬ疎データとの和（Ｓ密＋Ｌ疎）の各データを生成する（ステップＳ３２）。図１９（ｃ）にその例を示す。Ｓ疎＋Ｌ密データは、上述のステップＳ３１で生成したＳ疎データとＬ密データとを対応する各座標位置でその階調値の和をとったデータである。また、Ｓ密＋Ｌ疎データも生成したＳ密データとＬ疎データとを対応する各座標位置でその階調値の和をとったデータである。この各データもＲＡＭ２６の領域２６３ａ、２６３ｂに格納されるが、この領域も全体画像の画素位置に対応するように配置されている。
【０１００】
次いでＣＰＵ２４は、Ｓ疎データに対してディザ処理を行う（ステップＳ３３）。この場合のディザ処理は、Ｓドット用のディザ（閾値）マトリックスの各値とＳ疎データの各階調値とを比較し、Ｓ疎データの方がマトリックス内の閾値よりも大きいとドット打つことを示す“２００”を当該画素位置に割り当て、そうでないとドットを打たないことを示す“０”を当該画素位置に割り当てる。Ｓドット用閾値マトリックスの例を図２０に示す。また、Ｌドット用のディザマトリックスも用意されＬ疎データ、Ｌ密データに対してはかかるマトリックスにより処理が行われる。なお、これらのマトリックスは例えばＲＯＭ２５に格納されＣＰＵ２４が処理の際に読み出して各階調値と比較することで処理が進められるものとする。処理の具体例を図２１乃至図２３を参照して説明する。
【０１０１】
まずＣＰＵ２４は、Ｓ疎データ格納領域２６２ａの（０，０）に格納された階調値とマトリックスの（０，０）に格納された閾値とを比較する。図２１（ａ）に示すように領域２６２ａの（０，０）に格納された階調値は“０”、マトリックスの（０，０）に格納された閾値は“１８０”、よって閾値の方が高い値となっているので、（０，０）の位置ではＳドットを生成しないことになる。ここでＲＡＭ２６にはさらにＳ疎出力データ格納領域２６４を備え、（０，０）の位置にＳドットを生成しないことを示す“０”が格納されることになる（図２１（ａ）の右図参照）。この領域２６４も、同様に２次元構造で全体画像の画素位置に対応するように配置されている。
【０１０２】
次にＣＰＵ２４は、Ｓ疎データ領域２６２ａの（１，０）に位置する階調値“０”と、マトリックスの（１，０）に位置する閾値“６０”とを比較し、Ｓ疎データ出力領域２６４の（１，０）の位置にＳドットを生成しないことを示す“０”を格納する（図２１（ｂ）参照）。次に、（２，０）に位置するＳ疎データとマトリックス内の閾値とを比較して対応する領域２６４の（２，０）に“０”を格納する（図２２（ａ）参照）。次は、（３，０）のＳ疎データと（０，０）の閾値とを比較する。以下これを繰り返すことになる（図２２（ｂ）から図２３（ａ）参照）。ラスター方向に順次閾値を比較し終えると、次にすぐ下の行にあるＳ疎データとマトリックス内の閾値とを比較することになる。その結果を、図２３（ｂ）に示す。ここで、Ｓ疎データ領域の（４，１）に位置する階調値“４０”はマトリックス内の（１，１）の閾値“２０”より大きい値を有しているので、Ｓ疎出力データ領域２６４の位置（４，１）にはＳドット生成を示す“２００”が格納されることになる。以下、これを繰り返すことで図２３（ｃ）に示す出力結果を得る。図２３（ｃ）に示すようにＳドットが生成されるのは、（４，１）と（４，４）に位置する画素となる。
【０１０３】
図６に戻り、Ｓ疎データに対するディザ処理が終了するとＣＰＵ２４は、Ｓ疎＋Ｌ密データ（図１９（ｃ）の左図参照）からＳ疎ドット周囲の階調値の減算処理を行う（ステップＳ３４）。その後生成されるＬ密データにおいてＳ疎ドット周辺の階調値を小さくなるようにして、Ｓドット周囲にＬドットが打たれないようにするためである。これにより、ＳドットとＬドットでドット間距離を一定に保ち、ドットの重なりを防ぐことができる。
【０１０４】
減算処理の具体的な処理のフローチャートを図１８に示す。まずＣＰＵ２４は、Ｓ疎＋Ｌ密データにおいてＳ疎ドットの生成される画素位置を選択する（ステップＳ３４０）。図２４（ａ）に示す例では、Ｓ疎ドットは（４，１）の位置に生成されるため、Ｓ疎＋Ｌ密データが格納された領域２６３ａの（４，１）の画素位置を選択することになる。なお、ＲＡＭ２６にはさらに減算した階調値の合計を格納する合計値格納領域２６５を有している。ＣＰＵ２４によって適宜合計値が格納される。
【０１０５】
次いでＣＰＵ２４は、選択した画素の階調値がＳドットの閾値である“２００”を超えるか否か判断する（ステップＳ３４１）。図２４（ａ）に示す例では、選択したＳ疎＋Ｌ密データの画素の階調値は“１２０”となっているので、閾値を超えずに本ステップでは“ＮＯ”が選択される。
【０１０６】
次いでＣＰＵ２４は、選択画素の階調値をすべて減算する（ステップＳ３４２）。選択画素の階調値が閾値を超えないので、階調値すべて減算することになる。図２４（ｂ）に示すように、（４，１）に位置するＳ疎＋Ｌ密データの画素の階調値“１２０”をすべて減算する。減算した階調値は、ＣＰＵ２４によって合計値格納領域２６５に格納される（図２４（ｂ）参照）。
【０１０７】
次いでＣＰＵ２４は、周囲の未減算画素を選択する（ステップＳ３４３）。ドットが生成する画素位置の近い位置の画素を選択することになる。図２４（ｃ）に示すようにこの例では、上下左右の画素を選択している（（４，０）、（３，１）、（５，１）、（４，２）に位置する画素）。もちろん、これ以外にも斜め方向に隣接する画素を選択してもよい（例えば図２４（ｃ）の例では（３，０）、（５，０）、（３，２）、（５，２）に位置する画素を選択）し、これを含めた８つの画素を選択してもよい。
【０１０８】
図１８に戻り、次いでＣＰＵ２４は、選択画素の階調値の合計がドットの生成を示す値を超えるか否か判断する（ステップＳ３４４）。ドット生成を示す値分減算したか否か判断するためである。本実施例では、ドットの生成を示す値としてＬドットの場合は“２５５”、Ｓドットの場合は“２００”としている。図２４（ｃ）の例では、ドットが生成される画素位置を含めた選択画素の階調値の合計は、１２０＋１２０×４＝６００でＳドット生成を示す値“２００”を超える。よって、本ステップで“ＹＥＳ”が選択され、処理はステップＳ３４５に移行する。
【０１０９】
ステップＳ３４５でＣＰＵ２４は、各選択画素から均等に階調値を減算する処理を行う。本実施例において減算処理は、ドット生成を示す値から合計値格納領域２６５に格納された値を減算し、残った値をステップＳ３４３で選択した未処理画素の数で除算して均等に減算する。図２４（ｃ）に示す例では、ドットの生成を示す値“２００”から合計値格納領域２６５に格納された値“１２０”を減算すると“８０”、これを選択した画素の数４で除算すると“２０”、この値を各画素から均等に減算するようにする。減算後の例を図２５（ａ）に示す。ステップＳ３４３で選択された各画素（（４，０）、（３，１）、（５，１）、（４，２）の画素）の階調値が減算されて“１００”となっている。
【０１１０】
次いでＣＰＵ２４は、他にＳ疎ドットがあるか否か判断する（ステップＳ３４６）。他にＳ疎ドットがあれば再びステップＳ３４０に移行して上述の減算処理を繰り返すことになる。他にＳ疎ドットがなければ減算処理は終了し図１６のステップＳ３５に移行する。図２５（ａ）の例では、さらに（４，４）の位置にＳ疎ドットが打たれるので、当該位置のＳ疎＋Ｌ密データに対してさらに減算処理を行うことになる。
【０１１１】
一方、ステップＳ３４４で選択画素の階調値の合計がドット生成を示す値を超えないと（“ＮＯ”のとき）、さらに未処理画素の選択を行う（ステップＳ３４７）。ステップＳ３４３で選択されなかった未減算画素が選択される。選択の方法として図２４等に示す例では、ステップＳ３４３で上下左右の画素が選択されたので、例えば斜め方向に隣接する画素（（３，０）、（５，０）、（３，２）、（５，２）の画素）を選択するようにする。さらに、それでも階調値の合計がドット生成を示す値を超えないと（再びステップＳ３４４で“ＮＯ”が選択された場合）、さらに外側に位置する１６個の画素を適宜選択する（１６個全て選択してもよいし、そのうちから選択したものでもよい）等が考えられる。
【０１１２】
また、ステップＳ３４１で選択画素の階調値がドット生成を示す値を超えると（“ＹＥＳ”のとき）、選択画素の階調値をドット生成の値分減算する（ステップＳ３４８）。そして処理は、ステップＳ３４６に移行して上述の減算処理を繰り返すことになる。
【０１１３】
このように、Ｓ疎ドットが生成される画素位置を中心にＳ疎＋Ｌ密データを減算するようにしたので、その後生成されるＬ密データからのＬ密ドットはＳ疎ドットの位置と重なって生成される確率が低くなり、粒状的なドット生成の発生を抑えて視覚的に快適な画像出力を得ることができるのである。なお、上述したように最初にＳ密データから先にディザ処理を行うと、ドット密度の低いＬ疎成分を減算したときに、本来ドットが打たれる位置にない位置に対しても階調値を減算してしまい、入力階調値に忠実でないドットが生成される可能性がある。よって疎データから先に処理を行うのである。図１６のフローチャートでは、Ｓ疎データから先に処理をしているが、以上の理由からＬ疎データから先に処理をしても構わない。
【０１１４】
図１６に戻り、減算処理後ＣＰＵ２４は、減算済みＬ密データに対してディザ処理を行う（ステップＳ３５）。上述の減算処理により、Ｓ疎＋Ｌ密データからＳ疎出力データを減算したことになるので、その減算後のデータはＬ密データとなる。この減算後のＬ密データに対してディザ処理を行うのである。Ｌ成分のデータに対しては、図２０の右図に示すようにＬａｒｇｅ用マトリックスを利用して処理が行われる。具体的には、図２１乃至図２３で説明したＳ疎データに対する処理と同様に、Ｌ密データの各画素位置の階調値とＬ用マトリックスの各閾値とを比較し階調値が閾値より大きな値のときはドット生成を示す“２５５”を割り当て、そうでないときはドットを生成しないことを示す“０”を割り当てることになる。なお、ＲＡＭ２６にはＬ密出力データ格納領域２６６を有し、各位置にこのドット生成の有無を示す値が格納されることになる。この領域２６６も同様に各位置が全体画像の画素位置に対応するように配列されている。図２５（ｃ）にその結果の例を示す。
【０１１５】
図１６に戻り、次いでＣＰＵ２４は、Ｌ疎データに対してディザ処理を行う（ステップＳ３６）。Ｌ疎データはステップＳ３１で生成されたものである。閾値マトリックスはＬ用のものを用い、処理は上述した内容と同じで各階調値とマトリックス内の対応する閾値とを比較することで処理が進められる。その結果を図２６（ａ）に示す。なお、ＲＡＭ２６には、さらにＬ疎出力データ格納領域２６７を有し、各位置にＬ疎ドットの生成の有無を示す値が格納される。この領域２６７も全体画像の画素位置に対応するように配列されている。図２６（ａ）に示す例では、（１，１）、（１，４）にＬドットが打たれることを示している。
【０１１６】
次いでＣＰＵ２４は、Ｓ密＋Ｌ疎データからＬ疎ドット周囲の減算処理を行う（ステップＳ３７）。Ｌ疎ドット周辺にＳ密ドットが生成されるのを防ぐためである。具体的な処理は、Ｓ疎ドットの減算処理をほぼ同じ内容で、図１８にその処理のフローチャートを示す。以下、図面を参照して簡単に説明する。
【０１１７】
まず、ＣＰＵ２４はＳ密＋Ｌ疎データのＬ疎ドットが打たれる画素位置を選択する（ステップＳ３４０）。図２６（ｂ）に例では、（１，１）の画素を選択する。次いでＣＰＵ２４は、選択した画素の階調値がＬドット生成を示す“２５５”を超えるか否か判断する（ステップＳ３４１）。図２６（ｂ）の例では、階調値は“８０”で“ＮＯ”が選択される。
【０１１８】
次いでＣＰＵ２４は、選択画素の階調値をすべて減算して（ステップＳ３４２）、その値を合計値格納領域２６５に格納する。図２６（ｂ）の例では、（１，１）に位置する画素の階調値“８０”をすべて減算することになる。減算した値は、領域２６５に格納される。そして、ＣＰＵ２４は周囲の未処理画素を選択する（ステップＳ３４２）。本実施例では、Ｌ疎ドットが打たれる画素位置を中心に上下左右の画素を選択する。上述したようにその他の選択方法でもよい。次いでＣＰＵ２４は、選択画素の階調値の合計が“２５５”を超えるか否か判断する（ステップＳ３４４）。図２６（ｂ）の例では、８０＋８０×４＝４００で“２５５”を超えるので“ＹＥＳ”が選択される。
【０１１９】
次いでＣＰＵ２４は、各選択画素から均等に階調値の減算を行う（ステップＳ３４５）。図２６（ｂ）の例では、２５５−８０＝１７５を選択した画素数４で除算すると、４３．７５となる。そこで、３つの画素に対して“４４”づつ減算し、残りの画素を“４３”だけ減算すれば丁度“１７５”となる。減算した結果を図２６（ｃ）に示す。
【０１２０】
次いでＣＰＵ２４は、他にＬ疎ドットがあれば上述の減算処理を繰り返し（ステップＳ３４６で“ＹＥＳ”の場合）、ないと減算処理が終了しステップＳ３８に移行する（ステップＳ３４６で“ＮＯ”の場合）。図２７（ａ）の例では、さらに（１，４）にＬ疎ドットが存在するので、Ｓ密＋Ｌ疎データに対しさらに上述の減算処理を繰り返すことになる。その結果、図２７（ｂ）に示す状態となる。
【０１２１】
一方、ステップＳ３４４で選択画素の階調値の合計が“２５５”を超えないとさらに周囲の未減算画素を選択し（ステップＳ３４７）、“２５５”を超えるまで処理が繰り返される。選択は、Ｓ疎ドットの減算処理のときと同様に斜め方向にある画素や、さらに周囲の画素を適宜選択するようにする。また、ステップＳ３４１で最初に選択したＬ疎ドットに対応する画素の階調値の合計が“２５５”を超えると（“ＹＥＳ”のとき）、選択画素を“２５５”だけ減算し、周囲の未減算画素の選択等を行わずにステップＳ３４６に移行することになる。以上により減算処理が終了する。その結果を図２７（ａ）に示す。
【０１２２】
図１７に戻り、次いでＣＰＵ２４は、減算済みＳ密データに対してディザ処理を行う（ステップＳ３８）。Ｓ密＋Ｌ疎データからＬ疎出力データを減算したので、減算後はＳ密データとなる。このＳ密データに対してディザ処理を行うのである。Ｓ成分に対しては、Ｓ用閾値マトリックスを使用し、処理内容は上述と同様に各Ｓ密成分の階調値とマトリックス内の閾値とを順次比較してＳ密ドットの有無を生成する。この有無を示す値は、ＲＡＭ２６内のＳ密出力データ格納領域２６８の対応位置に格納される。この領域２６８も同様に全体画像の画素位置に対応するように配列されている。図２７（ｂ）にその結果を示すように、Ｓ密データに対するディザ処理の結果、（２，２）、（２，５）にＳドットが打たれることになる。
【０１２３】
図１７に戻り、次いでＣＰＵ２４は、Ｓ疎出力データとＳ密出力データとを合成する（ステップＳ３９）。Ｓ疎出力データはステップＳ３３で生成され（図２３（ｃ）参照）、Ｓ密出力データはステップＳ３８で生成されている（図２７（ｂ）参照）ので、これを対応する画素位置ごとに加算する。加算した各値は、Ｓドット出力データ格納領域２６９ａに格納される。この領域２６９ａも各位置が全体画像の各画素位置に対応するものである。その結果を図２７（ｃ）の左図に示す。合成した結果は、Ｓドットの出力データとなる。
【０１２４】
次いでＣＰＵ２４は、Ｌ疎出力データとＬ密出力データとを合成する（ステップＳ４０）。Ｌ疎出力データはステップＳ３６で生成され（図２６（ａ）参照）、Ｌ密出力データはステップＳ３５で生成されている（図２５（ｃ）参照）ので、これを対応する画素位置ごとに加算する。加算した値は、Ｌドット出力データ格納領域２６９ｂに格納される。この領域２６９ｂも全体画像の各画素位置に対応するように配列されている。その結果を図２７（ｃ）の右図に示す。合成した結果は、Ｌドットの出力データとなる。
【０１２５】
以上により、ディザ法によるハーフトーン処理が終了し、ＳドットとＬドットの出力データが、パルス幅変調部２１２に出力されて以後印刷出力を得ることができる。
【０１２６】
なお上述の処理では、ＬドットとＳドットの２つのドットサイズで説明したが、他にもＭｉｄｄｌｅサイズのドットを含めた３つのサイズでも同様に本発明が適用でき同様の効果を得ることができる。例えば、入力階調値をＬドット、Ｓドットのほか、Ｍドット用の分版関数により、Ｌドット、Ｍドット、Ｓドットの３つの各成分に分離する。分離した各成分を密度順に疎、中密、密の各成分に分けて、各ドットごとに疎成分と、（疎＋中密）成分、（疎＋密）成分を生成する。まず、疎成分に対して上述したディザ法によるハーフトーン処理を行い、疎ドット出力を得る。（疎＋中密）成分、（疎＋密）成分のそれぞれから疎ドット出力を減算する処理を行う。そして、減算後の中密成分、密成分を加算して（中密＋密）成分を生成する。次に、減算後の中密成分に対してディザ法によるハーフトーン処理を行い、中密ドット出力を得る。そして、減算後に加算した（中密＋密）成分から中密ドット出力を減算して、密成分を得る。次に、この減算後の密成分に対してディザ法によるハーフトーン処理を行い、密ドット出力を得る。最後に、各ドットごとに生成した疎ドット出力、中密ドット出力、密ドット出力を合成して、Ｌドット、Ｍドット、Ｓドットを得てハーフトーン処理が終了する。その後、この出力結果がパルス幅変調部２１２に出力され印刷出力を得る。
【０１２７】
以上の処理後の印刷出力は、ＳドットとＬドットとが重なる確率が少なくなるため粒状的なドットの発生を抑え、視覚的に快適な印刷出力となる。
［誤差拡散法によるハーフトーン処理］
次に本発明が適用される誤差拡散法を用いたハーフトーン処理について説明する。この誤差拡散法も、所定の階調値を有する画素に対してドット生成の有無を示す値にする２値化手法の一つである。例えば、閾値を“１２７”とし、ある入力画素の階調値が“５０”のとき、閾値よりも少ない値となるので２値化すると“０”となる。この場合に、量子化値“０”に対して“５０”の誤差が生じている。そこで、誤差拡散法ではこの誤差を周辺の画素に拡散させて以後閾値と階調値とを比較して、再生データを得るのである。
【０１２８】
この誤差拡散法による処理は、ディザ法による処理と同様にＳ疎データに対して誤差拡散処理を行い、Ｓ疎出力データを得る。そして、Ｓ疎＋Ｌ密データに対して減算処理を行い、Ｌ密データを得る。このＬ密データに誤差拡散処理を行い、Ｌ密出力データを得る。また、Ｌ疎データに誤差拡散処理を行い、Ｌ疎出力データを得る。そして、Ｓ密＋Ｌ疎データに減算処理を行い、Ｓ密データを得て誤差拡散処理によりＳ密出力データを得る。最後に、Ｓ疎出力データとＳ密出力データとを合成してＳドッドの出力データを得、Ｌ疎出力データとＬ密出力データとを合成してＬドットの出力データを得るのである。その後、この出力ドットデータから印刷出力を得るのである。
【０１２９】
このようにドット密度が低くなるであろうものから先に誤差拡散処理を行い、その後減算処理をして、サイズの異なる方の密度の高い成分を得る。このような減算処理により、異なるサイズで互いに重なってドットが打たれる確率が低くなり、ディザ処理等のときと同様に粒状的なドットの生成を抑えることができるのである。
【０１３０】
逆にドット密度の高い方から先に誤差拡散法による処理を行うと、ＣＣ法やディザ法による処理の場合と同様に、確率的にドットが生成されない位置に対して減算処理を行ってしまうことになる。これにより、入力階調値に忠実でないドット分布となってしまうのである。
【０１３１】
この誤差拡散法を利用した本発明のハーフトーン処理のフローチャートを図１６乃至図１８に示す。また、ＲＡＭ２６に格納されたデータの例を図２８乃至図３４に示す。フローチャートに示すように誤差拡散法による本発明の処理は、ディザ法による場合とほぼ同様である。なお、本処理においてもＣＣ法やディザ法による場合と同様に処理開始前に分版関数（図８参照）によって、入力データがＳ成分の入力データとＬ成分の入力データに分版されるものとする。その例を図２８（ａ）に示す。また、このＲＡＭ２６は、ＣＣ法による場合と同様に複数の領域を有し、Ｓ成分の入力階調データとＬ成分の入力階調データとがそれぞれ、Ｓ成分入力データ格納領域２６１ａと、Ｌ成分入力データ格納領域２６１ｂに格納される。各領域２６１ａ、２６１ｂは、それぞれｍ行ｎ列の２次元構造を有し、各座標位置はホストコンピュータ１０で生成された画像の画素位置に対応するものである。説明を簡単にするため各領域とも６行６列で表現されているが、画像１フレーム分の各階調値を格納できる構成であってもよいし、これよりも少ない構成であってもよい。以下フローチャートに沿って説明する。
【０１３２】
図１６に示すようにＣＰＵ２４は、本処理を実行するためのプログラムをＲＯＭ２５から読出すことによって、処理が開始されることになる（ステップＳ３０）。次いで、ディザ処理の場合と同様にＳ成分、Ｌ成分のデータをＳ疎、Ｓ密、Ｌ疎、Ｌ密の４つのデータに分離する（ステップＳ３１）。ここで各４つのデータはディザ処理のときと同様に、Ｓ成分のうちドット密度の低い成分がＳ疎データ、高い成分がＳ密データで、Ｌ成分のうちドット密度の低い成分がＬ疎データ、高い成分がＬ密データである。
【０１３３】
まず、ディザ法と同様に図８に示す分版関数を用いて入力階調値をＳ成分とＬ成分とに分離する。図２８（ａ）に示す例では、入力値が“８０”であるデータをＳ成分“５０”とＬ成分“３０”とに分離し、入力値が“１２０”であるデータをＳ成分“４０”とＬ成分“８０”とに分離している。
【０１３４】
また、ドット密度の高低は、分離したＳ成分とＬ成分とで同じ画素位置にある画素に対して、ディザ法と同様に（各成分の階調値）／（ドット生成のための閾値）により比較することで判定する。本実施例においてもドット生成のための閾値として、Ｓドットの場合は“２００”、Ｌドットの場合は“２５５”を用いている。すなわち、図２８（ａ）に示す例では、（０，０）に位置するＳ成分とＬ成分の画素から、５０／２００＞３０／２５５となるので、当該位置ではＳ成分の方がドット密度が高く、Ｌ成分の方がドット密度が低くなる。一方、（０，３）の位置では、４０／２００＜８０／２５５でＳ成分の方がドット密度が低く、Ｌ成分がドット密度が高いものとなる。この高低を各画素位置で判定し、Ｓ成分でドット密度が低いときはその階調値を、高いときは“０”を対応する画素位置に格納したものがＳ疎データとなる。逆にＳ成分でドット密度が高いときはその階調値を、低いときは“０”を対応する画素位置に格納したものがＳ密データとなる。同様にＬ疎データ、Ｌ密データとを生成する。生成したこれらのうちＳ疎データとＬ疎データとをそれぞれＳ疎データ格納領域２６２ａ、Ｌ疎データ格納領域２６２ｂに格納する。その例を図２８（ｂ）に示す。この領域２６２ａ、２６２ｂも同様に２次元構造を有し、各座標位置が全体画像の画素位置に対応する。
【０１３５】
なお、生成したＳ密データとＬ密データは、ディザ処理の同様に減算処理後に生成するようにしているため、このステップＳ３１で生成した２つのＳ密、Ｌ密の両データをＲＡＭ２６に格納せず、演算のみＣＰＵ２４で行うようにしている。もちろん、別途Ｓ密データ格納領域２６２ｃ、Ｌ密データ格納領域２６２ｄを用意し図２８（ｂ）に示すようにＳ密データとＬ密データとをそれぞれ各領域２６２ｃ、２６２ｄに格納するようにしてもよい。
【０１３６】
図１６に戻り、次いでＣＰＵ２４は、Ｓ疎データとＬ密データとの和（Ｓ疎＋Ｌ密）と、Ｓ密データとＬ疎データとの和（Ｓ密＋Ｌ疎）の各データを生成する（ステップＳ３２）。図２８（ｃ）にその例を示す。この各データもＲＡＭ２６の領域２６３ａ、２６３ｂに格納されるが、この領域も全体画像の画素位置に対応するように配置されている。
【０１３７】
次いでＣＰＵ２４は、Ｓ疎データに対して誤差拡散処理を行う（ステップＳ３３）。この場合の誤差拡散処理は、Ｓ成分に対しては閾値として“１００”を用い、Ｌ成分に対しては“１２７”を用い、この閾値と各成分とを比較して処理を進めるものとする。また、拡散すべき誤差が発生したとき、各画素に対して図２９（ａ）に示す拡散マトリックスを使用して拡散させる。このマトリックス内の値は比率を示し、“Ｘ”は処理対象の画素位置を示す。例えば、“６０”の誤差が発生したときは、処理対象の画素の右と下の画素に“２０”、右下と左下の画素には“１０”の階調値を拡散させることになる。ここでマトリックス内で現在処理中の画素に対して上や左側に比率が示されていないのは、画素をラスター方向に左から順番に処理を進めていくからである。この処理も、ＲＯＭ２５にマトリックス内の各値が格納され、ＣＰＵ２４が処理の際に適宜読み出して演算を行うことになる。
【０１３８】
以後、この拡散された値を当該画素の階調値に加算して閾値と比較して処理が進められることになる。そして、閾値と各データの階調値とを比較し、階調値の方が閾値よりも大きいとＳドット打つことを示す“２００”（Ｌドットの場合は“１５５”）、そうでないとドットを打たないことを示す“０”を当該画素位置に割り当てる。
【０１３９】
図２９を参照して、誤差拡散処理を説明する。まず、初期画素である（０，０）に位置する画素を選択し、その階調値“０”と閾値である“１００”とを比較する。閾値の方が値が大きいので、その位置にはドットを生成しないことを示す値“０”を割り当てることになる。この値はＲＡＭ２６内のＳ出力データ格納領域２６４の（０，０）の位置に格納される。この領域２６４も同様に各画素位置が全体画像の画素位置に対応するように配列され、ＣＰＵ２４の制御により値が格納される。この場合、階調値はもともと“０”なので誤差は発生しないことになる。
【０１４０】
次にラスター方向に右隣の画素（１，０）に対して、その階調値と閾値とを比較する。閾値の方が大きいので、Ｓ出力データ格納領域２６４の（１，０）に“０”が格納される（図２９（ｃ）参照）。さらに、（２，０）に位置する画素の階調値と閾値と比較して領域の（２，０）の位置に“０”が格納される（図２９（ｄ）参照）。
【０１４１】
次に、（３，０）に位置する画素の階調値は“４０”で閾値よりも低い値であるが、“０”を領域２６４に格納した場合に“４０”の誤差が発生することになる。ここで拡散マトリックスを用いて、“４０”の値分まわりの画素に拡散させる必要がある。図２９（ａ）の拡散マトリックスから（４，０）、（３，１）の画素には、２／６×４０＝１３．３３・・・、（４，１）、（２，１）の画素には、１／６×４０＝６．６・・・となる。ただし、マトリックスの比率からそれぞれ２：１に拡散させる必要があるので、演算したこの値内でこの比率になる数値、すなわち“１２”と“６”とを拡散誤差領域２７０の各位置に格納することになる。図３０（ａ）の中央に例を示す。この図に示すようにＲＡＭ２６には拡散誤差格納領域２７０を有し、拡散すべき階調値が格納される。そして、画素の階調値と閾値とを比較するときにこの領域２６９に格納された値と当該画素の階調値とを加算した値で閾値と比較するようにする。
【０１４２】
次に、（４，０）に位置する画素に対して処理を行うが、もともとの階調値は“４０”で、領域２６９の（４，０）の位置には誤差分“１２”が格納されているので加算した“５２”と閾値“１００”とを比較する。閾値の方が値が大きいので、Ｓドットを生成しないことを示す値“０”がＳ出力データ格納領域２６４に格納されることになる。この場合も“５２”の誤差が発生するので、拡散マトリックスを用いてこの誤差分を拡散させる。誤差の演算は上述の方法により行い、図３０（ａ）での誤差分も加算して図３０（ｂ）の中央に示す誤差が領域２７０に格納されることになる。
【０１４３】
以上の処理を繰り返し、１行目を終了すると図３０（ｃ）に示すようにＳ疎出力データを得ることができる。次いでこれらの処理を２行目、３行目と繰り返し、すべての行に対して処理を行うと図３１（ａ）に示すようにＳ疎出力データを得ることができる。この図に示すように、（４，２）と（４，４）に位置する画素にＳドットを打つことを示す“２００”が格納されることになる。
【０１４４】
図１６に戻り、次いでＣＰＵ２４は、Ｓ疎＋Ｌ密データからＳ疎出力データの減算処理を行う（ステップＳ３４）。サイズの異なるドットが重なって打たれる確率を低くして、粒状性を改善するためである。具体的には、図３１（ｂ）に示すようにＳ疎ドットが生成される画素位置にＬ密ドットが打たれないようにＳ疎＋Ｌ密データのＳ疎ドット周辺からドット生成を示す“２００”分の階調値を減算する。処理自体はディザ処理のときと同様であり、そのフローチャートを図１８に示す。
【０１４５】
すなわち、まずＳ疎＋Ｌ密データのＳ疎ドットが生成される画素位置を選択する（ステップＳ３４０）。図３１（ｂ）の例では、（４，２）に位置する画素が選択されることになる。なお、この場合もＲＡＭ２６に減算値を合計した値が格納される領域２６５を有し、ＣＰＵ２４の制御により適宜その値が格納されることになる。
【０１４６】
次いでＣＰＵ２４は、選択画素の階調値が“２００”を超えるか否か判断する（ステップＳ３４１）。Ｓドッド生成を示す“２００”の値分だけ減算処理を行うためである。図３１（ｂ）の例では、選択画素の階調値が“１２０”であるので、本ステップでは“ＮＯ”が選択され、ステップＳ３４２に移行する。
【０１４７】
ステップＳ３４２においてＣＰＵ２４は、選択画素の階調値をすべて減算する。図３１（ｂ）の例では、選択画素（４，２）の階調値“１２０”をすべて減算することになる。また、このとき減算した値はＣＰＵ２４によって合計値格納領域２６５に格納されることになる。
【０１４８】
次いでＣＰＵ２４は、周囲の未減算画素を選択する（ステップＳ３４３）。ディザ処理と同様に上下左右の画素を選択することにする。もちろん、ディザ処理と同様にそれ以外の画素を選択するようにしてもよい。図３１（ｂ）に示す例では、（４，１）、（３，２）、（５，２）、（４，３）の画素を選択する。
【０１４９】
次いでＣＰＵ２４は、選択した画素の階調値の合計が“２００”を超えるか否か判断する。図３１（ｂ）の例では、ドット生成する画素と周りの４つの画素との階調値の合計が、１２０＋１２０×４＝６００でＳドット生成を示す閾値“２００”を超えることになるので、本ステップでは“ＹＥＳ”が選択されステップＳ３４５に移行することになる。選択画素の階調値が“２００”を超えないときは（“ＮＯ”のとき）、ステップＳ３４７に移行し、さらに周囲の未減算画素を選択し（ステップＳ３４７）、“２００”を超えるまでこの処理が繰り返される。このステップＳ３４７における未減算画素の選択もディザ処理の場合と同様に、斜め方向やさらにそのまわりの未減算画素を選択すればよい。
【０１５０】
選択画素の階調値が“２００”を超えると（ステップＳ３４４で“ＹＥＳ”のとき）、ＣＰＵ２４は各画素から均等に階調値を減算する処理を行う（ステップＳ３４５）。図３１（ｂ）の例では、Ｓ疎ドットが生成される画素位置の階調値は“１２０”で“２００”に達するにはあと“８０”分の階調値を４つの画素から減算すればよいことになる。よって、各画素から“２０”づつの階調値を減算する。
【０１５１】
次いでＣＰＵ２４は、他にＳ疎ドットがあれば上述の減算処理を行うことになる（ステップＳ３４６で“ＹＥＳ”のとき）。図３１（ｂ）に示す例では、さらに（４，４）の画素位置にもＳ疎ドットが生成されるので、この位置に対しても減算処理を行うことになる（図３２（ｃ）参照）。そして、他にＳ疎ドットがないと（ステップＳ３４６で“ＮＯ”のとき）、減算処理が終了し、図１６のステップＳ３５に移行することになる。なお、Ｓ疎＋Ｌ密データからＳ疎出力データを減算したので、減算後のＳ疎＋Ｌ密データは、Ｌ密データとなる。
【０１５２】
一方、ステップＳ３４１で選択画素の階調値が“２００”を超えるときは、この“２００”分だけ減算処理を行うことになる。Ｓ疎ドットが打たれる画素位置の階調値が“２００”を越える場合である。その後、ステップＳ３４６に移行して上述の処理を行うことになる。以上により、Ｓ疎＋Ｌ密データに対する減算処理が終了することになる。
【０１５３】
図１６に戻り、ＣＰＵ２４は減算済みＬ密データに対して誤差拡散処理を行う（ステップＳ３５）。Ｌ成分に対しては、閾値を“１２７”とし、誤差拡散マトリックスは図２９（ａ）に示すものを用いる。処理はＳ疎成分に対するものと同様に初期画素からラスター方向に各画素の階調値と閾値とを比較して、誤差があればマトリックスを利用して周辺に拡散させる。その結果、図３１（ｃ）に示すＬ密データに対して図３２（ａ）に示すＬ密出力データを得ることができる。なお、このＬ密出力データは、ＲＡＭ２６のＬ密出力データ格納領域２６６に格納される。この領域２６６も他のＲＡＭ２６内の領域と同様に、各画素位置は全体画像の画素位置に対応するように配列されている。
【０１５４】
図１６に戻り、ＣＰＵ２４は、Ｌ疎データに対して誤差拡散処理を行う（ステップＳ３６）。Ｌ疎データはステップＳ３１で生成され、Ｌ成分に対しては閾値“１２７”、拡散マトリックスは図２９（ａ）を用いて処理を行う。ＲＡＭ２６内には拡散誤差領域２７０、Ｌ疎出力データ格納領域２６７も同様にしてＲＡＭ２６内におき、各値が格納されるようにする（図３２（ｂ）参照）。各領域２６７、２７０も全体画像の各画素位置に対応するように配列されている。初期画素からラスター方向に検索し、閾値“１２７”と各画素位置の階調値とを比較することで同様に処理を行うことになる。そして、その処理の結果を図３２（ｃ）に示す。この例の場合は、（２，４）の位置にＬドットを打つことを示す“２５５”が格納されることになる。
【０１５５】
図１６に戻り、次いでＣＰＵ２４は、Ｓ密＋Ｌ疎データに対してＬ疎ドット周囲の減算処理を行う（ステップＳ３７）。Ｌ疎ドット周囲にＳ密ドットが重なって打たれないようにするためである。これも、ステップＳ３４と同様に図１８に示すフローチャートに従って処理が行われることになる。
【０１５６】
すなわち、ＣＰＵ２４は、Ｌ疎出力ドットが打たれる位置に対応するＳ密＋Ｌ疎データの位置を選択する（ステップＳ３４０）。図３３（ａ）に示す例では、（２，４）の位置にある画素を選択することになる。次いで、ＣＰＵ２４は、選択画素の階調値がＬ疎ドットを示す“２５５”を超えるか否か判断する（ステップＳ３４１）。図３３（ａ）に示す例では、選択画素の階調値が“８０”となっているので、閾値“２５５”を超えず本ステップで“ＮＯ”が選択される。
【０１５７】
次いでＣＰＵ２４は、選択画素の階調値をすべて減算する（ステップＳ３４２）。図３３（ａ）の例では、（２，４）に位置する画素の階調値“８０”を全て減算することになる。減算した階調値は、減算値の合計が格納される領域２６５に、ＣＰＵ２４によって格納される。次いで、周囲の未処理画素を選択する（ステップＳ３４３）。Ｓ疎＋Ｌ密データに対する減算処理等（図３１（ｂ）、（ｃ）等参照）と同様に処理対象の画素の上下左右の画素を選択する。図３３（ａ）の例では、（２，３）、（１，４）、（２，５）の３つの画素を選択する。この場合、（３，４）の画素も選択対象となるが、もともと階調値が“０”となっているので、減算処理の対象とはしないことにして処理を進める。
【０１５８】
次いでＣＰＵ２４は、周囲の画素を選択した後、その階調値の合計がＬドット生成を示す“２５５”を超えるか否か判断する（ステップＳ３４４）。図３３（ａ）の例では、８０＋８０×３＝３２０で“２５５”を超えるので“ＹＥＳ”が選択される。次いでＣＰＵ２４は、各選択画素から閾値である“２５５”を超えないように均等に階調値を減算する（ステップＳ３４６）。図３３（ａ）の例では、ステップＳ３４２で、（２，４）の画素の階調値を減算したので、閾値“２５５”からの残りの値“１７５”（＝２５５−８０）を３つの画素で均等に減算させることになる。よって、１７５／３＝５８．３３・・・となるので、３画素から５８、５８、５９の階調値を減算させればよいことになる。その減算結果を図３３（ｂ）に示す。この場合も、１つだけ“５９”の階調値を減算させる画素が存在するが、ランダムに選択することにする。
【０１５９】
図１８に戻り、次いでＣＰＵ２４は、他にＬ疎ドットがあるか否か判断（ステップＳ３４６）して、かかるドットがなくなるまで上述の処理を繰り返すことになる。一方、ステップＳ３４４で選択画素の階調値の合計が“２５５”を超えないとき（“ＮＯ”のとき）、さらに周囲の未減算画素を選択する（ステップＳ３４７）。Ｓ疎＋Ｌ密データ等に対する減算処理と同様に、斜め方向の隣接画素やさらにまわりの画素を選択するようにすればよい。さらに、ステップＳ３４１で選択画素の階調値が“２５５”を超えるときは（“ＮＯ”のとき）、選択画素の階調値から閾値分“２５５”を減算して処理を進めればよいことになる。以上により、Ｓ密＋Ｌ疎データに対する減算処理が終了することになる。なお、減算処理後のＳ密＋Ｌ疎データは、Ｌ疎出力データから減算したので、Ｓ密データとなる。
【０１６０】
図１７に戻り、次いでＣＰＵ２４は、減算済みＳ密データに対して誤差拡散処理を行う（ステップＳ３８）。これも、ステップＳ３３、Ｓ３５、Ｓ３６と同様に各座標位置に格納された階調値と閾値（この場合はＳドット生成を示す“１００”）とを比較し、閾値よりも大きいとＳドット生成を示す“１００”、そうでないと“０”とし、また誤差分は図２９（ａ）に示すマトリックスを使用してまわりの画素に拡散させる。閾値との比較は、拡散された誤差があれば本来の階調値に加算して処理をする。これを、Ｓ密データの（０，０）からラスター方向に順に比較し、すべての画素の階調値に対して処理を行う。その結果を図３３（ｃ）に示す。この各値も、ＲＡＭ２６内のＳ密出力データ格納領域２６８に格納される。この図に示すようにＳ密データに対するＳドットとして、（１，０）、（１，１）、（１，２）、（１，３）、（０，５）に位置する５つの画素に打たれることになる。
【０１６１】
次いでＣＰＵ２４は、Ｓ疎ドットとＳ密ドットとを合成する（ステップＳ３９）。すなわち、ステップＳ３３で生成したＳ疎出力データ（図３１（ａ）参照）と、ステップＳ３８で生成したＳ密出力データ（図３３（ｃ）参照）とを対応する各座標位置どうしでその和を演算する。演算した各値は、ＣＰＵ２４の制御により、Ｓドット出力データ格納領域２６９ａに格納される。この領域２６９ａも全体画像の各画素位置に対応するように配列されている。その結果を図３４（ａ）の左図に示す。この合成データがＳドットの出力データとなる。
【０１６２】
次いでＣＰＵ２４は、Ｌ疎ドットとＬ密ドットとを合成する（ステップＳ４０）。すなわち、ステップＳ３５で生成したＬ密出力データ（図３２（ａ）参照）とステップＳ３６で生成したＬ疎出力データ（図３２（ｃ）参照）とを対応する各座標位置どうしでその和を演算する。演算した各値は、ＣＰＵ２４の制御により、ＲＡＭ２６内のＬドット出力データ格納領域２６９ｂに格納される。この領域２６９ａも全体画像の各画素位置に対応するように配列されている。その結果を図３４（ｂ）の右図に示す。この合成データがＬドットの出力データとなる。
【０１６３】
このＳドットとＬドットの出力データがハーフトーン処理部２１１からパルス幅変調部２１２に入力されて、以後ホストコンピュータ１０からのデータの印刷出力を得ることができるのである。
【０１６４】
この図３４に示す２つのサイズのドット生成位置は、互いに重なる部分がなく、よって粒状的なドットの発生を抑え、ＳドットをＬドットとでドット間距離が一定に保たれ、快適な画像出力を得ることができる。
【０１６５】
このＳドット、Ｌドットの出力データは、印刷エンジン２２に出力され、この出力データをもとにインク量が制御され、ホストコンピュータ１０で生成された画像の印刷出力を得ることができるのである。
【０１６６】
なお上述の処理では、ＬドットとＳドットの２つのドットサイズで説明したが、他にもＭｉｄｄｌｅサイズのドットを含めた３つのサイズでも同様に本発明が適用でき同様の効果を得ることができる。具体的にはディザ法による３つのサイズのドットと同様である。すなわち、入力階調値を分版関数によりＬドット、Ｍドット、Ｓドットの３つの各成分に分離し、各成分を密度順に疎、中密、密の各成分に分けて、加算、減算処理を行い、得られた疎ドット、中密ドット、密ドットの各出力を合成して出力ドットを得るのである。
【０１６７】
以上のように本発明では、ＣＣ法、ディザ法、誤差拡散法いずれのハーフトーン処理においても、サイズの異なるドット同士が重なり合う確率を下げて出力画像の粒状性を改善し、視覚的に快適な出力画像を得ることができる。
【０１６８】
上述の実施例では、図１に示す画像出力装置１０を用いて処理が行われるものとして説明したが、例えば図３５に示すような他のシステムにおいても適用される。すなわち、図３５に示すように、ホストコンピュータ１０内に、ハーフトーン処理部２１１を備え、処理後のデータを画像出力装置２０に出力するようにしている。この場合、上述したＣＣ法、ディザ法、誤差拡散法による処理は、いづれもホストコンピュータ１０内のハーフトーン処理部２１１で処理が行われることになる。
【０１６９】
また、画像出力装置２０としてレーザープリンタを用いた例で説明したが、他にもインクを用いたインクジェットプリンタやバブルジェットプリンタを用いても本発明が適用され同様の効果を得ることができる。
【図面の簡単な説明】
【０１７０】
【図１】本発明が適用されるシステム全体の構成を示す図である。
【図２】画像出力装置の構成を示す図である。
【図３】ＣＣ法による処理の動作を示すフローチャートである。
【図４】Ｓドットが生成される処理の動作を示すフローチャートである。
【図５】Ｓドットが生成される処理の動作を示すフローチャートである。
【図６】Ｌドットが生成される処理の動作を示すフローチャートである。
【図７】Ｌドットが生成される処理の動作を示すフローチャートである。
【図８】分版関数の例を示す図である。
【図９】ＲＡＭ２６の内部構成の例を示す図である。
【図１０】ＲＡＭ２６の内部構成の例を示す図である。
【図１１】ＲＡＭ２６の内部構成の例を示す図である。
【図１２】ＲＡＭ２６の内部構成の例を示す図である。
【図１３】ＲＡＭ２６の内部構成の例を示す図である。
【図１４】ＲＡＭ２６の内部構成の例を示す図である。
【図１５】ＲＡＭ２６の内部構成の例を示す図である。
【図１６】ディザ法及び誤差拡散法による処理の動作を示すフローチャートである。
【図１７】ディザ法及び誤差拡散法による処理の動作を示すフローチャートである。
【図１８】減算処理の動作を示すフローチャートである。
【図１９】ＲＡＭ２６の内部構成の例を示す図である。
【図２０】閾値マトリックスの例を示す図である。
【図２１】ＲＡＭ２６の内部構成の例を示す図である。
【図２２】ＲＡＭ２６の内部構成の例を示す図である。
【図２３】ＲＡＭ２６の内部構成の例を示す図である。
【図２４】ＲＡＭ２６の内部構成の例を示す図である。
【図２５】ＲＡＭ２６の内部構成の例を示す図である。
【図２６】ＲＡＭ２６の内部構成の例を示す図である。
【図２７】ＲＡＭ２６の内部構成の例を示す図である。
【図２８】ＲＡＭ２６の内部構成の例を示す図である。
【図２９】拡散マトリックスの例を示す図である。
【図３０】ＲＡＭ２６の内部構成の例を示す図である。
【図３１】ＲＡＭ２６の内部構成の例を示す図である。
【図３２】ＲＡＭ２６の内部構成の例を示す図である。
【図３３】ＲＡＭ２６の内部構成の例を示す図である。
【図３４】ＲＡＭ２６の内部構成の例を示す図である。
【図３５】本発明が適用されるシステム全体構成の他の例を示す図である。
【符号の説明】
【０１７１】
１０  ホストコンピュータ    ２０  画像出力装置    ２１  画像処理部    ２１１  ハーフトーン処理部    ２２  印刷エンジン    ２４  ＣＰＵ    ２５  ＲＯＭ    ２６  ＲＡＭ    ２６１ａ  Ｓ成分入力データ格納領域    ２６１ｂ  Ｌ成分入力データ格納領域    ２６２ａ  Ｓ疎成分入力データ格納領域    ２６３ａ  Ｓ疎＋Ｌ密データ格納領域    ２６３ｂ  Ｓ密＋Ｌ疎データ格納領域    ２６４  Ｓ疎出力データ格納領域    ２６５  減算値格納領域    ２６６  Ｌ密出力データ格納領域    ２６７  Ｌ疎出力データ格納領域    ２６８  Ｓ密出力データ格納領域    ２６９ａ  Ｓ疎＋Ｌ密出力データ格納領域    ２６９ｂ  Ｓ密＋Ｌ疎出力データ格納領域    ２７０  拡散誤差格納領
【図１】
2005064941.tif 000003
【図２】
2005064941.tif 000004
【図３】
2005064941.tif 000005
【図４】
2005064941.tif 000006
【図５】
2005064941.tif 000007
【図６】
2005064941.tif 000008
【図７】
2005064941.tif 000009
【図８】
2005064941.tif 000010
【図９】
2005064941.tif 000011
【図１０】
2005064941.tif 000012
【図１１】
2005064941.tif 000013
【図１２】
2005064941.tif 000014
【図１３】
2005064941.tif 000015
【図１４】
2005064941.tif 000016
【図１５】
2005064941.tif 000017
【図１６】
2005064941.tif 000018
【図１７】
2005064941.tif 000019
【図１８】
2005064941.tif 000020
【図１９】
2005064941.tif 000021
【図２０】
2005064941.tif 000022
【図２１】
2005064941.tif 000023
【図２２】
2005064941.tif 000024
【図２３】
2005064941.tif 000025
【図２４】
2005064941.tif 000026
【図２５】
2005064941.tif 000027
【図２６】
2005064941.tif 000028
【図２７】
2005064941.tif 000029
【図２８】
2005064941.tif 000030
【図２９】
2005064941.tif 000031
【図３０】
2005064941.tif 000032
【図３１】
2005064941.tif 000033
【図３２】
2005064941.tif 000034
【図３３】
2005064941.tif 000035
【図３４】
2005064941.tif 000036
【図３５】
2005064941.tif 000037