以下、本発明を実施する為の形態について図面を用いて説明する。なお、以下の実施例において示す構成は一例にすぎず、本発明は図示された構成に限定されるものではない。
本実施例では、画像形成装置として、コピー、プリント、FAXなどの複数の機能を有する電子写真方式のデジタル複合機(以下、MFP)を例に挙げて説明する。しかし、これに限らず、例えばインクジェット方式など他のプロセスを用いた機器でも本実施例は適用可能である。
図1は、本実施例に係る、MFP100の構成を示す概略ブロック図である。MFP100は、スキャナ部101、コントローラ102、プリンタ部103及び操作部104で構成される。
スキャナ部101は、原稿の画像を光学的に読み取り、画像データとして取得する。
コントローラ102は、CPU、ROM、RAMを備え、スキャナ部101で読み取られた画像データ等に所定の画像処理を施す。画像処理が施された画像データは、コントローラ102内のRAMに格納される。
プリンタ部103は、画像処理が施された画像データに対し、指定された印刷設定条件に従って電子写真方式によって記録用紙に画像を形成する。本実施例のプリンタ部103では、PWMによってレーザの露光量を調整が可能で、各画素4ビットの画像データが入力されるものとする。
操作部104は、ユーザが各種操作を行なうためのユーザインタフェースである。ユーザは、印刷対象の画像データに対する各種印刷条件の設定などを、操作部104を介して行う。
MFP100には、ネットワーク106を介して画像データを管理するサーバ108や、MFP100に対して印刷の実行を指示するパーソナルコンピュータ(PC)107等が接続される。コントローラ102は、サーバ108やPC107から印刷の実行が指示されると、サーバ108やPC107から送信された画像データをラスタライズしてプリンタ部103に対応した画像データ(ビットマップデータ)に変換し、RAMに格納する。
図2は、プリンタ部103の詳細を示す図であり、電子写真方式によって記録媒体上に画像を形成するためのカラー4色ドラムの機構が示されている。
コントローラ102内のRAMに一旦記憶されたビットマップデータと属性データは、再度コントローラ102内で後述する印刷用の画像処理が行われた後、プリンタ部103へ転送される。プリンタ部103では、プリンタ部103内のPWM制御によってパルス信号へと変換され、レーザ記録部でシアン(C)、マゼンタ(M)、イエロー(Y)、ブラック(K)の4色の記録レーザ光に変換される。そして、記録レーザ光は各色の感光体201に照射され、各感光体に静電潜像を形成する。
プリンタ部103は、トナーカートリッジ202から供給されるトナーにより各感光体にトナー現像を行い、各感光体に可視化されたトナー画像は中間転写ベルト203に一次転写される。中間転写ベルト203は、図2において時計回転方向に回転し、用紙カセット204から給紙搬送路205を通って給送された記録紙が二次転写位置206にきたところで、中間転写ベルト203から記録紙へとトナー画像が転写される。画像が転写された記録紙は、定着器207で加圧と熱によりトナーが定着され、排紙搬送路を搬送された後、フェイスダウンのセンタートレイ208或いはフェースアップのサイドトレイ209へと排紙される。
次に、コントローラ102内で実行される印刷用の画像処理について説明する。図3は、画像処理を担う機能部としての画像処理部の内部構成を示すブロック図である。すなわち、以下に述べる画像処理部300における各処理は、コントローラ102内のCPUが、ROMに保持された制御プログラムをRAMに展開して実行することで実現される。本実施例に係る画像処理部300は、色補正部301、エッジ情報生成部302、ガンマ補正部303、エッジ補正データ生成部304、スクリーン処理部305、位相ずれスクリーン処理部306、画像合成部307で構成される。
色補正部301は、コントローラ102内のRAMから取得した画像データ(ビットマップデータ)に対して色補正処理を行う。具体的には、色変換LUTやマトリクス演算によってCMYKの4種類の色(画像信号)で濃度を表現したCMYK色空間の画像データに変換する。変換された画像データは、各色において画素毎に8ビット(0〜255)の値を持っている。
エッジ情報生成部302は、CMYKの色毎にエッジ情報を生成する。このエッジ情報は、画素毎に3ビットの値を持つデータである。上位1ビットは、当該画素がエッジを構成する画素(以下、エッジ画素)か否かを示し、エッジ画素である場合に“1”、非エッジ画素である場合に“0”となる。下位の2ビットは、エッジの方向(Edge Direction)を示し、上を“00”下を“01”、右を“10”、左を“11”で表す。生成されたエッジ情報は、後述の画像合成部307で処理を切り替える際に参照される。
ガンマ補正部303は、入力されたCMYK画像データに対し、画像が記録紙へと転写された際に所望の濃度特性となるよう、一次元のルックアップテーブルを用いて補正する処理(ガンマ補正処理)を行なう。ガンマ補正処理が施された画像データは、エッジ補正データ生成部304、スクリーン処理部305、位相ずれスクリーン処理部306、画像合成部307に送られる。
エッジ補正データ生成部304は、入力された画像データからエッジ部の補正データ(以下、エッジ補正データ)を生成する。生成されたエッジ補正データは画像合成部307に送られる。
スクリーン処理部305は、入力された画像データに対しスクリーン処理を行って、スクリーンデータ(ハーフトーン画像データ)を生成する。生成されたスクリーンデータは画像合成部307に送られる。
位相ずれスクリーン処理部306は、入力された画像データに対し、スクリーン処理部305で使用したディザマトリクスの位相をずらしたディザマトリクスを用いて、位相のずれたスクリーンデータを生成する。生成された位相ずれスクリーンデータは画像合成部307へ送られる。
画像合成部307は、エッジ情報生成部302から受け取ったエッジ情報とガンマ補正後の画像データに基づいて、後述する画像合成処理を行なう。
<エッジ情報生成処理>
次に、エッジ情報生成部302におけるエッジ情報生成処理について、図4〜図9を参照して詳しく説明する。
図4は、エッジ情報生成部302の内部構成を示すブロック図である。エッジ情報生成部302は、混合データ変換部401、エッジ判定部402、内側判定部403、エッジ方向判定部404、判定結果統合部405で構成される。エッジ情報生成部302に、CMYK色空間に変換された画像データが入力されると、混合データ変換部401に送られる。
混合データ変換部401は、入力された画像データに対し、注目画素を中心とした所定の参照領域(ここでは、5×5画素の領域)単位で混合データ変換処理を行って、CMYKの4色を任意の割合で混合したデータ(以下、混合データ)を生成する。画像データ内の各画素は8ビットの値を持っているが、以降の処理では8ビットのデータまでは必要としないので、本実施例では下位2ビットを切り捨てた上でこの変換処理を行なっている。これにより回路規模を小さくすることができる。混合データ変換処理の詳細については後述する。生成された混合データは、エッジ判定部402、内側判定部403、エッジ方向判定部404に送られる。
エッジ判定部402は、注目画素が前述のエッジ補正データを適用すべきエッジ画素か否かを判定する処理(エッジ判定処理)を行なう。このエッジ判定処理の詳細については後述する。エッジ判定処理の結果はエッジ判定信号(例えば、エッジ画素の場合は“1”、非エッジ画素の場合は“0”とする1ビットの信号)として判定結果統合部405に送られる。
内側判定部403は、注目画素が内側であるか否かを判定する処理(内側判定処理)を行なう。具体的には、注目画素の周囲8画素において画素値の最大値を求め、注目画素の画素値が当該最大値以上である場合に当該注目画素を内側と判定する。この内側判定処理の結果は内側判定信号(例えば内側の場合は“1”、内側でない場合は“0”とする1ビットの信号)として、判定結果統合部405に送られる。
エッジ方向判定部404は、注目画素を基準としたエッジの方向を判定する処理(エッジ方向判定処理)を行う。具体的には、注目画素の画素値とその上下左右の画素の画素値を比較し、両者に差がある場合にはその方向にエッジがあると判定する。このエッジ方向判定処理の結果は、エッジ方向信号として判定結果統合部405に送られる。
判定結果統合部405は、入力されるエッジ判定信号、内側判定信号、エッジ方向信号に基づいて、前述のエッジ情報を生成する。具体的には、まずエッジ情報の上位1ビットについては、エッジ判定処理でエッジ画素と判定され、かつ、内側判定処理で内側と判定された場合は“1”を設定し、それ以外の場合は“0”を設定する。さらにエッジ情報の下位2ビットについては、エッジ方向判定処理の結果を下位の2ビットにそのまま代入する。こうして、3ビットのエッジ情報を画素毎に生成する。
<混合データ変換処理>
混合データ変換部401で行われる混合データ変換処理の詳細について説明する。
図5は、混合データ変換処理の流れを示すフローチャートである。この混合データ変換処理は、CMYK画像データにおける上述の参照領域(5×5画素の領域)を構成する全25画素に対して画素毎に実行される。
ステップ501において、混合データ変換部401は、Kの画素値DKとKの混合率MRKとの積を求め、Kの画素値DK’を得る。このとき、混合率MRKは、0〜15の範囲で任意に設定される値である。これによって、CMYの有彩色のみで混合データが生成するか、無彩色のKを含めて混合データを生成するのかを決定する。
ステップ502において、混合データ変換部401は、ステップ501で得たKの画素値DK’がCの画素値DCよりも大きいかどうかを判定する。画素値DK’が画素値DCよりも大きければステップ503に進む。一方、画素値DK’が画素値DCよりも大きくなければステップ504に進む。
ステップ503において、混合データ変換部401は、ステップ501で得たKの画素値DK’とCの混合率MRCとの積を求め、Cの画素値DC’を得る。ここで、混合率MRCも、上述の混合率MRKと同様、0〜15の範囲で任意に設定される値であり、混合率MRCの値を変化させることで、生成される混合データに対するCの割合を制御することができる。
ステップ504において、混合データ変換部401は、Cの画素値DCと上述の混合率MRCとの積を求め、Cの画素値DC’を得る。
ステップ505において、混合データ変換部401は、ステップ501で得たKの画素値DK’がMの画素値DMよりも大きいかどうかを判定する。画素値DK’が画素値DMよりも大きければステップ506へ進む。一方、画素値DK’が画素値DMよりも大きくなければステップ507に進む。
ステップ506において、混合データ変換部401は、ステップ501で得たKの画素値DK’とMの混合率MRMとの積を求め、Mの画素値DM’を得る。ここで、混合率MRMも、上述の混合率MRKと同様、0〜15の範囲で任意に設定される値であり、混合率MRMの値を変化させることで、生成される混合データに対するMの割合を制御することができる。
ステップ507において、混合データ変換部401は、ステップ501で得たKの画素値DMとMの混合率MRMとの積を求め、Mの画素値DM’を得る。
ステップ508において、混合データ変換部401は、ステップ501で得たKの画素値DK’がYの画素値DYよりも大きいかどうかを判定する。画素値DK’が画素値DYよりも大きければステップ509へ進む。一方、画素値DK’が画素値DYよりも大きくなければステップ510に進む。
ステップ509において、混合データ変換部401は、ステップ501で得たKの画素値DK’とYの混合率MRYとの積を求め、Yの画素値DY’を得る。ここで、混合率MRYも、上述の混合率MRKと同様、0〜15の範囲で任意に設定される値であり、混合率MRYを変化させることで、生成される混合データに対するYの割合を制御することができる。
ステップ510において、混合データ変換部401は、ステップ501で得たKの画素値DYとYの混合率MRYとの積を求め、Yの画素値DY’を得る。
ステップ511において、混合データ変換部401は、ここまでの処理で求めたDC’、DM’、 DY’の合計値を求め、求めた合計値をビットシフト量BSによって指定されたビット数分だけ右シフトすることによって、画素毎の混合データ[MIX]を求める。
ステップ512において、混合データ変換部401は、ステップ511で求めた混合データ[MIX]の値が、6ビットの最大値である63よりも大きいかどうかを判定する。ステップ511で求めた混合データ[MIX]の値が63よりも大きい場合は、ステップ513に進む。一方、ステップ511で求めた混合データ[MIX]の値が63よりも大きくない場合は、本処理を終える。すなわち、ステップ511で求めた値が、混合データ[MIX]として決定される。
ステップ513において、混合データ変換部401は、混合データ[MIX]の値を、6ビットの上限値である63に変更する(クリッピング処理)。通常は、[MIX]が63を超えないように、MRC、MRM、MRY、MRK、ビットシフト量BSが設定されるが、間違った数値を設定しても動作を保証するためにこのようなクリッピング処理を行う。
以上が、混合データ変換処理の内容である。ここで、MRCが4、MRMが6、MRYが6、MRKが0、BSが4で、DCが5、DMが8、DYが10、DKが2、である場合における混合データ変換処理の具体例を示す。
まず、MRKは0なので、DK’は0である(ステップ501)。
次に、DK’は0でDCは5なので、ステップ504へ移行する(ステップ502でNo)。
ステップ504では、DCは5でMRCは4なので、DC’は20となる。
そして、DK’は0でDMは8なので、ステップS507へ移行する(ステップ505でNo)。
ステップ507では、DMは8でMRMは6なので、DM’は48となる。
そして、DK’は0でDYは10なので、ステップ510へ移行する(ステップ508でNo)。
ステップ510では、DYは10でMRYは6なので、DY’は60となる。
そして、ステップ511では、まずDC’、DM’、DY’の合計値(20+48+60=128)を求め、BS=4に従って合計値128を4ビット右にシフトする。その結果、混合データ[MIX]の値として8が得られる。
ステップ511で得られた混合データ[MIX]の値(8)は、63より小さいので(ステップ512でNo)、最終的な混合データ[MIX]の値は8となる。
こうして、CMYKの各色が任意の割合で混合された各画素6ビットの混合データが生成される。そして、この混合データを以降の処理に用いることで、処理する色に依存しないエッジ補正処理を行うことが可能となり、その結果、エッジ部に発生する偽色を抑えることができる。
なお、混合データ変換処理は、上述の方法に限定される訳ではなく、複数の色を用いて混合したデータを生成するものであればよい。
また、上述のステップ511では、各色の画素値Dと所定の混合率MRとの積の合計値を、ビットシフト量BS分だけ右シフトすることで混合データ[MIX]を得ているが、例えば、右シフトに代えて除算を用いて混合データ[MIX]を得るようにしてもよい。
<エッジ判定処理>
次に、エッジ判定部402で行われるエッジ判定処理の詳細について説明する。
図6は、エッジ判定処理の流れを示すフローチャートである。
ステップ601において、エッジ判定部402は、混合データ変換部401で生成された混合データについて、上述の参照領域内の注目画素を中心とする幅3画素、高さ3画素の計9画素の中で、最も大きい画素値(最大値[MAX])を求める。
ステップ602において、エッジ判定部402は、混合データ変換部401で生成された混合データについて、上述の参照領域内の注目画素を中心とする幅3画素、高さ3画素の計9画素の中で、最も小さい画素値(最小値[MIN])を求める。
ステップ603において、エッジ判定部402は、ステップ601で求めた最大値[MAX]からステップ602で求めた最小値[MIN]を減算し、コントラスト値[CONT]を求める。
ステップ604において、エッジ判定部402は、ステップ603で求めたコントラスト値[CONT]とエッジ判定値[Sub]とを比較し、コントラスト値[CONT]の方が大きいかどうかを判定する。ここで、エッジ判定値[Sub]は、オブジェクトのエッジ部を判定するための閾値であり、例えば文字や線のエッジ部であるかどうかを判定可能な任意の値が設定される。判定の結果、エッジ判定値[Sub]よりもコントラスト値[CONT]の方が大きい場合にはステップ605に進む。一方、エッジ判定値[Sub]よりもコントラスト値[CONT]の方が大きくない場合にはステップ617に進む。
ステップ605において、エッジ判定部402は、ステップ601で求めた最大値[MAX]とステップ602で求めた最小値[MIN]とを加算し、得られた加算値を2で除算することによって平均値[AVE]を求める。
ステップ606において、エッジ判定部402は、上述の参照領域内の注目画素を中心とする幅3画素、高さ3画素の計9画素の中から、最大−最小値[MAX_MIN]を検索する。ここで、最大-最小値[MAX_MIN]は、最大値[MAX]を除いた平均値[AVE]以上の画素値の中で最小の値である。
ステップ607において、エッジ判定部402は、ステップ606における検索で最大-最小値[MAX_MIN]が見つかったかどうかを判定する。最大-最小値[MAX_MIN]が見つかった場合にはステップ608に進む。一方、最大-最小値[MAX_MIN]が見つからなかった場合にはステップ609に進む。
ステップ608において、エッジ判定部402は、ステップ601で求めた最大値[MAX]からステップ606で見つかった最大-最小値[MAX_MIN]を減算して、最大値との差分値[MAX_DIFF_MIN]を求める。
ステップ609において、エッジ判定部402は、最大-最小値[MAX_MIN]が存在しないため、最大値との差分値[MAX_DIFF_MIN]を“0”に設定する。
ステップ610において、エッジ判定部402は、上述の参照領域内の注目画素を中心とする幅3画素、高さ3画素の計9画素の中から、最小-最大値[MIN_MAX]を検索する。ここで、最小-最大値[MIN_MAX]は、最小値[MIN]を除いた平均値[AVE]未満の画素値の中で、最大の値である。
ステップ611において、エッジ判定部402は、ステップ610における検索で最小-最大値[MIN_MAX]が見つかったかどうかを判定する。最小-最大値[MIN_MAX]が見つかった場合にはステップ612に進む。一方、最小-最大値[MIN_MAX]が見つからなかった場合にはステップ613に進む。
ステップ612において、エッジ判定部402は、ステップ611で見つかった最小-最大値[MIN_MAX]からステップ602で求めた最小値[MIN]を減算して、最小値との差分値[MIN_DIFF_MAX]を求める。
ステップ613において、エッジ判定部402は、最小-最大値[MIN_MAX]が存在しないため、最小値との差分値[MIN_DIFF_MAX]を“0”に設定する。
ステップ614において、エッジ判定部402は、上述の最大-最小値[MAX_MIN]及び最小-最大値[MIN_MAX]のいずれも見つからなかったかどうかを判定する。どちらもなかった場合にはステップ615に進む。一方、どちらかがあった場合にはステップ616に進む。
ステップ615に進んだ時点で、最大-最小値[MAX_MIN]及び最小-最大値[MIN_MAX]がどちらも見つからず(ステップ614でYes)、コントラスト値[CONT]が十分に大きい(ステップ604でYes)ことが判明している。したがって、エッジ判定部402は、画素値に急峻な変化がある領域(すなわち、エッジ補正の必要があるエッジ画素)であると判断して、エッジ判定信号を“1(ON)”に設定し、本処理を終える。
ステップ616において、エッジ判定部402は、上述の参照領域に3つ以上の画素値がある場合に、補正が必要なエッジであるか否かを判定する処理(3値以上のエッジ判定処理)を行う。この3値以上のエッジ判定処理は、圧縮処理などで劣化した文字や自然画などに存在するエッジを検出するための処理である。図7は、3値以上のエッジ判定処理の詳細を示すフローチャートである。以下、詳しく説明する。
ステップ701において、エッジ判定部402は、ステップ603で求めたコントラスト値[CONT]から最大値との差分値 [MAX_DIFF_MIN]と最小値との差分値 [MIN_DIFF_MAX]を減算して、平均値付近の値の分布を示す分散値[DIFF]を求める。
ステップ702において、エッジ判定部402は、ステップ701で求めた分散値[DIFF]が第1の閾値[DiffTh_1]よりも大きいか否かを判定する。第1の閾値は、最大の最小値と最小の最大値との差が十分に大きいかどうかを判定するための閾値である。よって、第1の閾値には、エッジとして検出したい信号値差を表す値を設定する。この第1の閾値には、エッジ判定値[Sub]より少し小さい値が設定されることが望ましい。分散値[DIFF]が第1の閾値[DiffTh_1]よりも大きい場合にはステップ704に進む。一方、分散値[DIFF]が第1の閾値[DiffTh_1]よりも大きくない場合にはステップ703に進む。
ステップ703において、エッジ判定部402は、ステップ701で求めた分散値[DIFF]が十分大きな値でないため、画素値に急峻な変化がない領域であると判断する。すなわち、エッジ補正の必要がない非エッジ画素であると判断して、エッジ判定信号を“0(OFF)”に設定し、本処理を終える。
ステップ704において、エッジ判定部402は、上述の最大値との差分値[MAX_DIFF_MIN]が第2の閾値[DiffTh_2]より小さいか否かを判定する。第2の閾値及び後述の第3の閾値は、最大値との差分値[MAX_DIFF_MIN]及び最小値との差分値[MIN_DIFF_MAX]が十分に小さいかどうかを判定するための閾値である。最大値との差分値[MAX_DIFF_MIN]及び最小値との差分値[MIN_DIFF_MAX]が大きいということは、グラデーション部などで変化がある部分であることを意味している。グラデーションの変化の勾配がきつい部分は、エッジとして検出したくないので、第2及び第3の閾値を用いて判定することとしている。第2及び第3の閾値は、第1の閾値に比べて十分に小さい値とすることが望ましい。なぜなら、第2及び第3の閾値が大きくなればなるほど、コントラストがあって信号値のばらつきのある部分をエッジとして判定してしまうためである。最大値との差分値[MAX_DIFF_MIN]が第2の閾値[DiffTh_2]より小さい場合にはステップ705に進む。一方、最大値との差分値[MAX_DIFF_MIN]が第2の閾値[DiffTh_2]より小さくない場合にはステップ707に進む。
ステップ705において、エッジ判定部402は、上述の最小値との差分値[MIN_DIFF_MAX]が第2の閾値[DiffTh_2]より小さいか否かを判定する。最小値との差分値[MIN_DIFF_MAX]が第2の閾値[DiffTh_2]より小さい場合にはステップ706に進む。一方、最小値との差分値[MIN_DIFF_MAX]が第2の閾値[DiffTh_2]より小さくない場合にはステップ707に進む。
ステップ706において、エッジ判定部402は、最大値との差分値[MAX_DIFF_MIN]及び最小値との差分値[MIN_DIFF_MAX]の両者が共に十分小さいことから、画素値に急峻な変化がある領域であると判断する。すなわち、エッジ補正の必要があるエッジ画素であると判断して、エッジ判定信号を“1(ON)”に設定し、ステップ708に進む。
ステップ707において、エッジ判定部402は、画素値に急峻な変化がない領域と判断する、すなわち、エッジ補正の必要がない非エッジ画素であると判断して、エッジ判定信号を“0(OFF)”に設定し、ステップ708に進む。
ステップ708において、エッジ判定部402は、最大値との差分値[MAX_DIFF_MIN]が第3の閾値[DiffTh_3]より小さいか否かを判定する。最大値との差分値[MAX_DIFF_MIN]が第3の閾値[DiffTh_3]より小さい場合にはステップ710に進む。一方、最大値との差分値[MAX_DIFF_MIN]が第3の閾値[DiffTh_3]より小さくない場合にはステップ709に進む。
ステップ709において、エッジ判定部402は、最小値との差分値[MIN_DIFF_MAX]が第3の閾値[DiffTh_3]より小さいか否かを判定する。最小値との差分値[MIN_DIFF_MAX]が第3の閾値[DiffTh_3]より小さい場合にはステップ710に進む。一方、最小値との差分値[MIN_DIFF_MAX]が第3の閾値[DiffTh_3]より小さくない場合には、本処理を終える。
ステップ710において、エッジ判定部402は、最大値との差分値[MAX_DIFF_MIN]及び最小値との差分値[MIN_DIFF_MAX]のいずれかが十分に小さく、画素値に急峻な変化がある領域と判断する。すなわち、エッジ補正の必要があるエッジ画素であると判断して、エッジ判定信号を“1(ON)”に設定し、本処理を終える。
なお、上述の説明では、エッジ判定値や第1〜第3の閾値は各一つであるように記載しているが、これらの値を複数用意し、必要に応じて使い分けるようにしてもよい。例えば、さらに属性データを参照するようにして、注目画素の属性がイメージである場合は、他の属性よりもエッジ判定値と第1の閾値をより大きな値に、第2及び第3の閾値をより小さな値にそれぞれ切り替える。また、注目画素の属性が文字や線である場合は、他の属性よりもエッジ判定値と第1の閾値をより小さな値に、第2及び第3の閾値をより大きな値にそれぞれ切り替えてもよい。このような切り替えを行なうことによって、色や形状が複雑になりやすいイメージ属性では補正がかかり難く、また、色や形状が一様になりやすい文字属性や線属性では補正がよりかかり易くなるようにするといった具合に、緻密な制御が可能となる。
以上が、3値以上のエッジ判定処理の内容である。
図6のフローチャートの説明に戻る。
ステップ617において、エッジ判定部402は、コントラスト値[CONT]が小さいことから(ステップ604でNo)、参照領域が画素値に急峻な変化がない領域であると判断する。すなわち、参照領域はエッジ補正の必要がない非エッジ画素であると判断して、エッジ判定信号を“0(OFF)”に設定し、本処理を終える。
以上がエッジ判定処理の内容である。ここで、図8を用いて、エッジ判定処理の具体例を説明する。図8には、エッジとして検出したい3×3画素の画像801と、エッジとして検出したくない3×3画素の画像802が示されている。画像801と画像802とは同じコントラストである。
まず、両画像801及び802の最大値[MAX]は共に“40”であり(ステップ601)、最小値[MIN]は共に“0”である(ステップ602)。そして、両画像801及び802のコントラスト[CONT]は共に“40”となる(ステップ603)。
そして、エッジ判定値[Sub]が“20”であるとすると、いずれの画像の場合もステップ605へ移行し(ステップ604でYes)、その平均値[AVE]として共に“20”が導出される。
続くステップでは、画像801の場合は最大-最小値[MAX_MIN]は存在しないため(ステップ607でNo)、最大値との差分値[MAX_DIFF_MIN]は“0”となる(ステップ609)。これに対し、画像802の場合は最大-最小値[MAX_MIN]は存在するため(ステップ607でYes)、最大値との差分値[MAX_DIFF_MIN]として“10(=40−30)”が得られる(ステップ608)。
そして、画像801の場合は最小-最大値[MIN_MAX]も存在しないため(ステップ611でNo)、最小値との差分値[MIN_DIFF_MAX]も“0と”なる(ステップ613)。これに対し、画像802の場合は最小-最大値[MIN_MAX]が存在するため(ステップ611でYes)、最小値との差分値[MIN_DIFF_MAX]として“18(=18−0)”が得られる(ステップ612)。
ここまでの処理により、画像801については、最大-最小値[MAX_MIN]と最小-最大値[MIN_MAX]のどちらも存在しなかったので(ステップ614でYes)、エッジ判定信号がONに設定される(ステップ615)。つまり、画像801はエッジ部であると判定される。一方、画像802については、最大-最小値[MAX_MIN]も最小-最大値[MIN_MAX]の双方が存在するので、3値以上のエッジ判定処理に進むことになる(ステップ616)。
画像802に対する3値以上のエッジ判定処理では、まず、分散値[DIFF]が導出される(ステップ701)。いま、コントラスト[CONT]は“40”、最大値との差分値[MAX_DIFF_MIN]は“10”、最小値との差分値[MIN_DIFF_MAX]は“18”なので、分散値[DIFF]は“12”となる。
そして、ステップ702における第1の閾値[DiffTh_1]が“16”であったとすると(ステップ702でNo)、エッジ判定信号がOFFに設定される(ステップ703)。つまり、画像802はエッジ部でないと判定される。
上述のとおり図6のフローチャートでは、参照領域内の画素値が3つ未満の単純な領域である場合に、コントラスト値[CONT]のみを用いて補正が必要なエッジ部であるかどうかを判定するようにしている。しかしながら、このような態様に限定されるものではない。例えば、参照領域内の状態に関わらず、参照領域内のコントラスト値が十分に大きいか否かにのみ基づいてエッジ補正が必要なエッジであるかどうかを判定するようにしてもよい。要は、エッジ部にエッジ補正処理を施すべきであるか否かが適切に判定できればよい。
(エッジ方向判定処理)
次に、エッジ方向判定部404で行われるエッジ方向判定処理の詳細について説明する。
図9は、注目画素とエッジ方向判定部404で参照される4つの画素の位置関係を示した図である。図9において注目画素が[tr_pix]、注目画素の左隣の画素が[left_pix]、注目画素の右隣の画素が[right_pix]、注目画素の上隣の画素が[up_pix]、注目画素の下隣の画素が[down_pix]でそれぞれ示されている。図10は、エッジ方向判定処理の流れを示すフローチャートである。
ステップ1001において、エッジ方向判定部404は、注目画素の画素値と注目画素の上隣画素の画素値とを比較し、注目画素の画素値の方が大きいかどうかを判定する。注目画素の画素値の方が大きい場合には、ステップ1002へ進む。一方、注目画素の画素値の方が大きくない場合には、ステップ1003へ進む。
ステップ1002において、エッジ方向判定部404は、エッジが注目画素の上にあることを示すエッジ方向信号[Edge_Dir]を生成する。本実施例では、エッジ方向信号[Edge_Dir]を2ビットの信号とし、エッジが注目画素の上にあることを示す値として“00”を設定する。生成されたエッジ方向信号[Edge_Dir]は判定結果統合部405に送られ、本処理を終了する。
ステップ1003において、エッジ方向判定部404は、注目画素の画素値と注目画素の下隣画素の画素値とを比較し、注目画素の画素値の方が大きいかどうかを判定する。注目画素の画素値の方が大きい場合には、ステップ1004に進む。一方、注目画素の画素値の方大きくない場合には、ステップ1005に進む。
ステップ1004において、エッジ方向判定部404は、エッジが注目画素の下にあることを示すエッジ方向信号[Edge_Dir]を生成する。具体的には、エッジが注目画素の下にあることを示す値として“01”をエッジ方向信号[Edge_Dir]に設定する。生成されたエッジ方向信号[Edge_Dir]は判定結果統合部405に送られ、本処理を終了する。
ステップ1005において、エッジ方向判定部404は、注目画素の画素値と注目画素の右隣画素の画素値とを比較し、注目画素の画素値の方が大きいかどうかを判定する。注目画素の画素値の方が大きい場合には、ステップ1006へ進む。一方、注目画素の画素値の方が大きくない場合には、ステップ1007へ進む。
ステップ1006において、エッジ方向判定部404は、エッジが注目画素の右にあることを示すエッジ方向信号[Edge_Dir]を生成する。具体的には、エッジが注目画素の右にあることを示す値として“10”をエッジ方向信号[Edge_Dir]に設定する。生成されたエッジ方向信号[Edge_Dir]は判定結果統合部405に送られ、本処理を終了する。
ステップ1007において、エッジ方向判定部404は、エッジが注目画素の左にあることを示すエッジ方向信号[Edge_Dir]を生成する。具体的には、エッジが注目画素の左にあることを示す値として“11”をエッジ方向信号[Edge_Dir]に設定する。生成されたエッジ方向信号[Edge_Dir]は判定結果統合部405に送られ、本処理を終了する。
以上が、エッジ方向判定処理の内容である。エッジ方向信号によって、注目画素がエッジに対してどの方向に存在するのかが分かる。
<エッジ補正データ生成処理>
次に、エッジ補正データ生成部304におけるエッジ補正データ生成処理の詳細について説明する。
エッジ補正データ生成部304は、予め用意されたテーブル等(例えば一次元のルックアップテーブル:LUT)を参照してエッジ補正データを生成する。具体的には、所定の入力値に対応する出力値を、LUTを参照して決定(変換)し、エッジ補正データとする。本実施例では、入力された画像データを8ビットから4ビットに変換した上で、上記エッジ補正データを生成するものとする。図11は、エッジ補正データ生成処理で用いられるルックアップテーブルの一例を示している。図11(a)〜(c)で示される各LUTは、4ビット(0〜15)の入力値と出力値がそれぞれ一対一で対応付けられている。図11の(a)は、入力値をそのままの値で出力するリニアな特性を持つLUTである。図11の(b)及び(c)は、プリンタの特性に応じて非線形な特性を持つLUTである。図11(b)は、入力値に対して出力値が小さい値をとるLUTであり、プリンタの階調特性が通常よりも濃い場合や、エッジ補正効果を弱める場合などに用いられる。また、図11(c)は、入力値に対して出力値が大きい値をとるLUTであり、プリンタの階調特性が通常より薄い場合や、エッジ補正効果を強める場合などに用いられる。
<スクリーン処理>
次に、スクリーン処理部305におけるスクリーン処理について説明する。
図12は、スクリーン処理部305で行われるスクリーン処理の流れを示すフローチャートである。このスクリーン処理は、入力される画像データと予め設定されるディザマトリクスを用いて、プリンタ部103で印刷可能な4ビットの画像データに変換する処理である。
ステップ1201において、スクリーン処理部305は、所定のディザマトリクスを用いて、多値のディザ法によって画像データを4ビットのスクリーンデータに変換する。ディザマトリクスを用いた多値のディザ法については、周知の技術であるため説明を省く。
ステップ1202において、スクリーン処理部305は、ステップ1201で得られたスクリーンデータを画像合成部307に出力する。
以上が、スクリーン処理部305におけるスクリーン処理の内容である。
<位相ずれスクリーン処理>
次に、位相ずれスクリーン処理部306で行われる位相をずらしたスクリーン処理について詳しく説明する。この処理により、その後の画像合成部307における処理において、エッジ部のスクリーンドットをオブジェクトの内側にずらすことが可能となる。位相ずれスクリーン処理部306におけるスクリーン処理の流れは、上述のスクリーン処理部305におけるスクリーン処理の流れと同じであるため、以下では差異点のみを説明する。
前述のステップ1201において、位相ずれスクリーン処理部306は、位相をずらしたディザマトリクスを用い、多値のディザ法によって画像データを4ビットのスクリーンデータに変換する。具体的には、スクリーン処理部305で用いたディザマトリクスの位相を、上下左右に各1画素ずらしたディザマトリクスを用いてスクリーンデータに変換する。図13は、位相をずらしたディザマトリクスを説明する図である。図13(a)に示すレベル1〜15のディザマトリクス1301は、スクリーン処理部305で用いられるディザマトリクスである。図13(b)〜(e)に示す、レベル1〜15で構成されるディザマトリクス1302〜1305は、位相ずれスクリーン処理部306で用いられるディザマトリクスであり、ディザマトリクス1301の位相を上下左右にそれぞれ一マスずらしたものである。すなわち、図13(b)は上に1マスずらしたディザマトリクス、同(c)は下に1マスずらしたディザマトリクス、同(d)は左に1マスずらしたディザマトリクス、同(e)は右に1マスずらしたディザマトリクスである。
図14は、スクリーン処理部305でのスクリーン処理結果と位相ずれスクリーン処理部306でのスクリーン処理結果とを比較して説明する図である。図14(a)は、双方のスクリーン処理部に入力される画像データであり、縦12画素×横7画素の矩形のオブジェクト1401が存在している。
図14(b)は、スクリーン処理部305におけるスクリーン処理で生成されるスクリーンデータである。画素群1402は、網点に変換された画素群である。
図14(c)〜(f)は、位相ずれスクリーン処理部306における位相を上下左右に1マスずらしたスクリーン処理で生成されるスクリーンデータである。図14(c)〜(f)において画素群1403〜1406は、網点に変換された画素群であり、図14(b)における画素群1402にそれぞれ対応している。図14(c)における画素群1403は、画素群1402に比べて位相が上に1マスずれている。同様に、図14(d)における画素群1404は画素群1402に比べて位相が下に1マスずれている。そして、図14(e)における画素群1405は画素群1402に比べて位相が左に1マスずれ、図14(f)における画素群1406は画素群1402に比べて位相が右に1マスずれている。
<画像合成処理>
次に、画像合成部307で行われる画像合成処理について説明する。図15は、画像合成部307で行われる画像合成処理の流れを示すフローチャートである。以下の処理が、入力画像データ(ガンマ補正後の画像データ)内のすべての画素に対して実行される。
ステップ1501において、画像合成部307は、エッジ情報生成部302から入力されるエッジ情報に基づいて、注目画素がエッジ画素であるか否かを判定する。具体的には、エッジ情報の上位1ビットのデータを参照して、値が“1”の場合はエッジ画素と判定し、ステップ1502へ進む。一方、上位1ビットの値が“0”の場合は非エッジ画素と判定し、ステップ1503へ進む。
ステップ1502において、画像合成部307は、エッジ補正データ生成部304から入力されたエッジ補正データにおける注目画素の画素値を、出力画像データとしてプリンタ部103に出力する。
ステップ1503において、画像合成部307は、エッジ情報生成部302から入力されるエッジ情報を参照し、注目画素の周辺画素(注目画素を囲む周囲8画素)にエッジ画素が存在するか否かを判定する。周辺画素にエッジ画素が存在する場合は、ステップ1504へ進む。一方、周辺画素にエッジ画素が存在しない場合は、ステップ1513へ進む。
ステップ1504において、画像処理部307は、注目画素の画素値と所定の参照画素の画素値を比較して、注目画素がエッジ画素に内接する画素であるかどうか(オブジェクト内側の画素かどうか)を判定する。ここで、参照画素は、注目画素に隣接する画素であって、図16に示すような位置関係にある画素を指す。図16において、中央の画素1601が注目画素を示し、それ以外の画素1602〜1609が参照画素を示している。そして、注目画素がエッジ画素に内接する画素であるかどうかが、以下の条件に従って判定される。
・参照画素1602のエッジ情報の上位1ビットが“1”である場合は、注目画素1601の画素値から参照画素1606の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・参照画素1603のエッジ情報の上位1ビットが“1”である場合は、注目画素1601の画素値から参照画素1607の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・参照画素1604のエッジ情報の上位1ビットが“1”である場合は、注目画素1601の画素値から参照画素1608の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・参照画素1605のエッジ情報の上位1ビットが“1”である場合は、注目画素1601の画素値から参照画素1608の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・上記4つの条件に該当しない場合は、注目画素はエッジ画素に内接する画素でないと判定する。
判定の結果、注目画素がエッジ画素に内接する画素であると判定された場合は、ステップ1505に進む。一方、注目画素がエッジ画素に内接する画素でないと判定された場合は、ステップ1513へ進む。
ステップ1505において、画像合成部307は、エッジ情報を参照し、エッジが注目画素の上にあるかどうか(エッジ情報の下位2ビットの値が“00”であるかどうか)を判定する。下位2ビットの値が“00”である場合は、エッジが注目画素の上にあると判定し、ステップ1506へ進む。一方、下位2ビットの値が “00”でない場合は、ステップ1507へ進む。
ステップ1506において、画像合成部307は、スクリーン処理部305と位相ずれスクリーン処理部306の出力結果を合成し、合成データ[combData]を生成する。本ステップでは、オブジェクトの内側にスクリーンドットを移動させるために、エッジの方向(ここでは、上)とは逆の方向に位相をずらしたスクリーンデータを合成する。具体的には、スクリーン処理部305の出力結果[Sc]に、位相ずれスクリーン処理部306の出力結果の内、位相を下にずらしたスクリーンデータ[PSdownSc]を加算し、予め定めた合成係数βを乗算することにより、合成データ[combData]を得る。
ステップ1507において、画像合成部307は、エッジ情報を参照し、エッジが注目画素の下にあるかどうか(エッジ情報の下位2ビットの値が“01”であるかどうか)を判定する。下位2ビットの値が“01”である場合は、エッジが注目画素の下にあると判定し、ステップ1508へ進む。一方、下位2ビットの値が “01”でない場合は、ステップ1509へ進む。
ステップ1508において、画像合成部307は、スクリーン処理部305と位相ずれスクリーン処理部306の出力結果を合成し、合成データ[combData]を生成する。本ステップでは、オブジェクトの内側にスクリーンドットを移動させるために、エッジの方向(ここでは、下)とは逆の方向に位相をずらしたスクリーンデータを合成する。具体的には、スクリーン処理部305の出力結果[Sc]に、位相ずれスクリーン処理部306の出力結果の内、位相を上にずらしたスクリーンデータ[PSupSc]を加算し、予め定めた合成係数βを乗算することにより、合成データ[combData]を得る。
ステップ1509において、画像合成部307は、エッジ情報を参照し、エッジが注目画素の左にあるかどうか(エッジ情報の下位2ビットの値が“10”であるかどうか)を判定する。下位2ビットの値が“10”である場合は、エッジが注目画素の左にあると判定し、ステップ1510へ進む。一方、下位2ビットの値が “10”でない場合は、エッジが注目画素の右にあると判定し、ステップ1511へ進む。
ステップ1510において、画像合成部307は、スクリーン処理部305と位相ずれスクリーン処理部306の出力結果を合成し、合成データ[combData]を生成する。本ステップでは、オブジェクトの内側にスクリーンドットを移動させるために、エッジの方向(ここでは、左)とは逆の方向に位相をずらしたスクリーンデータを合成する。具体的には、スクリーン処理部305の出力結果[Sc]に、位相ずれスクリーン処理部306の出力結果の内、位相を右にずらしたスクリーンデータ[PSrightSc]を加算し、予め定めた合成係数βを乗算することにより、合成データ[combData]を得る。
ステップ1511において、画像合成部307は、スクリーン処理部305と位相ずれスクリーン処理部306の出力結果を合成し、合成データ[combData]を生成する。本ステップでは、オブジェクトの内側にスクリーンドットを移動させるために、エッジの方向(ここでは、右)とは逆の方向に位相をずらしたスクリーンデータを合成する。具体的には、スクリーン処理部305の出力結果[Sc]に、位相ずれスクリーン処理部306の出力結果の内、位相を左にずらしたスクリーンデータ[PSleftSc]を加算し、予め定めた合成係数βを乗算することにより、合成データ[combData]を得る。
ステップ1512において、画像合成部307は、注目画素について生成された合成データ[combData]を、出力画像データとしてプリンタ部103に出力する。
ステップ1513において、画像合成部307は、スクリーン処理部305の出力結果であるスクリーンデータ[Sc] における注目画素の画素値を、出力画像データとしてプリンタ部103に出力する。
上記の処理が、入力画像データ内に未処理の画素がなくなるまで繰り返される。以上が画像合成処理の内容である。上述のとおり、エッジ情報とガンマ補正後の画像データに応じて、出力される画像データ(注目画素の画素値)が、エッジ補正データ、合成データ、スクリーンデータのいずれかに適宜切り替えられることになる。
なお、本実施例では、合成係数βを乗算して合成データを生成していたが、これに限定されるものではない。例えば、スクリーン処理部305と位相ずれスクリーン処理部306の処理結果の加算値を一次元のルックアップテーブルに入力して、合成データを生成してもよい。
最後に、本実施例を適用する場合と適用しない場合の違いを、図17〜図19を参照して説明する。
図17は、位相ずれスクリーン処理の結果を用いずにエッジ補正処理を行った場合の一例を説明する図である。
図17(a)は、スクリーン処理部305に入力される画像データであり、前述の図14(a)と同様、縦12画素×横7画素の矩形のオブジェクト1701が存在している。
図17(b)は、(画像合成部307に入力される)エッジ情報によって、上位1ビットが“1”のエッジ画素を斜線で示した図である。エッジ画素1702にはエッジ補正データが適用され、エッジ画素1702の内側領域内の画素1703にはスクリーンデータが適用される。
図17(c)は、スクリーン処理部305で生成されるスクリーンデータを示した図である。画素群1704は、網点に変換された画素群である。
図17(d)は、画像合成部307に入力されるエッジ補正データを示す図であり、グレーで示される画素の画素値が、図17(b)に示すエッジ画素1702における画素値となる。
図17(e)は、従来技術によるエッジ補正処理の結果の一例を示す図である。この場合、エッジ画素1702に対して、図17(c)に示すスクリーンデータと図17(d)に示すエッジ補正データとで比較を行い、大きい方の値を出力値とする合成処理がなされている。
図17(f)は、別の従来技術によるエッジ補正処理の結果の一例を示す図である。この場合、エッジ画素1702に対して、図17(d)に示すエッジ補正データをそのまま用いる合成処理がなされている。
図18は、本実施例を適用してエッジ補正処理を行った場合の一例を説明する図である。
図18(a)は、スクリーン処理部305に入力される画像データであり、図17(a)と同様、縦12画素×横7画素の矩形のオブジェクト1801が存在している。
図18(b)は、(画像合成部307に入力される)エッジ情報の上位1ビットが“1”のエッジ画素1802を斜線で、当該エッジ画素に接する内エッジ画素1803を斜め格子で示した図である。エッジ画素1802にはエッジ補正データが用いられ、内エッジ画素1803には合成データが用いられ、内エッジ画素1803の内側領域内の画素1804にはスクリーンデータが用いられる。
図18(c)は、スクリーン処理部305で生成されるスクリーンデータを示した図である。画素群1805は、網点に変換された画像群である。
図18(d)は、画像合成部307に入力されるエッジ補正データを示す図であり、グレーで示す画素の画素値が、図18(b)に示すエッジ画素1802における画素値となる。
図18(e)は、画像合成部307で生成される合成データを示す図であり、複数レベルのグレーで示す画素の画素値が、図18(b)に示す内エッジ画素1803における画素値となる。
図18(f)は、画像合成部307から出力される本実施例によるエッジ補正処理結果としての出力画像データを示す図である。この場合、エッジ画素1802に対して図18(d)のエッジ補正データ、内エッジ画素1803に対して図18(e)の合成データ、内エッジ画素の内側領域内の画素1804に対して図18(c)のスクリーンデータがそれぞれ用いられている。
図19は、本実施例によるエッジ補正処理後の画像における各画素の露光量を説明する図である。
図19(a)は、画素の信号値に対する露光量を示している。画素1901の画素値は“4”であり、露光量が小さいことを薄いグレーで示している。画素1902は画素値が“8”で画素1901より露光量が大きく、やや濃いグレーで示している。画素1903は画素値が“15”で画素1902より露光量が大きく、黒で示している。
図19(b)は、図17(e)で示した従来技術によるエッジ補正処理結果(1)における各画素の露光量を示した図である。図19(b)では、エッジ部の画素値は画素によって異なっており、例えば画素1904(グレー)と画素1905(黒)との間に段差が発生してしまうことになる。さらに、電子写真の特性上、ハーフドットはフルドットに引き寄せられるので、潜像形成時には段差がより顕著となり、ジャギーを完全に除去しきれない。
図19(c)は、図17(f)で示した別の従来技術によるエッジ補正処理結果(2)における各画素の露光量を示した図である。図19(c)では、エッジ部の画素値は全て同じ画素値“8”なので、エッジ部における段差の問題は生じない。しかし、図19(b)において画素1905に存在していたスクリーンドット(フルドット)が、図19(c)では画素値“8”のハーフドットに置き変わるので、スクリーンドットの連続性が失われてしまう。例えば、画素1908に対して、画素1907の露光の影響が失われる。つまり、エッジ部に存在していたフルドットがエッジ補正データによってハーフドットに置き換わることで、スクリーンドットの連続性がエッジの手前で失われ、不自然になってしまう。
図19(b)及び(c)から明らかなように、エッジ部周辺において、位相をずらしたスクリーン処理の結果を合成しない場合には、ジャギーを除去しきれなかったり、画像不良が発生してしまうことが分かる。
図19(d)は、図18(f)で示した本実施例によるエッジ補正処理結果における各画素の露光量を示した図である。図19(d)では、エッジ部は図19(c)と同様すべて同じハーフドットで、画素値のばらつきがないのでエッジ部の段差の問題は発生しない。また、オブジェクト内側のエッジ部に隣接する画素(内エッジ画素)に対して、位相をずらしたスクリーン結果を合成することで、エッジ部に存在していたスクリーンドットをオブジェクトの内側にずらすことができている。例えば画素1910にドットを付加することで、あたかも画素1909を中心にスクリーンドットが存在しているかのように見せることができている。これにより、エッジ部においてもスクリーンドットの連続性が維持されている。
本実施例によれば、エッジ部に隣接するオブジェクト内側の画素に対して位相をずらしたスクリーン処理の結果が合成され、置き換えられたエッジ部のスクリーンドットがオブジェクトの内側に再配置される。これにより、スクリーンドットの連続性をエッジ部付近まで保ちながら、エッジ部のジャギーを改善することができる。
次に、オブジェクト内側のエッジ部に隣接する画素に対して位相をずらしたスクリーン結果を合成する代わりに、エッジ部に存在するスクリーンドットをオブジェクトの内側に移動させる態様について、実施例2として説明する。なお、実施例1と共通する部分については説明を省略ないしは簡略化し、以下では差異点を中心に説明するものとする。
図20は、本実施例に係る、画像処理を担う機能部としての画像処理部の内部構成を示すブロック図である。本実施例に係る画像処理部2000は、色補正部301、エッジ情報生成部2001、ガンマ補正部303、エッジ補正データ生成部304、スクリーン処理部305、画像合成部2002で構成される。これらのうち、色補正部301、ガンマ補正部303、エッジ補正データ生成部304、スクリーン処理部305については、実施例1と同じである。
エッジ情報生成部2001は、CMYKの色毎にエッジ情報を生成する。図21は、本実施例に係る、エッジ情報生成部2001の内部構成を示すブロック図であり、実施例1の図4と比較すると、エッジ方向判定部404が存在していないのが分かる。そのため、本実施例におけるエッジ情報には、エッジの方向を示す情報は含まれない。つまり、本実施例におけるエッジ情報は、画素毎に1ビットの値を持つデータであり、当該画素がエッジ画素である場合に“1”、非エッジ画素である場合に“0”で示す情報となる。生成されたエッジ情報は、画像合成部2002で処理を切り替える際に参照される。
画像合成部2002は、エッジ情報生成部2001から受け取ったエッジ情報とガンマ補正後の画像データに基づいて、後述する画像合成処理を行なう。
<画像合成処理>
次に、画像合成部2002で行われる画像合成処理の詳細について説明する。図22は、画像合成部2002で行われる画像合成処理の流れを示すフローチャートである。図23は、実施例1の図18に相当する図であり、本実施例を用いてエッジ補正処理を行なった場合の一例を説明する図である。図23(a)は、スクリーン処理部305に入力される画像データであり、前述の図18(a)と同様、縦12画素×横7画素の矩形のオブジェクト2301が存在している。図23(b)は、(画像合成部2002に入力される)エッジ情報が“1”のエッジ画素2302を斜線で、当該エッジ画素に接する内エッジ画素2303を斜め格子で示した図である。図23(c)は、スクリーン処理部305で生成されるスクリーンデータを示した図である。画素群2304は、網点に変換された画像群である。図23(d)は、画像合成部2002に入力されるエッジ補正データを示す図であり、グレーで示す画素の画素値が図23(b)に示すエッジ画素2302における画素値となる。図23(e)は、画像合成部2002で生成されるドット移動データを示した図である。図23(f)は、画像合成部2002で生成されるドット補正データを示した図である。図23(g)は、画像合成部2002から出力される本実施例によるエッジ補正処理結果としての出力画像データを示す図である。
ステップ2201において、画像合成部2002は、エッジ情報生成部2001から入力されるエッジ情報に基づいて、注目画素がエッジ画素であるか否かを判定する。具体的には、エッジ情報の値が“1”の場合はエッジ画素と判定し、ステップ2202へ進む。一方、エッジ情報の値が“0”の場合は非エッジ画素と判定し、ステップ2203へ進む。
ステップ2202において、画像合成部2002は、エッジ補正データ生成部304から入力されたエッジ補正データにおける注目画素の画素値を、出力画像データとしてプリンタ部103に出力する。
ステップ2203において、画像合成部2002は、エッジ情報生成部2001から入力されるエッジ情報を参照し、注目画素の周辺画素(注目画素を囲む周囲8画素)にエッジ画素が存在するか否かを判定する。周辺画素にエッジ画素が存在する場合は、ステップ2204へ進む。一方、周辺画素にエッジ画素が存在しない場合は、ステップ2211へ進む。
ステップ2204において、画像合成部2002は、注目画素の画素値と前述の参照画素の画素値(いずれもガンマ補正後)を比較して、注目画素がエッジ画素に内接する画素かどうか(オブジェクトの内側の画素であるかどうか)を判定する。具体的には、以下の条件に従って判定する(前述の図16を参照)。
・参照画素1602のエッジ情報の値が“1”である場合は、注目画素1601の画素値から参照画素1606の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・参照画素1603のエッジ情報の値が“1”である場合は、注目画素1601の画素値から参照画素1607の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・参照画素1604のエッジ情報の値が“1”である場合は、注目画素1601の画素値から参照画素1608の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・参照画素1605のエッジ情報の値が“1”である場合は、注目画素1601の画素値から参照画素1608の画素値を引いた値が“0”より大きければ、注目画素はエッジ画素に内接する画素であると判定する。
・上記4つの条件に該当しない場合は、注目画素はエッジ画素に内接する画素でないと判定する。
判定の結果、注目画素がエッジ画素に内接する画素であると判定された場合は、ステップ2205に進む。一方、注目画素がエッジ画素に内接する画素でないと判定された場合は、ステップ2211へ進む。
ステップ2205において、画像合成部2002は、注目画素に隣接する上下左右の画素が、エッジ画素であって、かつ、スクリーンドットの一部であるかどうか(スクリーンドットを構成する画素かどうか)を判定する。具体的には、注目画素に隣接する上下左右の画素について、そのエッジ情報(1ビット)の値が“1”であり、かつ、スクリーンデータにおいて“1”以上の値を持つ画素であるかどうかを判定する。判定の結果、注目画素に隣接する上下左右の画素が、エッジ画素であって、かつ、スクリーンドットを構成する画素(以下、エッジドット画素)である場合は、ステップ2206へ進む。一方、注目画素に隣接する上下左右の画素がエッジドット画素でない場合は、ステップ2208へ進む。
ステップ2206において、画像合成部2002は、ドット移動データを生成する。具体的には、エッジドット画素のスクリーンデータにおける画素値から、エッジ補正データ生成部304から入力されるエッジ補正データにおける画素値を減算して、ドット移動データとする。つまり、ドット移動データ[DotShiftVal]は、エッジドット画素のスクリーンデータ[DotVal]とエッジ補正データ[EdgeVal]から以下の式(1)によって求められる。
DotShiftVal = DotVal - EdgeVAl ・・・式(1)
ここで、注目画素が、図23(e)の画素2305(ドット移動データにおいて、グレーで示される画素の1つ)であった場合を例に具体的に説明する。図23(a)の画素2306、図23(b)の画素2307、図23(c)の画素2308、図23(d)の画素2309は、図23(e)の画素2305と同じ位置にある対応画素を示している。
まず、注目画素はエッジではないので、ステップ2203へ進む(ステップ2201でNo、図23(b)の画素2307を参照)。
次に、注目画素の周辺でエッジとなる画素に、図23(b)の画素2310があるので、ステップ2204へ進む(ステップ2203でYes)。
そして、図23(a)の画素2306の画素値は“0”より大きい値なので、エッジの内側であると判定され、ステップ2205へ進む(ステップ2204でYes)。
そして、注目画素の左隣の画素は、エッジ画素であってスクリーンドットなので(図23(b)の画素2310及び図23(c)の画素2311を参照)、ステップ2206へ進み、ドット移動データが生成される。いま、画素2311の画素値は“15”なので、DotValは“15”となる。そして、画素2312の画素値は“8”なので(図23(d)を参照)、エッジ補正データ[EdgeVal]は“8”となる。したがって、ドット移動データ[DotShiftVal]は“15”から“8”を引いた値である“7”となる。
このようにしてドット移動データが生成される。或いは、注目画素周辺のスクリーンデータを参照し、周辺スクリーンドットから注目画素までの距離に応じた画素値を決定することでドット移動データを得てもよい。
図22のフローチャートの説明に戻る。
ステップ2207において、画像合成部2002は、注目画素について生成されたドット移動データを、出力画像データとしてプリンタ部103に出力する。
ステップ2208において、画像合成部2002は、注目画素がスクリーンドットの一部であるかどうかを判定する。具体的には、注目画素が、スクリーン処理部305から入力されるスクリーンデータにおいて“1”以上の値を持つ画素(スクリーンドットを構成する画素)であるかどうかを判定する。判定の結果、注目画素がスクリーンドットを構成する画素である場合は、ステップ2209へ進む。一方、注目画素がスクリーンドットを構成する画素でない場合は、ステップ2211へ進む。
ステップ2209において、画像合成部2002は、ドット補正データを生成する。ドット補正データ[DotFixVal]は、注目画素を含む所定領域(例えば3x3画素)におけるスクリーンデータの合計値[DotSum]と、該所定領域におけるエッジ補正データの合計値[EdgeSum]と、該所定領域内のドット補正データが適用される画素の数[DotNum]から、以下の式(2)で求められる。(小数点以下は切り捨て)
DotFixVal = (DotSum − EdgeSum) / DotNum ・・・式(2)
ここで、注目画素が図23(f)の画素2313(ドット補正データにおいて、グレーで示される画素の1つ)であった場合について説明する。図23(a)の画素2314、図23(b)の画素2315、図23(c)の画素2316は、図23(f)の画素2313と同じ位置にある対応画素を示している。
まず、注目画素はエッジではないので、ステップ2203へ進む(ステップ2201でNo、図23(b)の画素2315を参照)。
次に、注目画素の周辺でエッジとなる画素に、図23(b)の画素2317があるので、ステップ2204へ進む(ステップ2203でYes)。
そして、図23(f)の画素2313の画素値は“0”より大きい値なので、エッジの内側であると判定され、ステップ2205へ進む(ステップ2204でYes)。
そして、注目画素に隣接する上下左右の画素に、エッジ画素であってスクリーンドットを構成する画素は存在しないので、ステップ2208へ進む(ステップ2205でNo)。
そして、注目画素はスクリーンドットを構成するので(図23(c)の画素2316を参照)、ステップ2209へ進み、ドット補正データが生成される。ここで、画素2313(=画素2316)を注目画素とした場合の3x3画素のスクリーンデータの合計値[DotSum]は、画素値が“15”の画素が3個、画素値が“8”の画素が1個なので“53”となる。そして、同様に、上記3x3画素内のエッジ補正データの合計値[EdgeSum]は、画素値が“8”の画素が3個なので“24”となる。さらに、上記3x3画素内のドット補正データが適用される画素(3x3画素内の画素値が0以外の画素であってエッジを構成しない画素)の数[DotNum]は、3個である(図23(f)を参照)。よって、この場合のドット補正データ[DotFixVal]は、(53−24)/3=9.66≒10となる。
なお、「注目画素を含む所定領域内のスクリーンデータの合計値と該所定領域内のエッジ補正データの合計値との差」を「該所定領域内のドット補正データが適用される画素の数」で除算するのは、注目画素を中心とする3x3画素で濃度を保存するためである。本来、図23(a)の入力画像に対して、図23(c)のスクリーンデータは濃度が保存された状態である。しかし、図23(e)のエッジ補正データがエッジ部に付加されるので、濃度が上昇してしまう。画像合成処理後のエッジ部は、エッジ補正データとドット補正データから構成されるので、濃度保存されたスクリーンデータの結果からエッジ補正データを減算すればドット補正データを算出することが可能となる。なお、本実施例では、所定領域を3x3画素の領域としたが、5x5画素や7x7画素であっても構わない。
ステップ2210において、画像合成部2002は、注目画素について生成されたドット補正データを、出力画像データとしてプリンタ部103に出力する。
ステップ2211において、画像合成部2102は、スクリーン処理部305の出力結果であるスクリーンデータ[Sc] における注目画素の画素値を、出力画像データとしてプリンタ部103に出力する。
上記の処理が、入力画像データ内に未処理の画素がなくなるまで繰り返される。以上が、本実施例に係る画像合成処理の内容である。
なお、ドット移動データやドット補正データの生成の手法は、上述したものに限定されるわけではない。例えば、注目画素のガンマ補正後の画素値を入力値とし、各入力値に対応するドット移動データ及びドット補正データの値を出力値としたLUTを予め用意し、これを用いて、ドット移動データやドット補正データを生成してもよい。
<変形例>
小ポイントの文字などエッジが密集するオブジェクトの場合、上述した手法でドット移動データを生成してしまうと、エッジが密集する部分とその周囲にあるエッジが密集していない部分との間に濃度差が発生して、画像劣化の原因となる。そこで、上述の実施例2をベースとし、注目画素周囲のエッジ画素の数も考慮してドット移動データを生成する態様について、変形例として説明する。
実施例2とは、ステップ2206におけるドット移動データ生成処理の内容が異なるのみなので、以下では、本変形例におけるドット移動データ生成の手法についてのみ説明する。
ステップ2206において、画像合成部2002は、エッジドット画素のスクリーンデータの画素値からエッジ補正データにおける画素値を減算し、当該減算によって得られた値に所定のエッジ補正率を乗算して、ドット移動データを得る。ここで、エッジ補正率は、注目画素の所定の周辺領域(例えば、5×5画素の領域)内にあるエッジ画素の数によって決まる値であり、例えば一次元のLUT(補正率テーブル)により決定される。図24は、所定の周辺領域が5×5画素の領域の場合における補正率テーブルの特性の一例を示す図である。図24に示す特性を持つ補正率テーブルでは、例えば注目画素の周囲に7個のエッジ画素があった場合にはエッジ補正率は80%であり、エッジ画素の数が増えるほどエッジ補正率は小さくなることが分かる。すなわち、本変形例では、注目画素の周囲に多くのエッジがあるほど、生成されるドット移動データの値は小さくなる。これにより、エッジが密集する部分とその周囲との間に大きな濃度差が発生するのを抑えることができる。
図25は、本実施例(変形例を含む)におけるエッジ補正処理の結果の一例を示す図である。
図25(a)は、スクリーン処理部305に入力される画像データであり、縦6画素×横7画素の矩形のオブジェクト2501とそれより一回り小さい不整の形状のオブジェクト2502が近接した位置に存在している。オブジェクト2501とオブジェクト2502は同じ濃度である。
図25(b)は、エッジ情報の値が“1”のエッジ画素を斜線で示した図である。図25(b)において、破線の矩形2504は、画素2503を注目画素とした場合の周辺領域(5×5画素の領域)を示している。このときのエッジ画素の数は7個である。また、破線の矩形2506は、画素2505を注目画素とした場合の周辺領域(5×5画素の領域)を示している。このときのエッジ画素の数は15個である。
図25(c)は、スクリーン処理部305で生成されるスクリーンデータを示した図である。画素群2507は、網点に変換された画素群である。
図25(d)は、画像合成部2002に入力されるエッジ補正データを示す図であり、図25(b)において斜線で示されるエッジ画素における画素値となる。
図25(e)は、画像合成部2002に入力されるドット移動データを示す図である。
図25(f)は、実施例2を適用した場合のエッジ補正処理結果の一例を示す図である。画素2508はエッジを構成するエッジ画素であり、かつ、スクリーンドットが存在するので、画像合成処理によって画素2509にドットが付加されている。
図25(g)は、変形例を適用した場合のエッジ補正処理結果の一例を示す図である。画素2510はエッジを構成するエッジ画素であり、かつ、スクリーンドットである。実施例2ではドットが付加されることなる画素2511は、当該画素を注目画素としたときの周辺領域内のエッジ画素の数が15個であるため、エッジ補正率が0%となり(図24の補正率テーブルを参照)、その結果画素値が“0(白画素)”となっている。
図25(f)と図25(g)とを比較すると、オブジェクト2502全体の濃度が図25(f)の方が図25(g)に比べて濃くなっている。その結果、本来は同じ濃度で表現されるべき2つのオブクジェクト2501及び2502が、図25(f)の方では濃度差が大きくなってしまうが、図25(g)では画素2511が白画素なので濃度差が小さくなっている。
このように、エッジ画素の数に応じてドット移動データを生成することで、エッジが密集する場合においても、画像劣化を招くことがないエッジ補正処理を実現できる。
また、エッジ補正データやドット補正データについても、ドット移動データと同様、エッジ画素の数に応じた生成を行ってもよい。
以上述べたとおり、本実施例によれば、スクリーンドットをオブジェクトの内側に移動させることで、スクリーンドットの連続性をエッジ部付近まで保ちながら、エッジ部のジャギーを改善することができる。また、位相ずれスクリーン処理を行なわないのでそのための回路を保持する必要がなく、実施例1に比べて低コストで実現することができる。
(その他の実施例)
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。