図1は、本発明の実施形態の例である記録装置の構成を示すブロック図である。図1に示されるように、記録装置2は画像形成コントローラ101とプリンタエンジン118とを有する。
画像形成コントローラ101は、パーソナルコンピュータ等のホスト装置から印刷指示及び印刷用の画像データを受信し、受信した画像データをプリンタエンジン118で印刷可能な構成の二値画像データに変換して出力する。画像形成コントローラ101は、CPU102、画像処理部103、プリンタエンジンインタフェース104、通信インタフェース105、拡張バス回路106、RAMコントローラ107、及びROMコントローラ108を備える。これらのブロックはそれぞれバスライン110a〜110gを介してシステムバスブリッジ109に接続されている。この実施形態では、これらのブロックはシステムLSIとして一つのパッケージに封止されたASIC111として実現されている。また、画像形成コントローラ101は、機能拡張ユニットを装着する拡張スロット112とRAM115とROM117とを備える。
CPU102は、画像形成コントローラ101全体の制御を司る。CPU102は、ROM117に格納されている制御プログラムを読み出してRAM115にロードして実行し、ホスト装置から受信した画像データを二値画像データである画像形成データに変換するための画像処理部103を制御する。また、CPU102は、ホスト装置と通信するための通信インタフェース105の制御や通信プロトコルの解釈、画像処理部103で生成された画像形成データをプリンタエンジン118へ転送するためのプリンタエンジンインタフェース104の制御等を行う。
画像処理部103は、ホスト装置から受信した画像データをプリンタエンジン118で画像を印刷させる際の処理に用いられる1画素につき二値の画像データに変換する機能を備えている。なお、画像処理部103の詳細な構成については図を参照して後述する。
プリンタエンジンインタフェース104は、画像形成コントローラ101とプリンタエンジン118との間でデータの送受信を行う。プリンタエンジンインタフェース104はDMAC(ダイレクトメモリアクセスコントローラ)を有し、画像処理部103で生成されRAM115に格納された二値画像データをRAMコントローラ107を介して順次読出してプリンタエンジン118に転送する。
通信インタフェース105は、パーソナルコンピュータやワークステーション等のホスト装置との間でデータの送受信を行い、ホスト装置から受信した画像データを、RAMコントローラ107を介してRAM115に格納する。通信インタフェース105は有線通信プロトコルまたは無線通信プロトコルに対応する。
拡張バス回路106は、拡張スロット112に装着した機能拡張ユニットを制御する機能を備え、拡張バス113を介して機能拡張ユニットにデータを送信する制御と、機能拡張ユニットが出力するデータを受信する制御とを行う。拡張スロット112には、通信機能を提供する通信ユニット、大容量記憶機能を提供するハードディスクドライブユニット等が装着可能である。なお、画像処理部103、通信インタフェース105、および、拡張バス回路106は、プリンタエンジンインタフェース104と同様にDMACを有し、メモリアクセス要求を発行する機能を備えている。
RAMコントローラ107は、RAMバス114を介してASIC111に接続されたRAM115の制御を行う機能を備えている。RAMコントローラ107はCPU102とDMACを有する各ブロックとRAM115との間で、書き込みまたは読み出しされるデータの中継を行う。RAMコントローラ107は、CPU102および各ブロックからの読み出し要求や書き込み要求に応じて必要な制御信号を生成してRAM115への書き込みやRAM115からの読み出しを実現する。
ROMコントローラ108は、ROMバス116を介してASIC111に接続されたROM117の制御を行う機能を備えている。ROMコントローラ108は、CPU102からの読み出し要求に応じて必要な制御信号を生成し、予めROM117に格納されたプログラムやデータを読み出し、システムバスブリッジ109を介してCPU102に読み出した内容を送り返す。また、ROM117がフラッシュメモリ等の電気的に書き換え可能なデバイスで構成される場合、ROMコントローラ108は必要な制御信号を発生してROM117の内容を書き換える機能を備える。
システムバスブリッジ109は、ASIC111を構成する各ブロック間を接続する機能を備えるほか、複数のブロックから同時にアクセス要求が発行された場合に、バス権を調停する機能を備えている。CPU102とDMACを有する各ブロックとがRAMコントローラ107を介してRAM115へのアクセス要求をほぼ同時に発行する場合があり、システムバスブリッジ109は予め指定された優先順位に従って適切に調停を行う。
RAM115は同期DRAM等で構成され、CPU102が実行するプログラムの一時的な格納、画像処理部103で生成された画像形成データの一時的な記憶、および、CPU102のワークメモリなどの機能を提供する。RAM115は、通信インタフェース105がホスト装置から受信した画像データの一時的なバッファリングや拡張バス113を介して接続された機能拡張ユニットとの間で受け渡しされるデータの一時保存などの機能を提供する。
ROM117はフラッシュメモリ等で構成され、CPU102が実行するプログラムおよびプリンタ制御に必要なパラメータを格納する。フラッシュメモリは電気的に書換え可能な不揮発性のデバイスであり、決められたシーケンスに従うことによりプログラムやパラメータを書き換えることが可能である。
このほか、各回路ブロックは動作モード等を設定するレジスタを備え、CPU102はレジスタアクセスバスを介して各回路ブロックの動作モード等を設定することが可能である。
プリンタエンジン118は、画像形成コントローラ101から送出される二値画像データに基づいて記録ヘッドにより記録媒体上に画像を印刷させる印刷機構である。本実施形態では、プリンタエンジン118は、インクジェット記録を行うものである。即ち、二値画像データに従ってシアン(C)、マゼンタ(M)、イエロー(Y)、ブラック(K)の4色のインクを記録ヘッドから吐出させ記録媒体上に付与することによって画像を記録する。
次に、記録装置2の画像処理部103について、図面を参照して説明する。図2は、画像処理部103の詳細な構成を示す機能ブロック図である。
画像処理部103は、色変換処理部201、量子化処理部202、レジスタ204、画像データリード用のDMAC206、画像データライト用のDMAC207、誤差データリード用のDMAC208、及び誤差データライト用のDMAC203を備える。
色変換処理部201は、ホスト装置から受信したライン形式の1画素につき多値(M値)の入力画像データの色空間をプリンタエンジン118のインク色で表される色空間に変換する。本実施形態では、ホスト装置からの多値の画像データは、各画素が赤(R)、緑(G)、青(B)のそれぞれ8ビット(256値)で表現されるカラー画像データとする。色変換処理部201では、この入力画像データの各画素を、プリンタエンジン118のインク色であるC、M、Y、Kのそれぞれ8ビット(0〜255)で表現される色空間に変換する。また、色変換処理部201では、プリンタエンジン118の出力特性に応じたガンマ補正もあわせて行われる。
量子化処理部202は、各色成分について誤差拡散法による二値(N値)化処理を行う。量子化処理部202では、周辺画素から拡散される誤差を注目画素に加算し、誤差が加算された画素値を閾値と比較することで二値化処理、すなわち量子化処理を行う。誤差が加算された後の画素値が閾値を越えた場合は1(ドットがオンされることを示す)となり、閾値を越えない場合はゼロ(ドットがオフされることを示す)となる。このとき発生する量子化誤差(0又は255との差分)は周辺の未処理の画素へ拡散され、全体として画像データの濃度が保存される。誤差データはDMAC203に送られ、誤差メモリに格納され、DMAC208を介して量子化処理部202に転送する。
レジスタ204は、画像処理の開始を指示する画像処理起動レジスタや実行する画像処理の内容およびパラメータを指定するコマンド・パラメータレジスタ等を備えたレジスタ群から構成される。また、レジスタ204は、量子化用の閾値に関するパラメータを設定するレジスタを有している。
DMAC206は、RAM115に格納された入力画像データを読み出すためのDMACである。また、DMAC207は、入力画像データに対して量子化処理を行って生成された二値画像データをRAM115に格納するためのDMACである。
DMAC208は、隣接ラインから拡散される誤差データを誤差メモリから読み出すためのDMACである。また、DMAC203は、隣接ラインに拡散する誤差データを誤差メモリに格納するためのDMACである。なお、この実施形態では、誤差メモリはRAM115の一部として構成される。
以下、本実施形態に係る記録装置の動作を説明する。図3は記録装置が画像データを量子化処理する場合の画像処理部の動作手順を示すフローチャートである。画像処理部103は量子化処理の実行を指示されると図3に示すフローチャートに従った画像処理動作を実行し、量子化処理を行う。
ステップ602で画像処理部103は、注目画素の画像データを、DMAC206を介してRAM115から読み出す。
次に、ステップ603で画像処理部103は、注目画素を色変換処理部201によりインク色で表現される画像データに変換する。
さらに、ステップ604で画像処理部103は、注目画素の画像データを量子化処理部202においてC、M、Y、Kの色成分毎に誤差拡散法により量子化する。なお、このステップの量子化処理部に係る処理の詳細は図を参照しつつ後述する。
ステップ605で画像処理部103は、1ラインの画像処理が終了したか否かを判定し、未処理の画素が残っている場合、処理はステップ601へ戻り、1ラインの全ての画素の処理が終了している場合は処理を終了する。
以下、図4〜12を用いて、画像処理部103における量子化処理部202の動作を詳細に説明する。
図4に示すように、量子化処理部202は、入力制御部900と、第1の誤差拡散部(ED1)910と、第2の誤差拡散部(ED2)920と、出力制御部930と、を備える。詳細は後述するが、第1の誤差拡散部910と第2の誤差拡散部920は、並列に動作する。
入力制御部900は、色変換処理部201から出力された注目画素の画像データに、前ラインから拡散される誤差データを読み出して加算し、入力データを各誤差拡散部に送信する。なお、前ラインから拡散される誤差データは、RAM115に格納されている。
第1の誤差拡散部910は、入力画像データ及び前ラインからの誤差データが入力されると、これに同一ラインの処理済みの画素の誤差データを加算して、これをそれぞれの色成分毎に閾値と比較して量子化を行い、量子化データ及び誤差データを出力する。一方、第2の誤差拡散部920は、入力画像データ及び前ラインからの誤差データが入力されると、これをそれぞれの色成分毎に閾値と比較して量子化を行い、量子化データ及び誤差データを出力する。
そして、出力制御部930は、第1の誤差拡散部910から出力された量子化データ及び誤差データをDMAC207によってRAM115に格納する。また、出力制御部930は、後述する判定フラグに応じて、第2の誤差拡散部920から出力された量子化データ及び誤差データをRAM115に格納するか否かを制御する。
なお、画像処理部103は、CPU102からレジスタ204への書き込みにより画像処理開始を指示されると、RAM115に格納された画像データを一方端の画素から他方端の画素まで順次読み出し、上述した色変換処理及び量子化処理を行う。ライン処理が終了すると画像処理部103はCPU102に対して割り込みを発行して処理の完了を通知する。CPU102からの指示により副走査方向に隣接する画素列について同様に処理を行うことで画像データ全体の二値化処理が実現できる。二値化された出力画像データは順次RAM115に格納される。これを、プリンタエンジンインタフェース104を介してプリンタエンジン118へ送出することで記録媒体への記録が行われる。
ここで、本実施形態の第1の誤差拡散部910の誤差拡散方法及び第2の誤差拡散部920の誤差拡散方法について説明する。図5は、本実施形態の第1の誤差拡散部910の誤差拡散方法及び第2の誤差拡散部920の誤差拡散方法を説明する図である。本実施形態では、Floyd&Steinberg型の誤差拡散法を適用した。
図5(a)において、「P」で示される画素が注目画素である。量子化処理によって発生する量子化誤差は、図5(a)に示す拡散係数にしたがって、未処理の周辺画素に拡散される。このうち、図5(a)に「A」で示す同一ラインへ拡散される誤差データは量子化処理部202内の誤差拡散部のバッファに保存する。また、図5に「B」、「C」および「D」で示す隣接ラインへ拡散される誤差データは量子化処理部202内の誤差拡散部のバッファにいったん記憶され、同一画素へ拡散する誤差データをすべて足し合わせる。合算された誤差データは、出力制御部930に送信され誤差データライトDMAC203を介してRAM115に格納される。
図5(b)は、誤差値を拡散する画素から見た誤差データの拡散の様子を模式的に示す図であり、図5(c)は、誤差データを拡散される画素から見た誤差データの拡散の様子を模式的に示す図である。図5(b)及び(c)において、縦方向の座標をk、横方向の座標をmとし、注目画素Pの座標を(k,m)とし、注目画像Pから周囲に拡散される誤差値をE(k,m)とする。
図5(b)に示すように、Floyd&Steinberg型では、同一ラインの画像、すなわち、座標(k,m+1)の画像211に対して、注目画素P200からE(k,m)×αが分散される。また、座標(k+1,m+1)の画像214に対しては注目画素P200からE(k,m)×βが分散される。同様に、座標(k+1,m)の画像213に対しては注目画素P200からE(k,m)×γ、座標(k+1,m−1)の画像212に対しては注目画素P200からE(k,m)×δが分散される。これにより、(k,m+1)の画像データは、もともとの画像データに対して、E(k,m)×αが加算された値になる。同様に、(k+1,m−1)の画像データ、(k+1,m)の画像データ、(k+1,m+1)の画像データはそれぞれ、もともとの画像データに対して所定の誤差データが加算された値になる。同様の処理を順次、対象画素に対して行う。なお、誤差データの拡散係数の割合の総和(α+β+γ+δ)が1となるようにして、画像全体の濃度を保つようにする。本実施形態では、α=7/16、β=1/16、γ=5/16、δ=3/16である。すなわち、同一ラインの座標(k,m+1)の画素211には誤差値E(k,m)に7/16を乗じた値を加算する。隣接ラインの座標(k+1,m+1)の画素214には誤差値に1/16を乗じた誤差データを加算する。また、座標(k+1,m)の画像213には誤差値に5/16を乗じた誤差データ、座標(k+1,m−1)の画像212には誤差値に3/16を乗じた誤差データを、それぞれ加算する。
一方、図5(c)に示すように、注目画素P200へ拡散される誤差は、次の4つの誤差データを合算したものとなる。具体的には、座標(k−1,m−1)の画像201からの誤差データE(k−1,m−1)×βと、座標(k−1,m)の画像202からの誤差データ×γと、座標(k−1,m+1)の画像203からの誤差データδと、座標(k,m−1)の画像204からの誤差データαとが加算される。
ここで、図6及び図7を用いて、第1の誤差拡散部910の第1の量子化演算部911及び第2の誤差拡散部920の第2の量子化演算部921における量子化データ及び誤差データの算出方法についてそれぞれ詳細に説明する。なお、図6及び図7では、各ラインの第1番目の画像及び第2番目の画像を処理する場合について説明する。本実施形態の入力画像データは、8bitデータで0〜255の値をとり、出力を2値データとし、閾値を128とした。
図6は、第1の誤差拡散部910の第1の量子化演算部911の演算方法を説明する図である。第1の量子化演算部911では、入力画像データ、前ラインからの誤差データ、及び同一ラインからの誤差データの合計値(以下、「S1」ともいう)を演算する。また、S1と閾値(本実施形態では、128)とを比較して、量子化データを求めると共に、S1と閾値との差から第1の誤差値E(k,m)を算出する。
図6において、座標(k,m)の画素のS1は、入力画像データA(k,m)と、前ラインからの誤差データ[E(k−1,m−1)×β+E(k−1,m)×γ+E(k−1,m+1)×δ]と、左画素からの誤差データ[E(k,m−1)×α]が加算されたものである。
図6(a)に示すように、「S1≧閾値」の場合は、量子化データ=1とする。また、第1の誤差値E(k,m)=S1−255を演算する。
図6(b)に示すように、「S1<閾値」の場合は、量子化データ=0とする。また、第1の誤差値E(k、m)=S1とする。
図7は、第2の誤差拡散部920の第2の量子化演算部921の演算方法を説明する図である。第2の誤差拡散部920の第2の量子化演算部921では、入力画像データと、第1注目画素以外の画素から拡散される誤差データの合計値(以下、「S2」ともいう)を演算する。なお、本実施形態では、図5(a)に示すFloyd&Steinberg型の誤差拡散法を適用しているので、「第1注目画素以外の画素から拡散される誤差データ」は、前ライン(上ライン)からの誤差データのみとなる。第2の誤差拡散部920は、第1の誤差拡散部910が処理する画像の次の画素の処理を行う。すなわち、第2の量子化演算部921は、座標(k,m+1)の画素の演算を行う。
座標(k,m+1)の画素のS2は、入力画像データA(k,m+1)と、前ラインの誤差データ[E(k−1,m)×β+E(k−1,m+1)×γ+E(k−1,m+2)×δ]と、を加算したものである。このS2は、第1注目画素の誤差データ、すなわち、左画素の誤差データを加算する前の値である。
第2の量子化演算部921では、第1注目画素の誤差データが加算される前の合計値であるS2から、量子化データが確定するか否かを判定した判定フラグを算出する。具体的には、合計値S2が第1の基準値以下か否か及びこの第1の基準値より大きい第2の基準値以上か否かに基づいて、量子化データが確定するか否かを判定する。
本実施形態では、S2と、閾値及び同一ライン上の第1注目画素からの誤差データが取り得る値の最大値の和と、閾値及び同一ライン上の第1注目画素からの誤差データが取り得る値の最小値の和と、を比較し、判定フラグを決定する。すなわち、上記の第1の基準値は、第2の誤差拡散部920において設定される閾値及び同一ライン上の第1注目画素からの誤差データの取り得る値の最大値から求められる。また、上記の第2の基準値は、第2の誤差拡散部920において設定される閾値及び同一ラインからの誤差データの取り得る値の最小値から求められる。なお、量子化データが確定する場合は1、量子化データが確定しない場合は0と判定する。
本実施形態では、8bitデータで閾値が128である。したがって、左画素から拡散される誤差データ(E(k,m)×α)の最大値(以下、「Tmax」ともいう)は、128×(7/16)=56である。また、左画素から拡散される誤差データ(E(k,m)×α)の最小値(以下、「Tmin」ともいう)は、−128×(7/16)=−56である。
S2+Tmax≧閾値である場合、すなわち、S2≧184である場合は、左画素の誤差データが加算される前からドットがONと確定している。したがって、量子化データ=1とし、判定フラグ=1とする。すなわち、前の処理と並列処理が可能と判断する。また、第2の誤差値E(k,m+1)=S2−255を演算する。
S2+Tmin≦閾値である場合、すなわち、S2≦72である場合は、左画素の誤差データが加算される前からドットがOFFと確定している。したがって、量子化データ=0とし、判定フラグ=1とする。また、第2の誤差値E(k,m+1)=S2とする。
一方、S2+Tmin<閾値、且つ、S2+Tmax>閾値の場合、すなわち、72<S2<184の場合は、左画素から拡散される誤差データの値によってドットのON/OFFが確定する。言い換えれば、左画素から拡散される誤差データの値を加算しないと量子化データは確定しない。したがって、判定フラグ=0とする。すなわち、前の処理と並列処理が不可能と判断する。
このように、第2の量子化演算部921は、左画素の誤差データが加算される前の合計値が、閾値と同一ラインからの誤差データの取り得る値の最小値との和以上である場合は、量子化データ=1とし、判定フラグ=1とすると共に第2の誤差値を算出する。また、左画素の誤差データが加算される前の合計値が、閾値と同一ラインからの誤差データの取り得る値の最大値との和以下である場合は、量子化データ=0とし、判定フラグ=1とすると共に第2の誤差値を算出する。一方、左画素の誤差データが加算される前の合計値が、閾値と同一ラインからの誤差データの取り得る値の最大値の和より大きく且つ閾値と同一ラインからの誤差データの取り得る値の最小値との和未満である場合は、量子化データが確定できず、判定フラグ=0とする。
なお、判定フラグは、レジスタ204に保存する。
図8は、誤差拡散処理の判定フラグの結果毎のタイミングチャートを示す図である。
図8(a)及び(b)は、いずれも、上から順に、クロック(以下、「CLK」ともいう)、後述する第1の誤差拡散部(以下、「ED1」ともいう)の処理画素の座標、第2の誤差拡散部(以下、「ED2」ともいう)の処理画素の座標、判定フラグである。
図8(a)は、第2の量子化演算部921における誤差拡散処理で量子化データが確定し、判定フラグ=1となる場合のタイミングチャートである。図8(a)に示すように、クロック1で、ED1では座標(k,m)の画素の誤差拡散処理を行う。また、これと並行してED2では座標(k,m+1)の画素の誤差拡散処理を行う。このとき、ED1では図6で示した誤差拡散処理を行い、ED2では図7で示した誤差拡散処理を行う。
そして、ED2において判定フラグ=1と判定されると、次のクロック2では、ED1は、座標(k,m+2)の画素の誤差拡散処理を行い、これと並行してED2は、座標(k,m+3)の画素の誤差拡散処理を行う。
図8(b)は、第2の量子化演算部921における誤差拡散処理で量子化データが確定せず、判定フラグ=0となる場合のタイミングチャートである。図8(b)に示すように、クロック1では、図8(a)と同様に、ED1は座標(k,m)の画素の誤差拡散処理を行い、これと並行してED2は座標(k,m+1)の画素の誤差拡散処理を行う。
そして、ED2において判定フラグ=0と判定された場合、座標(k,m+1)の画素の量子化データを確定できなかったので、次のクロック2では、ED1は、座標(k,m+1)の画素の誤差拡散処理を行う。また、これと並行して、ED2は、座標(k,m+1)の次の画素、すなわち、(k,m+2)の画素の誤差拡散処理を行う。なお、クロック1において、座標(k,m)の画素の誤差拡散処理は確定している、すなわち、座標(k,m)の画素は誤差データが確定している。
図9を用いて、ED1及びED2の誤差拡散処理についてさらに説明する。図9において、数字は画素番号を示す。図9(a)は、画像データの処理順序を説明する図であり、図9(b)は、誤差拡散処理のタイミングチャートの一例を示す図である。なお、図9(b)は、上から順に、CLK、処理中信号(以下、「ACT」ともいう)、ED1の処理対象の画素番号、ED2の処理対象の画素番号、判定フラグを示す。
図9(a)に示すように、画像データの誤差拡散処理は、ライン毎に所定方向に処理が実行される。
図9(b)に示すように、クロック1でACT信号がアサートし、ED1では画素1の誤差拡散処理を行い、ED2では画素1の次の画素である画素2の誤差拡散処理を行う。
次に、クロック1においてED2の判定フラグ=1であったとすると、画素2までの誤差拡散処理が終わっているので、次のクロック2では、ED1は画素3の誤差拡散処理を行い、ED2は画素3の次の画素4の誤差拡散処理を行う。
次いで、クロック2においてED2の判定フラグ=0であったとすると、画素4の量子化データが確定できていないので、次のクロック3では、ED1は再び画素4の誤差拡散処理を行い、ED2は画素4の次の画素である画素5の誤差拡散処理を行う。同様の処理を順次続けていく。
図9(b)では、判定フラグ=1に3回なっていることにより、7クロックで10画素の誤差拡散処理ができる。10画素の誤差拡散処理をするためには、従来の方法によれば、10クロック必要であったが、本実施形態によれば、10クロックよりも判定フラグ=1になった回数分少ないクロック数で10画素の誤差拡散処理をすることができる。
これにより、誤差拡散法による効果を損なうことなく、言い換えれば通常の誤差拡散法と同様の画質を維持しつつ、誤差拡散処理を高速化することができる。
ここで、図10を用いて、実施形態1に係る誤差データ加算方法について説明する。図10は、実施形態1に係る誤差データ加算方法の説明図である。なお、図10において、次のクロックの第1の誤差拡散処理部の注目画像は、座標(k,m)の画像である。
図10(a)は、前のクロックで、第2の量子化演算部921において量子化データが確定した場合、すなわち、判定フラグ=1の場合の誤差データの拡散の様子を示す図である。この場合、前のクロックで、座標(k,m)の注目画素の1画素前の画素(座標(k,m−1))の第1の誤差値E(k,m−1)、及び注目画素の2画素前の画素(座標(k,m−2))の第2の誤差値E(k,m−2)が前のクロックで同時に確定している。
したがって、同一ラインからの誤差データは、注目画素の2画素前の画素の誤差データと、注目画素の1画素前の画素の誤差データとを加算したものとなる。本実施形態では、同一ラインからの誤差データは、座標(k,m−2)の画素の誤差値E(k,m−2)に拡散係数αを2回乗算した値と、座標(k,m−1)の画素の誤差値E(k,m−1)に拡散係数αを1回乗算した値と、を加算した値となる。すなわち、このクロックでは、第1の量子化演算部911には、入力画像データA(k,m)と、前ラインの誤差データと、座標(k,m−2)の画素の誤差値E(k,m−2)に拡散係数αを2回乗算した値と、座標(k,m−1)の画素の誤差値E(k,m−1)に拡散係数αを1回乗算した値と、の合計値を加算する。
また、次のラインに拡散する誤差データに関しては次の演算を行う。
座標(k−1,m−2)の画素に関しては、図示しないが、座標(k,m−2)の画素から拡散する誤差データとして誤差値E(k,m−2)に拡散係数γを乗算した値を加算する(後述する第1の誤差データ933に相当する)。さらに、座標(k,m−1)の画素から拡散する誤差データとして誤差値E(k,m−2)に拡散係数αとδを乗算した値を加算し、誤差データE(k,m−1)に係数δを乗算した値を加算する(後述する第2の誤差データ935に相当する)。
座標(k−1,m−1)の画素に関しては、図示しないが、座標(k,m−2)の画素から拡散する誤差データとして誤差値E(k,m−2)にβを乗算した値を加算する(後述する第1の誤差データ933に相当する)。さらに、座標(k,m−1)の画素が拡散する誤差データとして誤差値E(k,m−2)に係数αとγを乗算した値を加算し、誤差値E(k,m−1)に係数γを乗算した値を加算する(後述する第2の誤差データ935に相当する)。
座標(k−1,m)の画素に関しては、座標(k,m−1)の画素から拡散する誤差データとして誤差値E(k,m−2)に係数αとβを乗算した値を加算し、誤差値E(k,m−1)に対して係数βを乗算した値を加算する(後述する第2の誤差データ935に相当する)。
また、図10(b)は、前のクロックで、第2の量子化演算部921において量子化データが確定しなかった場合、すなわち、判定フラグ=0の場合の誤差データの拡散の様子を示す図である。この場合、前のクロックで座標(k,m)の注目画素は、すでに第2の量子化演算部921が演算処理をしているが、このクロックで、ED1により再度、座標(k,m)の画素の誤差拡散処理を行う。
したがって、同一ラインからの誤差データは、注目画素の1画素前の画素の誤差データのみとなる。すなわち、座標(k,m)の画素の1画素前の画素(座標(k,m−1))の誤差値E(k,m−1)に係数αを乗算した値を加算する。
下のラインの誤差データに関しては次の演算を行う。
座標(k−1,m−2)の画素に関しては、誤差値E(k,m−1)に対して拡散係数δを乗算した値を加算する(後述する第1の誤差データ933に相当する)。
座標(k−1,m−1)の画素に関しては、誤差値E(k,m−1)に対して拡散係数γを乗算した値を加算する(後述する第1の誤差データ933に相当する)。
座標(k−1,m)の画素に関しては、誤差値E(k,m−1)に対して拡散係数βを乗算した値を加算する(後述する第1の誤差データ933に相当する)。
図4に戻って、画像処理部103の量子化処理部202の構成を詳細に説明する。図4は、量子化処理部202の詳細なブロック図である。
図4に示すように、量子化処理部は、入力制御部900と、第1の誤差拡散部910と、第2の誤差拡散部920と、出力制御部930とを備える。このように、図4に示す実施形態1に係る記録装置は、誤差拡散部を2つ備えており、この2つの誤差拡散部が並列に動作する。なお、本図においては第1の誤差拡散部910の処理する第1注目画素を座標(k,m)の画素、第2の誤差拡散部920の処理する第2注目画素を座標(k,m+1)の画素とする。
入力制御部900は、入力データ制御部901と、第1の加算部902と、第2の加算部903とを備えている。
第1の加算部902は、第1の入力画像データA(k,m)と、前ラインからの誤差データとの加算を行う。第1の入力画像データは、RAMからDMAC206及び色変換処理部201を介して入力される。また、前ラインからの誤差データは、誤差メモリからDMAC208を介して入力されるものであり、前ラインからの誤差データ[E(k−1,m−1)×β+E(k−1,m)×γ+E(k−1,m+1)×δ)]である。第1の入力画像データと前ラインからの誤差データとを加算することにより第1の入力データを算出して、第1の誤差拡散部(ED1)910に送信する。
また、第2の加算部903は、第2の入力画像データA(k,m+1)と、前ラインからの誤差データとの加算を行う。第2の加算部903は、上述した第1の加算部902の動作と同時に動作する。第2の入力画像データは、RAMからDMAC206及び色変換処理部201を介して入力される。また、前ラインからの誤差データは、誤差メモリからDMAC208を介して入力されるものであり、前ラインからの誤差データ[E(k−1,m)×β+E(k−1,m+1)×γ+E(k−1,m+2)×δ)]である。第2の入力画像データ904と前ラインからの誤差データとを加算することにより第2の入力データを算出して、第2の誤差拡散部(ED2)920に送信する。
第1の誤差拡散部910は、量子化を行う第1の量子化演算部911と、第1の係数乗算部912とを備えている。さらに、第1の係数乗算部912から算出された誤差データ(E(k,m)×α)に拡散係数αを乗算する乗算部913と、拡散係数β、γ、δをそれぞれ乗算する乗算部914と、誤差データのセレクタ915と、加算部916,917とを備えている。
加算部916は、加算部902から受信した第一の入力データと、セレクタ915で選択した同一ラインの画素からの誤差データを加算し、これを第1の量子化演算部911に送信する。このとき、セレクタ915は、判定フラグ=0の場合は、誤差データE1(k,m−1)×αを選択し、判定フラグ=1の場合は、誤差データE1(k,m−2)×(αの2乗)と誤差データE2(k,m−1)×αを加算した値を選択する。
第1の量子化演算部911は、レジスタ204に格納された閾値をもとに、入力された値を二値に量子化すると共に誤差値E(k,m)を算出する。第1の量子化演算部911の演算方法については、図6を用いて説明した通りである。第1の量子化演算部911により量子化した結果は、第1の量子化データa(k,m)932として出力制御部930に送信する。一方、第1の量子化演算部911で算出した誤差値E(k,m)は、第1の係数乗算部912に送信する。
第1の係数乗算部912では、誤差値に対して振り撒く画素ごとに、図5で示したように係数を乗算する。第1の係数乗算部912において、誤差値E(k,m)に拡散係数αを乗じた値は、同一ラインの次の画素に拡散するため誤差データとしてセレクタ915に送信する。誤差値E(k,m)に拡散係数αを乗じた値は、さらに、乗算部913及び乗算部914にそれぞれ送信される。一方、第1の係数乗算部912において、誤差値E(k,m)に係数β、γ、δをそれぞれ乗じた値は、次のラインに拡散するため、第1の誤差データ933として出力制御部930に送信する。
乗算部913は、誤差データE(k,m)×αに係数αを乗じて、その結果を加算部917に送信する。加算部917は、誤差データE(k,m)×(αの二乗)と、後述する第2の誤差拡散部920から送信される誤差データE(k,m+1)×αとを加算し、結果をセレクタ915に送信する。
乗算部914は、誤差データE(k,m)×αに係数β、γ、δをそれぞれ乗じて、結果を第2の誤差拡散部920の加算部923に送信する。
一方、第2の誤差拡散部920は、量子化を行う第2の量子化演算部921と、第2の係数乗算部922と、加算部923とを備えている。
そして、第2の量子化演算部921は、レジスタ204に格納された閾値と、S2と閾値及び同一ラインからの誤差データが取り得る値の最大値の和と、閾値及び同一ラインからの誤差データが取り得る値の最小値の和と、に基づいて判定フラグの決定をする。判定フラグの結果は、入力データ制御部901、セレクタ915、出力制御部931にそれぞれ送信される。
第2の量子化演算部921は、第2の入力データを二値に量子化すると共に誤差値E(k,m+1)を算出する。第2の量子化演算部921の演算方法については、図7で説明した通りである。第2の量子化演算部921により量子化した結果は、第2の量子化データa(k,m+1)934として出力制御部930に送信する。一方、第2の量子化演算部921で算出した誤差値は、第2の係数乗算部922に送信する。
第2の係数乗算部922では、誤差値に対して振り撒く画素ごとに係数を乗算する。第2の係数乗算部922において、誤差値E(k,m+1)に係数αを乗じた値は、同一ラインの次の画素に拡散するため誤差データとしてセレクタ915に送信する。一方、係数乗算部922において、誤差値E(k,m+1)に係数β、γ、δをそれぞれ乗じた値は、加算部923に送信する。
加算部923は、第2の係数演算部922から送信される誤差データ[E(k,m+1)に係数β、γ、δをそれぞれ乗じた値]と、第1の誤差拡散部910から送信される誤差データ[E(k,m)に係数β、γ、δをそれぞれ乗じた値]とを加算する。加算した結果は、次のラインに拡散するため、第2の誤差データ935として出力部930に送信する。
出力データ制御部931は、判定フラグ=0の場合は、第2の量子化データ934及び第2の誤差データ935を使用せず、第1の量子化データ932をRAM115に保存すると共に第1の誤差データ933を誤差メモリに保存するように制御する。判定フラグ=1の場合は、第1の量子化データ932及び第2の量子化データ934をRAM115に保存すると共に、第1の誤差データ933及び第2の誤差データ935を誤差メモリに保存するように制御する。
出力制御部930は、誤差データを次のラインへ分配するために、誤差の累積値を保持するレジスタを備えている。このレジスタは、図5に示すように、1つの注目画素から次のラインの3画素に分配するので、各画素位置に累積される誤差データを保持するメモリ領域を備えている。1つの画素位置について累積がなされる(誤差データ「B」、「C」、「D」の加算が完了する)と、その誤差値を誤差メモリへ出力する。
図11を用いて、入力制御部900の処理手順を詳細に説明する。図11は、入力制御部900の処理フローを示す図である。画素の番号をkとして、最終画素をNとする。
データを受信して入力データ制御をスタートし、ステップ1001においてkに初期値=1を代入する。
次に、ステップ1002において、k=N(最終画素)かどうか判断する。
k=Nでない場合は、ステップ1003に進み、ED1に第一の入力データ[k]を送信し、ED2に第二の入力データ[k+1]を送信する。
ステップ1004において、判定フラグ=1か否かを判定する。判定フラグ=0の場合は、ステップ1005に進み、k=k+1として、ステップ1002に戻って、ED2の処理したk+1の画像の処理をED1で再び行う。判定フラグ=1の場合は、ステップ1006に進み、k=N−1か否かを判断する。k=N−1の場合は、ステップ1003においてED2において最終画素が処理されているので、処理を終了する。k=N−1でない場合は、ステップ1007においてk=k+2として、ステップ1002に戻る。
ステップ1002において、k=Nであった場合はステップ1008に進み、ED1に第一の入力データ[k=N]を送信する。その後、処理を終了する。
図12を用いて、出力制御部930の処理手順を詳細に説明する。図12は、出力制御部930の処理フローを示す図である。ここでも画素の番号をkとして、最終画素をNとする。
データを受信して出力データ制御をスタートし、ステップ1101においてkに初期値=1を代入する。
次に、ステップ1102において、判定フラグ=1か否かを判断する。
判定フラグ=1の場合は、ステップ1103に進み、第一の量子化データ及び第一の誤差データをメモリに出力する。さらに、ステップ1104において、第二の量子化データ及び第二の誤差データをメモリに出力する。そして、ステップ1105に進み、k=k+2として、ステップ1108に進む。
一方、判定フラグ=0である場合は、ステップ1106において、第一の量子化データ及び第一の誤差データをメモリに出力する。そして、ステップ1107に進み、k=k+1として、ステップ1108に進む。すなわち、第二の量子化データ及び第2の誤差データはメモリに出力しない。
ステップ1108では、最終画素Nの処理が完了したか判断する。最終画素Nが完了していない場合は、ステップ1102に戻り処理を繰り返し、最終画素Nの処理が完了した場合は処理を終了する。
本実施形態では、上述したように、第1の誤差拡散部910と第2に誤差拡散部920を並行して動作させる。そして、第2の量子化演算部921の判定フラグ=1の場合は、第2の誤差拡散部920は、同一ラインの誤差データを加算せずに誤差拡散処理を進めることができる。すなわち、第2の量子化演算部921の判定フラグ=1の場合は、同一ラインの誤差データを待つ必要がない。そして、次のクロックでは、第1の誤差拡散部910は、第2の量子化演算部921が処理を行った画素の次の画素の誤差拡散処理を行うことができる。したがって、第2の量子化演算部921の判定フラグ=1と判定された数の分だけ誤差拡散処理を高速化することができる。
これにより、誤差拡散法による効果を損なわずに、通常の誤差拡散処理と比較して高速に処理を行うことができる。
(実施形態2)
本実施形態は、画像処理部103の量子化処理部202以外の構成は、実施形態1と同様であるので、重複する説明は省略する。図13は、実施形態2に係る量子化処理部202の構成を示すブロック図である。
図13に示すように、量子化処理部は、入力制御部1200と、第1の誤差拡散部1210と、第2の誤差拡散部1220と、第3の誤差拡散部(以下、ED3ともいう)1230と、出力制御部1240とを備える。このように、図13に示す実施形態2に係る記録装置は、誤差拡散部を3つ備えており、この3つの誤差拡散部が並列に動作する。以下、ED1の処理する第1注目画素を座標(k,m)の画素、ED2の処理する第2注目画素を座標(k,m+1)画素、ED3の処理する第3注目画素を座標(k,m+2)の画素として説明する。
入力制御部1200は、入力データ制御部1201と、第1の加算部1202と、第2の加算部1203と、第3の加算部1204とを備えている。
第1の加算部1202は、実施形態1の第1の加算部902に対応するものであるため簡単に説明する。第1の加算部1202は、入力画像データA(k,m)と、前ラインからの誤差データとの加算を行う。入力画像データと前ラインからの誤差データとを加算することにより第1の入力データを算出して、第1の誤差拡散部(ED1)1210に送信する。
第2の加算部1203は、実施形態1の第2の加算部903に対応するものであるため簡単に説明する。第2の加算部1203は、入力画像データA(k,m+1)と、前ラインからの誤差データとの加算を行う。第2の入力画像データと前ラインからの誤差データとを加算することにより第2の入力データを算出して、第2の誤差拡散部(ED2)1220に送信する。
第3の加算部1204は、入力画像データA(k,m+2)と、前ラインからの誤差データとの加算を行う。第3の加算部1204の処理は、第1の加算部1202と第2の加算部1203と並行して行う。入力画像データA(k,m+2)は、RAMからDMAC206及び色変換処理部201を介して入力される。また、前ラインからの誤差データは、誤差メモリからDMAC208を介して入力されるものであり、E(k−1,m+1)×β+E(k−1,m+2)×γ+E(k−1,m+3)×δ)である。入力画像データと前ラインからの誤差データとを加算することにより第3の入力データを算出して、第3の誤差拡散部(ED3)1230に送信する。
第1の誤差拡散部1210は、量子化を行う第1の量子化演算部1211と、第1の係数乗算部1212と、セレクタ1217と、加算部1218、12191、12192とを備えている。また、係数乗算部1212から算出された誤差データE(k,m)×αに係数αを乗算する乗算部1213と、誤差データE(k,m)×αにαの2乗を乗算する乗算部1215と、を備える。さらに、誤差データE(k,m)×αに係数β、γ、δをそれぞれ乗算する乗算部1214と、誤差データE(k,m)×αに係数αβ、αγ、αδをそれぞれ乗算する乗算部1216と、を備える。
加算部1218は、第1の加算部1202から受信した第一の入力データと、セレクタ1217で選択した前の画素の誤差データを加算し、これを第1の量子化演算部1211に送信する。セレクタ1217は、第1の判定フラグ=0の場合は、誤差データE(k,m−1)×αを選択する。第1の判定フラグ=1で且つ第2の判定フラグ=0の場合は、誤差データE(k,m−2)×(αの2乗)と誤差データE(k,m−1)×αを加算した値を選択する。第1の判定フラグ=1で且つ第2の判定フラグ=1の場合は、誤差データ(k,m−3)×(αの3乗)と誤差データE(k,m−2)×(αの二乗)と、誤差データE(k,m−1)×αとを加算した値を選択する。なお、第1の判定フラグ及び第2の判定フラグについては後述する。
第1の量子化演算部1211は、レジスタ204に格納された閾値をもとに加算部1218により入力される値を二値に量子化すると共に誤差値を算出する。第1の量子化演算部1211の演算方法については、図6を用いて説明した通りである。第1の量子化演算部1211により量子化した結果は、第1の量子化データa(k,m)1242として出力制御部1240に送信する。一方、第1の量子化演算部1211で算出した誤差値は、第1の係数乗算部1212に送信する。
第1の係数乗算部1212では、誤差値に対して振り撒く画素ごとに、係数を乗算する。第1の係数乗算部1212において、誤差値E(k,m)に係数αを乗じた値は、同一ラインの次の画素に拡散するため誤差データとしてセレクタ1217に送信する。また、誤差値E(k,m)に係数αを乗じた値は、乗算部1213、乗算部1214、乗算部1215、及び乗算部1216にそれぞれ送信される。一方、係数乗算部1212において、誤差値E(k,m)に係数β、γ、δをそれぞれ乗じた値は、次のラインに拡散するため、第1の誤差データ1243として出力制御部1240に送信する。
誤差値E(k,m)に係数αを乗じた値は、乗算部1213において係数αを乗じて、加算部1219に送信する。加算部12191では、誤差データE(k,m)×(αの二乗)と、第2の誤差拡散部1220から送信される誤差データE(k,m+1)×αとが加算され、結果はセレクタ1217に送信される。
また、誤差値E(k,m)に係数αを乗じた値は、乗算部1215において(αの2乗)を乗じて、加算部12192に送信する。加算部12192では、誤差データE(k,m)×(αの三乗)と、第2の誤差拡散部1220から送信される誤差データE(k,m+1)×(αの二乗)と、第3の誤差拡散部1230から送信される誤差データE(k,m+2)×(αの三乗)とが加算される。加算された結果はセレクタ1217に送信される。
第2の誤差拡散部1220は、量子化を行う第2の量子化演算部1221と、第2の係数乗算部1222と、乗算部1223と、乗算部1224と、加算部1225と、を備えている。
そして、第2の量子化演算部1221は、レジスタ204に格納された閾値と、S2と閾値及び同一ラインからの誤差データが取り得る値の最大値の和と、閾値及び同一ラインからの誤差データが取り得る値の最小値の和と、をもとに第1の判定フラグの決定をする。第1の判定フラグの結果は、入力データ制御部1201、セレクタ1217、出力データ制御部1241にそれぞれ送信される。
第2の量子化演算部1221は、第2の入力データを二値に量子化すると共に第2の誤差値E(k,m+1)を算出する。第2の量子化演算部1221の演算方法については、実施形態1の第2の量子化演算部921と同様である。第2の量子化演算部1221により量子化した結果は、第2の量子化データa(k,m+1)1241として出力制御部1240に送信する。一方、第2の量子化演算部1221で算出した誤差値は、第2の係数乗算部1222に送信する。
第2の係数乗算部1222では、誤差値に対して振り撒く画素ごとに係数を乗算する。第2の係数乗算部1222において、誤差値E(k,m+1)に係数αを乗じた値は、加算部12191、加算部12192、乗算部1223、及び乗算部1224にそれぞれ送信する。一方、第2の係数乗算部1222において、誤差値E(k,m+1)に係数β、γ、δをそれぞれ乗じた値は、加算部1225に送信する。
加算部1225は、第2の係数演算部1222から送信される誤差データ[E(k,m+1)に係数β、γ、δをそれぞれ乗じた値]と、第1の誤差拡散部1210から送信される誤差データ[E(k,m)に係数β、γ、δをそれぞれ乗じた値]とを加算する。加算した結果は、次のラインに拡散するため、第2の誤差データ1245として出力部1240に送信する。
乗算部1223は、誤差データE(k,m+1)×αに係数αを乗じて、結果を加算部12192に送信する。乗算部1224は、誤差データE(k,m+1)×αに係数β、γ、δをそれぞれ乗じて、結果を第3の誤差拡散部1230の加算部1233に送信する。
第3の誤差拡散部1230は、量子化を行う量子化演算部1231と、係数乗算部1232と、加算部1233と、を備えている。
そして、第3の量子化演算部1221は、レジスタ204に格納された閾値と、S2と閾値及び同一ラインからの誤差データが取り得る値の最大値の和と、閾値及び同一ラインからの誤差データが取り得る値の最小値の和と、をもとに第2の判定フラグの決定をする。第2の判定フラグの結果は、入力データ制御部1201、セレクタ1217、出力データ制御部1241にそれぞれ送信される。
第3の量子化演算部1231は、第3の入力データを二値に量子化すると共に誤差値E(k,m+2)を算出する。
以下、第3の量子化演算部1231の演算方法について簡単に説明する。
第3の誤差拡散部1230の第3の量子化演算部1231では、入力画像データと、第1注目画素及び第2注目画素以外からの誤差データとの合計値(以下、「S3」ともいう)を演算する。なお、本実施形態では、図5(a)に示すFloyd&Steinberg型の誤差拡散法を適用しているので、「第1注目画素以外及び第2注目画素以外の画素から拡散される誤差データ」は、前ライン(上ライン)からの誤差データのみとなる。
第3の誤差拡散部1230は、第2の誤差拡散部1220が処理する画像の次の画素の処理を行う。すなわち、第3の量子化演算部1231は、座標(k,m+2)の画素の演算を行う。
座標(k,m+2)の画素のS3は、入力画像データA(k,m+2)と、前ラインの誤差データ[E(k−1,m+1)×β+E(k−1,m+2)×γ+E(k−1,m+3)×δ]と、を加算したものである。また、S3は、同一ラインの誤差データ、具体的には、左画素の誤差データを加算する前の値である。
第3の量子化演算部1231では、同一ラインの第1注目画素及び第2注目画素からの誤差データが加算される前の合計値であるS3により、量子化データが確定するか否か判定する判定フラグを算出する。具体的には、合計値S3が第1の基準値以下か否か及びこの第1の基準値より大きい第2の基準値以上か否かに基づいて、量子化データが確定するか否かを判定する。
本実施形態では、S3と、閾値及び同一ラインの第1注目画素及び第2注目画素からの誤差データが取り得る値の最大値の和と、閾値及び同一ラインの第1注目画素及び第2注目画素からの誤差データが取り得る値の最小値の和と、を比較し、判定フラグが1か0かを決定する。すなわち、上記の第1の基準値は、第3の誤差拡散部1230において設定される閾値及び同一ラインからの第1注目画素及び第2注目画素からの誤差データの取り得る値の最大値から求められる。また、上記の第2の基準値は、第3の誤差拡散部1230において設定される閾値及び同一ラインの第1注目画素及び第2注目画素からの誤差データの取り得る値の最小値から求められる。第3の量子化演算部1231の演算方法については、図7で説明した方法と同様であるので、説明を省略する。
第3の量子化演算部1231により量子化した結果は、第3の量子化データa(k,m+2)1246として出力制御部1240に送信する。一方、第3の量子化演算部1231で算出した誤差値は、第3の係数乗算部1232に送信する。
第3の係数乗算部1232では、誤差値に対して振り撒く画素ごとに係数を乗算する。第3の係数乗算部1232において、誤差値E(k,m+2)に係数αを乗じた値は、セレクタ1217に送信する。一方、第3の係数乗算部1232において、誤差値E(k,m+2)に係数β、γ、δをそれぞれ乗じた値は、加算部1233に送信する。
加算部1233は、第3の係数演算部1232から送信される誤差データ[E(k,m+2)に係数β、γ、δをそれぞれ乗じた値]と、第2の誤差拡散部1220から送信される誤差データ[E(k,m+1)に係数β、γ、δをそれぞれ乗じた値]と、第1の誤差拡散部1210から送信される誤差データ[E(k,m)に係数β、γ、δをそれぞれ乗じた値]を加算する。加算した結果は、次のラインに拡散するため、第3の誤差データ1247として出力部1240に送信する。
出力データ制御部1241は、第1の判定フラグ=0の場合は、第2の量子化データ1244及び第2の誤差データ1245、並びに第3の量子化データ1246及び第3の誤差データ1247を使用しない。そして、第1の量子化データ932をRAM115に保存すると共に、第1の誤差データ1243を誤差メモリに保存するように制御する。また、第1の判定フラグ=1で且つ第2の判定フラグ=0の場合は、第3の量子化データ1246及び第3の誤差データ1247を使用しない。そして、第1の量子化データ1242及び第2の量子化データ1244をRAM115に保存すると共に、第1の誤差データ1243及び第2の誤差データ1245を誤差メモリに保存するように制御する。一方、第1の判定フラグ=1で且つ第2の判定フラグ=1の場合は、第1の量子化データ1242、第2の量子化データ1244、及び第3の量子化データ1246をRAM115に保存する。そして、第1の誤差データ1243、第2の誤差データ1245、及び第3の誤差データ1247を誤差メモリに保存するように制御する。
出力制御1240は、誤差データを次のラインへ分配するために、誤差の累積値を保持するレジスタを備えている。このレジスタは、図5に示すように、1つの注目画素から次のラインの3画素に分配するので、各画素位置に累積される誤差データを保持するメモリ領域を備えている。1つの画素位置について累積がなされる(誤差データ「B」、「C」、「D」の加算が完了する)と、その誤差値を誤差メモリへ出力する。
図14を用いて、入力制御部1200の処理手順を詳細に説明する。図14は、入力制御部1200の処理フローを示す図である。画素の番号をkとして、最終画素をNとする。
データを受信して入力データ制御をスタートし、ステップ1301においてkに初期値=1を代入する。
次に、ステップ1302において、k=N(最終画素)かどうか判断する。
k=Nでない場合は、ステップ1303において、k=N−1かどうか判断する。k=N−1でない場合、ステップ1304に進む。
ステップ1304では、ED1に第一の入力データ[k]を送信、ED2に第二の入力データ[k+1]を送信、ED3に第三の入力データ[k+1]を送信する。
次のステップ1305では、第一の判定フラグ=1かどうか判定する。第一の判定フラグ=1でない場合、ステップ1306に進む。ステップ1306では、k=k+1として、ステップ1302に戻る。一方、第一の判定フラグ=1の場合、ステップ1307に進み、第二の判定フラグ=1かどうか判定する。
第二の判定フラグ=1でない場合、ステップ1308に進む。そして、ステップ1308では、k=k+2として、ステップ1302に戻る。一方、第二の判定フラグ=1の場合、ステップ1309においてk=N−2かどうか判断する。k=N−2の場合は、ステップ1304において最終画素をED3において処理しているので処理を終了する。k=N−2でない場合はステップ1310において、k=k+3として、ステップ1302に戻る。
ステップ1303において、k=N−1であった場合はステップ1311に進む。
ステップ1311では、ED1に第一の入力データ[k=N]を送信し、ED2に第二の入力データ[k=N+1]を送信する。次に、ステップ1312において、第一の判定フラグ=1かどうかを判定する。第1の判定フラグ=1でない場合、ステップ1306に進む。第1の判定フラグ=1である場合は、ステップ1311において最終画素をED2において処理しているので、処理を終了する。
ステップ1302においてk=Nであった場合は、ステップ1313に進み、ED1に第一の入力データ[k=N]を送信する。その後、処理を終了する。
図15を用いて、出力制御部1240の処理手順を詳細に説明する。図15は、出力制御部1240の処理フローを示す図である。画素の番号をkとして、最終画素をNとする。
データを受信して出力データ制御をスタートし、ステップ1101においてkに初期値=1を代入する。
次に、ステップ1402において、第一の判定フラグ=1かどうか判断する。第一の判定フラグ=1の場合は、ステップ1403に進む。そして、ステップ1403において、第二の判定フラグ=1かどうか判断する。
ステップ1403において、第二の判定フラグ=1の場合は、ステップ1404において、第一の量子化データ及び第一の誤差データをメモリに出力する。さらにステップ1405において、第二の量子化データ及び第二の誤差データをメモリに出力し、ステップ1406において、第三の量子化データ及び第三の誤差データをメモリに出力する。そして、S1407に進みk=k+3として、ステップ1413に進む。
一方、ステップ1403において、第二の判定フラグ=1でない場合は、ステップ1408に進み、第一の量子化データ及び第一の誤差データをメモリに出力する。さらにステップ1409において、第二の量子化データ及び第二の誤差データをメモリに出力し、ステップ1410に進む。ステップ1410では、k=k+2として、ステップ1413に進む。
ステップ1402において、第一の判定フラグ=1でない場合は、ステップ1411に進み、第一の量子化データ及び第一の誤差データをメモリに出力する。そして、ステップ1412に進みk=k+1として、ステップ1413に進む。
ステップ1413において、最終画素が完了したか判断する。最終画素が完了していない場合はステップ1402に戻り処理を繰り返し、最終画素が完了した場合は処理を終了する。
本実施形態では、上述したように、第1の誤差拡散部1210と、第2の誤差拡散部1220と、第3の誤差拡散部1230とを並行して動作させる。
第2の量子化演算部1221の判定フラグ=1の場合は、第2の誤差拡散部1220は、同一ラインの誤差データを加算せずに誤差拡散処理を進めることができる。すなわち、第2の量子化演算部1221は、同一ラインの誤差データを待つ必要がない。
第2の量子化演算部1221の判定フラグ=1で且つ第3の量子化演算部1231の判定フラグ=1の場合は、第2の量子化演算部1221だけでなく、第3の量子化演算部1231も、同一ラインの誤差データを加算せずに誤差拡散処理を進めることができる。
したがって、第2の量子化演算部1221の判定フラグ=1と判定された数と、第2の量子化演算部1221の判定フラグ=1且つ第3の量子化演算部1231の判定フラグ=1と判定された数との分だけ誤差拡散処理を高速化することができる。
これにより、誤差拡散処理の効果を損なうことなく、通常の誤差拡散処理と比較して高速に処理を行うことができる。
(他の実施形態)
以上、各実施形態を説明したが、本発明の基本的構成は上述したものに限定されるものではない。
例えば、誤差データの拡散係数の乗算部、入力データと誤差データの加算部、誤差データ同士の和の加算部等の演算部は、いずれのブロックに存在していてもよく、実施形態1や実施形態2の構成に限定されるものではない。演算部の位置が異なったとしても、上述した実施形態と同様の処理をしていれば、実施形態1や実施形態2と同様の効果を得ることができる。例えば、各実施形態では、入力画像データと誤差データの加算は入力制御部で行っているが、この加算処理は入力制御部で行わなくてもよい。例えば、次のラインに拡散する誤差データを計算したときに、出力制御部で加算処理を行ってもよく、また、別途、入力画像データと誤差データを加算する演算手段を持つ構成としてもよい。
また、実施形態1及び2では、第2の誤差拡散部の量子化演算部が演算した合計値により、量子化データが確定するか否かを判定する手段を、第2の量子化演算部自身が備えるものとしたが、これに限定されるものではない。例えば、第2の誤差拡散部の外部に、量子化演算部が演算した合計値により、量子化データが確定するか否かを判定する手段を設けるようにしてもよい。同様に、第3の誤差拡散部の量子化演算部が演算した合計値により量子化データが確定するか否かを判定する手段を、第3の量子化演算部の外部に設けるようにしてもよい。
上述した実施形態では、M値の画像データを二値化する例について説明したが、M値の画像データを3値以上のN値(M>N)の画像データに変換するものとしてもよい。すなわち、3値、5値、9値等の多値誤差拡散法においても同様に実施可能である。多値誤差拡散とした場合、閾値が複数個に増えるが、一方で左画素に拡散する誤差値として取り得る範囲が小さくなる。したがって、処理の高速化が一概に低下することはなく、誤差拡散法による効果を損なわずに、誤差拡散法による画像処理の高速化を実現することができる。
本実施形態では、誤差拡散部において設定される閾値と、同一ライン上で且つ並行して誤差拡散処理されている注目画素から拡散される誤差データが取り得る値の最大値、その誤差データが取り得る値の最小値に基づいて、量子化データが確定するか否かの判定行ったがこれに限定されるものではない。例えば、同一ライン上で且つ並行して誤差拡散処理されている注目画素から拡散される誤差データが取り得る値の最大値の代わりに、その誤差データが取り得る値の最大値に所定の調整値を加算した値を用いてもよい。同様に、同一ライン上で且つ並行して誤差拡散処理されている注目画素から拡散される誤差データが取り得る値の最小値の代わりに、その誤差データが取り得る値の最小値に所定の調整値を加算した値を用いてもよい。例えば、8bitデータで0〜255の値をとり、閾値が128の場合、同一ラインから拡散される誤差データが取り得る値の最大値(−56)に所定の値(5)を加算した設定値179以上であれば、量子化データが確定すると判定するように設定してもよい。また、例えば、同一ラインから拡散される誤差データが取り得る値の最大値(56)に所定の値(−5)を加算した設定値77以下であれば、量子化データが確定すると判定するように設定してもよい。
また、誤差拡散法は、図5に示すFloyd&Steinberg型に限定されるものではなく、公知の誤差マトリクスを用いることができる。
また、上述した実施形態では、閾値や拡散係数を固定値して説明したが、誤差拡散部に入力される入力値に応じて閾値を変化させたり、誤差拡散部に入力される入力値に応じて拡散係数を変化させたり、誤差拡散部に入力される入力値に乱数を付加させたりしてもよい。このように閾値の変更、拡散係数の変更、乱数の不可等により画質を向上させることもできる。
誤差拡散部に入力される入力値に応じて閾値を変化させる場合は、ED1及びED2の各誤差拡散部に入力される値に応じて閾値を変化させて処理する。このとき、ED2では以下に説明する方法により、図7における処理と同様の処理を行う。まず、ED1の処理の対象とする画素の入力するデータの値をED2に入力することによりED1の閾値がわかる。そして、この閾値からED1が右画素に拡散する誤差データの最大値及び最小値がわかる。このED1が右画素に拡散する誤差データが取り得る値の最大値及び最小値と、ED2の処理の対象とする画素の入力データとを図7を用いて説明した演算により、前の画素と並列処理ができるか否かを判定することができる。なお、誤差拡散部が3以上ある場合についても、同一ラインからの誤差データが取り得る値の最大値及び最小値を求め、これらを用いて同様に演算をすればよいので説明を省略する。
また、複数クロックで1画素の処理を行う誤差拡散法を用いる場合は、ED2にED1の入力データを入力する代わりに、ED2がED1から閾値情報を受信することによって、ED1とED2との並列処理をすることができる。なお、ED3が存在する場合は、ED3がED2から閾値情報を受信することによって、ED1と、ED2と、ED3との並列処理をすることができ、誤差拡散部が4以上ある場合についても同様に並列処理をすればよいので説明を省略する。
さらに、誤差拡散部の入力値に応じて閾値を変化させる処理と、拡散係数を変化させる処理を、同時に実施してもよい。
入力データに画素毎に乱数を付加させる処理の場合は、制御ブロックに入力データを入力したとき又は各誤差拡散部に入力データを入力するときに、各画素に与える乱数値を付加すればよい。この制御が加わることによっても、本発明の高速化が妨げられることはない。
また、実施形態2では、誤差拡散部を3つ備える構成としたが、これを応用し、さらに1以上の誤差拡散部を連結することも同様に可能である。この場合も同様に、第Kの誤差拡散部(Kは、4以上の自然数)は、ED1、ED2、及びED3と並行して、第1注目画素と同一ライン上で且つ第2注目画素以降の第K注目画素(Kは、4以上の自然数)の誤差拡散処理を行うものとする。このとき、第Kの誤差拡散部の誤差拡散処理により、第K注目画素の量子化データが確定するか否かをそれぞれ判定するようにすればよい。具体的には、第K注目画素の入力画像データ及び第1〜第(K−1)注目画素以外の画素から拡散される誤差データの合計値が第1の基準値以下か否か及び第2の基準値以上か否かに基づいて第K注目画素の量子化データが確定するか否かを判定すればよい。なお、第1の基準値及び第2の基準値は、それぞれED2やED3とは異なる値としてもよい。
なお、図5では処理方向を1方向のみ示したが、逆方向での処理も存在し、処理方向は交互に切り替えられるようにしてもよい。
また、以上の実施形態の処理の全てをハードウェアで実行する必要はなく、一部をソフトウェアによって構成してもよい。