(57)【要約】【課題】ドット間距離を保ちつつ、滑らかな階調とエッジの再現性の高い、快適な印刷出力を得る。【解決手段】各画素所定の階調値を有する画像データが入力され、初期画素から探索し、探索した画素を含めた画素の階調値の合計が所定の閾値以上になるまでセルを構成する画素の選択を行う。このとき、セル内の画素の平均階調値が所定値（例えば“３０”）以上のとき、ドット間距離を保つため、閾値を例えばこれまでの“２５５”から“５１０”に変更する。また、セル内の最大階調値と最小階調値の差が所定値（例えば“５０”）より大きいとき、エッジの領域であるとして変更した閾値“５１０”を“２５５”に下げ、ドット密度を上げる。また画素の選択は重心位置から最も近い画素を選択する。閾値以上となるまで画素を選択するとその重心位置にドットを生成させる。【選択図】図８
2005136976.tif 000002
【特許請求の範囲】
【請求項１】
画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータに変換する画像処理装置において、
画素選択のための第１の基準点に基づいて、画素ごとの前記Ｎ種類のレベル値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成手段と、
前記画素群生成手段で生成した画素群の第２の基準点を決定する画素群基準点決定手段と、
前記画素群基準点決定手段で決定した前記第２の基準点に位置する画素に前記Ｍ種類のレベル値を付与する付与手段と、を備え、
前記画素群生成手段は、前記第１の基準点を更新して当該第１の基準点に基づいて前記画素を選択し、さらに生成した前記画素群内のレベル値に応じて前記閾値を更新することを特徴とする画像処理装置。
【請求項２】
請求項１記載の画像処理装置において、
前記画素群生成手段は、生成した前記画素群内の画素のレベル値の平均値に応じて前記閾値を更新する、ことを特徴とする画像処理装置。
【請求項３】
請求項１記載の画像処理装置において、
前記画素群生成手段は、生成した前記画素群内のレベル値が第１の値より大きいとき、前記閾値をこれまでの第２の値から前記第２の値より大きい第３の値に更新する、ことを特徴とする画像処理装置。
【請求項４】
請求項１記載の画像処理装置において、
前記画素群生成手段は、生成した前記画素群内のレベル値の最大値と最小値の差が第４の値よりも大きいとき、前記閾値をこれまでの第５の値から前記第５の値より低い第６の値に更新する、ことを特徴とする画像処理装置。
【請求項５】
請求項１記載の画像処理装置において、
前記第２の基準点は、前記画素群の各画素位置と各画素の前記Ｎ種類のレベル値とから演算した重心位置である、ことを特徴とする画像処理装置。
【請求項６】
請求項１記載の画像処理装置において、
前記画素群生成手段は、前記第１の基準点に基づいて選択すべき画素が複数あるときはランダムにいづれか一の画素を選択する、ことを特徴とする画像処理装置。
【請求項７】
画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータに変換する画像処理装置において、
前記Ｎ種類のレベル値を有する画素を選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する画素群生成手段と、
前記画素群生成手段で生成した画素群の所定画素に対して前記Ｍ種類のレベル値を付与する付与手段と、を備え、
前記画素群生成手段は、生成した前記画素群内のレベル値に応じて前記閾値を更新することを特徴とする画像処理装置。
【請求項８】
画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータを出力する画像処理方法において、
画素選択のための第１の基準点に基づいて、画素ごとの前記Ｎ種類のレベル値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成工程と、
前記画素群生成工程で生成した画素群の第２の基準点を決定する画素群基準点決定工程と、
前記画素群基準点決定工程で決定した前記第２の基準点に位置する画素に前記Ｍ種類のレベル値を付与する付与工程と、を備え、
前記画素群生成工程は、前記第１の基準点を更新して当該第１の基準点に基づいて前記画素を選択し、さらに生成した前記画素群内のレベル値に応じて前記閾値を更新することを特徴とする画像処理方法。
【請求項９】
画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータを出力する画像処理方法において、
前記Ｎ種類のレベル値を有する画素を選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する画素群生成工程と、
前記画素群生成手段で生成した画素群の所定画素に対して前記Ｍ種類のレベル値を付与する付与工程と、を備え、
前記画素群生成工程は、生成した前記画素群内のレベル値に応じて前記閾値を更新することを特徴とする画像処理方法。
【請求項１０】
画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるためのプログラムにおいて、
画素選択のための第１の基準点に基づいて、画素ごとの前記Ｎ種類のレベル値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成処理と、
前記画素群生成処理で生成した画素群の第２の基準点を決定する画素群基準点決定処理と、
前記画素群基準点決定処理で決定した前記第２の基準点に位置する画素に前記Ｍ種類のレベル値を付与する付与処理と、を備え、
前記画素群生成処理は、前記第１の基準点を更新して当該第１の基準点に基づいて前記画素を選択し、さらに生成した前記画素群内のレベル値に応じて前記閾値を更新することを特徴とするプログラム。
【請求項１１】
画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるプログラムにおいて、
前記Ｎ種類のレベル値を有する画素を選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する画素群生成処理と、
前記画素群生成手段で生成した画素群の所定画素に対して前記Ｍ種類のレベル値を付与する付与処理と、を備え、
前記画素群生成処理は、生成した前記画素群内のレベル値に応じて前記閾値を更新することを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、レーザプリンタなどの画像処理装置における階調画像データのハーフトーン処理に関する。詳しくは、閾値に達するまでセルを構成する画素を選択し、そのセルの基準点にドットを発生させるように処理を行うが、画素の入力階調値に応じて閾値を変更するようにした処理に関する。
【背景技術】
【０００２】
従来から、プリンタなどの画像出力装置は、各画素ごとに多値の階調値を有する階調データに対して、ドットの有無を表す２値の値に変換処理して印刷用紙に印刷を行うようになされている。一般には、多値の階調値を２値の値に変換する処理のことをハーフトーン処理と称されている。
【０００３】
かかるハーフトーン処理の方法としては、所定の閾値が格納された閾値マトリックスを利用して、入力階調値が閾値よりも大きいか小さいかにより２値化するディザ法や、閾値を設定しその閾値よりも大きいか小さいかにより２値化するとともにその誤差分をまわりの画素に分散して処理を進める誤差拡散法もある。
【０００４】
さらに、入力画像の各画素の階調値の合計が所定の閾値になるまでセルを構成する画素を選択し、セルの中心位置にドットを生成させるようにしたハーフトーン処理も知られている（例えば、特許文献１）。
【特許文献１】特開平１１−２７５２８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、上述した特開平１１−２７５２８においては、セルを構成する画素の選択を所定のテーブルを用いて行っているが、テーブル内で左側に存在する画素は既に処理済みの場合が多く、結果的に生成されるセルが歪んだ形となってしまう。かかる場合に、セルの中心にドットを生成させるとある部分では隣のドットを重なって形成されてしまうことになる。かかるハーフトーン処理における印刷出力は、ドットがある部分で重なって発生するため、全体として見た場合に粒状的にドットが存在し、視覚的に不快な印刷出力となっていた。
【０００６】
とくに、レーザプリンタの場合に例えば１画素おきにドットを生成させるような場合に、その性能によってはドットが重なってしまい、滑らかな階調を表現したドットを生成させることができない場合もある。
【０００７】
さらに、上述した特開平１１−２７５２８において、階調値の変化の大きいエッジの部分ではセルの形状が歪んだ形になりやすく、セルの中心にドットを打つようにしてもエッジの領域でドットが離れすぎたり重なったりするなど、再現性がよいものとはいえず、不快な印刷出力となっていた。
【０００８】
そこで、本発明の目的は、ドット間距離を保ちつつ、滑らかな階調とエッジの再現性の高い、快適な印刷出力を得ることにある。
【課題を解決するための手段】
【０００９】
上記目的を達成するために本発明は、画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータに変換する画像処理装置において、画素選択のための第１の基準点に基づいて、画素ごとのＮ種類のレベル値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成手段と、画素群生成手段で生成した画素群の第２の基準点を決定する画素群基準点決定手段と、画素群基準点決定手段で決定した第２の基準点に位置する画素にＭ種類のレベル値を付与する付与手段と、を備え、画素群生成手段は、第１の基準点を更新して当該第１の基準点に基づいて画素を選択し、さらに生成した画素群内のレベル値に応じて閾値を更新することを特徴としている。これにより、例えば、ドット間距離を保ちつつ、滑らかな階調を表現した快適な印刷出力を得ることができる。
【００１０】
さらに、本発明は上記画像処理装置において、上記画素群生成手段は、生成した画素群内の画素のレベル値の平均値に応じて前記閾値を更新することを特徴としている。これにより、例えば、セルとして画素を選択している領域が平均階調値が高いと高濃度の領域と判断して、閾値を変更することでドット間距離を保つことができる。
【００１１】
さらに、本発明は上記画像処理装置において、上記画素群生成手段は、生成した画素群内のレベル値が第１の値より大きいとき閾値をこれまでの第２の値から第２の値より大きい第３の値に更新することを特徴としている。これにより、例えば、レベル値の変化が大きいとそれだけ閾値の値を大きくとることでセルの大きさを保ち、ドット間距離を保つことができる。
【００１２】
さらに、本発明は上記画像処理装置において、上記画素群生成手段は、生成した画素群内のレベル値の最大値と最小値の差が第４の値よりも大きいとき、閾値をこれまでの第５の値から第５の値より低い第６の値に更新することを特徴としている。これにより、例えば、エッジの領域ではドット密度を高めてその再現性を向上させることができる。
【００１３】
さらに、本発明は上記画像処理装置において、上記第２の基準点は画素群の各画素位置と各画素のＮ種類のレベル値とから演算した重心位置であることを特徴としている。これにより、例えば、円状に成長した画素群の重心位置にドットが打たれるようになるため各ドットの間隔が一定距離に保たれた快適な印刷出力を得ることができる。
【００１４】
さらに、本発明は上記画像処理装置において、上記画素群生成手段は、第１の基準点に基づいて選択すべき画素が複数あるときはランダムにいづれか一の画素を選択することを特徴としている。これにより、例えば、画素群が円状に成長しやすくなり、第２の基準点にドットを打てばそのドット間距離が一定に保たれる。
【００１５】
また、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータに変換する画像処理装置において、Ｎ種類のレベル値を有する画素を選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する画素群生成手段と、画素群生成手段で生成した画素群の所定画素に対してＭ種類のレベル値を付与する付与手段と、を備え、画素群生成手段は、生成した前記画素群内のレベル値に応じて前記閾値を更新することを特徴としている。これにより、例えば、ドット間距離を保ちつつ、滑らかな階調を表現した快適な印刷出力を得ることができる。
【００１６】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータに変換する画像処理方法において、画素選択のための第１の基準点に基づいて、画素ごとのＮ種類のレベル値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成工程と、画素群生成工程で生成した画素群の第２の基準点を決定する画素群基準点決定工程と、画素群基準点決定工程で決定した前記第２の基準点に位置する画素にＭ種類のレベル値を付与する付与工程とを備え、画素群生成工程は、第１の基準点を更新して当該第１の基準点に基づいて画素を選択し、さらに生成した前記画素群内のレベル値に応じて閾値を更新することを特徴としている。これにより、例えば、ドット間距離を保ちつつ、滑らかな階調を表現した快適な印刷出力を得ることができる。
【００１７】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データを、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータに変換する画像処理方法において、Ｎ種類のレベル値を有する画素を選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する画素群生成工程と、画素群生成手段で生成した画素群の所定画素に対してＭ種類のレベル値を付与する付与工程とを備え、画素群生成工程は、生成した前記画素群内のレベル値に応じて閾値を更新することを特徴としている。これにより、例えば、ドット間距離を保ちつつ、滑らかな階調を表現した快適な印刷出力を得ることができる。
【００１８】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるためのプログラムにおいて、画素選択のための第１の基準点に基づいて、画素ごとのＮ種類のレベル値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成処理と、画素群生成処理で生成した画素群の第２の基準点を決定する画素群基準点決定処理と、画素群基準点決定処理で決定した第２の基準点に位置する画素にＭ種類のレベル値を付与する付与処理とを備え、画素群生成処理は、第１の基準点を更新して当該第１の基準点に基づいて画素を選択し、さらに生成した画素群内のレベル値に応じて閾値を更新することを特徴としている。これにより、例えば、ドット間距離を保ちつつ、滑らかな階調を表現した快適な印刷出力を得ることができる。
【００１９】
さらに、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは整数）種類以上のレベル値を有する階調データに対して、画素ごとにＭ（Ｍは整数）種類のレベル値を有するデータを出力する処理をコンピュータに実行させるプログラムにおいて、Ｎ種類のレベル値を有する画素を選択し、選択した画素ごとのレベル値の総和が閾値となるまで未処理画素を選択して画素群を生成する画素群生成処理と、画素群生成手段で生成した画素群の所定画素に対してＭ種類のレベル値を付与する付与処理とを備え、画素群生成処理は、生成した画素群内のレベル値に応じて前記閾値を更新することを特徴としている。これにより、例えば、ドット間距離を保ちつつ、滑らかな階調を表現した快適な印刷出力を得ることができる。
【発明を実施するための最良の形態】
【００２０】
以下、図面を参照して本発明を実施するための最良の形態を説明する。図１は、本発明が適用されるシステム全体の構成を示す図である。全体としてホストコンピュータ１０と、画像出力装置２０とから構成される。
【００２１】
ホストコンピュータ１０は、アプリケーション部１１とラスタライズ部１２とから構成される。アプリケーション部１１では、文字データ、図形データ、ビットマップデータ等の印刷対象のデータが生成される。例えば、ホストコンピュータ１０でワードプロセッサや図形ツールなどのアプリケーションプログラムを使用してキーボード等の操作により文字データや図形データなどが生成される。生成されたこれらのデータは、ラスタライズ部１２へ出力される。
【００２２】
ラスタライズ部１２では、アプリケーション部１１から出力された印刷対象のデータを画素ごと（又はドットごと）に８ビットの階調データに変換される。したがって、各画素ごと０から２５５までの階調値（レベル値）を有することになる。ラスタライズ部１２における階調データの生成は、実際にはホストコンピュータ１０に実装されたドライバによって処理が行われる。ラスタライズ部１２から出力される階調データは、画像出力装置２０に出力される。なお、本実施例においてこの階調データはモノクロデータとして以下説明する。
【００２３】
画像出力装置２０は、全体として画像処理部２１と印刷エンジン２２とから構成される。画像処理部２１では、ホストコンピュータ１０から出力された階調データに対してハーフトーン処理等を行う。処理後のデータは印刷エンジン２２に出力され、この印刷エンジン２２にて実際に印刷用紙等の記録媒体への印刷が行われる。
【００２４】
画像処理部２１は、ハーフトーン処理部２１１と、パルス幅変換部２１２とから構成される。ハーフトーン処理部２１１は、ホストコンピュータ１０から出力された階調データが入力され、２値以上の多値の値（レベル値）に変換し、量子化データを出力する。ハーフトーン処理としては、本実施例では複数の画素からなるセルを構成してその重心にドットを生成させる重心利用した処理（Circular Cell法、以下ＣＣ法）を行う。本処理の具
体的な内容は後述する。
【００２５】
パルス幅変調部２１２は、ハーフトーン処理部２１１から出力された量子化データが入力され、この量子化データに対してドットごとにレーザ駆動パルス有り又は無し等の駆動データを生成する。生成した駆動データは、印刷エンジン２２に出力される。
【００２６】
印刷エンジン２２は、レーザドライバ２２１とレーザーダイオード（ＬＤ）２２２とから構成される。レーザドライバ２２１は、パルス幅変調部２１２からの駆動データが入力され、その駆動データをもとに駆動パルスあり又はなし等を示す制御データを生成し、レーザーダイオード２２２に出力する。レーザーダイオード２２２は、レーザドライバ２２１から出力された制御データに基づいて駆動され、さらに図示しない感光ドラムや転写ベルトが駆動されて、実際に印刷用紙等の記録媒体にホストコンピュータ１０からのデータが印刷されることになる。
【００２７】
次に図２を参照して、画像出力装置２０の具体的構成について説明する。ここで、図１の画像出力装置２０のうち、ハーフトーン処理部２１１及びパルス幅変調部２１２は、図２におけるＣＰＵ２４、ＲＯＭ２５、及びＲＡＭ２６に対応する。
【００２８】
画像出力装置２０は、全体として、入力インターフェース（Ｉ／Ｆ）２３、ＣＰＵ２４、ＲＯＭ２５、ＲＡＭ２６、印刷エンジン２２とから構成され、バスを介して互いに接続されている。入力Ｉ／Ｆ２３は、ホストコンピュータ１０と画像出力装置２０とのインターフェースの役割を果たす。入力Ｉ／Ｆ２３には、所定の伝送方式により伝送された、ホストコンピュータ２０からの階調データが入力され、画像出力装置２０で処理できるデータに変換される。入力された階調データは、一旦ＲＡＭ２６に格納される。
【００２９】
ＣＰＵ２４は、バスを介して入力Ｉ／Ｆ２３、ＲＯＭ２５、ＲＡＭ２６、印刷エンジン２２と接続され、ＲＯＭ２５に格納されたプログラムを読み出して、ハーフトーン処理等の各種処理を行う。その詳細は後述する。ＲＡＭ２６は、ＣＰＵ２４で実行される各処理のワーキングメモリとして役割を果たし、処理後の各種データが格納される。また、印刷エンジン２２のレーザドライバ２２１を駆動させるための駆動データも格納される。ＲＡＭ２６の具体的構成等も後述する。
【００３０】
印刷エンジン２２は、図１の印刷エンジンと同様の構成で、ＲＡＭ２６に格納された駆動データがＣＰＵ２４の制御により入力されて、上述した印刷処理が行われることになる。
【００３１】
次に、このハーフトーン処理部２１２における処理について以下、具体的に説明するが、その前にＣＣ法についての概要を簡単に説明する。ＣＣ法によるハーフトーン処理は、まず初期画素を選択し、所定の閾値に達するまで初期画素周辺の未処理画素を選択して、複数画素からなるセルを構成する。セルを構成する未処理画素選択の際、それまで構成したセルの重心位置から最も近い画素を選択する。そして、閾値に達するとそのセルの重心位置に位置する画素にドット生成を示す値（例えば“２５５”）を割り当て、それ以外の画素はドットの生成を行わないことを示す値（例えば“０”）を割り当てる。ＣＣ法は、以上の処理を入力画像の全てのデータに対して行うことで、量子化されたデータを得るのである。
【００３２】
上述した特開平１１−２７５２８では、セルに取り込むべき未処理画素の選択にテーブルを利用して予め決められた位置の画素を選択するようにしている。一方、ＣＣ法は重心位置を利用してセルに取り込むべき未処理画素を選択するようにしているため、特開平１１−２７５２８と比較して、セルが円状に成長し、ドット間距離を一定に保つことができ、ドットの分散性を向上させて視覚的に快適な印刷出力を得ることができるのである。
【００３３】
一方、レーザプリンタの場合、露光ユニット内のレーザ光を感光体ドラムに照射することで潜像を形成するが、１画素分のドットを形成させるとき光の特質により正確に１画素分の大きさのドットを形成させることができない。隣接画素から除々に光量が多くなり照射すべき画素内で最も高い光量となり、また除々に少ない光量となる。すなわち、隣接画素に跨って光が照射されてしまうのである。このため、１画素おきにドットを形成させるような場合、使用するレーザプリンタによっては連続してドットが発生することがあり、これが粒状的なドットを発生させる原因にもなっている。
【００３４】
ここで、ＣＣ法による処理をレーザプリンタに応用した場合に、セルを構成するための閾値を一定にすると各画素の階調値が小さい領域では階調値の合計がなかなか閾値に達することができないためにセルの大きさは比較的大きくその重心にドットを生成させると、ドット間の距離が長く保たれているので粒状的なドットの発生を抑える確率は高くなる。しかしながら、階調値が大きい領域ではすぐに閾値に達してしまうためセルの大きさは比較的小さくその重心にドットを打つようにしても隣接するドットどうしが重なりドット間距離が保つことができず、粒状的なドットを発生させてしまう確率が高くなる。そこで、本発明ではセルを構成するための閾値をセル内の画素の階調値によって変化させることで、粒状的なドットの発生を抑え、滑らかな階調表現を実現しようとするものである。具体的には、セルを構成する画素の階調値の平均値が一定値以上のとき、その閾値を高くし、セルの大きさを大きく保つようにすることで、ドット間距離を保ち粒状的なドットの発生を抑えるのである。
【００３５】
また、上述したようにレーザプリンタは、例えば１画素分の大きさのような小さいドットを安定して出力することは困難である。このようなプリンタでＣＣ法による閾値を固定にすると入力階調値が低い領域では、例えば１画素分の領域にしかドットが発生しない場合が多い。これでは、上述したように隣の画素までドットが発生したりするなど、粒状的なドットを発生させてしまう。そこで、入力階調値に応じてその閾値を更新して、できるだけ２画素分のドット、３画素分のドットなど安定したサイズのドットを発生させるようにするのである。このようにすることで、本発明では階調値が低い領域でも小さいドットを発生させる確率を低くして、粒状的でない安定したサイズのドットを発生させることができる。したがって、ドットサイズが小さいと粒状的なドットを発生させてしまうレーザプリンタであっても、入力階調値に応じて閾値を変更することで、ドット間距離は広がるものの１つ１つのドットが安定した、粒状的でないドットを発生し快適な印刷出力を得ることができるのである。
【００３６】
図３には、レーザプリンタによる出力例を示す。図３（ａ）は閾値を一定にした場合の例、図３（ｂ）は閾値をセル内の画素の平均階調値によって高くした場合の例である。入力階調値は双方とも図面上左から右にかけて除々にその値が大きくなっている。閾値を一定にすると(図３（ａ）の場合)、階調値が大きい領域（図面右側）ではドットが密集し、上述したレーザプリンタの特性から、所々でドットどうしが引っ付いたりするなど粒状的なドットが発生している。一方、図３（ｂ）の場合、階調値が大きい領域でもドット間距離が保たれ粒状的なドットは発生していない。かかるドットは全体的に滑らかな階調を表現している、といえる。
【００３７】
また、階調の表現自体も図３（ａ）の場合、右側にいくに従って除々にドットが密集するように配置されることで階調が表現されている。一方、図３（ｂ）の場合はドット間距離が保たれたまま右側にいくに従ってドットの１つ１つが除々に大きくなることで階調が表現されている。これは、ＣＣ法による処理の場合に閾値を高く設定するとセルの大きさが大きくなる分、セルに取り込んだ画素の階調値の合計値も大きくなり、ドットが１画素分ではなく２画素分、３画素分と大きく成長するためである。
【００３８】
しかしながら、このように閾値を変化させたとしても以下のような問題点である。すなわち、突然その画素の階調値が変化する領域（以下、エッジという）でドット間距離が空いてしまうと却ってエッジの再現性が悪くなってしまう。距離が大きい分、エッジの表現が劣化してしまうのである。このようなエッジの部分では、むしろセルの大きさを小さくしドット密度を上げて解像度を良くすべきである。図４には、エッジの部分を何ら検出せず、セルを構成する画素の平均階調値が高くなると閾値を上げるように処理した場合の出力例である。図に示すように、とくに文字“Ｓ”のカーブの部分ではドット間距離が広がりすぎていたり、ドットが重なって発生したりしているため、エッジの再現性が良くない。この図では、文字“Ｓ”の領域は入力階調値を“０”にしているため、セルがエッジの部分で円状に成長せず歪んだ形となってしまい、その重心にドットを打っても隣接するセルのドットと重なってしまうことがあるからである。
【００３９】
そこで、入力階調値の変化が大きい領域を検出するとその閾値を下げるように処理することで、セルの大きさが小さくなりその分ドット密度が上がるため、エッジの再現性がよくなる。図５にかかる処理を行った場合の出力例を示す。文字“Ｓ”のカーブの部分では、まわりのドットと比較してその大きさが小さくなるがその分多くのドットが打たれ、図４の場合と比較して再現性がよい。この場合に、上述したレーザプリンタの特性、すなわちドットどうしが引っ付いてしまう確率が高まるが、それよりも解像度を上げてエッジの再現性を良くすべきである。図５の場合でもエッジの部分で隣接するドットが引っ付いている箇所も存在するが、却ってそのことが文字“Ｓ”を強調しており再現性は高くなっているといえる。もちろん、できるだけドットどうしが距離を保ち、かつ再現性を高めるようにするためには、ドットどうしが引っ付いてしまうことのないような閾値を設定するようにすればよいのである。
【００４０】
このように入力階調値によってセルを構成するための閾値を変化させることで、図３に示すようにドット間距離を保って滑らかな階調を表現し、入力階調値の変化が大きいとその閾値を下げるようにすることで、図５に示すようにエッジの再現性が優れた印刷出力を得ることができる。
【００４１】
以下、本発明によるＣＣ法によるハーフトーン処理の詳細について図面を参照しながら説明する。ここで図６乃至図１１は処理の動作を示すフローチャートであり、図１２乃至図２９はＲＡＭ２６に格納された階調データの例を示すものである。以下、フローチャートに沿って説明することにする。
【００４２】
図６は、本発明のＣＣ法によるハーフトーン処理全体のフローチャートを示すものである。まず、図６に示すように、ＣＰＵ２４は本処理を実行するためのプログラムをＲＯＭ２５から読み出すことによって、処理が開始されることになる（ステップＳ１０）。ホストコンピュータ１０からの入力階調データはＲＡＭ２６に格納されているものとする。その例を図１２（ａ）に示す。この図に示すようにＲＡＭ２６には、入力データ格納領域２６１ａを有し、ホストコンピュータ１０からの入力階調データがＣＰＵ２４の制御によってこの入力データ領域２６１ａに格納さる。この領域２６１ａにおいて各座標位置は、全体画像の画素位置に対応するものである。例えば入力データ格納領域２６１ａで（０，０）の座標位置は、全体画像の（０，０）に位置する画素に対応する。また、各座標位置に格納された値は当該画素の入力階調値を示す。なお、図１２（ａ）に示す例は７行１２列の構成であるが、これは説明を容易にするためであって、例えば１ページ（１フレーム）分の画像を格納できる構成であってもよいし、この図より少ない行と列の構成であってもよい。また、ＲＡＭ２６内には量子化データを格納するための出力データ領域２６１ｂを有する。この領域２６１ｂも、入力データ領域２６１ａと同様に各座標位置は全体画像の画素位置に対応するもので、構成も７行１２列となっているがそれ以外の構成であってもよい。さらに、ＲＡＭ２６には図１２（ｂ）に示すようにワーキングメモリ領域２７０を有し、基準点としての重心位置の座標とこれまでセルとして選択した画素の階調値の合計値とを格納する領域２７０ａと、セル内の画素の階調値の最大値と最小値とを格納する領域２７０ｂと、セル内の階調値の平均値を格納する領域２７０ｃと、セルを構成する画素を選択するための閾値を格納する領域２７０ｄと、から構成される。各領域２７０ａ〜２７０ｄはＣＰＵ２４によって演算されてその値が格納される。なお、領域２７０ｄには閾値のデフォルト値として“２５５”が格納されているものとする。
【００４３】
図６に戻り、次いでＣＰＵ２４は初期画素を決定し、基準点を初期画素の座標に設定する（ステップＳ１１）。初期画素の決定に際しては、ＣＰＵ２４はラスタ方向に入力データ領域２６１ａ内を探索する。ここでラスタ方向とは、ホストコンピュータ１０で生成される画像、すなわち入力データ格納領域２６１ａで最も上の最も左側の方向である。このようにラスタ方向に探索することで、ＣＣ法により円状に成長した２つのセルの中間にすぐ下にセルが配置されるようになる。そのセルの重心位置にドットを打てば、印刷用紙全体として見ると、上の行のドット間の真ん中あたりに下の行のドットが配置されるように構成される。すなわち、全体的にドットが斜め方向に形成されるのである。このように配列されたドットは視覚的に目立ちにくく快適な印刷出力を得ることができる。上の行のドットと下の行のドットとが鉛直方向で同じ位置に配置されている場合はドットが正確に並びすぎて却ってドットが視覚的に目立ってしまう。このようなドットの配列を防止するためにラスタ方向に探索するのである。図１２（ｂ）の例では、ラスタ方向に探索すると、入力データ領域２６１ａの（０，０）に位置する画素が未処理画素となる(図１２（ｃ）の入力データ領域２６１ａ参照)。よって、ＣＰＵ２４は初期画素として（０，０）に位置する画素を選択する。なお、ＣＰＵ２４はＣＣ法による処理を行った画素に対して“−１”を入力データ領域２６１ａの当該画素位置に格納していく。以後の処理でセルを構成する未処理画素として選択されないようにするためである。よって、ラスタ方向に探索して未処理画素か否かは、選択した画素位置に“−１”が格納されているか否かで判断される。
【００４４】
さらにＣＰＵ２４は、本ステップＳ１１において重心位置を演算する。画素選択のためと、最後にセル内にドットを打つ処理を行うためである。この重心位置の演算には、以下に示す演算式を用いる。
（式１）
ｘ重心＝｛｛（セルの重心のｘ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｘ座標）×（選択した未処理画素の階調値）｝｝
／（セルの階調値の合計＋選択した未処理画素の階調値）
ｙ重心＝｛｛（セルの重心のｙ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｙ座標）×（選択した未処理画素の階調値）｝｝
／（セルの階調値の合計＋選択した未処理画素の階調値）
（ｘ重心、ｙ重心は重心位置の座標）
この演算式はＲＯＭ２５に格納され、重心位置の演算のときにＣＰＵ２４がＲＯＭ２５から読み出して演算を行うことになる。ちなみに、初期画素の場合は、（式１）においてセルの重心のｘ、ｙ座標、及びセルの階調値の合計はともに０として演算される。なお、セルとは、上述したように複数の画素から構成される画素群で、上式で“セルの重心”とあるのは、これまで構成したセルの重心のことである。初期画素の場合の重心を演算すると、ｘ重心＝０、ｙ重心＝０となる。本ステップＳ１１で演算した重心位置は、ＣＰＵ２４によってワーキングメモリ２７０の領域２７０ａに格納されることになる（図１３（ａ）の領域２７０ａ参照）。また、ＣＰＵ２４は、階調値の合計値、この場合は（０，０）の画素のみ選択したので当該画素の階調値“２０”も領域２７０ａに格納される。
【００４５】
さらに、ＣＰＵ２４は本ステップＳ１１において、セルを構成する画素の階調値の最大値（ｍａｘ）、最小値（ｍｉｎ）、その選択画素の平均階調値（ｍｅａｎ）を各領域２７０ｂ、２７０ｃに格納する。図１３（ａ）の例では、１つの画素（０，０）のみしか選択していないので、最大値“２０”、最小値“２０”、平均階調値“２０”が各領域２７０ｂ、２７０ｃに格納されることになる。
【００４６】
また、ＣＰＵ２４はセルを構成する画素を選択すると、上述したように以後未処理画素として選択されないようにするために“−１”をその画素位置に格納する。図１３（ａ）の入力データ領域２６１ａに示すように、初期画素として（０，０）に位置する画素を選択したので、ＣＰＵ２４はこの画素位置に“−１”を格納することになる。以上が、ＣＰＵ２４が本ステップＳ１１で行う処理である。
【００４７】
図６に戻り、次いでＣＰＵ２４は決定した初期画素が低濃度か否か判断する（ステップＳ１２）。低濃度の場合とは、選択画素で黒成分が少なく白成分が多い場合である。高濃度の場合とは選択画素で黒成分が多く白成分が多い場合である。かかる低濃度と高濃度の画素に対して全く同じように処理を行うことは必ずしも好ましいことではない。すなわち、高濃度の成分に対して、低濃度と同様に閾値に達するまでセルを構成するように処理を進めると、すぐに閾値に達してしまいセルの大きさを確保することができず、隣り合ったセルどうしでドットが隣接して発生してしまう。このようなドットは印刷出力全体として目立ちやすく、快適な印刷出力を得られない。そこで、黒成分が多い画素と白成分が多い画素とを分けて処理を進めるのである。この判断は、ＣＰＵ２４がＲＯＭ２５内に格納された所定値（本実施例では“１２７”）を読出し、選択画素の階調値がその値より大きいか小さいかで判断する。図１３（ａ）の例では、（０，０）の画素の階調値“２０”は所定値“１２７”より小さい値なので、低濃度と判定され（ステップＳ１２で“ＹＥＳ”）、ステップＳ１３に移行する。なお、高濃度の場合（ステップＳ１２で“ＮＯ”）は白濃度処理（ステップＳ２４）に移行するがその詳細は後述する。
【００４８】
図６に戻り、次いでＣＰＵ２４は、未処理画素の選択を行う（ステップＳ１３）。未処理画素の選択は、ワーキングメモリ２７０に格納した重心位置の座標に最も近い位置にある画素を選択する。重心を利用してセルを構成する未処理画素を選択するため、上述したようにセルは円状になりやすく、その重心にドットを形成させることで、ドット間距離が一定で快適な印刷出力を得ることができるのである。図１３（ａ）の例では、ワーキングメモリ領域２７０の領域２７０ａに重心位置ｘ重心＝０、ｙ重心＝０が格納されているので、この位置から最も近い画素位置を選択することになる。この例の場合に、重心位置に最も近い画素としては、（１，０）と（０，１）に位置する２つの画素が存在する。この場合ＣＰＵ２４は、ランダムにいずれか１つの画素を選択することにする。固定順（例えば次に選択すべき未処理画素は右隣の画素、次に選択すべき画素はその画素の下にある画素など）に選択すると、最終的に構成されるセルが規則的に並びすぎることによって、印刷出力のある領域でドットが周期的に発生する周期パターンが生じることになる。このようなパターンは視覚に入り易く快適な印刷出力を得ることができない。このような理由から、選択すべき画素が複数あれば、ランダムに選択するのである。図１３（ａ）の例では、ＣＰＵ２４は、（１，０）に位置する画素をランダムに未処理画素として選択することにする(図１３（ｂ）の入力データ領域２６１ａ参照)。
【００４９】
図６に戻り、次いでＣＰＵ２４は閾値制御処理を行う（ステップＳ１４）。セルを構成するための閾値を変化させることで、滑らかな階調を表現するとともにエッジの再現性を高めるためである。図８に閾値制御処理のフローチャートを示す。
【００５０】
まず、ＣＰＵ２４は本処理（ステップＳ１４）に移行すると新たに選択した画素を含めた最大値と最小値、及び平均階調値を演算する（ステップＳ１４１）。図１３（ａ）の例では、新たに（１，０）の画素を未処理画素として選択した（ステップＳ１３）ので、この画素を含めたセル内の最大値等を演算する。この場合、選択画素（１，０）の階調値は“２０”なので、最大値は“２０”、最小値も“２０”、そして平均階調値も“２０”（＝（２０＋２０）／２）となり、これらの値をＣＰＵ２４は各領域２７０ｂ、２７０ｃに格納することになる（図１３（ｂ）の領域２７０ｂ、２７０ｃ参照）。
【００５１】
次いでＣＰＵ２４は、セルの平均階調値を引数とする関数により画素を選択するための閾値を変更する（ステップＳ１４２）。平均階調値が高いとき、閾値となるまで画素を選択するとすぐに閾値に達してしまい上述したようにドットが密集することで粒状的なドットを発生させてしまう。滑らかな階調を表現するために閾値を変更するのである。本実施例では、平均階調値（ｍｅａｎ）が“３０”より小さいときは閾値は“２５５”、“３０”以上で“８０”よりも小さいとき閾値を“５１０”に変更し、さらに“８０”以上のときは“７６５”に変更する。もちろん、これは一例でこれ以外の平均値の値でもよいし、これ以外の閾値でもよい。また、３段階で閾値を設定するようにしているが、２段階に設定しても、４段階以上であってもよい。粒状的なドットを発生させないように、画像出力装置２０ごとにその値を設定すればよい。この場合の関数の一例を図２３に示す。この関数は、いわゆるプログラム上の読出し関数（threshold()）である。この図に示すように平均階調値（mean）の値によって出力する閾値（threshold）を変化させている。もちろん、関数として数式を用いた演算式によって閾値を変化させてもよい。例えば、以下の演算式である。
（式２）
threshold ＝  （２＋７５×（階調値の合計値）／（選択画素数）／２５５）×２５５（thresholdは閾値）
この式で、“２”は画像出力装置２０の特性に合わせた特性値を示し、“７５”は閾値を線形に変化させるための係数である。（階調値の合計値）／（選択画素数）で平均階調値を表すことになる。この関数も平均階調値が高いほど閾値も高くなるように設定されている。なお、この演算式及び図２３に示した呼び出し関数ともにＲＯＭ２５等に格納され、ＣＰＵ２４が本処理（ステップＳ１４）の際に適宜読み出して実行することで、各値が得られる。すなわち図１３（ｂ）に示すように、ステップＳ１４１で領域２７０ｃに格納した平均階調値“２０”を読出して、（式２）や呼び出し関数（threshold()）に代入等することで、閾値“２５５”を得て、領域２７０ｄにＣＰＵ２４によって再び格納されることになる。
【００５２】
図８に戻り、次いでＣＰＵ２４は画素群であるセル内の階調値の最大値と最小値の差が所定値よりも大きいか否か判断する（ステップＳ１４３）。上述したように入力階調値の差からエッジの領域であるか否かを検出するためである。ステップＳ１４１で最大階調値、最小階調値ともに領域２７０ｂに格納されているので、ＣＰＵ２４はこの値を領域２７０ｂから読み出すことによって処理を行う。本実施例では所定値として“５０”を設定し、ＲＯＭ２５に格納されているものとする。図１３（ｂ）の例では、最大値“２０”、最小値“２０”でその差は“０”よって所定値“５０”よりも小さいので本ステップＳ１４３で“ＮＯ”が選択され閾値制御処理が終了して図６のステップＳ１５に移行する。なお、本ステップＳ１４３で所定値よりも大きいとき（“ＹＥＳ”のとき）、閾値を下げる処理を行う（ステップＳ１４４）がその詳細は後述する。
【００５３】
図６に戻り、閾値制御処理が終了するとＣＰＵ２４は階調値の合計が閾値を超えるか否か判断する（ステップＳ１５）。閾値制御処理（ステップＳ１４）で変更した閾値に基づき、セルを構成する画素を閾値に達するまで選択するためである。図１３（ｂ）の例では、セルを構成する画素の階調値の合計は、（０，０）と（１，０）の画素の階調値の合計値である“４０”となり、閾値である“２５５”を超えない。よって本ステップＳ１５で“ＮＯ”が選択され、ステップＳ１６に移行する。
【００５４】
ステップＳ１６でＣＰＵ２４は、未処理画素を含めた基準点、すなわち重心位置の演算を行う。未処理画素として選択（ステップＳ１３）した画素を含めたセルの重心位置を更新するためである。重心位置の演算は、上述した（式１）を用いる。図１３（ｂ）の例で重心位置を演算すると、ｘ重心＝０．５、ｙ重心＝０を得て、メモリ領域２７０の領域２７０ａにＣＰＵ２４によって格納されることになる（同図の領域２７０ａ参照）。
【００５５】
次いでＣＰＵ２４は、階調値の合計を演算してワーキングメモリ２７０の領域２７０ａに格納する（ステップＳ１７）。図１３（ｂ）の示すように選択画素（（０，０）と（１，０））の階調値の合計は“４０”なので、この値が領域２７０ａに格納されることになる。また、ＣＰＵ２４は、ステップＳ１３で未処理画素として選択した画素の入力データ領域２６１ａの位置に“−１”を格納する（同図の入力データ領域２６１ａ参照）。以後の処理で未処理画素として選択されないようにするためである。さらに、ＣＰＵ２４は、対応する出力データ領域２６１ｂの画素位置（１，０）にドットを打たないことを示す値（ここでは“０”）を格納する（同図出力データ領域２６１ｂ参照）。
【００５６】
次いでＣＰＵ２４は、ワーキングメモリ２７０の領域２７０ａに格納した階調値の合計が閾値と等しいか否か判断する（ステップＳ１８）。階調値の合計と閾値はそれぞれ領域２７０ａ、２７０ｄに格納されているのでこれらの値をＣＰＵ２４が適宜読み出し比較することで処理が行われる。図１３（ｂ）の例では、階調値の合計は“４０”、閾値は“２５５”で等しくないため本ステップＳ１８で“ＮＯ”が選択され、再びステップＳ１３に移行する。
【００５７】
そして、ＣＰＵ２４は選択した画素の階調値の合計が閾値と等しい（ステップＳ１８で“ＹＥＳ”）か、閾値を超える（ステップＳ１５）まで、未処理画素を選択していく。図１３（ｃ）の例は、セルを構成する画素として４つの画素（（０，０）、（１，０）、（０，１）、及び（１，１）の画素）を選択してステップＳ１８に移行したときの状態を示す。ここまでは、階調値の合計は“８０”、選択画素の階調値はすべて同じ値のためその最大値、最小値、平均階調値ともに“２０”、閾値も平均階調値が“２０”のままで“３０”以上となっていないため“２５５”のままである。また、重心位置は（式１）により演算した結果、（０．５，０．５）となる（同図の領域２７０ａ〜２７０ｄ参照）。ステップＳ１８でＣＰＵ２４は、階調値の合計“８０”は閾値“２５５”と等しくないため本ステップで“ＮＯ”が選択され再び未処理画素の選択を行う（ステップＳ１３）。
【００５８】
図１３（ｃ）に示すように４つの画素を選択した後、重心位置（０．５，０．５）に最も近い画素として、（２，０）、（２，１）、（１，２）、（０，２）に位置する４つの画素があるがランダムに（２，０）の画素を選択するものとする（ステップＳ１３、図１４（ａ）の入力データ領域２６１ａ参照）。そして閾値制御処理（ステップＳ１４）に移行するが、ステップＳ１４１にて選択画素（２，０）の階調値が“２５”のため、セルを構成する画素の階調値の最大値が“２５”、さらに平均階調値も“２１”（＝（８０＋２５）／５）に更新される（図１４（ｂ）の領域２７０ｂ、２７０ｃ参照）。
【００５９】
次いでＣＰＵ２４は閾値の変更処理を行う（ステップＳ１４２）が、平均階調値は“２１”で“３０”以下となるので、閾値は変更されず“２５５”を領域２７０ｄに格納することになる。そして、階調値の最大値“２５”と最小値“２０”の差は“５”で所定値である“５０”以下である。従ってステップＳ１４３で“ＮＯ”が選択され、閾値を下げることはせずに閾値制御処理は終了することになる。
【００６０】
その後、階調値の合計は“１０５”なのでステップＳ１５で“ＮＯ”が選択され、ＣＰＵ２４は重心位置を演算し（ステップＳ１６）、階調値の演算（ステップＳ１７）を行い、図１４（ｂ）の領域２７０ａに示す値を得る。また、ＣＰＵ２４は当該画素位置（２，０）で入力データ領域２６１ａに“−１”を格納し、出力データ領域２６１ｂに“０”を格納することになる（図１４（ｂ）の入力、出力各データ領域２６１ａ、２６１ｂ参照）。この場合でも階調値の合計“１０５”は、閾値“２５５”以下なのでステップＳ１８で“ＮＯ”が選択され、再び未処理画素を選択することになる（ステップＳ１３）。
【００６１】
以後、図１４（ｃ）から順に説明すると、次にＣＰＵ２４は未処理画素として（２，１）を選択する（ステップＳ１３）。当該画素の階調値は“２５”で、最大値はかわらず、平均階調値は“２１．７”（≒（１０５＋２５）／６）に更新される（図１４（ｃ）メモリ領域２７０参照）。よって“３０”以下なので閾値の変更はなく、また閾値を下げることもない。このときのセルを構成する画素の階調値の合計は、“１３０”で閾値“２５５”に達しないのでステップＳ１８で“ＮＯ”が選択され再び未処理画素の選択を行う（ステップＳ１３）。
【００６２】
次にＣＰＵ２４は、未処理画素として図１５（ａ）に示すように、重心位置に最も近い画素として（１，２）を選択する。当該画素の階調値は“２０”、平均階調値は“２１．４”（≒（１３０＋２０）／７）となる。平均階調値は“３０”以下なので閾値の変更はなく、また最大、最小の差も“５０”以下なので閾値を下げる処理も行われない。
【００６３】
かかる処理を繰り返すことで、図１５（ｂ）の状態となる。これは、これまで選択した画素の階調値の合計が“２５０”で、閾値である“２５５”に達する直前の状態である。この状態での重心位置、最大値、最小値、平均階調値、閾値は図１５（ｂ）のメモリ２７０の各領域２７０ａ〜２７０ｄに示す値となっている。この状態のときも、階調値の合計は閾値と等しくないためステップＳ１８で“ＮＯ”が選択され、再び未処理画素の選択を行う（ステップＳ１３）。
【００６４】
ＣＰＵ２４はステップＳ１３において、領域２７０ａに格納された重心位置から、この位置に最も近い画素を選択する。複数あればランダムに選択する。図１５（ｃ）に示すように、ＣＰＵ２４は（２，３）に位置する画素を選択するものとする。当該画素の階調値は“２５”なので、最大値は“２５”のまま、平均階調値は“２２．７”となる（ステップＳ１４１）。“３０”以下なので閾値の変更は行われず（ステップＳ１４２）、また最大値と最小値の差も“５０”以下なので、閾値を下げる処理も行われず（ステップＳ１４３で“ＮＯ”が選択）、ステップＳ１５に移行する。
【００６５】
ステップＳ１５においてＣＰＵ２４は、階調値の合計は最後に選択した画素を含めると“２７５”（＝２５０＋２５）となるため閾値“２５５”を超えることになるため、本ステップで“ＹＥＳ”が選択され閾値を超えた場合の演算処理（ステップＳ２２）に移行することになる。本処理のフローチャートを図９に示す。
【００６６】
本処理に移行するとまずＣＰＵ２４は、閾値から濃度の合計、すなわちこれまで構成したセルの階調値の合計の減算処理を行う（ステップＳ２２１）。図１５（ｃ）の例では、閾値“２５５”からこれまでの階調値の合計“２５０”を減算すると“５”を得る。上述したようにこれまで選択した画素の階調値の合計は領域２７０ａに格納されているので、ＣＰＵ２４は適宜この領域２７０ａから値を読み出すことで処理が行われる。
【００６７】
次いでＣＰＵ２４は、このステップＳ２２１で減算した値を最後に選択した画素の階調値として重心位置の演算を行う（ステップＳ２２２）。すなわち、最後に選択した画素の階調値をそのまま用いると閾値を超えてしまうので、閾値と丁度等しくなる値を当該画素の階調値として重心演算を行うのである。演算式は以下の式を用いる。
（式３）
ｘ重心＝｛｛（セルの重心のｘ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｘ座標）×（閾値までに必要な階調値）｝｝
／（セルの階調値の合計＋閾値まで必要な階調値）
ｙ重心＝｛｛（セルの重心のｙ座標）×（セルの階調値の合計）｝
＋｛（選択した未処理画素のｙ座標）×（閾値までに必要な階調値）｝｝
／（セルの階調値の合計＋閾値まで必要な階調値）
（ｘ重心、ｙ重心は重心位置の座標）
（式１）との違いは、選択した未処理画素の階調値をそのまま用いるのではなく、セルの階調値の合計が閾値と同じになる値（“閾値までに必要な階調値”）を用いる点が異なる。この演算式は、（式１）の場合と同様に予めＲＯＭ２５に格納されており、ＣＰＵ２４が本ステップを実行する際にＲＯＭ２５から読み出すことで処理される。図１５（ｃ）の例で演算すると、重心位置はｘ重心≒１．７５、ｙ重心≒０．９６となる。演算した重心位置は、ＣＰＵ２４の制御によりワーキングメモリ２７０の領域２７０ａに格納される（図１５（ｃ）の領域２７０ａ参照）。そして、ＣＰＵ２４は閾値を超えた場合の階調値演算処理を終了させ、図７のステップＳ２３に移行する。
【００６８】
ステップＳ２３でＣＰＵ２４は、残った階調値を未処理画素に戻す処理を行う。図１５（ｃ）の例では、最後に選択した画素（２，３）の階調値は“２５”、重心演算の際に“５”の階調値として演算したので、減算した“２０”（＝２５−５）を入力データ領域２６１ａの当該画素位置（２，３）に戻すことになる（同図の入力データ領域２６１ａ参照）。セルを構成する画素以外の画素に戻すことも考えられるが、それではその画素の階調値でない値を有することになるので、入力階調値に忠実なドットを生成させることができない。よって、最後に選択した画素に減算後の値を戻し、以後再び未処理画素として選択できるようにするのである。またＣＰＵ２４は、選択した未処理画素の対応する出力データ領域２６１ｂに“０”を格納する。図１５（ｃ）の出力データ領域２６１ｂに示すように、この例では（２，３）に“０”が格納される。
【００６９】
そしてＣＰＵ２４は、重心位置に黒ドットを生成させる処理を行う（ステップＳ２３）。すなわち、ワーキングメモリ２７０の領域２７０ａにはこれまで構成したセルの重心位置が格納されているのでＣＰＵ２４がこの値を読出し、出力データ領域２６１ｂの重心位置の存在する画素位置に“２５５”を格納することになる。図１５（ｃ）の例では、これまで演算した重心位置（１．７５、０．９６）がメモリ２７０に格納されているので、この位置にある出力データ領域２６１ｂの画素（２，１）にドット生成を示す“２５５”を格納することになる（図１６（ａ）の出力データ領域２６１ｂ参照）。そして、処理はステップＳ２０に移行する。
【００７０】
一方、ステップＳ１８で閾値と等しい場合（“ＹＥＳ”の場合）も、すでにセルを構成する階調値の合計が閾値に達したことになるので、同様に重心位置に黒ドットを生成する処理（ステップＳ１９）を行うことになる。そして、同様にステップＳ２０に処理は移行する。
【００７１】
ステップＳ２０においてＣＰＵ２４は、未処理画素があるか否か判断する。図１６（ａ）の例では、これまで１つのセルを構成しその重心位置に黒ドットを発生させるように処理を行ったことになるので、再び未処理画素を探索してセルを構成していくのである。なお、未処理画素か否かの判断は、入力データ領域２６１ａで処理済みの画素には“−１”が格納されているので、すべての画素位置で“−１”が格納されたか否かで判断することができる。図１６（ａ）の例では、すべての画素位置に“−１”が格納されていないので本ステップＳ２０で“ＹＥＳ”が選択され、再びステップＳ１１に移行することになる。
【００７２】
ステップＳ１１に移行するとＣＰＵ２４は、上述したようにラスタ方向に未処理画素の探索を行い、図１６（ｂ）に示すように（４，０）の画素を初期画素として選択する。以後、上述したような処理を行うと、画素を４つ選択（（４，０）、（５，０）、（４，１）、（５，１）の画素）し、再び未処理画素として（６，０）を選択した場合（ステップＳ１３）で以下説明する。この４つの画素を選択したときの平均階調値は“３０”（＝（３０×４）／４）であるが、（６，０）の階調値は“３５”であるため、これを含めた平均階調値を演算すると（ステップＳ１４１）、“３１”（＝（１２０＋３５）／５）となる。この値は、図２３に示す呼び出し関数から“３０”を超える値のため閾値を“２５５”から“５１０”に変更することになる（ステップＳ１４２）。ＣＰＵ２４は、平均階調値“３１”と、この変更された閾値“５１０”をワーキングメモリ２７０の各領域２７０ｃ、２７０ｄに格納する（図１６（ｃ）の各領域２７０ｃ、２７０ｄ参照）。入力階調値が比較的大きな値を有する領域と判断したため、セルの大きさをさらに大きく確保するのである。上述したように、このように閾値を高く設定することでセルの大きさを確保し、ドット間距離を保つためである。また階調の表現も上述したように入力階調値が大きい領域ではセルが大きくなるものの、ドット１つはその変更した閾値分大きくなるため結果的に入力階調値に忠実な階調表現を実現しているのである。すなわち、滑らかな階調を表現することができるのである。もちろん、閾値の変更がない領域では入力階調値が高いとその分セルの大きさは小さくなり、結果的にドット密度が高くなるため、この場合でも滑らかな階調を表現することができる。
【００７３】
具体的に図１６（ｃ）以降の図を参照しながら説明する。図１６（ｃ）で未処理画素（６，０）を選択して（ステップＳ１３）、閾値制御処理（ステップＳ１４）を終了すると、階調値の合計“１５５”（＝１２０＋３５）は変更した閾値“５１０”を超えない。従って、ステップＳ１５で“ＮＯ”が選択され、重心位置の演算（ステップＳ１６）、階調値の合計値の演算等（ステップＳ１７）を行い、各領域２７０ａ等にその値が格納される（図１７（ａ）参照）。階調値の合計は閾値と等しくないためステップＳ１８で“ＮＯ”が選択され再びセルを構成する未処理画素の選択を行う（ステップＳ１３）。かかる処理を繰り返すことで、図１７（ｂ）に示す値を得る。この図に示すのは、階調値の合計が閾値である“５１０”となる直前の状態である。この図では、これまで８つの画素が選択されている。重心位置等の値は、図１７（ｂ）の各領域２７０ａ〜２７０ｄに示す値を得る。そして、ＣＰＵ２４は重心位置（５．６７，１．４）から最も近い未処理画素として、図１７（ｃ）に示す（６，４）の画素を選択するものとする。当該画素の階調値は“３５”、これまで構成したセルの階調値の合計は“４９０”、従って階調値の合計は“５２５”で閾値である“５１０”を超えることになり、ステップＳ１５で“ＹＥＳ”が選択されステップＳ２２に移行する。
【００７４】
ステップＳ２２の階調値演算処理において、まずＣＰＵ２４は閾値“５１０”からこれまで構成したセルの階調値の合計値“４９０”を減算する（ステップＳ２２１）。その減算値“２０”が最後に選択した（６，４）の画素の階調値として（式３）を用いて重心を演算する（ステップＳ２２２）。重心位置はメモリ２７０の領域２７０ａに格納される。そして、図６に戻り、残り濃度“１５”（＝３５−２０）を選択画素（６，４）に戻して（図１７（ｃ）の入力データ領域２６１ａ参照）、重心位置に黒ドットを生成する（ステップＳ２３）。
【００７５】
この黒ドット生成の際、閾値として“５１０”を設定し階調値の合計が“５１０”となるまで画素を選択したため、ドット生成を示す値“２５５”を２画素に割り当てることになる。すなわち、図１８（ａ）の出力データ領域２６１ａに示すように、ＣＰＵ２４はまず重心位置に存在する画素（６，２）に“２５５”を割り当てる。このとき、階調値の合計値は“２５５”（＝５１０−２５５）となる（同図の領域２７０ａ参照）。さらに、重心位置に最も近い画素（５，２）に“２５５”を割り当てる（図１８（ｂ）の出力データ領域２６１ａ参照）。このようにすることで、セルとして選択した階調値分の値を割り当てることになる。
【００７６】
したがって、入力階調値が大きい領域では閾値を高く設定してセルの大きさを確保し、ドット間距離を保つとともに、入力階調値に応じた滑らかな階調を表現することができる。また、閾値を予め設定した値より高く設定することでセル内に取り込まれるべき画素数が増加する場合もある。このとき重心位置にドットを打つと上述したように閾値を高くした分、ドット生成を示す値を割り当てるべき画素の数も増加する。すなわち、セルの大きさは大きくなるがそのドットはそれに応じて大きく成長しやすいため、ドット間距離を保ったまま入力階調値に応じた階調を表現することができるのである。上述した図３（ｂ）において、右側のドットは左側のドットを比較してその大きさは大きいもので全体としてみると右側の方がドット密度が上がっているように見える。入力階調値の変化に応じてドットどうしが引っ付いたりすることのない、滑らかな階調を表現している、といえる。
【００７７】
再び処理に戻ると、ＣＰＵ２４は未処理画素がなくなる（図７のステップＳ２０で“ＮＯ”）まで上述した処理を繰り返すことになる。その結果を図１８（ｃ）に示す。出力データ領域２６１ａに格納された値が量子化データとしてハーフトーン処理部２１１から出力され、パルス幅変調部２１２を介して印刷エンジン２２に出力されて、ホストコンピュータ１０で生成した印刷データが印刷されるのである。
【００７８】
上述の例では、入力階調値が図面上左側から除々に大きくなる例で説明したため、エッジの検出が結果的に行われず、図８の閾値制御処理においてステップＳ１４３で常に“ＮＯ”が選択され閾値を下げる処理が行われなかった。次の例としてかかるエッジの領域での処理について説明する。以下、図１９以降に示した図を参照しながら説明する。なお、全体の処理自体は上述したものと全く同じで図６等に示したフローチャートに沿って処理が行われる。
【００７９】
入力データ領域２６１ａには図１９（ａ）に示す階調値がホストコンピュータ１０から入力されたものとする。画素位置（５，０）を境に階調値が急激に変化している。
【００８０】
まずＣＰＵ２４は、上述した処理と同様に初期画素を選択するため入力データ領域２６１ａ上をラスタ方向に探索する。そして、（０，０）に位置する画素を初期画素として選択する（ステップＳ１１）。そして、重心位置を演算し、セルを構成する画素が閾値と等しくなる（ステップＳ１８で“ＹＥＳ”）か、超える（ステップＳ１５で“ＹＥＳ”）まで画素を選択し続ける。その結果、図１９（ｂ）の出力データ領域２６１ｂに示す出力データを得る。この選択の途中で、平均階調値は“３０”を超えないので閾値の変更（ステップＳ１４２）は行われず、またその階調値の最大と最小の差も“５０”を越えないため閾値を下げる処理（ステップＳ１４４）も行われない。
【００８１】
再び初期画素をラスタ方向に探索して、（４，０）に位置する画素を初期画素として選択し（ステップＳ１１、図１９（ｂ）の入力データ領域２６１ａ参照）、閾値以上となるまで画素を選択する。この選択の途中で、４つの画素（（４，０）、（４，１）、（５，０）、（５，１）の画素）をセルとして構成し、未処理画素として（６，０）を選択したときの状態を図１９（ｃ）に示す。
【００８２】
ＣＰＵ２４は、（６，０）の画素を未処理画素として選択すると（ステップＳ１３）、閾値制御（ステップＳ１４）に移行する。まず、ＣＰＵ２４は新たに選択した画素（６，０）を含めたセル内の画素の階調値の最大値、最小値、及び平均階調値を演算して対応する領域２７０ｂ、２７０ｃに格納する（ステップＳ１４１）。最小値は変わらず“３０”、最大値は（６，０）の画素の階調値“１００”、平均階調値は“４４”（＝（１２０＋１００）／５）、となる（図２０（ａ）の領域２７０ｂ、２７０ｃ参照）。
【００８３】
次いでＣＰＵ２４は、関数を読み出して平均階調値を引数として閾値を変更する（ステップＳ１４２）。この場合に、平均階調値は“３０”より大きく“８０”以下の範囲にあるので、図２３に示す関数から閾値は“５１０”に変更されることになる（図２０（ａ）の領域２７０ｄ参照）。入力階調値が高い領域と判断されることになる。
【００８４】
次いでＣＰＵ２４は、セル内の画素の最大階調値と最小階調値の差が所定値である“５０”を超えるか否か判断する（ステップＳ１４３）が、領域２７０ｂ、２７０ｃに格納された値を読み出すとその差は“７０”（＝１００−３０）で所定値“５０”を超える。よって本ステップで“ＹＥＳ”が選択されて閾値を下げる処理を行う。ここで、この領域はエッジの領域であると判断されたことになる。
【００８５】
この閾値を下げる処理もステップＳ１４２と同様に関数を呼び出してこの値を決定するようにしてもよいし、（式２）のような演算式を用いて決定してもよい。本実施例では図２３に示すように関数threshold()を呼び出してその値を決定するようにする。すなわち
、図２３の後半部分にあるように最大値（max_value）と最小値（min_value）との差が５０を超えると、その閾値を一律に“２５５”に設定するようにしている。図２０（ｂ）の領域２７０ｄに示すようにその閾値を“５１０”から“２５５”に変更することになる。閾値を下げる処理としては、これ以外にも例えば、ステップＳ１４２の閾値の変更と同様に平均階調値に応じて、段階的にその閾値を下げるようにすることでもよい。例えば、“３０”以下のときの閾値は“２５５”のままで、“３０”より大きく“８０”以下のときも“２５５”、“８０”より大きいときは“５１０”と設定することもできる。これまでの閾値より小さい値でかつドット間距離を保つように設定すればよい。
【００８６】
図２０（ｂ）の場合、閾値制御処理（ステップＳ１４）が終了するとＣＰＵ２４は、重心の演算（ステップＳ１６）、階調値の演算（ステップＳ１７）を行い、各演算値が領域２７０ａに格納され、さらに入力データ領域２６１ａの当該未処理画素（６，０）に“−１”、出力データ領域２６１ｂに“０”を格納することになる。なお、階調値の合計は“２２０”で閾値である“２５５”を超えないのでステップＳ１５は“ＮＯ”が選択される。
【００８７】
次いでＣＰＵ２４は、ステップＳ１８で“ＮＯ”が選択され、再びセルを構成する未処理画素を重心位置から最も近い画素から選択する（ステップＳ１３）。この例の場合、図２１（ａ）に示すように、（６，１）の画素が選択される。閾値制御処理（ステップＳ１４）に移行するとＣＰＵ２４は、平均階調値等を演算する（ステップＳ１４１）が、この場合、平均値は“５３．３”（≒（２２０＋１００）／６）となり、関数を呼び出して閾値が再び“５１０”に変更される（ステップＳ１４２、図２１（ａ）の領域２７０ｄ参照）。しかし、これまで構成したセルの最大階調値と最小階調値の差はこの場合も“７０”で、所定値以上となるためステップＳ１４３で“ＹＥＳ”が選択され閾値を下げることになる（ステップＳ１４４）。この場合もエッジの領域であると判断されたためである。同様に閾値は“２５５”に変更されＣＰＵ２４によって領域２７０ｄに格納されることになる（図２１（ｂ）の領域２７０ｄ参照）。そして、閾値制御処理（ステップＳ１４）が終了して、図６のステップＳ１５に移行することになる。
【００８８】
同様にＣＰＵ２４は、最後に選択した画素を含めたセルの階調値の合計が閾値を超えるか否か判断する（ステップＳ１５）が、この場合には閾値は“２５５”で、最後に選択した画素（６，１）を含めたセルの階調値の合計は“３２０”となるので、本ステップで“ＹＥＳ”が選択されることになる。そして、上述したように、閾値を超えた場合の階調値の演算処理（ステップＳ２２）により、（６，１）の画素の階調値は“３５”（＝２５５−２２０）として（式３）を用いて重心を演算する（ステップＳ２２２）。残った階調値“６５”（＝１００−３５）を当該画素位置に戻して演算した重心位置に黒ドット生成を示す“２５５”を割り当てることになる（図２１（ｃ）参照）。
【００８９】
かかる処理を未処理画素がなくなるまで（図７のステップＳ２０で“ＮＯ”）繰り返すことで処理が終了する（ステップＳ２１）。この結果を図２２（ａ）に示す。
【００９０】
このようにエッジを検出すると設定した閾値を下げるようにすることで、セルの大きさが小さくなるため、ドット密度が上がり、エッジの再現性が向上した印刷出力を得ることができるのである。図２２（ａ）の出力データ領域２６１ｂに示すように（５，０）から（５，６）までのエッジの領域はまわりの画素と比較して多数の小さいドットにより再現しているため、解像度が落ちることなく、エッジの再現性が向上した快適な印刷出力を得ることができる。
【００９１】
次に出力ドットのサイズを“２５５”よりも小さい単位で出力する場合の例について説明する。上述した例では、１ドットの出力はすべて“２５５”としたため、１画素分すべての領域にドットを打った場合の例で説明したが、この例では１画素分の所定領域幅にドットを打つ場合である。
【００９２】
図２４（ａ）の入力データの例を示す。この場合の入力データ領域２６１ａの構成は、７行８列の構成である。説明の便宜のためであって、もちろんこれ以外の構成でもよいことは上述の例と同様である。各座標位置は入力画像の各画素位置に対応することも同様である。この図の例でも、入力データ領域２６１ａ上、左側から右側にかけて除々にその階調値が増加している。なお、ワーキングメモリ２７０、出力データ領域２６１ｂも上述の例と同様の構成である。
【００９３】
ＣＰＵ２４が行う処理の動作も図６乃至図１１に示すフローチャートに従う。すなわち、まずＣＰＵ２４は本処理を実行するためのプログラムを読出しで処理が開始される（図６のステップＳ１０）。次いで、初期画素を決定し、基準点を初期画素の座標位置に設定する（ステップＳ１１）。図２４（ｂ）に示すように入力データ領域２６１ａをラスタ方向に探索すると、（０，０）の画素が未処理画素なので（“−１”が格納されてないので）、この画素を初期画素とする。そして、セルを構成する画素のうち最大階調値と最小階調値、及び平均階調値をワーキングメモリ２７０の各領域２７０ｂ、２７０ｃに格納する（同図の各領域２７０ｂ、２７０ｃ参照）。また、平均階調値は“７０”なので、ＣＰＵ２４はセルを構成する画素を選択するための閾値を“５１０”に設定し、この値をメモリ２７０の領域２７０ｄに格納する（同図の領域２７０ｄ参照）。さらに、ＣＰＵ２４は上述の（式１）を用いて重心位置を演算しその演算値と、セルを構成する画素の階調値の合計値とを領域２７０ａに格納するとともに、入力データ領域２６１ａの選択した初期画素の画素位置に“−１”、対応する出力データ領域２６１ｂに“０”を格納する（図２４（ｃ）参照）。
【００９４】
そして、図６に戻り、初期画素の初期濃度（階調値）“７０”は“１２７”より小さい値なのでステップＳ１１で低濃度と判定され（“ＹＥＳ”）以下ステップＳ１３以降が実行される。すなわち、ワーキングメモリ２７０の領域２７０ａに格納された重心位置に最も近い未処理画素を選択し（ステップＳ１３）、セルを構成する画素の階調値の合計が閾値と等しいか（ステップＳ１８で“ＹＥＳ”）、閾値を超えるまで（ステップＳ１５で“ＹＥＳ”）、この未処理画素の選択を続ける。このとき、ステップＳ１４でセルを構成する画素の階調値の平均値が、例えば３０以下なら、この画素選択のための閾値を“２５５”のままにし、３０より大きく８０以下のときは閾値を“５１０”、８０より大きいときは“７６５”にする（ステップＳ１４２）。セルの大きさをある程度大きくすることでドット間距離を保つためである。そして、セルを構成する画素の最大階調値と最小階調値の差が、例えば“５０”より大きいときは（ステップＳ１４３で“ＹＥＳ”）、エッジの領域であるとして、その閾値を“２５５”にする（ステップＳ１４４）。ドット密度を上げることでエッジの再現性を向上させるためである。
【００９５】
図２５（ａ）は、６つの画素を未処理画素として選択し、さらに７番目の未処理画素として（２，１）の画素を選択したときの例である。このとき、セルを構成するこの７つの画素の階調値の合計は“５００”で、画素選択のための閾値は、平均階調値が“７１”なので “５１０”となっている（同図の領域２７０ａ、２７０ｄ参照）。ちょうど、階調
値の合計が閾値となる直前の例である。
【００９６】
そして、領域２７０ａに格納された重心位置から最も近い未処理画素として、（２，０）の画素を選択する（ステップＳ１３、図２５（ｂ）の入力データ領域２６１ａ参照）。このとき、階調値の合計値は、“５８０”（＝５１０＋７０）となるので領域２７０ｄに格納された閾値“５１０”を超えるのでステップＳ１５で“ＹＥＳ”が選択され、閾値を超えた場合の階調値演算処理を行う（ステップＳ２２）。
【００９７】
すなわち、閾値“５１０”からこれまでセルとして選択した画素の階調値の合計値“５００”を減算し（ステップＳ２２１）、その減算値“１０”が最後に選択した画素（２，０）の階調値として重心の演算を行う（ステップＳ２２２）。演算結果がＣＰＵ２４によって領域２７０ａに格納され（図２５（ｃ）の領域２７０ａ参照）、残った階調値を（２，０）の画素に戻し、黒ドットの生成を行う（ステップＳ２３）。
【００９８】
この黒ドットの生成で、上述の例ではまず重心位置に存在する画素にドット生成を示す値“２５５”を割り当て、閾値が“５１０”のときはさらにその重心位置に最も近い画素を選択、さらに閾値が“７６５”のときはその重心位置から２番目に近い画素を選択と、重心位置に近い画素から順にドット生成を示す値 “２５５”を割り当てるようにしてい
た。しかし、本例では、最初に重心位置に存在する画素に“２５５”を割り当てると、閾値がそれ以上のときはその選択画素に隣接する処理済みの画素を選択するようにする。そして、隣接する画素が複数あれば均等に割り当てるのである。このようにすることで、１画素分の大きさに１ドットすべて印刷するよりも、細かな階調表現が可能になる。
【００９９】
図２５（ｃ）の例では、まず重心位置（０．７６，０．９８）に存在する画素（１，１）にドット生成を示す値“２５５”を割り当てる(同図の出力データ領域２６１ｂ参照)。このとき閾値は“５１０”でさらに“２５５”の階調値分だけドットを割り当てる必要がある。この重心位置に存在する画素に隣接する処理済みの画素（（１，０）、（０，１）、（１，１）、（１，２）に位置する画素）を選択し、４つの画素に全体として“２５５”となるよう均等に、６４、６４、６４、６３を割り当てる（図２６（ａ）の出力データ領域２６１ｂ参照）。そして、この出力データを量子化データとして、パルス幅変調部２１２を介して印刷エンジン２２に出力する。この領域の印刷出力の例を図２９（ａ）に示す。
【０１００】
この印刷出力の例に示すように（０，１）の画素と（２，１）の画素とは同じドットの生成を示す値“６４”が割り当てられているが、前者の画素は右からドットが成長し、後者の画素は左からドットが成長している。すなわち、重心位置に存在する画素の左側の画素は右からドットが成長し、逆に右側に位置する画素は左からドットが成長している。ＣＰＵ２４は、この重心位置が存在する画素の右側に位置する画素か左側に位置する画素かによって左右どちらの側からドットが成長すべきかのデータを量子化データとともにパルス幅変調部２１２に出力するのである。
【０１０１】
図２６（ａ）の例でさらに処理を続けると、重心位置に黒ドットを生成すると、まだ未処理画素があるため再び未処理画素の選択を行う（ステップＳ２０で“ＹＥＳ”が選択されて、ステップＳ１１に移行する）。ラスタ方向に探索すると（２，０）の画素位置は未処理画素であるので、この画素を選択する。このとき、この画素の階調値は“７０”であるが、例えば“２０”となっているときに、次に未処理画素として（３，０）を選択すると、セルを構成する画素の最大階調値と最小最小値の差が“５０”を超えてエッジとして検出されてしまう可能性がある。そこで、ＣＰＵ２４は未処理画素として選択された画素に対応する出力データ領域２６１ｂの画素にすでに処理すみである“０”が格納されていれば本来の階調値ではなく、ステップＳ２３で戻しデータであることを認識して、最大階調値、最小階調値、及び平均階調値の演算をスキップするようにする。これにより、エッジとして間違って検出されるのを防ぐのである。
【０１０２】
以後、セルを構成する未処理画素を選択していき図２６（ｃ）に示すように（４，０）を選択したとする。このとき、平均階調値は“８３”となり、閾値制御処理（図６のステップＳ１４）で閾値が“７６５”に変更される（ステップＳ１４２）ことになる。そして、同様に未処理画素の選択を続けて、図２７（ａ）に示す値を得る。これは、セルを構成する画素の階調値の合計が閾値である“７６５”を超える直前の状態である。
【０１０３】
図２７（ａ）に示すように（５，２）の画素を選択したとき、その階調値の合計は“８５０”（＝７６０＋９０）で閾値である“７６５”を超えるため（図６のステップＳ１５で“ＹＥＳ”）、閾値を超えた場合の演算処理（ステップＳ２２）に移行する。閾値“７６５”からこれまでの階調値の合計“７６０”を減算し、その“５”が当該画素（５，２）の階調値として重心の演算を行う（ステップＳ２２１、Ｓ２２２、図２７（ｃ）参照）。
【０１０４】
そして、最後に選択した画素（５，２）に残りの階調値“８５”（＝９０−５）を戻し（図２７（ｂ）の入力データ領域２６１ａ参照）、黒ドットの生成を行う（ステップＳ２３）。黒ドットの生成は、まず重心位置（３．７４，０．７９）に存在する画素（４，１）に“２５５”を割り当てる（図２７（ｃ）の出力データ領域２６１ｂ参照）。階調値の合計はまだ“５１０”の値分あるので、この（４，１）の画素に隣接する４つの処理済みの画素（（４，０）、（３，１）、（５，１）、（４，２）の画素）に均等に、１２８、１２８、１２７、１２７（全部で“５１０”）を割り当てることになる（図２８（ａ）の出力データ領域２６１ｂ参照）。この場合の、出力ドットは図２９（ｂ）に示すものを得る。まわりの画素から均等にドット生成を示す値を割り当てているので、入力階調値に忠実なドットで、さらに階調表現にすぐれたドットを生成することができる。この場合も、画素位置（３，１）は重心位置の左側なのでドットが右から成長するようにし、（５，１）の画素は重心位置の右側なのでドットが左側から成長するようにドットが打たれる。
【０１０５】
以下、上述した処理を繰り返すことで図２８（ｂ）に示す出力データを得る。このように１画素分のドット幅のうち所定幅の領域にドットを生成させることのできる画像出力装置２０であっても、上述した例と同様に滑らかな階調を表現でき、エッジの再現性が向上したドットを出力することができる。
【０１０６】
次に白濃度処理（図１０乃至図１１）について説明する。上述の例では、初期画素を選択した（ステップＳ１１）あと、その階調値が“１２７”よりも低い値を有していたのでステップＳ１２で低濃度と判定されて以下処理を行っていた。ここでは、初期画素の階調値が低濃度でない場合について説明する。例えば図３０（ａ）の入力データ領域２６１ａに示すデータが入力されるとすると、上述したようにラスタ方向に未処理画素を探索し（０，０）の画素を選択するとする。このとき、（０，０）に位置する画素の階調値は“１８５”で、“１２７”より高い値なのでステップＳ１２で“ＮＯ”と判定され白濃度処理（ステップＳ２４）に移行することになる。
【０１０７】
白濃度処理の動作を示すフローチャートを図１１乃至図１２に示す。ほぼ、低濃度のときの処理（図６のステップＳ１３からステップＳ２０）と同様である。セルを構成する画素が閾値と等しいか（ステップＳ２４８で“ＹＥＳ”）、超える（ステップＳ２４５で“ＹＥＳ”）まで重心位置から最も近い画素を選択し続ける。複数あればランダムに選択する。そして、閾値制御処理（ステップＳ２４４、図８参照）も同様で、平均階調値が所定値以上のときこれまでの閾値をより大きな値に設定して（ステップＳ１４２）、最大階調値と最小階調値の差が所定値以上のときエッジの部分であるとしてその設定した閾値を低い値に設定する（ステップＳ１４４）。
【０１０８】
この白濃度処理で、低濃度の処理のときとの違いは、まず選択した未処理画素の階調値をそのまま使用するのではなく、入力階調値の最大値（ここでは“２５５”）からの差を演算して、その値が当該画素の階調値として重心等の演算を行うようにする。例えば、図３０（ａ）の例では（０，０）の画素は“１８５”の階調値を有するが、最大値から減算すると“７０”（＝２５５−１８５）を得る。これを各未処理画素選択のたびに行うことで、図３０（ｂ）の入力データ領域２６１ａに示す値を有することになる。ただし、処理の上では各未処理画素を選択した後に減算（ステップＳ２４２）を行っているので、すべての画素に対してこの図に示す値に直してから処理が行われるものではない。この場合、結局図２４に示す値と同じ値を有するものとして処理が行われることになる。
【０１０９】
また、低濃度の処理のときとの違いは、未処理画素を選択すると、低濃度のときは対応する出力データ領域２６１ｂの画素位置にドットを生成しないことを示す値“０”を格納したが、白濃度処理のときでは対応する画素位置にドットを生成することを示す値（ここでは“２５５”）を格納する（図１０のステップＳ２４３）。図３０（ｃ）に示すように（０，０）の画素を未処理画素として選択したとき、出力データ領域２６１ｂの対応する（０，０）に“２５５”をＣＰＵ２４の制御によって格納されることになる。そして、セルを構成する画素の階調値の合計が閾値と等しい（ステップＳ２４８で“ＹＥＳ”）か、超える（ステップＳ２４５で“ＹＥＳ”）と重心位置にドットを生成することになるが、低濃度のときとは異なり、ドットを生成しないことを示す値（ここでも“０”）を重心位置に存在する画素位置に割り当てるのである（図３０（ｄ）参照）。ただし、複数の画素に“０”を割り当てなければならないとき、画素の選択は低濃度の処理と同様に重心位置に最も近い画素を選択したり、或いは最初に選択した画素に隣接する画素に均等に割り当てる方法であってもよい。均等に割り当てるときは、まわりの画素の“２５５”の値から減算した値となる。
【０１１０】
さらに、階調値の合計が閾値を超えた場合に、低濃度のときは最後に選択した画素の階調値が丁度閾値と等しくなる値にし、残りを当該画素に戻していたが、白濃度処理も同様に残りの階調値を当該画素に戻す処理が行われる（ステップＳ２５３）。ただし、ステップＳ２４２で階調値の減算を行ったので、本来の階調値に直して戻すことになる。例えば、図３０（ｄ）に示すように最後に（２，０）を選択して当該画素の階調値を“１０”（ステップＳ２４２の減算後階調値は“８０”となり、これまでのセルの階調値の合計値が“５００”だったので、閾値である“５１０”と等しくさせるために“１０”とした）として演算し、残った階調値は“７０”であるが、これは本来の階調値ではなくステップＳ２４２で減算した値である。よって、本来の階調値“１８５”に戻して当該画素に戻すのである（同図の入力データ領域２６１ａ参照）。
【０１１１】
このように、各画素で白成分が多い低濃度の場合と、黒成分が多い高濃度の場合（白濃度処理を行う場合）とで処理を異ならしめているのは、高濃度の成分に対して低濃度と同様の処理を行うと２つや３つの画素ですぐに閾値に達してしまうためセルの大きさを確保できず、その重心にドットを生成させてもセルが小さい分隣り合ったドットと距離を保てず、ドットが重なって発生するようになり、不快な印刷出力となってしまうからである。
【０１１２】
以上のような白濃度処理においても、閾値制御処理自体の内容は低濃度の処理と同様であるため、滑らかな階調が表現され、エッジの再現性が向上した印刷出力を得ることができる。
【０１１３】
上述の例で低濃度、高濃度の双方とも画素選択のための閾値として“２５５”の整数倍（５１０、７６５、…）として処理を行ってきたが、必ずしもこれに拘泥せず任意の整数値であってもよい。図３１（ａ）に示すように、閾値として“４５０”が設定された場合に、重心位置に“２５５”を割り当て、残りの値“１９５”をこの画素位置に隣接する処理済みの４つの画素に均等に割り当てている。また図３１（ｂ）に示すように、重心位置に“２５５”を割り当て、残りの値“１９５”を重心位置に最も近い画素に割り当ててもよい。このような場合でも、平均階調値が所定の値以上のときに画素選択のための閾値を“４５０”から例えば“４８０”にすることで、セルの大きさを確保しドット間距離を保つことができる。要するに、平均階調値を引数とする関数を用いて、平均階調値に応じた閾値を設定するようにすればよい。
【０１１４】
さらに、以下のような変形例においても同様の効果を奏する。すなわち、上述の例において、本発明が適用されるハーフトーン処理部２１１は画像出力装置２０において処理が行われていたが、それ以外にも図３２に示すようにハーフトーン処理部２１１がホストコンピュータ１０内に設けられ、このハーフトーン処理部２１１において本発明が適用されることによっても、上述したものと全く同様の効果を奏することができる。この場合、ハーフトーン処理２１１から出力される量子化データがホストコンピュータ１０から画像出力装置２０に入力されて、パルス幅変調２１２から印刷エンジン２２にドット生成を示す制御データが出力され印刷が行われることになる。
【０１１５】
また、ホストコンピュータ１０以外にも例えば携帯電話やＰＤＡ（Personal Digital Assistance）、その他の情報携帯端末において、印刷対象のデータが生成されて画像出力
装置２０に出力されるようになされていてもよい。さらには、かかる端末に本発明が適用されるハーフトーン処理部２１１を備えるようにしてもよい。さらには、紙とディスプレイとを組み合わせた、いわゆる電子ペーパーにおいてかかる本発明のハーフトーン処理２１１が設けられ、２値化（又は多値化）された値で文書や画像を表示したり、画像出力装置２０との組み合わせて印刷出力を得るようにしてもよい。これらの場合でも、上述した効果を得ることができる。
【０１１６】
また、ＣＣ法による処理で、セルを構成する画素を選択するとき、演算した重心位置を用いて選択したが、それ以外にも階調値を考慮せず座標位置のみの中心位置から最も近い画素を選択するようにしてもよい。すなわち、（座標位置の和）／（選択画素の数）により演算した（ｘ、ｙ）の座標位置からセルを構成する画素を選択するのである。例えば、（０，０）と（１，０）の２つの画素をセルを構成する画素として選択した場合、その中心位置は（０．５，０）、この中心位置から最も近い位置にある未処理画素を選択する。さらに（０，１）を加えた３つの画素の場合、その中心位置は（０．５，０．５）、その画素位置から最も近い画素位置を未処理画素として選択するようにする。要するに、セルを構成する未処理画素を選択するときに常にテーブル等を利用して固定して選択するのではなく、画素選択のための基準点の位置（上述の例で説明した重心位置や、階調値を考慮せず座標位置のみで演算した中心位置）が移動すればよい。このように移動することで、セルの形状が固定の場合と比較してより円状に成長する可能性が高まり、ドット間距離が保たれた快適な画像出力を得られるからである。
【０１１７】
上述の例では、平均階調値をセルを構成する画素を選択するごとに演算したが、例えば、初期画素選択後、１画素、２画素等、固定画素数選択したときまで平均階調値を演算し、その後は平均階調値の演算を行わない場合でも同様の効果を奏する。重心付近の数画素を選択して平均階調値を演算して閾値を設定するようにすることで、毎回画素選択のたびに演算するよりも、演算量を少なくすることができ全体の処理を早めることもできる。
【０１１８】
さらに、上述の例では平均階調値によりその閾値を更新させるようにしたが、画素数により閾値を変化させるようにしてもよい。例えば、最小画素数を設定し、それ以上の画素がセルを構成する画素として選択されると、閾値をこれまでの“２５５”から“５１０”に設定するなどとすることができる。
【０１１９】
また、上述の例ではエッジの検出としてセル内の最大階調値と最小階調値の差から演算したが、例えばそれ以外にも階調値の分散値や標準偏差から演算するようにしても全く同様の作用効果を奏する。すなわち、平均階調値をμ、分散をσ2  とすると、分散、標準
偏差はそれぞれ、
σ2       ＝  ｛１/（画素数）｝×Σ（各画素の階調値―μ）2
標準偏差  ＝  √σ2
となる。この分散値や、標準偏差の値がある値以上のときは、エッジであるとしてその閾値を更新させるのである。
【０１２０】
さらに、上述の例では平均階調値によりその閾値を更新させるようにしたが、画素数により閾値を変化させるようにしてもよい。例えば、最小画素数を設定し、それ以上の画素がセルを構成する画素として選択されると、閾値をこれまでの“２５５”から“５１０”に設定するなどとすることができる。
【０１２１】
さらに上述の例では、ホストコンピュータ１０から出力されるデータはモノクロデータであるとして説明してきたが、ＣＭＹＫ（シアン、マゼンダ、イエロー、ブラック）のカラーデータに対して処理を行ってもよい。すなわち、ラスタライズ部１２で各画素ごとＲＧＢ（レッド、グリーン、ブルー）の階調データを生成し、画像出力装置２０内に色変換部を設けてこのＲＧＢデータをテーブル又は関数等を利用することでＣＭＹＫの各色データに変換する。この変換後のＣＭＹＫの各データ（シアン、マゼンダ、イエロー、ブラックの各データごと）に対して上述したＣＣ法による処理を行うのである。この場合でも、各色成分で平均階調値が高い領域では閾値をこれまでの値より大きくしてドット間距離を保ち、階調値の差が大きい領域ではエッジの部分としてその大きくした閾値を下げてドット密度を高めエッジの再現性を向上させるのである。もちろん、カラーを表現する色成分としてＣ、Ｍ、Ｙ、Ｋの４色以外にもライトシアン、ライトマゼンダを含めた６色や、さらにそれ以外の色成分を含めた複数色の場合でも同様の効果を得ることができる。
【図面の簡単な説明】
【０１２２】
【図１】本発明が適用されるシステム全体の構成を示す図である。
【図２】画像出力装置の具体的構成を示す図である。
【図３】除々に入力階調値が変化する場合の印刷出力例である。
【図４】エッジの検出を行わなかった場合の印刷出力例である。
【図５】エッジの検出を行って閾値を変更させた場合の印刷出力例である。
【図６】ＣＣ法による処理の動作を示すフローチャートである。
【図７】ＣＣ法による処理の動作を示すフローチャートである。
【図８】閾値制御処理の動作を示すフローチャートである。
【図９】閾値を超えた場合の階調値演算処理の動作を示すフローチャートである。
【図１０】白濃度演算処理の動作を示すフローチャートである。
【図１１】白濃度演算処理の動作を示すフローチャートである。
【図１２】ＲＡＭ２６の内部構成の例を示す図である。
【図１３】ＲＡＭ２６の内部構成の例を示す図である。
【図１４】ＲＡＭ２６の内部構成の例を示す図である。
【図１５】Ｃ、Ｍに対する処理全体の動作を示すフローチャートである。
【図１６】ＲＡＭ２６の内部構成の例を示す図である。
【図１７】ＲＡＭ２６の内部構成の例を示す図である。
【図１８】ＲＡＭ２６の内部構成の例を示す図である。
【図１９】ＲＡＭ２６の内部構成の例を示す図である。
【図２０】ＲＡＭ２６の内部構成の例を示す図である。
【図２１】ＲＡＭ２６の内部構成の例を示す図である。
【図２２】ＲＡＭ２６の内部構成の例を示す図である。
【図２３】閾値を変更する関数の一例である。
【図２４】ＲＡＭ２６の内部構成の例を示す図である。
【図２５】ＲＡＭ２６の内部構成の例を示す図である。
【図２６】ＲＡＭ２６の内部構成の例を示す図である。
【図２７】ＲＡＭ２６の内部構成の例を示す図である。
【図２８】ＲＡＭ２６の内部構成の例を示す図である。
【図２９】ドットの印刷出力例である。
【図３０】ＲＡＭ２６の内部構成の例を示す図である。
【図３１】ＲＡＭ２６の内部構成の例を示す図である。
【図３２】本発明が適用される他のシステム全体の構成を示す図である。
【符号の説明】
【０１２３】
１０  ホストコンピュータ    ２０  画像出力装置    ２１  画像処理部    ２１１  ハーフトーン処理部    ２１２  パルス幅変調部    ２２  印刷エンジン    ２４  ＣＰＵ    ２５  ＲＯＭ    ２６１ａ  入力データ格納領域    ２６１ｂ  出力データ格納領域  ２７０  ワーキングメモリ領域    ２７０ａ  重心位置と階調値の合計値とが格納される領域    ２７０ｂ  セルの最大階調値と最小階調値とが格納される領域    ２７０ｃ  平均階調値が格納される領域    ２７０ｄ  閾値が格納される領域
【図１】
2005136976.tif 000003
【図２】
2005136976.tif 000004
【図３】
2005136976.tif 000005
【図４】
2005136976.tif 000006
【図５】
2005136976.tif 000007
【図６】
2005136976.tif 000008
【図７】
2005136976.tif 000009
【図８】
2005136976.tif 000010
【図９】
2005136976.tif 000011
【図１０】
2005136976.tif 000012
【図１１】
2005136976.tif 000013
【図１２】
2005136976.tif 000014
【図１３】
2005136976.tif 000015
【図１４】
2005136976.tif 000016
【図１５】
2005136976.tif 000017
【図１６】
2005136976.tif 000018
【図１７】
2005136976.tif 000019
【図１８】
2005136976.tif 000020
【図１９】
2005136976.tif 000021
【図２０】
2005136976.tif 000022
【図２１】
2005136976.tif 000023
【図２２】
2005136976.tif 000024
【図２３】
2005136976.tif 000025
【図２４】
2005136976.tif 000026
【図２５】
2005136976.tif 000027
【図２６】
2005136976.tif 000028
【図２７】
2005136976.tif 000029
【図２８】
2005136976.tif 000030
【図２９】
2005136976.tif 000031
【図３０】
2005136976.tif 000032
【図３１】
2005136976.tif 000033
【図３２】
2005136976.tif 000034