(57)【要約】【課題】中間階調領域の入力画像に対しても高画質で快適な印刷出力を得る。【解決手段】画素ごとに階調画像データ値を有する画像データが入力され、前記画像を印刷する印刷装置において、前記画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成手段と、前記画素群生成手段で生成した画素群の重心位置を決定する重心位置決定手段と、前記重心位置決定手段で決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定手段と、前記出力データ値設定手段で設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換手段と、前記パルス幅変換手段で変換されたパルスに基づいて前記ドットを生成して印刷用紙に前記入力された画像の印刷を行う印刷制御手段と、を有し、前記画素群生成手段は前記重心位置決定手段で決定した重心位置から最も近い画素を選択することを特徴としている。【選択図】図９
2004312456.tif 000002
【特許請求の範囲】
【請求項１】
画素ごとに階調画像データ値を有する画像データに従って、前記画像を印刷する印刷装置において、
前記画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成手段と、
前記画素群生成手段で生成した画素群の重心位置を決定する重心位置決定手段と、
前記重心位置決定手段で決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定手段と、
前記出力データ値設定手段で設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換手段と、
前記パルス幅変換手段で変換されたパルスに基づいて前記ドットを生成して印刷用紙に前記入力された画像の印刷を行う印刷制御手段と、
を有し、前記画素群生成手段は前記重心位置決定手段で決定した重心位置から最も近い画素を選択することを特徴とする印刷装置。
【請求項２】
請求項１記載の印刷装置であって、
前記出力データ値は、少なくとも前記パルスの幅情報についての値であることを特徴とする印刷装置。
【請求項３】
請求項１記載の印刷装置であって、
前記画素群生成手段は、前記画素群重心決定手段で決定した重心位置から最も近い画素が複数存在するときにランダムに画素を選択することを特徴とする印刷装置。
【請求項４】
画素ごとにＮ（Ｎは正の整数）種類以上のレベルを有するＮ値画像データが入力され、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベルを有するＭ値の画像データを出力する画像処理装置において、
前記画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成手段と、
前記画素群生成手段で生成した画素群の重心位置を決定する重心位置決定手段と、
前記重心位置決定手段で決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定手段と、
前記出力データ値設定手段で設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換手段と、
を有し、前記画素群生成手段は前記重心位置決定手段で決定した重心位置から最も近い画素を選択することを特徴とする画像処理装置。
【請求項５】
画素ごとに階調画像データ値を有する画像データに従って、前記画像を印刷する印刷方法において、
前記画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成ステップと、
前記画素群生成ステップで生成した画素群の重心位置を決定する重心位置決定ステップと、
前記重心位置決定ステップで決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定ステップと、
前記出力データ値設定ステップで設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換ステップと、
前記パルス幅変換ステップで変換されたパルスに基づいて前記ドットを生成して印刷用紙に前記入力された画像の印刷を行う印刷制御ステップと、
を有し、前記画素群生成ステップは前記重心位置決定ステップで決定した重心位置から最も近い画素を選択することを特徴とする印刷方法。
【請求項６】
画素ごとにＮ（Ｎは正の整数）種類以上のレベルを有するＮ値画像データが入力され、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベルを有するＭ値の画像データを出力する画像処理方法において、
前記画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成ステップと、
前記画素群生成ステップで生成した画素群の重心位置を決定する重心位置決定ステップと、
前記重心位置決定ステップで決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定ステップと、
前記出力データ値設定ステップで設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換ステップと、
を有し、前記画素群生成ステップは前記重心位置決定ステップで決定した重心位置から最も近い画素を選択することを特徴とする画像処理方法。
【請求項７】
画素ごとに階調画像データ値を有する画像データが入力され、前記画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成処理と、
前記画素群生成処理で生成した画素群の重心位置を決定する重心位置決定処理と、
前記重心位置決定処理で決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定処理と、
前記出力データ値設定処理で設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換処理と、
前記パルス幅変換処理で変換されたパルスに基づいて前記ドットを生成して印刷用紙に前記入力された画像の印刷を行う印刷制御処理と、
を有し、前記画素群生成処理は前記重心位置決定処理で決定した重心位置から最も近い画素を選択することをコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、画素ごとに所定の階調値を有する画像データに対して、構成されたセルの重心位置を中心にドットを生成する印刷装置、画像処理装置、印刷方法、画像処理方法及びプログラムに関する。
【０００２】
【従来の技術】
従来より、デジタル画像の１画素が多数の値を持ち得る連続階調のデータを少数の階調（例えば２値）に変換する、ハーフトーン処理が行われている。ハーフトーン処理の方法としては、誤差拡散法がよく知られている。誤差拡散法では、変調の周期（ドットを打つ位置の周期）が入力画像の階調値に応じて変化するため、その周期が閾値マトリックスで予め決められたディザ法に比べ、高い解像度を有している。
【０００３】
一方で、誤差拡散法は、入力画像の階調値が低濃度の値で分布していると、誤差が遠く離れた画素まで拡散する場合もあり、結果的にドットの分散性が劣化する問題があった。
【０００４】
そこで、入力画像を所定の大きさのセルに分割し、各セルの中心位置にドットを生成させるようにすることで、誤差拡散法の高解像性を保持したまま、ドットのつながりなどの画質劣化を防止する技術が開示されている（例えば、特許文献１）。
【０００５】
【特許文献１】
特開平１１−２７５２８号公報（図４、図７）
【０００６】
【発明が解決しようとする課題】
しかしながら、上述した特開平１１−２７５２８は、入力画像の中間階調領域においてすぐに閾値に達するため、セルサイズが小さくなってしまう。かかるサイズが小さいと、隣接するセルでドットが繋がったり離れたりなどドット間距離にばらつきが生じ、視覚的にドットが目立つなど快適な印刷出力を得ることができない問題点があった。
【０００７】
そこで、本発明は、中間階調領域の入力画像に対しても高画質で快適な印刷出力を得る印刷装置、印刷方法、画像処理装置、画像処理方法及びプログラムを提供することを目的とする。
【０００８】
【課題を解決するための手段】
上記目的を達成するために、本発明は、画素ごとに階調画像データ値を有する画像データに従って画像を印刷する印刷装置において、画素ごとの階調画像データ値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成手段と、画素群生成手段で生成した画素群の重心位置を決定する重心位置決定手段と、重心位置決定手段で決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定手段と、出力データ値設定手段で設定された画素の出力データ値を所定幅のパルスに変換するパルス幅変換手段と、パルス幅変換手段で変換されたパルスに基づいてドットを生成して印刷用紙に入力された画像の印刷を行う印刷制御手段と、を有し、画素群生成手段は重心位置決定手段で決定した重心位置から最も近い画素を選択することを特徴としている。これにより、例えば、重心位置とドットの中心位置との誤差が最小となるような、複数画素に跨るドットを生成でき、画質劣化なく視覚的に快適な印刷出力を得ることができる。
【０００９】
また、本発明は、上記印刷装置であって、上記出力データ値は、少なくともパルスの幅情報についての値であることを特徴としている。これにより、例えば、印刷装置は、この幅情報を用いてドットを生成するためのパルスを容易に生成することができる。
【００１０】
また、本発明は、上記印刷装置であって、上記画素群生成手段は、画素群重心決定手段で決定した重心位置から最も近い画素が複数存在するときにランダムに画素を選択することを特徴している。これにより、例えば、セルが円状に生成され重心にドットを生成しても、隣接するセルでドットが繋がって生成されることはなくなり、視覚的に快適な印刷出力を得ることができる。
【００１１】
また、上記目的を達成するために本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベルを有するＮ値画像データが入力され、画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベルを有するＭ値の画像データを出力する画像処理装置において、画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成手段と、画素群生成手段で生成した画素群の重心位置を決定する重心位置決定手段と、重心位置決定手段で決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定手段と、出力データ値設定手段で設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換手段と、を有し、画素群生成手段は重心位置決定手段で決定した重心位置から最も近い画素を選択することを特徴としている。これにより、例えば、重心位置とドットの中心位置との誤差が最小となるような、複数画素に跨るドットを生成でき、画質劣化なく視覚的に快適な出力画像を得ることができる。
【００１２】
さらに、上記目的を達成するために、本発明は、画素ごとに階調画像データ値を有する画像データに従って画像を印刷する印刷方法において、画素ごとの階調画像データ値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成ステップと、画素群生成ステップで生成した画素群の重心位置を決定する重心位置決定ステップと、重心位置決定ステップで決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定ステップと、出力データ値設定ステップで設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換ステップと、パルス幅変換ステップで変換されたパルスに基づいてドットを生成して印刷用紙に入力された画像の印刷を行う印刷制御ステップと、を有し、画素群生成ステップは重心位置決定ステップで決定した重心位置から最も近い画素を選択することを特徴としている。これにより、例えば、重心位置とドットの中心位置との誤差が最小となるような、複数画素に跨るドットを生成でき、画質劣化なく視覚的に快適な印刷出力を得ることができる。
【００１３】
さらに、上記目的を達成するために、本発明は、画素ごとにＮ（Ｎは正の整数）種類以上のレベルを有するＮ値画像データが入力され画素ごとにＭ（Ｍ＜Ｎ、Ｍは正の整数）種類のレベルを有するＭ値の画像データを出力する画像処理方法において、画素ごとの階調画像データ値の総和が閾値以上となるまで、画素を選択して画素群を生成する画素群生成ステップと、画素群生成ステップで生成した画素群の重心位置を決定する重心位置決定ステップと、重心位置決定ステップで決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定ステップと、出力データ値設定ステップで設定された画素の出力データ値を、所定幅のパルスに変換するパルス幅変換ステップと、を有し、画素群生成ステップは重心位置決定ステップで決定した重心位置から最も近い画素を選択することを特徴としている。これにより、例えば、重心位置とドットの中心位置との誤差が最小となるような、複数画素に跨るドットを生成でき、画質劣化なく視覚的に快適な出力画像を得ることができる。
【００１４】
さらに、上記目的を達成するために、本発明は、画素ごとに階調画像データ値を有する画像データが入力され画素ごとの階調画像データ値の総和が閾値以上となるまで画素を選択して画素群を生成する画素群生成処理と、画素群生成処理で生成した画素群の重心位置を決定する重心位置決定処理と、重心位置決定処理で決定した重心位置を中心に所定ドット分の大きさに含まれる画素に出力データ値を設定する出力データ値設定処理と、出力データ値設定処理で設定された画素の出力データ値を所定幅のパルスに変換するパルス幅変換処理と、パルス幅変換処理で変換されたパルスに基づいて前記ドットを生成して印刷用紙に前記入力された画像の印刷を行う印刷制御処理と、を有し、画素群生成処理は重心位置決定処理で決定した重心位置から最も近い画素を選択することをコンピュータに実行させるためのプログラムであることを特徴としている。これにより、例えば、重心位置とドットの中心位置との誤差が最小となるような、複数画素に跨るドットを生成でき、画質劣化なく視覚的に快適な印刷出力を得ることができる。
【００１５】
【発明の実施の形態】
以下、図面を参照して本発明の実施の形態例を説明する。
【００１６】
図１は、本発明による画像出力システムをモノクロ入力画像に適用した場合の処理の流れを示すシステム全体構成図である。この例では、ホストコンピュータ１０において、生成した階調画像データ１６（図１においてはモノクロである）が、ページプリンタなどの画像出力装置２０に出力され、画像出力装置２０でホストコンピュータ１０からの画像データが出力されるようになっている。
【００１７】
ホストコンピュータ１０は、アプリケーション部１２とラスタライズ部１４とから構成される。
【００１８】
アプリケーション部１２は、ホストコンピュータ１０内に実装されたアプリケーションプログラムにより印刷対象となる、文字データ、図形データ、ビットマップデータ、その他の種々のデータが生成される。これらのデータは、例えばホストコンピュータに接続された表示装置や入力装置を介して生成させることができる。アプリケーション部１２で生成されたデータは、ラスタライズ部１４に出力される。
【００１９】
ラスタライズ部１４は、アプリケーション部１２から出力された印刷対象のデータをラスタライズし、各画素または各ドットごと８ビットの値からなる階調画像データ１６に変換される。８ビットのデータであるので、各画素は０から２５５までの値をとることができる。ラスタライズ１４は、実際にはホストコンピュータ１０に実装されたドライバによって実行されることになる。８ビットのデータに変換された階調画像データ１６は、画像出力装置２０に出力される。
【００２０】
画像出力装置６０は、ハーフトーン処理部２６、パルス幅変調２８と、印刷エンジン３０とから構成される。
【００２１】
ハーフトーン処理部２６は、入力された階調画像データ１６に対して、より少数の階調の値（２値や４値など）に変換する処理を行う。この階調画像データ１６は、０から２５５までの連続階調の値を有しており、例えばこれを２値の値（０及び１など）に変換することで、画像出力装置２０で実際に用紙に印刷するときに、ドットをうつ又はうたない、という処理を行うことが可能になる。
【００２２】
ハーフトーン処理部２６によって所定の階調値に変換されたデータ３０は、パルス幅変調部２８に出力される。パルス幅変調部２８は、各画素ごと変換されたデータ３０を、レーザー駆動パルスあり又はなし、かつありの場合はそのパルス幅等からなる駆動データ２９に変換する。生成された駆動データ２９は、エンジン３０に出力される。
【００２３】
エンジン３０は、レーザードライバ３２と、レーザーダイオード３４とから構成される。レーザードライバ３２は、入力された駆動データ２９から、駆動パルスあり又はなし等を示す制御データを生成し、レーザーダイオード３４に出力する。レーザーダイオード３４は、レーザードライバ３２からのこの制御データに基づいて駆動され、また図示しない感光ドラムや転写ベルトが駆動されて、実際に印刷用紙にホストコンピュータ１０からのデータが印刷されることになる。
【００２４】
次に画像出力装置２０の具体的構成を、図２を参照して説明する。
【００２５】
ここで、図１のハーフトーン処理部２６は、図２におけるＣＰＵ２１と、ＲＯＭ２５、及びＲＡＭ２７に対応し、パルス幅変調部２８は、ＣＰＵ２１と、ＲＯＭ２５及びＲＡＭ２７に対応する。
【００２６】
画像出力装置２０は、全体として、ＣＰＵ２１と、入力インターフェース（Ｉ／Ｆ）２３と、ＲＯＭ２５と、ＲＡＭ２７とから構成される。
【００２７】
ＣＰＵ２１は、内部バスを介して、入力Ｉ／Ｆ２３、ＲＯＭ２５、ＲＡＭ２７、印刷エンジン３０と互いに接続され、重心位置の演算や、未処理画素の選択、ドットの生成等、各種処理を実行するためのものである。詳細は後述する。
【００２８】
入力Ｉ／Ｆ２３は、ホストコンピュータ１０と画像出力装置２０とのインターフェースとしての役割を果たし、本実施例では、ホストコンピュータ１０から出力される、ラスタライズされた各画素ごとに所定の階調値を有する入力画像データが入力される。入力された画像データはＣＰＵ２１の制御により一旦ＲＡＭ２７に格納される。
【００２９】
ＲＯＭ２５は、各種プログラムなどが格納される。ＣＰＵ２１の制御によりプログラムが読み出されて、各種処理が実行されることになる。
【００３０】
ＲＡＭ２７は、ＣＰＵ２１が処理を実行する際のワーキングメモリとしての役割を果たし、実行データ等が一時格納される。
【００３１】
印刷エンジン３０は、図１のエンジン３０と同様の構成で、レーザドライバ３２及びＬＤ３４とから構成される。
【００３２】
次に、全体の動作について説明するが、その前に本発明の重心を利用して未処理画素を探索し、ドット生成を行うまでの原理について図３から図６を参照して説明する。
【００３３】
ホストコンピュータ１０から各画素ごとに所定の階調値を有するデータが入力される。この画像データの例を図３（ａ）に示す。これは、入力された画像データが入力Ｉ／Ｆ２３を介してＣＰＵ２１の制御によりＲＡＭ２７の入力バッファ領域２７１に格納された例を示している。入力バッファ２７１は、ｍ行ｎ列の２次元構造を有し、各位置はホストコンピュータ１０で生成された画像の画素位置に対応するものである。例えば、入力バッファの（ｎ、ｍ）の位置に格納されたデータは、全体画像における（ｎ、ｍ）の位置に位置する画素の階調値に対応するものである。
【００３４】
ここでは、説明を簡単にするため、縦方向はｍからｍ＋２まで、横方向はｎからｎ＋３までの入力バッファ構造を示しているが、実際には１画像（１フレーム）分の入力バッファの構成を有することになる。
【００３５】
ここで行う処理は、初期画素から所定の閾値に達するまで順次画素を取り込んでいき、一定の大きさのセルを生成する。順次画素を取り込むときに選択される画素は、これまで取り込んだ画素の重心位置を利用して、その位置から最も近い画素を取り込むようにする。このように重心から次の画素を探索するため、生成したセルは円状に生成し、その重心にドットを形成しても、隣合うドットは均一の距離が保たれる。かかるドットの分散により視覚的に快適な印刷出力を得ることができる。
【００３６】
また、重心から最も近い画素が複数存在するときは、ランダムに画素を選択するものとする。ランダムではなく固定順により選択すると最終的に生成されるセルの形が常に一定でその重心にドットを形成しても全体としてドットの位置が周期的で印刷出力において周期パターンを発生させてしまうことになる。かかる周期パターンは、視覚に映りやすく印刷出力の画像が不自然なものとなってしまう。一方、ランダムにより選択することで、生成されるセルの形状が常に一定とはならず、重心にドットを形成しても周期パターンが発生せず、視覚的に快適な印刷出力を得られるのである。図７（ａ）にランダムに選択した場合の印刷出力の例を示し、図７（ｂ）にはランダムではなくテーブル等を利用して固定順で画素を選択した場合の印刷出力の例を示す。図７（ｂ）に示すように固定順の場合、印刷部分の左下から右上にかけて一定の並び順でドットが形成されているため、周期パターンが発生し、このパターンが視覚に反映されて印刷出力が不自然なものとなっている。一方、図７（ａ）に示すようにランダムに選択した場合には、周期パターンが発生せず、視覚的に快適な印刷出力を得ることができる
そして、選択された画素が閾値に達すると、それまで選択した画素により構成されるセルが生成され、そのセルの重心にドットを生成させるよう処理を行う。
【００３７】
図３の例に戻って、処理の流れを具体的に説明する。まず初期画素を選択画素として決定する。初期画素は、ここでは、まだ処理されていない未処理画素のうち最も上でかつ最も左側にある画素とする。したがって、図３（ａ）に示す例では、図３（ｂ）に示すように（ｎ、ｍ）に位置する画素が最も上でかつ左側にある画素なので、この画素が初期画素となり、これを選択画素２７１ａとして選択することになる。
【００３８】
そして、これまで選択した画素の階調値の合計が閾値に達したか否か判断される。ここでは、閾値として例えば“２５５”を設定されているものとする。この時点では、初期画素２７１ａのみの選択で、その階調値の合計は“５０”であるため、閾値に達していないことになる。よって、さらに画素を選択する動作を行う。
【００３９】
画素の選択は、上述したように重心を利用して、重心から最も近い画素を選択する。これまで選択されたセル２７１ｂは、この時点で初期画素のみなので、この重心を決定すると、図３（ｃ）に示す位置２７１ｃに位置することになる。重心の決定方法は、後述する。そして、この位置２７１ｃから最も近い画素を選択する。ここでは、（ｎ、ｍ＋１）と（ｎ＋１、ｍ）の２つが重心から最も近い画素である。複数ある場合は、ランダムに選択するので、例えば図３（ｃ）に示すように（ｎ＋１、ｍ）に位置する画素を選択する。
【００４０】
次いで、選択画素２７１ａをセル２７１ｂに組み込み、その重心を決定すると、図４（ａ）に示す位置に重心２７１ｃが位置することになる。この重心２７１ｃから最も近い画素を選択画素２７１ａとして選択すると、２つの画素（ｎ，ｍ＋１）と（ｎ＋１，ｍ＋１）であるが、ランダムに選択して、図４（ａ）に示すように（ｎ、ｍ＋１）に位置する画素を選択画素２７１ａとする。
【００４１】
以上の処理を繰り返して、図４（ｂ）に示すように５つの画素（（ｎ、ｍ）、（ｎ、ｍ＋１）、（ｎ＋１、ｍ）、（ｎ＋１、ｍ＋１）、（ｎ＋１、ｍ＋２））が選択されると、セル２７１ｂの階調値の合計（“２６５”）が閾値（“２５５”）に達するので、ここで画素の選択を終わらせる。そして、セル２７１ｂの重心位置を演算すると図４（ｂ）に示す位置２７１ｃに重心が存在する。ここで、この重心が存在する画素にドットを生成させるようにするため、所定の値を設定する。ここでは“２５５”の値を（ｎ＋１、ｍ＋１）の位置に設定する。
【００４２】
ここで、最終的に選択された画素が（ｎ＋１、ｍ＋２）とすると、その階調値の合計は、“２６５”となる。重心位置の決定に際して、セル２７１ｂの階調値の合計が“２５５”として演算を行う。すなわち、最後に選択された画素（ｎ＋１、ｍ＋２）は、その階調値が“５５”として重心の演算を行う。この誤差分“１０”（＝６５−５５）は、再び画素（ｎ＋１、ｍ＋２）に戻し、セル２７１ｄに組み込ませずに再度初期画素からセル２７１ｂを構成させる際に選択対象の画素となるようにする。このように戻しデータ値をもとの画素（ｎ＋１、ｍ＋２）に戻すため、生成したセル以外の画素に戻して誤差を伝播させるときと比べて入力された画素の階調値のドット分布に忠実に出力ドットが形成されることになる。
【００４３】
そして、再び、初期画素２７１ａを選択して、上述の処理を繰り返すことで、図５（ａ）に示すような２つのセルが生成されることになる。ここで、各セルの重心位置２７１ｃに存在する画素に対してドットを生成させるようにすると、図５（ｂ）に示すように、出力ドットが隣り合うセルで接触することになる。このため、印刷出力全体で見るとこのドットが目立ち、結果的に分散性が劣ったドットを生成することになってしまう。かかるドットにより視覚的に快適な印刷出力を得ることができなくなってしまう。とくに、入力画像データの階調値が中間階調領域（例えば“１２０”の値で連続した領域など）では、２つや３つの画素でセルが構成されることになるので、セルが小さく、図５（ｂ）に示すようにドットが隣接したり、或いはドットが離れすぎたりするため、快適な印刷出力を得にくい状況となる。
【００４４】
そこで、セルを構成する画素群の中で重心を決定すると、その重心位置を中心に複数の画素を跨いで正確に重心位置にドットを生成させるようにする。例えば図５（ｃ）に例を示す。このようにドットを生成させれば、入力階調分布の重心位置と出力ドットの重心位置ずれをなくすことができるので、中間階調領域でも分散性を向上したドットを生成することができる。他にも、図６（ａ）に示すように、セルの重心位置とドットの重心位置は水平方向（ｎ、ｎ＋１・・・の方向）では一致するが、鉛直方向（ｍ、ｍ＋１・・・の方向）では若干ずれている場合でも、図５（ｂ）の場合と比較して、ドットの分散性は向上していることになる。
【００４５】
さらに図６（ｂ）に示すように、水平方向の重心位置とドットの中心位置は一致するが、正確に重心位置とドットの中心位置とが一致するドット（図５（ｃ）参照）が含まれる４つの画素にドットを生成するようにしてもよい。図５（ｂ）と比較してドットの分散性が向上するからである。
【００４６】
ここで、ドット全体の面積は１ドット分の面積（例えば１画素分の面積）となるように生成されている。これは、画素（ｎ，ｍ）と、画素（ｎ＋１，ｍ）の境目からドットがうたれる領域割合はｎ方向では、図６（ａ）と同じであるがその面積は全体として１ドット分の大きさとなっている。さらに、重心が位置する画素に応じて、ドットの幅も変えている。すなわち、画素（ｎ，ｍ）と（ｎ＋１，ｍ）との領域にうたれるドットｎ方向の幅と、画素（ｎ，ｍ＋１）と（ｎ＋１，ｍ＋１）との領域にうたれるドットｎ方向の幅では、重心が位置する方の画素を含む領域（画素（ｎ，ｍ＋１）と（ｎ＋１，ｍ＋１）の方の領域）の方を広げてドットをうっている。これにより重心に忠実なドットを生成させることができる。
【００４７】
なお、以上の処理で、すでに構成されたセルの重心と、現在構成したセルの重心とが一致する場合も考えられる。かかる場合には、すでに構成されたセルの重心から生成されたドットの隣でかつ未だドットの生成が行われていない領域に、１ドット分の大きさのドットを生成させるようにすることが考えられる。全くドットを形成させないようにすることも考えられるが、入力階調値に忠実なドット分布を得るようにするためには、このようにドットを形成させることが望ましい。
【００４８】
次に図８から図１９を参照して、以上述べてきたセルの生成からドットの生成までの具体的処理について説明する。
【００４９】
ここで前提として、ホストコンピュータ１０から入力される階調画像データは、図３（ａ）に示すデータが入力されるものとする。そして、入力されたデータは、ＣＰＵ２１の制御によりＲＡＭ２７の入力バッファ領域２７１に格納されるものとする。その例を図１０に示す。
【００５０】
図１０（ａ）は、全体としてＲＡＭ２７の構成を示す。ＲＡＭ２７は、入力バッファ領域２７１と、ワーキングメモリ領域２７２と、出力バッファ領域２７３とから構成され、ＣＰＵ２１に制御により、ＣＰＵ２１によって演算されたデータ等がそれぞれ入力バッファ２７１、ワーキングメモリ２７２、出力バッファ２７３に適宜、書き込みや読み出しが行われるようになされている。
【００５１】
入力バッファ領域２７１は、上述したようにホストコンピュータ１０から出力された入力画像データの階調値が格納される。２次元構造であり、各位置は入力画像全体の画素の位置に対応する。ワーキングメモリ２７２は、演算した重心位置や階調値の合計などを格納するためのものである。出力バッファ２７３も、入力バッファ２７１と同様に２次元構造で、画像全体の画素の位置に対応し、この各位置に格納された値によって印刷を行うことになる。
【００５２】
図３（ａ）に示す画像データが入力されたときの例を図１０（ｂ）に示す。ここでは説明を簡単にするため、３行４列の入出力バッファ２７１、２７３で、（ｎ、ｍ）を（０、０）として以下説明することにする。
【００５３】
図８、９は、セルの生成からドット生成までの処理全体の動作を示すフローチャートである。
【００５４】
まず、処理が開始される（ステップＳ１０）と、ＣＰＵ２１は初期画素を決定し、初期濃度重心を演算する（ステップＳ１１）。図１０（ｂ）に示す例では、初期画素は未処理画素のうち最も上でかつ左側にある画素が選択されるため、（０，０）に位置する画素が選択される。そして、ＣＰＵ２１は初期画素の位置する画素の階調値と、そのアドレス位置とを読み出し、重心を演算する。ＣＰＵ２１が演算する重心は具体的には、以下の演算式を用いる。
【００５５】
2004312456.tif 000003
この演算式はＲＯＭ２５に格納され、ステップＳ１１にてＣＰＵ２１が読み出して演算を行うことになる。ちなみに、初期画素の場合は、量子化中画素群の重心のｘ、ｙ座標、及び量子化中画素群の重心の階調値はともに０として演算される。（式１）にこれらの値と、読み出した初期画素の位置と階調値とを代入して演算すると、重心位置は（ｘ重心、ｙ重心）は（０，０）となる。なお、ＣＰＵ２１は、演算した重心位置と、初期画素の階調値とを上述した、ワーキングメモリ領域２７２に格納する（図１０（ｃ）参照）。その後の演算処理をスムーズに行うためである。そして、ＣＰＵ２１は、ステップＳ１２で初期画素が低濃度と判断された場合は、その時点で初期画素に対応する出力バッファ２７３に“０”を格納し、ステップＳ１２で初期画素が高濃度と判断された場合は、その時点で初期画素に対応する出力バッファ２７３に“２５５”を格納する。初期画素に（黒又は白）ドットが打たれなかった場合に、正しい出力を行うためである。また、ＣＰＵ２１は、選択した初期画素の入力バッファ２７１の階調値を“−１”にして格納する。後述する未処理画素の選択で、すでに選択された画素を選択しないようにするためである。なお、入力バッファ２７１に格納する値は、“−１”以外でも他の負の値を格納させてもよい。さらに、入力バッファ２７１と同様のメモリ構成で、選択した画素の対応する位置にフラグを立てるようにして選択画素が処理済みか否かを判断することも可能である。
【００５６】
次いで、ＣＰＵ２１は、決定した画素が低濃度か否か判断する（ステップＳ１２）。具体的には、ＲＯＭ２５に格納された閾値“１２７”を読出し、ＲＡＭ２７の入力バッファ２７１から読み出した階調値と比較し、閾値よりも低い場合はステップＳ１３に移行し、閾値と同じか大きいときはステップＳ１３に移行する。ここで、低濃度と判断される場合（ステップＳ１２で“ＹＥＳ”の場合）とは、選択した画素が黒成分が少なくしろ成分が多い場合である。その後の処理で黒ドットを形成させる処理に移行させるためである。一方、低濃度ではないと判断された場合（ステップＳ１２で“ＮＯ”の場合）は、選択した画素が白成分が少なく黒成分が多い場合で、その後の処理で白ドットを形成させる処理（ステップＳ５３）に移行することになる。ここで、低濃度か否か判定しているのは、ドットの生成処理で黒ドットを生成する場合と、何もドットをうたない白ドットを生成する場合とでは処理が異なるからである。
【００５７】
ステップＳ１２で低濃度と判断された場合（ステップＳ１２で“ＹＥＳ”の場合）、ＣＰＵ２１は、未処理画素の選択を行う（ステップＳ１３）。ここで未処理画素の選択は、重心を利用して画素の選択を行う。最終的に生成されるセルの形状は、円状となり、その重心にドットを形成させることで、ドット間距離が均一となり、視覚的に快適な印刷出力を得ることができるからである。ここで、未処理画素の選択は、ステップＳ１１で演算した重心から最も近い距離にある画素が選択される。図１０（ｃ）に示す例では、（１、０）に位置する画像データか、（０，１）に位置する画像データが選択される。２つの画素ともアドレス（０，０）から等距離にあるからである。ここで、いずれかの画素を選択する必要があるが、ランダムにＣＰＵ２１が選択するものとする。ランダムではなく固定順に選択すると量子化済み画素群の形状が規則的に並び重心位置にドットを形成すると周期パターンが発生するからである。ランダムに選択することで周期パターンの発生を抑えて、視覚的に快適な印刷出力を得ることができる。図１０（ｃ）に示す例では（１，０）に位置する画素をＣＰＵ２１が選択するものとする（図１１（ａ）参照）。
【００５８】
ここで、重心位置は上述の（式１）で示されているように必ずしも整数値になるとは限らない。重心に最も近い画素を選択する場合のほかに、重心が位置する画素に最も近い画素を選択する場合でもよい。このようにすることで、重心位置は整数値として演算でき、ＣＰＵ２１の処理する計算量が減ることが期待できる。ただし、演算した重心位置が小数点を含む場合があるので、演算した重心位置のｘ、ｙ座標のそれぞれに０．５を足して、その位置に重心が位置する画素として、画素を選択することも可能である。ＣＰＵ２１は、選択した画素、ここでは（１，０）の画素に対応する入力バッファ２７１に“−１”を格納する。以後の未処理画素の選択で当該画素が選択されないようにするためである。さらに、ＣＰＵ２１は、選択した画素に対応する、ＲＡＭ２７の出力バッファ２７３に“０”を格納する（図１１（ｂ）の出力バッファ２７２参照）。
【００５９】
次いで、ＣＰＵ２１は、閾値制御処理を行う（ステップＳ１４）。後述するが閾値が一定の場合では、入力画像データの階調値が低い領域では出力ドットの密度は低くなり、また階調値が中間値（例えば“１２０”など）の領域では出力ドットの密度が高くなり、印刷出力全体としてのドットの分布密度が一定とならない。印刷出力のうち、ある領域では多くドットが打たれ、ある領域ではドットが少ないため全体として快適な印刷出力を得ることができない。そこで、かかる場合に閾値を変更することで、量子化済み画素群５６ａの大きさ、すなわち量子化済み画素群５６ａを構成する画素数が一定となり、一定密度のドット分布を得ることができる。閾値変更する場合の処理は、後述するが、選択した画素が所定個数（例えば５個）に達したか否かで閾値変更処理が行われる。上述の例では、（０、０）の画素と（１，０）の画素の２つの画素のみしか選択されていないので、閾値の変更は行われない。
【００６０】
次いで、ＣＰＵ２１は、濃度の合計が閾値に達したか否か判断する（ステップＳ１５）。すなわち、選択した未処理画素の階調値を含めた濃度の合計（階調値の合計）が閾値“２５５”に達したか否か判断される。具体的には、ＣＰＵ２１は、ＲＡＭ２７のワーキングメモリ２７２に書き込んだ画素の階調値と、ステップＳ１３で選択した画素の入力バッファ２７１に格納された階調値とを読出し、その合計を演算して、ＲＯＭ２５に格納された閾値（ここでは“２５５”の値）とを比較する。例えば図１１（ａ）の例では、ワーキングメモリ２７２には階調値“５０”、画素（１，０）に格納されている階調値は“５０”であるので、その合計は“１００”となる。よって合計値は閾値に達しないことになる
階調値の合計が閾値を超えない場合（ステップＳ１５で“ＮＯ”の場合）、ＣＰＵ２１は、選択した未処理画素を含めた重心の演算を行う（ステップＳ１６）。具体的なＣＰＵ２１の演算は、上述した（式１）の演算式を用いて行うことになる。これまで求めた重心の座標は、（０，０）で重心の階調値は“５０”、未処理画素の座標は（１，０）で、その階調値は“５０”とすると、演算される重心位置は（０．５，０）となる。演算した重心位置は、ＣＰＵ２１の制御によってＲＡＭ２７のワーキングメモリ２７２に格納される。ステップＳ１１でワーキングメモリ２７２には初期画素の重心位置が格納されていたが、ここではその位置に上書きして格納する。その格納後の例を図１１（ｂ）のワーキングメモリ２７２（左側と中央参照）に示す。
【００６１】
次いで、ＣＰＵ２１は、階調値の演算を行う（ステップＳ１７）。ここでの演算は、ＲＡＭ２７のワーキングメモリ２７２に書き込まれた階調値とステップＳ１３で選択した画素の階調値との合計を演算する。演算した結果は、再びＲＡＭ２７のワーキングメモリ２７２に上書きして書き込む。この例を図１１（ｂ）のワーキングメモリ２７２（右側参照）に示す。
【００６２】
次いで、ＣＰＵ２１は、ステップＳ１７で演算した階調値の合計が、閾値と等しいか否か判断する（ステップＳ１８）。具体的には、ステップＳ１７でＲＡＭ２７のワーキングメモリ２７２に格納された階調値と、ＲＯＭ２５に格納された閾値とをＣＰＵ２１が読み出して、両者を比較することで実行される。図１１（ｂ）の場合は、まだ閾値に達していない（ステップＳ１８で“ＮＯ”の場合）ので、再び、未処理画素の選択（ステップＳ１３）に移行し、上述の処理を繰り返すことになる。未処理画素をセルに次々と組み込み、その合計値が閾値（ここでは“２５５”）に達するまで処理が繰り返されることになる。これまでセルに組み込まれた画素の階調値の合計は、ＲＡＭ２７のワーキングメモリ２７２に格納されているので、その値と閾値とを比較することで、閾値に達するまでセルを構成していくことができる。なお、ＣＰＵ２１は、未処理画素の選択を行うと対応する出力バッファ２７３の位置に“０”を格納する。
【００６３】
そして、閾値と等しいとＣＰＵ２１が判断した場合（ステップＳ１８で“ＹＥＳ”の場合）、処理はステップＳ１９に移行し、すでに演算した重心位置を中心として複数画素にわたる黒ドットの生成を行う。
【００６４】
例えば図１１（ｃ）に示すようにステップＳ１３で最終的に（１，２）に位置する画素が選択されると、重心位置は（０．６２，１．３１）となる。この重心に位置する画素は（１，１）の位置の画素であるが、この画素のみドット生成を示す“２５５”を設定すると、図５（ｂ）の左側にあるようにドットが生成される。中間階調領域では、セルの大きさが小さくなるため、隣りあうドットとつながったり、離れたりと、ドットが目立ってしまう。そこで、この重心位置を中心に画素が跨っても、セルの重心位置とドットの中心位置とが一致するようなドットを生成するようにすることで、かかるドットの発生を抑制することができる。
【００６５】
通常、ハーフトーン処理後に行われるパルス幅変調は、所定の値に変換された各画素の階調値に対して、その階調値に対応したパルス幅を生成する。例えば、階調値が２５５なら生成されるパルスは、画素の幅に対してすべて“１”、階調値が１２７なら、画素の幅の半分だけ“１”でその他半分は“０”、階調値が６３なら、画素の幅の４分の１だけ“１”、それ以外は“０”となるパルスを生成する。また、画素に対して右側が“１”となるか、左側が“１”となるかで、所望のパルスを生成できる。例えば、図６（ａ）に示す例では、画素（ｎ、ｍ＋１）の右側に“１”となるパルス、画素（ｎ＋１、ｍ＋１）の左側に“１”となるパルスを生成させれば、２つの画素に跨るドットを生成させることが可能である。
【００６６】
したがって、図６（ａ）や（ｂ）に示すドットを生成させることができるのである。パルスの幅については、図１３を参照して以下のように演算することができる。
【００６７】
例えば、重心位置が図１３に示すように（０．６２，１．３１）とすると、図１３に示す黒点が重心位置２７１ｃとなる。ここで、重心位置２７１ｃに対して（０，０）となる点は、図１３に示すように画素（０，０）の中心に位置する。この位置（０，０）から例えば水平方向（ｎ、ｎ＋１・・・方向）に対して、０．５だけ進むと次の画素（１，０）の領域に入ることになる。したがって、ｎ＝０．６２のときは、画素（０，０）から見ると右側にドットが生成され、画素（１，０）から見ると左側にドットを生成することになる。ここで、重心のｙ座標は１．３１であるため、点（０，１）から見ると右側に、点（１，１）から見ると左側にドットを生成させることになる。この場合のパルス幅は、画素（０，１）の領域は右側に０．３８（＝１−０．６２）の割合だけドット生成させるようにパルス幅を生成させ、画素（１，１）から見ると左側に０．６２の割合だけドットを生成させるようにすればよいことになる。一般に重心位置が水平方向（ｎ、ｎ＋１・・・方向）にα．β（β≠０）とあらわされたとき、画素（α，ｍ）から見ると右側に、２５５×（１−０．β）のパルス幅をもたせ、画素（α＋１，ｍ）から見ると左側に２５５×０．βのパルス幅を持たせるようにすればよいことになる。なお、β＝０のときは画素（α、ｍ）の中心位置を中心にパルス幅を持たせるようにすればよい。
【００６８】
したがって、重心位置が（α．β，γ．θ）であらわされたとき、画素（α，γ）から右側に２５５×（１−０．β）のパルス幅を生成させ、画素（α＋１，γ）から見ると左側に２５５×０．βのパルス幅を生成させるようにすればよい。
【００６９】
上述した重心位置は（０．６２，１．３１）であるので、画素（０，１）から見て右側に２５５×（１−０．６２）≒９６（小数点切捨て）、画素（１，１）から見て左側に２５５×０．６２≒１５８のパルス幅をもたせればよいことになる。かかる処理により図６（ａ）のドットを生成させることができる。なお、この幅情報と右か左の情報は、ともに対応する画素の出力バッファ２７３に格納することになる。詳細は後述する。
【００７０】
また、図６（ａ）に示すドットの生成の方法としては、正確な重心位置が（α．β，γ．θ）であった場合に（α．β，γ）を中心にしてその点の左右に等量（１２７．５：合計が２５５のとき）の画素幅を分配する方法によっても実現できる。すなわち、画素（α，γ）と画素（α＋１，γ）との境界から見て右側に、（０．β−０．５）×２５５＋１２７．５、画素（α，γ）と画素（α＋１，γ）との境界から見て左側に、−（０．β−０．５）×２５５＋１２７．５、の幅をもつドットを生成させるようにしてもよい。重心位置が（０．６２，１．３１）のときは、画素（０，１）と画素（１，１）との境界から見て右側に（０．６２−０．５）×２５５＋１２７．５＝１５８、左側に−（０．６２−０．５）×２５５＋１２７．５＝９７の幅を持つドットを生成させることができ、図６（ａ）に示すドットを生成させることができる。
【００７１】
さらに、これらを応用して、図５（ｃ）に示す重心とドットの中心が一致したドットを生成することができる。すなわち、重心位置が（α．β，γ．θ）と表されたとき、上記ｎ方向に加え、画素（α，γ）から見て下側に２５５×（１−θ）、画素（α，γ＋１）から見て上側に２５５×θ、のそれぞれのパルス幅を持たせればよいことになる。かかる場合に、出力バッファ２７３の各内部構成は、上述したｎ方向の出力バッファ２７３のみならず、ｍ方向の出力バッファ２７３を有するように構成させればよいことになる。
【００７２】
図６（ｂ）に示すドットの生成は、具体的には以下のようになる。境界を中心に生成される上下２つのドット（上に位置するドット２７１ｅと下に位置するドット２７１ｆ）は、それぞれ幅が異なるが、ドット２７１ｅとドット２７１ｆとを合わせたときのｍ方向の重心位置は、“γ．θ”となるように２つのドットの面積の比率を計算しておく必要がある。
【００７３】
すなわち、上にあるドット２７１ｅの幅をＷ、下にあるドット２７１ｆの幅を２５５−Ｗとし、２つのドットを合わせた重心位置が重心位置“γ．θ”となるようなＷを求めることになる。ｍ方向の２つのドットを合わせた重心Ｙは以下のように演算される。
【００７４】
（式２）
Ｙ＝  （ドット２７１ｅの幅×ドット２７１ｅの重心＋ドット２７１ｆの幅×ドット２７１ｆの重心）／（ドット２７１ｅの幅＋ドット２７１ｆの幅）
この合わせた重心Ｙが、セルのｍ方向の重心位置“γ．θ”となるＷを求めれればよいことになる。すなわち、
（式３）
γ．θ＝（Ｗ×ドット２７１ｅの重心＋（２５５−Ｗ）×ドット２７１ｆの重心）／（Ｗ＋（２５５−Ｗ））
上述した、セル２７１ｄの重心位置は（０．６２，１．３１）であったので、（式３）に値を代入すると、１．３１＝（Ｗ×１．０＋（２５５−Ｗ）×２．０）／（Ｗ＋（２５５−Ｗ））となり、Ｗ＝１７６を得る。すなわち、ドット２７１ｅの幅は１７６で、ドット２７１ｆの幅は２５５−１７６＝７９の幅を有することになる。したがって、（０．６２，１．０）を中心に左右に８８（全部で１７６）づつ分配したドット、（０．６２，２．０）を中心に左右に３９，４０（全部で７９）づつ分配したドットを生成すれば、図６（ｂ）に示すドットを生成することができる。かかる演算式（式３）は、ＲＯＭ２５に予め格納され、ＣＰＵ２１が読み出し、ワーキングメモリ２７２に格納された重心位置をこの演算式に代入して演算することで、実行される。
【００７５】
図９に戻って、ＣＰＵ２１は、未処理画素があるか否か判断する（ステップＳ２１）。すなわち、上述した処理をＲＡＭ２７の入力バッファ２７１に書き込まれたすべての階調値に対して行ったか否かで判断し、未処理画素があれば（“ＹＥＳ”の場合）再び処理はステップＳ１１に移行し、上述の処理を繰り返し、すべての画素に対して処理が終了すれば（“ＮＯ”）、ＣＰＵ２１はステップＳ２２に移行し、処理が終了することになる。
【００７６】
一方、ステップＳ１５（図８参照）で濃度の合計が閾値を超える場合（“ＹＥＳ”の場合）、処理はステップＳ２５に移行し、閾値超えた場合の重心演算処理を行う。これは、図１１（ｃ）に示すように、最終的にステップＳ１３選択された画素が（１、２）に位置する画素であるとき、セルの階調値の合計を演算するとすると“２６５”になり、閾値“２５５”を超えることになる。したがって、このような場合はステップＳ１５で“ＹＥＳ”が選択されてステップＳ２５に移行することになる。
【００７７】
図１４は、閾値を超えた場合の重心演算処理の動作を示す。
【００７８】
まず、ＣＰＵ２１は、閾値から濃度の合計、すなわち閾値からこれまでステップＳ１６で演算した階調値の合計値を引く演算を行う（ステップＳ２５０）。例えば図１１（ｃ）に示す例では、閾値は“２５５”、ステップＳ１６でこれまで演算した階調値の合計は“２００”であるので、２５５−２００＝５５の値を演算する。上述したようにこれまで選択した画素の階調値の合計は、ＲＡＭ２７のワーキングメモリ２７２に格納され、閾値はＲＯＭ２５に格納されているのでＣＰＵ２１がこれらを読み出して演算することができる（図１１（ｃ）参照）。
【００７９】
そして、ＣＰＵ２１は、この“５５”の値を画素（２、１）の階調値として重心の演算を行う（ステップＳ２５１）。この閾値を超えた場合の重心演算処理における重心の演算は具体的には、以下の演算式を用いる。
【００８０】
2004312456.tif 000004
（式１）との違いは、選択した未処理画素の階調値をそのまま用いるのではなく、セルの階調値の合計が閾値と同じになるような階調値を用いる点が異なる。この演算式は、（式１）の場合と同様に予めＲＯＭ２５に格納されており、ＣＰＵ２１が本ステップを実行する際にＲＯＭ２５から読み出すことで実行される。ここでは、最終的にステップＳ１３で選択した画素の階調値は、これまで演算した階調値の合計との和をとることで閾値と等しくなるように演算して、それをもとに重心位置を求めることになる。そしてＣＰＵ２１は、演算した重心位置を再びＲＡＭ２７のワーキングメモリ２７２に値を書き込む。上述したように実際には重心位置を演算すると（０．６２，１．３１）となり、これがワーキングメモリ２７２に格納される（図１２（ａ）参照）。また、ＣＰＵ２１は、最終的に選択した画素の元の階調値からステップＳ２５０で演算した演算結果を引いた値を演算して、その値を再びその選択した画素の入力バッファに書き込む（ステップＳ２０）。これにより、当該画素の階調値が、戻しデータとして格納される。図１２（ａ）に示す例では、戻しデータとして  “１０”の値を求め、これをＲＡＭ２７の入力バッファ２７１の（２、１）に再び書き込む（図１２（ａ）の入力バッファ２７１参照）。そして、この画素は生成したセルに組み込まれず、再度セルを構成する際に利用されることになる。上述したように、戻しデータを生成したセル以外の画素に戻すのではなく、戻しデータが発生した画素に再び格納させることで、入力階調値に忠実なドット分布を形成することができる。
【００８１】
そして、ＣＰＵ２１は、（式４）で求めた重心位置に黒ドットを形成する処理を行う（図９のステップＳ２０）。これは上述したステップＳ１９と同様の処理が行われることになる。ここで図１２（ｂ）に出力バッファ２７３の各セルの構成を示す。出力バッファ２７３は、９ビット構成で、１ビット目２７３ａはドットを右側に生成させるか、左側に生成させるかの情報を示す値が格納される。残りの８ビット２７３ｂでパルスの幅の情報を示す値が格納される。重心位置は図１２（ａ）の例では（０．６２，１．３１）となるので、画素（０，１）に対応する出力バッファ２７３の位置には、最初の１ビット目が右側にパルスを生成させることを示す“１”が格納され、その幅“９６”（≒２５５×（１−０．６２））を示す“００１１００００”が幅情報領域２７３ｂに格納される（図１２（ｃ）参照）。また画素（１，１）に対応する出力バッファの位置には、最初の１ビット目が左側にパルスを生成させることを示す“０”が格納され、その幅“１５８”（≒２５５×０．６２）を示す“０１００１１１１”が幅情報領域２７３ｂに格納されることになる（図１２（ｂ）参照）。かかる演算は、ワーキングメモリ２７２に格納された重心位置をＣＰＵ２１が読み出し、ＲＯＭ２５に格納された上述の演算を行うことで計算され、その結果を出力バッファ２７３へ格納させることで処理が行われる。なお、閾値に達したセルを構成する各入力バッファ２７１に対して“０”を格納させることで、閾値に達したセルであることを示し、以後の処理で“０”が格納された画素に対してセルを構成させないようにしている（図１２（ａ）の入力バッファ２７１参照）。
【００８２】
その後、処理はステップＳ２１へ移行し、上述した処理が繰り返されることになる。
【００８３】
一方、図８のステップＳ１２で、決定した画素が低濃度でない場合（“ＮＯ”の場合）、処理は白濃度処理へと移行する（ステップＳ２３）。この処理の詳細を図１５に示す。本処理は、画素の階調値が白濃度よりも黒濃度の方が大きいため、その画素のまわりに白ドットを生成するために行われる処理である。なお、入力画素のデータは図１６（ａ）に示すデータが入力されるものとして以下説明する。ここでは、初期画素は、図１６（ａ）の（ｎ，ｍ）に位置する画素であるものとする。黒濃度の処理と同様に各画素の位置座標も入力バッファ２７１のアドレスに対応しているものとする。なお、白濃度前段の処理であるステップＳ１１により初期画素は（ｎ，ｍ）が選択され、その重心位置は式１によりＲＡＭ２７のワーキングメモリ２７２に既に格納され、その階調値“２０５”もメモリ２７２に格納されているとする（図１６（ｂ）参照）。また、初期画素の入力バッファ２７１には“−１”が格納され、対応する出力バッファ２７３にも“２５５”が格納されているものとする。
【００８４】
まず、白濃度処理に移行すると、ＣＰＵ２１は、未処理画素の選択を行う（ステップＳ２３０）。ここでの未処理画素の選択も上述したステップＳ１３と同様に重心を利用して選択する。ドット間距離を均一に保つためである。初期画素は、（ｎ，ｍ）であるので、重心を利用すると最も近い画素は（ｎ＋１，ｍ）と（ｎ，ｍ＋１）の２つの画素がある。ＣＰＵ２１は、ステップＳ１３と同様にランダムに選択する。ドットの周期パターンの発生を抑えるためである。ここでは、（ｎ＋１，ｍ）の画素を選択するとする。上述したように重心利用する場合に重心位置そのものを利用する以外にも、重心が位置する画素に最も近い画素を選択する場合でもよい。また、ＣＰＵ２１は、画素（ｎ＋１、ｍ）に対応する入力バッファ２７１には“−１”を格納する。以後の未処理画素の選択で、未処理画素として選択されないようにするためである。
【００８５】
次いで、ＣＰＵ２１は、入力階調値の最大値から、初期画素も含めステップＳ２３０で選択した未処理画素の階調値を減算する（ステップＳ２３１）。図１６（ａ）に示す例では、（ｎ＋１，ｍ）に位置する初期画素の階調値は、“２０５”なので、入力階調値の最大値である“２５５”から減算すると、“５０”となる。また、ステップＳ２３０で選択した未処理画素は（ｎ，ｍ＋１）であるとすると、その階調値“２０５”を最大値“２５５”から減算すると“５０”を得る。この入力画素の階調値の最大値は、ＲＯＭ２５に格納されており、また、選択した画素の階調値は上述したようにＲＡＭ２７の入力バッファ２７１に格納されているので、ＣＰＵ２１がこれらの値を読み出すことで、演算することができる。演算した結果はＣＰＵ２１の制御によりＲＡＭ２７のワーキングメモリ領域２７２に格納される（図１６（ｂ）参照）。
【００８６】
このように各階調値の値を変更させているのは、黒の濃度のままセルを構成していくと、２つ又は３つなど少ない画素数ですぐに階調値の合計が閾値に達してしまうからである。これでは、セルが一定の大きさを保てず、隣り合ったセル同士でドットが隣接して生成され、全体としてドットが目立つため快適な印刷出力を得ることができなくなってしまう。そこで、白濃度演算処理として、入力階調値の最大値から選択した画素の階調値の減算処理を行うのである。
【００８７】
なお、図８に示す処理のうちステップＳ１２において画素が低濃度か否かを判定せず、黒成分が多く、白成分が少ない画素群に対しても低濃度の場合と同様の処理（ステップＳ１３からステップＳ１９）を行うと以下のような問題が生じる。すなわち、もともと黒成分が多い画素が多数存在するため、構成したセルは、すぐに閾値に達してしまう。例えば図１６（ａ）の場合では、２つの画素（（ｎ，ｍ）と（ｎ＋１，ｍ））で閾値に達することになる。かかる場合に重心位置から黒ドットをうつべき画素は、２つの画素のいずれか（例えば（ｎ，ｍ））である。そして、余った戻りデータを、例えば（ｎ＋１，ｍ）に戻して、再びこの画素を含めたセルを初期画素（例えばこの（ｎ＋１，ｍ））から探索すると、重心利用して選択される画素は例えば（ｎ，ｍ＋１）となる。これに初期画素の階調値を加えるとこの２つの画素でセルを形成して重心位置からいずれか１の画素に黒ドットを形成する。これを繰り返すことで、ほとんど黒ドットをうつことになり、白ドットは余りの戻しデータが少なくなるとようやく何もうたない白ドットを形成することになる。これでは、黒成分が多く、白成分が少ない画素群に対して生成した白ドットは、誤差拡散法で問題となるワーム状に配置され、視覚的に不快な印刷出力となる。かかる理由により、白成分が多く黒成分が少ない画素と、黒成分が多く白成分が少ない画素とでステップＳ１２を境に異なる処理を行うようにしている。
【００８８】
図１５の処理に戻って、ＣＰＵ２１は、出力バッファ２７３に黒ドットの生成を行う（ステップＳ２３２）。これは、最終的に印刷エンジン７０では、入力画像データに対して黒成分が多い画素にはドットをうつ処理を行い、重心位置にある画素に対してドットをうたないようにして印刷を行うためである。ＣＰＵ２１は、ステップＳ２３０で選択した画素に対して、上述したＲＡＭ２７の出力バッファ２７３の対応する位置に入力階調値の最大値（図１６（ａ）の場合は“２５５”）を格納することで処理が行われる（図１６（ｃ）参照）。
【００８９】
次いで、ＣＰＵ２１は、閾値制御処理を行う（ステップＳ２３３）。上述したステップＳ１４と同様に選択した未処理画素（ステップＳ２３０）を含めた入力階調値が低い領域などで、閾値を変更することで生成されるセルの大きさが一定となり、生成される白ドットが印刷出力全体として一定密度で分布することになる。詳細は後述するが、実際にはセルを構成する画素の個数等により判断されるが、この図１６（ｃ）に示す例では、まだ（ｎ，ｍ）と（ｎ＋１，ｍ）に位置する画素しか選択されていないので、閾値の変更は行われない。
【００９０】
次いで、ＣＰＵ２１は、階調値の合計が閾値を越えるか否か判断する（ステップＳ２３４）。ここでは、すでにワーキングメモリ２７２にこれまで選択した画素の階調値の合計が格納されているので、その値をメモリ２７２からＣＰＵ２１が読み出し、閾値はＲＯＭ２５に格納されているので、この読み出した閾値と比較して判断する。図１６（ｃ）の例では、メモリ２７２に“５０”が格納されているので、最大値“２５５”と比較すると、まだ閾値に達していないと判断される。
【００９１】
閾値が超えないと判断された場合（ステップＳ２３４で“ＮＯ”の場合）は、処理はステップＳ２３５に移行して、ＣＰＵ２１は、未処理画素を含めた重心位置を演算する。重心の演算は、上述した（式１）と同様である。演算した重心位置は、ワーキングメモリ２７２にＣＰＵ２１の制御により格納される。初期画素（ｎ，ｍ）と、選択画素（ｎ＋１，ｍ）との重心位置を演算すると、（式１）により（ｎ＋０．５，ｍ）となる。これを黒処理と同様にワーキングメモリ２７２にＣＰＵ２１の制御により格納する。図１７（ａ）に例を示す。
【００９２】
次いで、ＣＰＵ２１は、階調値の合計を演算する（ステップＳ２３６）。ステップＳ２３１で演算した値とワーキングメモリ２７２に書き込まれた階調値との合計を演算する。演算した結果は、ワーキングメモリ２７２にＣＰＵ２１の制御により格納される（図１７（ａ）参照）。
【００９３】
次いで、ＣＰＵ２１は、演算した階調値の合計が閾値と等しいか否か判断し（ステップＳ２３７）、等しくなるまで処理が繰り返されることになる（ステップＳ２３７で“ＮＯ”の場合）。
【００９４】
階調値の合計が閾値と等しいと判断されると（“ＹＥＳ”の場合）、ステップＳ２３５で演算した重心位置を中心に複数画素にわたる白ドットを生成する処理を行う（ステップＳ２３８）。具体的には、図８のステップＳ１９、Ｓ２０に示す処理と同じである。すなわち、重心位置が（α．β，γ．θ）であらわされたとき、画素（α，γ）から右側に２５５×（１−０．β）のパルス幅を生成させ、画素（α＋１，γ）から見ると左側に２５５×０．βのパルス幅を生成させるようにする。図１７（ａ）に示す例では、５つの画素（（ｎ，ｍ）、（ｎ＋１，ｍ）、（ｎ，ｍ＋１）、（ｎ＋１，ｍ＋１）、（ｎ＋１，ｍ＋２））で閾値に達し１つのセルが構成されると、その重心位置は（０．６２，１．３１）であるので、画素（０，１）から見て右側に２５５×（１−０．６２）≒９６（小数点切捨て）、画素（１，１）から見て２５５×０．６２≒１５８のパルス幅をもたせればよいことになる。ただし、白ドットは何もドットをうたない処理となるため、ＣＰＵ２１は、この演算した結果からすべて反転させる処理を行うことになる。すなわち、画素（０，１）から見て左側に１５９（＝２５５−９６）、画素（１，１）から見て右側に９７（＝２５５−１５８）のパルス幅を持たせるドットを生成させるようにする。これにより、画素（０，１）から見て右側に９６のパルス幅分の何もうたない領域が確保され、画素（１，１）から見て左側に１５８のパルス幅分何もドットをうたない領域が確保されることになる。この幅情報と右か左の情報は、上述したように、ともに対応する画素の出力バッファ２７３に格納することになる。
【００９５】
次いで、図１５に戻り、未処理画素があるか否か判断され（ステップＳ２３９）、未処理画素があればステップＳ１１に再び移行して（“ＹＥＳ”の場合）、未処理画素がなくなるまで処理が繰り返される。未処理画素がなくなると（“ＮＯ”の場合）、処理が終了（ステップＳ２３９）することになる。
【００９６】
一方、ステップＳ２３４で階調値の合計が閾値を超える場合（“ＹＥＳ”の場合）、処理はステップＳ２４１に移行し、ＣＰＵ２１は、閾値を超えた場合の重心演算処理を行う。ここでの重心演算処理は、上述したステップＳ２５での演算処理と同様である（図１４参照）。すなわち、ＣＰＵ２１は、ＲＯＭ２５から閾値（ここでは“２５５”）を読出し、ＲＡＭ２７のワーキングメモリ２７２に格納された階調値の合計から減算して（ステップＳ２５０）、その値をもとに（式４）に示す重心の演算を行う（ステップＳ２５１）。図１７（ｂ）に示す例では、最終的にステップＳ２３０で（ｎ＋１，ｍ＋２）が選択されると、これまで選択した画素の階調値の合計は、メモリ２７２に格納された“２００”、選択画素の階調値は“１９０”で最大値“２５５”から引いた値が“６５”、であるから階調値の合計は“２６５”となる。この値は閾値“２５５”を超えているので、ステップＳ２３４で“ＹＥＳ”が選択され、ステップＳ２１に移行する。そして、（閾値）―（濃度の合計）、すなわち２５５−２００で“５５”を得る。この値を選択画素（ｎ＋１，ｍ＋２）の階調値としてステップＳ２５１で重心位置を演算することになる。
【００９７】
演算した重心位置（０．６２，１．３１）は再びＲＡＭ２７のワーキングメモリ領域２７２に格納させ（図１７（ｃ）のワーキングメモリ２７２参照）、戻しデータを演算してその値をＲＡＭ２７の当該画素の入力バッファ２７１に上書きして格納する（図１７（ｃ）の入力バッファ２７１参照）。生成したセルに組み込まれないようにするためである。これにより入力階調値に忠実な白ドットを形成することができる。
【００９８】
その後、ＣＰＵ２１は、図１５のステップＳ２４２に移行して、演算した重心位置を中心に複数画素にわたる白ドットを生成して、残った階調値を選択画素に戻すことになる。複数画素にわたる白ドットの生成処理は、上述したステップＳ２３８と同様である。演算したパルス幅、右か左の情報は出力バッファ２７３の対応する画素の位置に格納される（図１７（ｃ）参照）。
【００９９】
その後処理は再びステップＳ２３９に移行し、上述の処理が繰り返されることになる。
【０１００】
次に、ステップＳ１４（図８参照）、及びステップＳ２３３（図１５参照）の閾値制御処理について図１８のフローチャートを参照して説明する。
【０１０１】
上述したように、初期画素や未処理画素を含め選択した画素（ステップＳ１３、ステップＳ２３０）の入力階調値が低い値や中間階調値が連続すると、セルの大きさは一定とならず、生成される黒ドットや白ドットの密度が一定とならない。かかる場合に、印刷出力のドット分布が一定とならずにある領域ではドットが目立ち、ある領域ではドットが少なく、快適な印刷出力を得ることができない。そこで、生成されるセルを、セルを構成する画素数により閾値を変更して一定の大きさのセルを構成し、ドット密度を一定にさせるようにする。
【０１０２】
具体的な処理は、図１８に示すように閾値制御処理に移行すると（ステップＳ１４、ステップＳ２３３）、閾値変更処理を行う（ステップＳ１４１）。ここでは毎回選択した未処理画素を含む画素数と、セルの階調値の合計とから、ステップＳ１５、Ｓ２３４で使用する閾値を変更するものとする。変更のための演算式は、所定の関数により表現されており、ＣＰＵ２１がＲＯＭ２５に格納されたこの関数を読出し、ワーキングメモリ２７２の画素数と階調値の合計とをこの関数に入力させることにより、変更閾値を求めることができる。また、変更閾値を最初からＲＯＭ２５に格納させておきこの閾値変更の処理（ステップＳ１４２）でＣＰＵ２１が読み出して処理を行うようにしてもよい。
【０１０３】
図１９に示す例で具体的に説明する。画像データが入力されて、ＲＡＭ２７の入力バッファ２７１には図１９（ａ）に示すように格納されるとする。そして、ステップＳ１１で初期画素として（ｎ，ｍ）に位置する画素が選択されて、その重心を演算すると（ｎ，ｍ）となるため、その重心位置と階調値が図１９（ｂ）に示すワーキングメモリ２７２にＣＰＵ２１によって格納される。さらに、初期画素（ｎ，ｍ）のみしか選択されていないため、この領域２７２ａには“１”がＣＰＵ２１によって格納される。
【０１０４】
次いで、ステップＳ１３で未処理画素（ｎ＋１，ｍ）が選択されると、ワーキングメモリ２７２の個数格納領域２７２ａには、初期画素を含めた選択画素の個数の合計である“２”が格納される。そして、ステップＳ１６、Ｓ１７で未処理画素を含めた重心位置及び階調値の合計が演算されて、ワーキングメモリ２７２は図１９（ｃ）に示すように値が格納されることになる。また、選択した画素の個数“２”が格納領域２７２ａに格納される。
【０１０５】
そして、ステップＳ１３からステップＳ１８を繰り返し、４つの画素（（ｎ，ｍ）、（ｎ＋１，ｍ）、（ｎ，ｍ＋１）、及び（ｎ＋１，ｍ＋１））がセルに組み込まれるとする（図２０（ａ）参照）。そして、再びステップＳ１３で未処理画素（ｎ＋１，ｍ＋２）が選択されると、個数格納領域２７２ａには選択した画素の個数  “５”が格納される（図２０（ｂ）参照）。ここで、ステップＳ１４１のＲＯＭ２５に記憶された所定の画素数を４個とすると、セルの画素数（５個）が所定の画素数（４個）を超えたため、閾値変更処理（ステップＳ１４１）により閾値変更をＣＰＵ２１が演算することになる。
【０１０６】
ステップＳ１４２でＣＰＵ２１は、選択画素数“５”と、これまでの階調値の合計値“４０”とから、ＲＯＭ２５に記憶された関数を読出し、変更された閾値を演算する。その結果、例えば閾値を“２５５”から“５０”に変更する。そして、これまでの階調値の合計“４０”と閾値“５０”とを比較して、閾値を超えないので、ステップＳ１６、Ｓ１７に移行し、最終的に選択された画素（ｎ＋１，ｍ＋２）を含めた重心位置と階調値の合計を演算する。演算結果は、上述したようにワーキングメモリ２７２に格納される。ステップＳ１８で階調値の合計“５０”が閾値“５０”と等しいため、ステップＳ１９以降への移行して、上述した重心位置を中心に画素を跨いでドットの生成を行う（図２０（ｂ）の出力バッファ２７３参照）。そして、一連の処理が終了することになる。なお、白濃度処理Ｓ２３における閾値制御処理Ｓ２３３も同様の処理を行う。
【０１０７】
この例では、閾値を低くした場合を説明したが、入力階調値が中間階調値で連続する場合は、閾値が高くなるようにすることも可能である。
【０１０８】
このように、閾値をセルの個数と階調値で変化させているため、最終的に生成されたセルの大きさは、ほぼ一定であり、ドットが一定の密度で生成されることになる。しかも、重心を利用してドットの生成を行うようにしているので、入力画像の階調値の分布に忠実なドットの分布を生成することができる。
【０１０９】
上述したすべての処理が終了するとＣＰＵ２１は、ＲＡＭ２７の出力バッファ２７３に書き込まれた値を読出し、実際に変調されたパルスを生成して、印刷エンジンに出力する。そして、印刷エンジン３０は、このパルス幅をもとに、所定の印刷出力を得ることができるのである。
【０１１０】
以上説明してきたように本発明によれば、中間階調領域の入力画像に対しても重心位置とドットの中心との誤差が最小となるようにドットを生成するようにしているので、高画質で快適な印刷出力を得ることができる。
【図面の簡単な説明】
【図１】本発明によるシステム全体の構成図である。
【図２】本発明の画像出力装置の構成を示す図である。
【図３】本発明によるセルの構成方法の一例を示す図である。
【図４】本発明によるセルの構成方法の一例を示す図である。
【図５】隣接するセルに生成したドットを示す図である。
【図６】隣接するセルに生成したドットを示す図である。
【図７】固定順に画素を選択したときと、ランダムで画素を選択したときの印刷出力の例を示す図である。
【図８】本発明の実施の形態の動作を示すフローチャートを示す図である。
【図９】本発明の実施の形態の動作を示すフローチャートを示す図である。
【図１０】ＲＡＭ２７の構成と格納される値の例を示す図である。
【図１１】ＲＡＭ２７の構成と格納される値の例を示す図である。
【図１２】ＲＡＭ２７の構成と、出力バッファ２７２の構成を示す図である。
【図１３】重心位置と各画素の位置関係を示す図である。
【図１４】閾値を超えた場合の重心演算処理の動作を示すフローチャートを示す図である。
【図１５】白濃度演算処理の動作を示すフローチャートである。
【図１６】白濃度処理のおけるＲＡＭ２７の構成と格納される値の例を示す図である。
【図１７】白濃度処理のおけるＲＡＭ２７の構成と格納される値の例を示す図である。
【図１８】閾値制御処理の動作を示すフローチャートである。
【図１９】白濃度処理のおけるＲＡＭ２７の構成と格納される値の例を示す図である。
【図２０】白濃度処理のおけるＲＡＭ２７の構成と格納される値の例を示す図である。
【符号の説明】
１０  ホストコンピュータ  ２０  画像処理装置  ２１  ＣＰＵ  ２３  入力Ｉ／Ｆ  ２５  ＲＯＭ  ２６  ハーフトーン処理部  ２７  ＲＡＭ  ２７１  入力バッファ  ２７２  ワーキングメモリ  ２７３  出力バッファ  ２７３ａ  パルス位置データ格納部  ２７３ｂ  パルス幅データ格納部  ２８  パルス幅変調部３０  印刷エンジン
【図１】
2004312456.tif 000005
【図２】
2004312456.tif 000006
【図３】
2004312456.tif 000007
【図４】
2004312456.tif 000008
【図５】
2004312456.tif 000009
【図６】
2004312456.tif 000010
【図７】
2004312456.tif 000011
【図８】
2004312456.tif 000012
【図９】
2004312456.tif 000013
【図１０】
2004312456.tif 000014
【図１１】
2004312456.tif 000015
【図１２】
2004312456.tif 000016
【図１３】
2004312456.tif 000017
【図１４】
2004312456.tif 000018
【図１５】
2004312456.tif 000019
【図１６】
2004312456.tif 000020
【図１７】
2004312456.tif 000021
【図１８】
2004312456.tif 000022
【図１９】
2004312456.tif 000023
【図２０】
2004312456.tif 000024