以下、本発明の実施例を図面に基づいて説明する。ただし、本発明の範囲は以下の実施例に限定されるものではない。
[実施形態1]
実施形態1に係る画像処理装置は、入力画像に対して画像処理を行う。本実施形態に係る画像処理装置は、複数の画像処理部(処理モジュール)を備える。本実施形態において、画像処理装置はN個の画像処理部を備えるものとする。N個の画像処理部は、処理対象とする画素(以降、処理画素)に対して同様の画像処理を実行するものであり、それぞれの画像処理部は、処理画素とは異なる参照画素についての処理結果を参照して、処理画素についての処理結果を生成する。以下では、画像処理装置がJ値画像をI値画像(I<J)に変換する誤差拡散処理を行う場合について説明する。誤差拡散処理は、フィードバックループが用いられる処理の1つである。すなわち、処理画素についての処理結果(量子化結果)を得るためには、参照画素についての処理結果(量子化誤差又は拡散誤差)を参照する必要がある。また、本実施形態に係る画像処理装置は、複数の処理画素について並列に処理を行い、すなわち、複数の画像処理部は、互いに異なる処理画素についての処理結果を並列に生成する。以下で、画素ライン又はラインとは、主走査方向に並ぶ画素列のことを指し、データ列とも呼ばれる。
図1は、実施形態1に係る画像処理装置190の機能構成例を示すブロック図である。画像処理装置190は、画像入力部100、画像供給部101、画像出力部103、及び画像処理部110~113を備える。
画像入力部100は入力画像のデータを取得する。本実施形態において、入力画像のデータは、J値画像のデータである。画像入力部100は、例えば、スキャナ若しくはデジタルカメラ等の画像取得装置、又はハードディスク等の記録媒体から、入力画像のデータを取得する。そして、画像入力部100は、入力画像中の処理領域のデータを読み出し、画像供給部101に提供する。本実施形態において、入力画像は複数の処理領域に分割され、それぞれの処理領域について処理が行われる。以下では、それぞれの処理領域をバンド領域と呼ぶ。
バンド領域の大きさは特に限定されない。一実施形態において、入力画像は所定の主走査方向画素数及び副走査方向画素数を有する矩形領域に分割される。ここで、バンド領域の主走査方向画素数は、入力画像の主走査方向画素数と同じでありうる。また、一実施形態において、バンド領域の主走査方向画素数は副走査方向画素数より大きい。本実施形態において、主走査方向は横方向であり、副走査方向は縦方向である。
画像供給部101は、複数の画像処理部に対し、処理を行うタイミングで処理画素の処理に必要な画素データを供給する。例えば、画像供給部101は、画像入力部100から取得したバンド領域の画像データを画像処理部110~113に供給できる。この際に、画像供給部101は、画像処理部110~113が並列処理可能なように、バンド領域のJ値の画素データを画像処理部110~113に供給できる。
画像処理部110~113は、画像供給部101から取得したJ値の画素データに対して誤差拡散処理を行うことにより、I値の画素データを生成する。後述するように、複数の画像処理部は、処理結果を転送可能なように接続されている。複数の画像処理部間の接続方法は特に限定されず、例えば1つの画像処理部が他の全ての画像処理部と接続されていてもよい。一方、図13(E)を参照して後述するように、参照画素の位置に応じて、処理結果の転送が不要である画像処理部間には接続が存在しなくてもよい。
本実施形態において、複数の画像処理部はリング状に接続されている。すなわち、画像処理部110と画像処理部111との接続、画像処理部111と画像処理部112との接続、画像処理部112と画像処理部113との接続との接続に加えて、画像処理部113と画像処理部110との接続が存在する。言い換えれば、ある画像処理部から、他の全ての画像処理部を1回ずつ通って、元の画像処理部に戻る接続経路が存在する。後述するように、一実施形態において、入力画像中の処理領域の第1の画素ラインに含まれる連続したN個の画素についての処理結果は、所定の順序で互いに異なる画像処理部により逐次生成される。ここで、所定の順序でリング状に接続された画像処理部を用いることにより、第1の方向(主走査方向)への拡散誤差の伝播を容易に行うことができる。
画像出力部103は、画像処理部110~113から取得した画素データを用いて、I値の画像データを生成する。画像出力部103は、画像処理部110~113で処理された画素データを、各ライン間の処理遅延を解消しながらメモリ(例えばDRAM)に記録することにより、メモリにI値の画像データを出力することができる。
以下、画像処理装置190が行う処理について詳しく説明する。まず、誤差拡散処理について説明する。誤差拡散処理とは、処理画素の入力階調値と、処理画素の量子化結果である量子化代表値との差(量子化誤差)を、処理画素の近傍にある未処理の画素に所定の比率で拡散する処理を逐次的に行う画像処理である。図3は、誤差拡散処理の一例における、処理画素、参照画素、及び拡散係数の関係を示す。
誤差拡散処理においては、参照画素における量子化誤差に拡散係数を乗じて算出される拡散誤差が、処理画素に伝播される。拡散係数は、処理画素と参照画素との間の相対的な位置に応じた重みである。誤差拡散処理を行うためには、処理済みの画素の拡散誤差が参照画素に伝播されるのを待つ必要がある。誤差拡散処理のように、他の画素についての処理結果を参照して処理が行われる場合には、画素間の依存関係を考慮して処理の順序を決める必要がある。
例えば、図3に示す誤差拡散処理を行う場合、処理画素305の処理を行って画素値を決定するためには、参照画素である画素301~304の処理が全て完了している必要がある。そして、処理画素305の処理が完了すると、処理画素305を参照画素として用いて処理が行われる次の画素に拡散誤差が伝搬される。そして、全ての参照画素からの拡散誤差が確定している画素が、次に処理される。
図4は、画像処理部110の詳細な構成を示すブロック図である。画像処理部111~113も、画像処理部110と同様の構成をとることができる。すなわち、複数の画像処理部は同じ構成を有していてもよい。画像処理部110は、補正部400、量子化部401、誤差算出部402、誤差メモリ403、及び拡散フィルタ404を有する。このように、複数の画像処理部のそれぞれは処理モジュールとして構成され、それぞれ処理部(補正部400、量子化部401、誤差算出部402、及び拡散フィルタ404)とメモリ(誤差メモリ403)とを有している。画像処理部110~113の物理的な構成は特に限定さない。例えば、画像処理部110は、補正部400、量子化部401、誤差算出部402、及び拡散フィルタ404の機能を実現する回路又はプロセッサのような処理ユニットと、誤差メモリ403として働くメモリと、を備えていてもよい。
補正部400は、入力されるJ値の画素データに対し、後述する参照画素からの拡散誤差の累積値(補正値)を加算する。J値の画素データは、例えば、1画素8ビット(256階調)で表現される画素データであってもよい。
量子化部401、補正部400で補正されたJ値の画素データを、I値の画素データに量子化する。例えば、量子化部401は、J値の画素データを、濃度値0又は濃度値255に対応する2値の階調値に量子化する。誤差算出部402は、補正部400で補正されたJ値の画素データと、量子化部401で量子化されたI値の画素データと、の誤差を算出する。
誤差メモリ403は、誤差算出部402が算出した量子化誤差を保持する。誤差メモリ403は、他の画像処理部111~113から転送された、参照画素の量子化誤差を保持することもできる。また、誤差算出部402が算出した量子化誤差を、誤差メモリ403から他の画像処理部111~113に転送することもできる。拡散フィルタ404は、誤差算出部402又は誤差メモリ403から送られる参照画素の量子化誤差に、拡散係数を乗じて拡散誤差を算出する。また、拡散フィルタ404は、処理画素に対する拡散誤差の累積値を算出し、この累積値を補正部400に出力する。
このように、画像処理部110は、入力されるJ値の画素データと、参照画素の拡散誤差とを用いて、J値の画素データを量子化し、量子化誤差から拡散誤差を算出し伝搬することが可能である。なお、誤差メモリ403は、参照画素の量子化誤差の代わりに、参照画素の拡散誤差を保持してもよい。
もっとも、画像処理部110~113の構成は上記のものには限られない。参照画素からの量子化誤差又は拡散誤差を受け取ることができ、処理画素の画素値を量子化して量子化誤差を算出し、この量子化誤差又は拡散誤差を転送することができる、任意の構成を有する処理部を用いることができる。
(ライン数4のバンド領域に対する処理例)
以下、具体的な処理例として、画像入力部100が入力画像から読み出したライン数4のバンド領域に対する誤差拡散処理について説明する。この例では、この処理例では、4つの画像処理部110~113を用いて並列数4の並列処理が行われる。また、第1の方向に連続する並列数に等しい数の画素に対しては、異なる画像処理部110~113が処理(量子化処理)を行う。一方で、画像処理部が処理画素に対する処理を行った結果、処理画素から第2の方向に現れた処理可能な画素に対しては、同じ画像処理部が処理を行う。1つの画像処理部は、第2の方向に位置する画素を処理することを繰り返す。そして、この画像処理部は、最後のデータ列(この例ではバンド領域に含まれる4列目のデータ列)の画素に対する処理を行うと、次に最初のデータ列(この例ではバンド領域に含まれる1列目のデータ列)にある、処理可能な画素に対する処理を行う。以下の説明において、第1の方向は主走査方向である。また、第2の方向は、参照画素の位置に応じて定めることができる。
図5(A)を参照して、この処理順序について説明する。以下の処理例では、図3に示されるとおり、処理画素の左上、上、右上、及び左に隣接する画素が、参照画素として用いられる。したがって、処理可能な画素とは、処理画素の左上、上、右上、及び左に隣接する画素の処理が終わっている(すなわち量子化値及び量子化誤差が計算されている)画素である。このように、一実施形態において、参照画素は、処理画素より上の画素ラインにあるか、又は処理画素と同じ画素ラインの処理画素より左側にある。
サイクルC1において、処理可能な画素は、処理開始位置の画素511のみである。したがって、画像処理部110は、処理開始位置の画素511を処理する。すると、全ての参照画素の処理が完了している画素512が、処理可能な画素となる。ここで、画素512は、処理された画素511から第1の方向(主走査方向)に位置している。画素511と画素512とは第1の方向に連続しているため、画素511を処理した画像処理部110とは異なる画像処理部、例えば画像処理部110の次の画像処理部111によって、サイクルC2において処理される。なお、画素512の誤差参照範囲には、画素が存在しない領域があるが、ここでは、この領域には処理が完了した画素が存在し、この画素からの拡散誤差はないものとして扱われる。しかしながら、例えば別のバンドからの拡散誤差が伝播される場合、この拡散誤差を考慮して処理を行ってもよい。
サイクルC2において、画像処理部111によって画素512が処理され、その結果画素513及び画素521が処理可能な画素となる。画素513は、処理された画素512から第1の方向に位置している。画素511~513は第1の方向に連続しているため、これらを処理した画像処理部110~111とは異なる画像処理部、例えば画像処理部111の次の画像処理部112によって、サイクルC3において処理される。
一方、画素521は、処理された画素512から第1の方向とは異なる第2の方向に位置している。このため、画素521は、サイクルC2において画素521の参照画素の処理を完了した画像処理部111によって、サイクルC3において処理される。このように、この処理例において第2の方向は、画素512から画素521の方向、すなわち下に1ライン、左に1画素進む方向に決まる。以降の処理サイクルにおいて、画像処理部111は、第2の方向に向かって4つのデータ列の画素を順次処理する。すなわち、画像処理部111は、次のサイクルにおいて、前のサイクルで処理した画素から所定の相対位置にある画素(この例では下に1ライン及び左に1画素)を処理する。(もっとも、画素531の1画素左、及び画素541の2画素左に画素は存在しないので、これらの画素に対する処理タイミングにおいては、画像処理部111は待機を行う。)
4つのデータ列の画素を処理した画像処理部は、1番目のデータ列の処理可能な画素を次に処理し、さらに第2の方向に向かって4つのデータ列の画素を順次処理することを繰り返す。図5(B)は、このような構成において、各サイクルC1~C7において各画像処理部110~113が処理する画素を示す。サイクルC1~C6までは、画像処理部は、処理の対象となる処理画素が存在しないために処理を行わないことがある。この場合には、画像処理部は誤差を伝搬しなくてもよい。サイクルC7以降は、各画像処理部は処理の対象となる処理画素を有しており、同時に4つの画素が処理画素となる。
本実施形態の構成によれば、複数の画像処理部による同時並列処理の対象となる画素は、同じライン上には存在しない。また、複数の画素を同時に処理した結果現れる複数の処理可能な画素は、複数の画素のそれぞれから第2の方向の所定の相対位置にあるため、やはり同じライン上には存在しない。このように、参照範囲に示される依存関係のために、同時に現れる処理可能な画素はそれぞれ異なる高さ方向にある。また、図3に示される参照範囲を用いる場合、同時に現れる処理可能な画素は、横方向の位置が異なるし、斜め方向(下に1ライン及び左に1画素ずつ進む方向)の位置も異なる。これは、各画像処理部が、縦方向、横方向、及び斜め方向の位置が互いに異なる複数の画素を処理し、その次は第2の方向の所定の相対位置に現れる処理可能な画素を処理する、という、第2の方向への規則的な走査を行っているためである。このような構成を有するために、複数の画像処理部110~113はそれぞれ1つの画素を同時に処理できる。
また、第2の方向に向かってそれぞれの(例えばM個の)データ列にあるそれぞれの(例えばM個の)画素の処理を行った後、処理部は1番目のデータ列の処理可能な画素を次に処理する。このような走査を行うことで、順に配置された異なる複数の画像処理部110~113のそれぞれは、第1の方向に連続する複数の画素のそれぞれに対応し、対応する画素の処理を行う。そして、末尾の画像処理部113が処理した画素と、第1の方向に連続する画素は、先頭の画像処理部110が処理するという、ループ状の処理が行われる。この構成により、データ列の長さが変わったとしても、またバンド領域に含まれるデータ列の数が変わったとしても、処理を行う画像処理部の依存関係は変わらない。すなわち、1つの画像処理部が1つの画素の処理を行う際に、この画素の参照画素の処理を行った画像処理部は決まっているため、接続された特定の画像処理部から量子化誤差又は拡散誤差を取得することにより、この画素の処理を行うことができる。このように、画像処理部間の接続関係が処理の途中で切り替わることがないため、同じ構成を用いて並列処理を行うことができる。
次に、画像供給部101が画像処理部110~113に画素データを供給する方法について説明する。図2は、処理の対象となるバンド領域230及びバンド領域1430を示す。バンド領域230及びバンド領域1430には、各処理画素が処理される処理サイクルが数値で示されている。また、画素データの供給先となる画像処理部が背景パターンとして図示されている。
画像供給部101は、ライン遅延回路800及びモジュール遅延回路900を有している。まず、図8を参照して、ライン遅延回路800を説明する。この処理例において、ライン遅延回路800はバッファ841~862を備える。バンド領域230には、入力データ列801~804が含まれている。ライン遅延回路800は、所定の数の画素についての画素データを、各入力データ列801~804から順次取得する。この処理例では、ライン遅延回路800は1サイクルに4画素の画素データを取得する。ここでは、1サイクルで取得される画素データに対応する画素の数は、並列数と同じであり、4である。すなわち、ライン遅延回路800は、入力データ列801~804まで順に4画素ずつ画素データを取得した後、さらに入力データ列801~804まで順に4画素ずつ未取得の画素データを取得する処理を繰り返す。
そして、画像供給部101は、取得した画素データをモジュール遅延回路900へと転送する。ここで、上のデータ列と比較して、下に隣接するデータ列には1画素分の遅延が付加されるように、ライン間遅延を加えてから、ライン遅延回路800は画素データをモジュール遅延回路900へと転送する。すなわち、あるサイクルにおいて、上のラインの第1の横位置から右に連続する所定個数の画素の画素データが、ライン遅延回路800から出力される。そして、次のサイクルでは、隣接する下のラインの、第1の横位置よりも左側にある第2の横位置から右に連続する所定個数の画素の画素データが、ライン遅延回路800から出力される。このように、第1の横位置よりも第2の横位置の方が左側となるように、隣接するラインの画素データを転送することを、ここではライン間遅延を加えるという。
以下、具体的な処理の一例を説明する。1列目の入力データ列801に対してライン間遅延は挿入されない。サイクルC0において、ライン遅延回路800は入力データ列801から4画素の画素データ811を取得し、バッファ841~844に格納する。ここで、取得した画素データ811に含まれる各画素の画素データは、左側の画素の画素データが前方のバッファに格納されるように、降順に格納される。例えば、画素データ811のうち、一番左の画素の画素データはバッファ844に格納され、一番右の画素の画素データはバッファ841に格納される。後述するように、ライン遅延回路800内のバッファに含まれるデータに対してはシフト動作が行われ、ここではシフト方向にあるバッファを前方のバッファと呼ぶ。そして、サイクルC1において、バッファ841~844に格納された4画素の画素データは、画素データ831としてモジュール遅延回路900に出力される。
次に、入力データ列802の処理について説明する。入力データ列802には、入力データ列801との間のライン間遅延が1画素分挿入される。サイクルC1において、ライン遅延回路800は、入力データ列802から4画素の画素データ812を取得し、バッファ845~848に降順に格納する。サイクルC2において、バッファ846~849に格納された4画素の画素データは、画素データ832としてモジュール遅延回路900に出力される。バッファ845は4段のバッファにより構成される。バッファ845は、格納した画素データを次の画素データ816が取得されるサイクルC5の前まで保持する。そして、サイクルC5で次の4画素の画素データ816がバッファ845~848に格納される際に、バッファ845の画素データはバッファ849に格納される。言い換えれば、バッファ845の画素データは、バッファ849へとシフトされる。次のサイクルC6において、バッファ846~849に格納された4画素の画素データは画素データ832としてモジュール遅延回路900に出力される。
入力データ列803の処理は、入力データ列803に入力データ列802とのライン間遅延が1画素分挿入されることを除き、入力データ列802の処理と同様である。すなわち、サイクルC2において、ライン遅延回路800は、入力データ列803から画素データ813を取得してバッファ850~853に格納する。サイクルC3において、バッファ852~855に格納された画素データ833はモジュール遅延回路900に出力される。また、サイクルC6で画素データ817がバッファ850~853に格納される際に、バッファ850及びバッファ851の画素データはバッファ854及びバッファ855にシフトされて格納される。サイクルC7において、同様に画素データ833はモジュール遅延回路900に出力される。
入力データ列804の処理も、入力データ列804に入力データ列803とのライン間遅延が1画素分挿入されることを除き、入力データ列803の処理と同様である。すなわち、サイクルC3において入力データ列804からの画素データ814がバッファ856~859に格納され、サイクルC4においてバッファ859~862に格納された画素データ834はモジュール遅延回路900に出力される。サイクルC7において画素データ818がバッファ856~859に格納される際に、バッファ856~868の画素データはバッファ860~862にシフトされて格納される。サイクルC8において、画素データ834はモジュール遅延回路900に出力される。
この処理例では、ライン間遅延は1ラインにつき1画素である。これは、第2の方向への第1の画素と第2の画素との間の相対位置を反映している。すなわち、1つの画像処理部は、第1の画素ラインの第1の画素と、第1の画素ラインの下にある第2の画素ラインの第2の画素と、を順に処理する。ここで、第2の画素は第1の画素よりも列位置が1画素左にあるため、第1の画素データを処理したサイクルの次のサイクルで第2の画素データが入力されるように、第2の画素ラインからの入力データ列にはライン間遅延が1画素分挿入される。一方、行う画像処理の内容によっては、タイミング制約を緩和するためにライン間遅延を増加させてもよい。一方、ライン間遅延を増加させると、参照画素の処理結果(例えば量子化誤差又は拡散誤差)を保持する期間(サイクル数)が長くなるため、回路中に必要な誤差バッファの数が増加するかもしれない。
次にモジュール遅延回路900について図9を参照して説明する。上記の説明からわかるように、モジュール遅延回路900には、1サイクルにつき、第1の方向に連続する4つの画素の画素データが入力される。モジュール遅延回路900は、これら4つの画素の画素データを、それぞれ、画像処理部110~113に転送する。この際、モジュール遅延回路900は、画像処理部110~113が順に処理を行うのに合わせて、モジュール間遅延を付加して転送を行う。この処理例では、モジュール間遅延は1サイクルである。すなわち、モジュール遅延回路900は、4つの画素の画素データが入力されると、1つ目の画素データを同じサイクルにおいて画像処理部110に転送し、2つ目の画素データを次のサイクルにおいて画像処理部111に転送する。また、モジュール遅延回路900は、3つ目の画素データをその次のサイクルにおいて画像処理部112に転送し、4つ目の画素データをさらに次のサイクルにおいて画像処理部113に転送する。このようにモジュール間遅延を付加するために、モジュール遅延回路900は、バッファ911~916を有している。
モジュール遅延回路900の処理をさらに詳細に説明する。サイクルC1では、4画素の画素データ831がライン遅延回路800から入力される。バッファ841~843に格納されていた画素データは、それぞれバッファ913~911に格納される。バッファ911~913は、それぞれ画像処理部111~113へ転送される画素データを格納する。このように、左側の画素の画素データは、後側の画像処理部へと転送される。また、バッファ844に格納されていた画素データは、モジュール遅延回路900内のバッファには格納されず、サイクルC1において画像処理部110に出力される。
サイクルC2では、同様に4画素の画素データ832がライン遅延回路800から入力される。バッファ846~848に格納されていた画素は、それぞれバッファ913~911に格納される。バッファ849に格納されていた画素データは、モジュール遅延回路900内のバッファには格納されず、サイクルC2において画像処理部110に出力される。バッファ911に格納されていた画素データは画像処理部111に出力される。また、バッファ912及びバッファ913に格納されていた画素データはそれぞれバッファ914及びバッファ915に格納される。
サイクルC3でも同様に、画素データ833がライン遅延回路800から入力されて、バッファ855に格納されていた画素データは画像処理部110に出力され、バッファ852~854に格納されていた画素データはバッファ913~911に格納される。また、バッファ911及びバッファ914に格納されていた画素データは画像処理部111及び画像処理部112に出力される。バッファ912、バッファ913、及びバッファ915に格納されていた画素データは、それぞれバッファ914、バッファ915、及びバッファ916に転送される。
サイクルC4でも同様に、画素データ834がライン遅延回路800から入力されて、バッファ862に格納されていた画素データは画像処理部110に出力され、バッファ859~861に格納されていた画素データはバッファ913~911に格納される。また、バッファ911、バッファ914、及びバッファ916に格納されていた画素データは画像処理部111、画像処理部112、及び画像処理部113に出力される。バッファ912、バッファ913、及びバッファ915に格納されていた画素データは、それぞれバッファ914、バッファ915、及びバッファ916に転送される。
サイクルC5以降も同様の動作が行われる。このように、画像供給部101は、第1の方向に連続する並列数分の画素の画素データを、それぞれを、1サイクルおきに画像処理部110~113に供給する。このような動作により、画像供給部101は、バンド領域230内の画素データを、図2に示す通りの画像処理部110~113へと所定の順序で供給できる。
画像出力部103は、画像処理部110~113の処理により得られた画素データのライン間遅延及びモジュール間遅延を解消し、メモリ(DRAM等)に出力する。画像出力部103は、画像供給部101が与えたライン間遅延とモジュール間遅延が解消されるように、画素データの出力タイミングに遅延を与える。以下の構成は一例にすぎず、遅延の解消にはどのような構成を用いてもよい。
画像出力部103は、モジュール遅延解消回路1000と、ライン遅延解消回路1100とを備える。図10(A)を参照して、モジュール遅延解消回路1000を説明する。モジュール遅延解消回路1000は、第1の方向に連続する並列数分の画素の画素データに対し、それぞれ遅延を加える。こうして、モジュール遅延回路900が画像処理部110~113に画素データを供給する際に加えられた遅延差が解消される。その結果、第1の方向に連続する並列数分の画素の画素データが、モジュール遅延解消回路1000からライン遅延解消回路1100へと同じタイミングで転送される。この動作のために、モジュール遅延解消回路1000は、図10(A)に示すように、バッファ1011~1016を有している。そして、第1の方向に連続する並列数分の画素の画素データのうち、先のサイクルで処理された画素データは、後のサイクルで処理された画素データよりも1サイクル長く保持されてから出力される。
モジュール遅延解消回路1000には、1サイクルに4画素の画素データ、すなわち画像処理部110~113のそれぞれから1画素の画素データが入力される。画像処理部110からバッファ1011に入力された画素データは、バッファ1014及びバッファ1016を介して3サイクル後にライン遅延解消回路1100に出力される。同様に、画像処理部111からバッファ1012に入力された画素データは、バッファ1015を介して2サイクル後にライン遅延解消回路1100に出力される。画像処理部112からバッファ1013に入力された画素データは、1サイクル後にライン遅延解消回路1100に出力される。画像処理部113からモジュール遅延解消回路1000に入力された画素データは、遅延なしにライン遅延解消回路1100に出力される。
サイクルC1~C8においてモジュール遅延解消回路1000からライン遅延解消回路1100に出力される画素データ1021~1028を図10(B)に示す。このように、サイクルC1でモジュール遅延回路900に転送された4画素の画素データ831は、処理後、サイクルC4で遅延差が解消されてモジュール遅延解消回路1000から画素データ1024として出力される。画素データ1021~1023は、モジュール遅延回路900とモジュール遅延解消回路1000により加えられた3サイクル分の遅延を表し、これらに対するライン遅延解消回路1100による処理は不要である。
図11を参照して、ライン遅延解消回路1100について説明する。ライン遅延解消回路1100は、モジュール遅延解消回路1000から入力された画素データのライン間遅延差を解消する。すなわち、ライン遅延解消回路1100は、下のデータ列と比較して、上に隣接するデータ列には1画素分の遅延が付加されるように、ライン間遅延を加えてから、画素データを出力する。そのための具体的な構成は、ライン遅延回路800と同様でありうる。
すなわち、ライン遅延解消回路1100は、バッファ1141~1162を有している。ライン遅延解消回路1100には、図10(B)に示されるように1サイクルに4画素の画素データがモジュール遅延解消回路1000から入力される。画素データ1024は、バッファ1144~1141に降順に入力される。例えば、画素データ1024のうち、一番左の画素の画素データはバッファ1144に格納され、一番右の画素の画素データはバッファ1141に格納される。入力された画素データには、3画素分のライン間遅延が付けられて、メモリ(例えばDRAM)に出力される。すなわち、バッファ1144に入力された画素データは、次のサイクルで出力される。また、バッファ1143~バッファ1141に入力された画素データは、入力から4サイクル後にバッファ1147~1145へとシフトされ、入力から5サイクル後に出力される。
同様に、画素データ1025はバッファ1151~1148に降順に入力され、2画素分のライン遅延が付けられてメモリに出力される。画素データ1026はバッファ1157~1154に降順に入力され、1画素分のライン遅延が付けられてメモリに出力される。画素データ1027はバッファ1159~1162に降順に入力され、ライン遅延を付加されずにメモリに出力される。
ここでは画素データ1027までの処理を説明した。以降、ライン遅延解消回路1100に入力される画素データは、順に3画素、2画素、1画素、0画素の遅延が付けられ、ライン遅延解消回路1100から出力される。ライン遅延解消回路1100からメモリへは降順に並んだ画素データが出力されるため、昇順になるように変換されてメモリに格納される。以上の処理により、サイクルC5~C8では入力データ列801~804のそれぞれの1画素目の処理結果である画素データが出力され、サイクルC9~C12では入力データ列801~804のそれぞれの2~5画素目の処理結果である画素データが出力される。
こうして、画像出力部103には、バンド領域230の各画素についての処理結果である画素データが蓄積され、結果としてバンド領域230の誤差拡散結果が得られる。以上のように、画像出力部103はモジュール遅延解消回路1000及びライン遅延解消回路1100を備える。そして、画像出力部103は、画像供給部101が加えたライン間遅延及びモジュール間遅延による遅延差がなくなるように遅延を加えてから画素データを出力する。
(ライン数5のバンド領域に対する処理例)
以下、別の具体的な処理例として、画像入力部100が入力画像から読み出したライン数5のバンド領域に対する誤差拡散処理について説明する。誤差拡散処理における参照画素及び拡散係数は図3に示した通りである。
各画素の画素データを処理する画像処理部110~113の決定方法は、ライン数4のバンド領域に対する処理の場合と同様である。この処理例で、画像処理部は、5番目のデータ列の画素を処理した後、1番目のデータ列の処理可能な画素を処理する。この処理順のイメージ図を図15(A)に示す。
図15(A)を参照して、この例における処理順序について説明する。サイクルC1において、処理可能な画素は処理開始位置の画素1511のみであり、画像処理部110は画素1511を処理する。すると、全ての参照画素の処理が完了している画素1512が処理可能な画素となる。画素1512は、処理された画素1511から主走査方向に位置しているため、次の画像処理部111によってサイクルC2において処理される。
サイクルC2において、画像処理部111によって画素1512が処理され、その結果画素1513及び画素1521が処理可能な画素となる。主走査方向に位置する画素1513は次の画像処理部112によってサイクルC3において処理される。一方、主走査方向とは異なる第2の方向に位置する画素1521は、サイクルC2において参照画素の処理を完了させた画像処理部111により、サイクルC3において処理される。このように、第2の方向は、画素1512から画素1521の方向、すなわち下に1データ列、左に1画素進む方向に決まる。
画素1521は、画像処理部110又は画像処理部113が処理してもよい。しかしながらこの場合、画像処理部110は、サイクルC1で画素1511を処理し、サイクルC2では待機してから、サイクルC3で画素1521を処理することになる。画像処理部111が画素1521を処理することにより、並列化による処理高速化の効果が向上する。また、画像処理部113が画素1521を処理する場合、サイクルC1における画素1511の拡散誤差をサイクルC3まで保持する必要があり、より長いサイクルの間誤差を保持する必要があるため、回路中の拡散誤差を保持するバッファが増加する。画像処理部111が画素1521を処理することにより、拡散誤差を保持するバッファの数を減らすことができる。
サイクルC4以降も、画像処理部110~113は同様の処理を行う。図15(B)は、このような構成において、各サイクルC1~C9において各画像処理部110~113が処理する画素を示す。ライン数4の場合と同様、サイクルC1~C8までは処理を行わない画像処理部が存在するが、サイクルC9以降は、4つの画素の画素データが画像処理部110~113で同時に処理される。
この処理例でも、画像処理部は、第2の方向に向かってそれぞれの(例えばM個の)データ列にあるそれぞれの(例えばM個の)画素の処理を行った後、処理部は1番目のデータ列の処理可能な画素を次に処理する。この処理例でも、画像処理部間の接続関係はライン数4のバンド領域に対する処理と同じであるから、ライン数4のバンド領域に対する処理と同じ回路構成の画像処理部110~113を用いることができる。
次に、画像供給部101が画像処理部110~113に画素データを供給する方法について説明する。ここでは、画像入力部100が図2(B)に示すライン数5のバンド領域1430を読み出したときの処理について説明する。図2(B)は、各処理サイクルにおける、処理画素(処理される処理サイクルが数値で示されている)及び画素データの供給先となる画像処理部を示す。
画像供給部101は、ライン遅延回路及びモジュール遅延回路を有している。この処理例ではバンド領域のライン数が5なので、ライン遅延回路は最大4画素のライン間遅延を付加可能である。この処理例におけるライン遅延回路の構成は、この点を除き、ライン遅延回路800と同様であり、詳しい説明は省略する。すなわち、ライン遅延回路は、1番目のデータ列からの画素データはそのまま出力し、2~5番目のデータ列からの画素データは1~4画素分のライン間遅延を付加してから出力する。
モジュール遅延回路の構成はバンド領域のライン数が4の場合と同様であり、詳しい説明は省略する。すなわち、ライン遅延回路から入力された4画素分の画素データのうち、1番目の画素データはすぐに画像処理部110に入力される。また、2~4番目の画素データは、1~3サイクル後に画像処理部111~113に入力される。
このように、画像供給部101は、ライン遅延回路とモジュール遅延回路とを用いることで、画像処理部110~113へと、図2(B)に示す順序で画素データを供給することができる。
画像出力部103は、バンド領域のライン数4の場合と同様に、画像処理部110~113の処理により得られた画素データのライン間遅延及びモジュール間遅延を解消し、メモリ(DRAM等)に出力する。画像出力部103は、モジュール遅延解消回路と、ライン遅延解消回路とを備える。モジュール遅延解消回路の構成はライン数4の場合と同様であり、詳しい説明は省略する。すなわち、モジュール遅延解消回路は、同じサイクルで画像処理部110~112から入力された画素データを、3~1サイクル後にライン遅延解消回路に出力するとともに、画像処理部113から入力された画素データはそのままライン遅延解消回路に出力する。サイクルC1~C10においてモジュール遅延解消回路からライン遅延解消回路に出力される画素データ1023~1040を図10(C)に示す。バンド領域のライン数が4の場合と同様、モジュール遅延回路により付加された遅延差が解消されていることがわかる。
ライン遅延解消回路の構成は、バンド領域のライン数が5なので、最大4画素のライン間遅延を付加可能な点を除き、ライン遅延解消回路1100と同様であり、詳しい説明は省略する。すなわち、ライン遅延解消回路は、画素データ1035~1039(それぞれ1番目から5番目のデータ列に対応)のそれぞれに対して4~0画素分のライン遅延を付加してメモリ(例えばDRAM)に出力する。以降も、各データ列についての4画素の画素データがライン遅延回路に入力され、4~0画素の遅延が付加されてメモリに出力される処理が繰り返される。
(実施形態1における動作)
実施形態1における動作を、図12のフローチャートに沿って説明する。ステップS1200において、画像入力部100はバンド領域のデータを読み出す。ステップS1201において、画像供給部101は画像入力部100から4画素ずつJ値の画素データを取得する。そして、画像供給部101は、取得した画素データに、上記のようにライン遅延及びモジュール間遅延を付加して画像処理部110~113に出力する。
既に説明したように、画像処理部110~113による画素の処理順序は決まっている。すなわち、処理領域の第1の画素ラインに含まれる連続したN個の画素についての処理結果は、所定の順序で互いに異なる画像処理部により逐次生成される。例えば、第1の方向(主走査方向)に連続する並列数に等しい数の画素に対しては、異なる画像処理部110~113が処理(量子化処理)を行う。また、第1の画素ラインに含まれる連続したN個の画素についての処理結果は、所定の順序で互いに異なる画像処理部により連続した処理サイクルにおいて生成される。なお、上記の処理例において、1つの画像処理部は、1つの画素ラインに含まれる画素のみを処理するのではなく、1~M番目の画素ラインのそれぞれに含まれる画素を少なくとも1つずつ処理する。
また、複数の画像処理部のそれぞれは、第1の画素ラインに含まれる第1の画素についての処理結果を生成すると、次に、第2の画素についての処理結果を生成する。この第2の画素は、第1の画素ラインとは異なる処理領域の第2の画素ラインに含まれ、第1の画素についての処理結果が生成されたことに応じて処理が可能になった画素である。例えば、画像処理部が処理画素に対する処理を行った結果、処理画素から第2の方向に現れた処理可能な画素に対しては、同じ画像処理部が処理を行う。1つの画像処理部は、第2の方向に位置する画素を処理することを繰り返し、M番目の画素ラインにある画素に対する処理を行うと、次に1番目の画素ラインにある処理可能な画素に対する処理を行う。ここで、処理領域はM行の画素ラインを有しているものとする。
また、第2の画素は、第1の画素から第2の方向の所定の相対位置にある画素でありうる。すなわち、第1の画素と第2の画素との相対位置は、参照画素の位置に依存する一方で、第1の画素の位置にかかわらず同じでありうる。例えば、第1の画素の位置がi行j列である場合、第2の画素の位置はi+1行j-a列でありうる。ここで、aは参照画素の位置によって定まる任意の整数(正の整数、負の整数、又はゼロ)である。例えば、図3に示す参照画素が用いられる場合において、aは1である。
一方で、処理領域がM行(M>N)の画素ラインを有している場合に、N個の画像処理部は、1行目の画素ラインの処理が全て終了する前に、M行目の画素ラインの処理を開始する。すなわち、本実施形態において、バンド領域の処理は左から右に向けて完了する。
画像供給部101は、上記のような処理が実現できるように、複数の画像処理部に画素データを供給する。例えば、画像供給部101は、第1の画素ラインに含まれる連続するN個の処理画素の画素データを、所定の順序でN個の画像処理部に逐次供給することができる。また、画像供給部101は、第1の画素についての処理が完了した画像処理部に対して第2の画素の画素データを供給することができる。さらに、画像供給部101は、1つの画像処理部に対し、1番目の画素ラインにある処理画素の画素データから、M番目の画素ラインにある処理画素の画素データまでを順に供給した後、1番目の画素ラインにある処理画素の画素データを供給することができる。
ステップS1202において、画像処理部110~113は誤差拡散処理を行う。また、ステップS1203において、画像処理部110~113は拡散誤差の伝搬を行う。本実施形態では、画像処理部110が処理画素を処理する際に、それぞれの参照画素を処理した画像処理部は固定される。すなわち、図13(A)に示されるように、処理画素の左上の画素は画像処理部112により処理され、処理画素の上及び左の画素は画像処理部113により処理され、処理画素の右上の画素は画像処理部110により処理されている。これは、画像処理部110~113による、第1の方向に連続する画素の処理順序と、第2の方向に連続する画素の処理順序とが決まっているからである。すなわち、これは、第1の方向(主走査方向)に連続する4画素はそれぞれ画像処理部110~113が処理し、第2の方向(左下方向)に連続する画素は同じ画像処理部が処理するためである。これは、図13(B)~(D)に示されるように、画像処理部111~113が処理画素を処理する際にも同様である。また、この関係は、ライン数にかかわらず(例えばライン数が4であっても5であっても)一定である。
このように、本実施形態において、処理画素を処理する画像処理部と、参照画素を処理した(すなわち誤差を伝搬する)画像処理部との、相対位置は固定されている。したがって、参照画素を処理した画像処理部から、処理画素を処理する画像処理部へと、拡散誤差を伝播できるように、各処理部間を接続することにより、誤差伝播処理が可能となる。この接続関係は、処理の途中で変更する必要はないし、処理領域の大きさ(例えば高さ又は長さ)を変えた場合にも変更する必要はない。図13(E)に、画像処理部110~113の間の接続関係の一例を示す。
なお、参照される処理結果(例えば量子化誤差又は拡散誤差)は、処理画素を処理する画像処理部が保持してもよいし、参照画素を処理した画像処理部が保持してもよい。いずれの場合でも、参照される処理結果は、所望のタイミングで参照画素を処理した画像処理部から処理画素を処理する画像処理部へと転送できる。一実施形態において、第1の画像処理部は、複数の参照画素のうち1つについての処理結果を、第1の画像処理部の処理結果を格納する第1の画像処理部のメモリ(例えば誤差メモリ403)から取得する。例えば、第1の画像処理部が、上記のように第1の画素の次に第2の画素を処理する際に、参照画素である第1の画素の処理結果は第1の画像処理部のメモリに格納されている。また、第1の画像処理部は、複数の参照画素のうち他の1つについての処理結果を、第1の画像処理部とは異なる第2の画像処理部から取得することができる。上記のとおり、処理結果の取得元となる画像処理部は決まっている。
なお、処理画素を処理する画像処理部と、参照画素を処理した画像処理部とを直接接続する必要はない。例えば、図13(E)の例において、画像処理部111は、画像処理部113の処理結果(例えば量子化誤差又は拡散誤差)を、画像処理部110を介して受け取ってもよい。すなわち、一実施形態において、複数の画像処理部はリング状に直列に接続され、それぞれの画像処理部が接続される他の画像処理部は2つのみであってもよい。
ステップS1204において、画像処理部110~113はI値の画素データを出力する。ステップS1205において、画像出力部103は出力されたI値の画素データの遅延差を解消し、メモリに記録する。ステップS1206において、画像供給部101は、全画素について処理を行ったかどうかを判定する。全画素について処理が行われていない場合、処理はステップS1201に戻り、全画素の処理が完了するまで走査が繰り返される。全画素について処理が行われると、図12の処理は終了する。
以上の説明では、バンド領域のライン数が異なる場合、異なる構成のライン遅延回路及びライン遅延解消回路が用いられた。しかしながら、ライン数にかかわらず、同じ構成のライン遅延回路及びライン遅延解消回路を用いてもよい。例えば、説明したライン数5の場合のライン遅延回路及びライン遅延解消回路を用いて、ライン数4の場合の処理を行うことができる。この場合、ライン遅延回路及びライン遅延解消回路のうち、4画素分のライン間遅延を付加する部分は使用されない。
また、画像入力部100、画像供給部101、画像出力部103は、及び後述する経路制御部2002は、ハードウェア回路であってもよいが、ソフトウェアにより実現されてもよい。すなわち、これらの処理部のうち少なくとも一部が、コンピュータにより実現されてもよい。図20はこれらの処理部を実現できるコンピュータの基本構成を示す図である。図20においてプロセッサ2110は、例えばCPUであり、コンピュータ全体の動作をコントロールする。メモリ2120は、例えばRAMであり、プログラム及びデータ等を一時的に記憶する。コンピュータが読み取り可能な記憶媒体2130は、例えばハードディスク又はCD-ROM等であり、プログラム及びデータ等を長期的に記憶する。本実施形態においては、記憶媒体2130が格納している、各部の機能を実現するプログラムが、メモリ2120へと読み出される。そして、プロセッサ2110が、メモリ2120上のプログラムに従って動作することにより、各部の機能が実現される。図20において、入力インタフェース2140は外部の装置から情報を取得するためのインタフェースである。また、出力インタフェース2150は外部の装置へと情報を出力するためのインタフェースである。バス2160は、上述の各部を接続し、データのやりとりを可能とする。
このように、本実施形態によれば、バンド領域のライン数又は長さが異なる場合であっても、それぞれの画像処理部が処理する画素を切り替える必要が無い。また、バンド領域のライン数又は長さが異なる場合であっても、それぞれの画像処理部は同様の処理を行えばよいため、同じ構成の画像処理部を用いることができる。このため、バンド領域のライン数及び長さに関わらず、同様の構成の画像処理部を用いて、並列処理が可能である。とりわけ、本実施形態において、複数の画像処理部のそれぞれは、参照画素についての処理結果を、処理画素にかかわらず、またバンド領域のライン数にかかわらず、同じ画像処理部から取得することができる。このため、バンド領域のライン数が変化しても、画像処理部の処理及び画像処理部間の接続を変更することなく、並列な画像処理を行うことができる。
[実施形態2]
実施形態2では、入力画像の色数に応じて並列数を切り替える構成について説明する。実施形態2でも、画像処理装置がJ値画像をI値画像(I<J)に変換する誤差拡散処理を行う場合について説明する。以下の説明でも、図3に示す参照画素及び拡散係数が用いられる。
本実施形態に係る画像処理装置は、実施形態1と同様の4つの画像処理部110~113を備える。そして、本実施形態においては、入力画像の色数に応じて、動作モードが切り替えられる。例えば、画像処理装置は、N個の画像処理部が、入力画像の1つの色についての画像処理を並列に行う第1の動作モードで動作することができる。一例として、入力画像の色数が1の場合、4つの画像処理部が並列に処理を行うことができる。また、画像処理装置は、第2の動作モードで動作することができる。第2の動作モードにおいては、N個の画像処理部のうちの第1のグループが、入力画像の第1の色についての画像処理を並列に行い、N個の画像処理部のうちの第2のグループが、入力画像の第2の色についての画像処理を並列に行う。一例として、入力画像の色数が2の場合、それぞれの色の画素データを2つの画像処理部が並列に処理することができる。さらに、入力画像の色数が1の場合、それぞれの色の画素データを1つの画像処理部で処理することができる。
一実施形態においては、入力画像の色数Lに応じて、N個の画像処理部はL個のグループに分類される。ここで、それぞれのグループには同じ数の画像処理部が含まれてもよく、その数はN/L個であってもよい。そして、それぞれのグループに含まれる画像処理部が処理結果を転送可能なように、それぞれのグループに含まれる画像処理部を接続することができる。この接続を介して、画像処理部は処理結果を転送することができる。後述するとおり、このような接続が可能なように、データ転送経路は経路制御部2002によって制御されてもよい。
図7は、本実施形態に係る画像処理装置195の構成例を示すブロック図である。画像入力部100、画像供給部101、画像処理部110~113、及び画像出力部103の構成は実施形態1と同様であり、以下では異なる点について説明する。画像処理装置195は、さらにデータ転送経路2001を有しており、画像処理部110~113はデータ転送経路2001を介して拡散誤差を伝播することができる。
(入力画像の色数が2の場合)
まず、入力画像の色数が2であり、それぞれの色の画素データを2つの画像処理部が並列に処理する構成について説明する。以下では、入力画像の各画素が、シアン画素データとマゼンタ画素データを有している場合について説明する。シアン画素データとマゼンタ画素データのそれぞれは、J値のデータである。
画像入力部100は、入力画像のうち、それぞれの色についてのバンド領域を読み出す。例えば、図16(A)に示すように、画像入力部100は、シアンのバンド領域2210とマゼンタのバンド領域2200とを読み出すことができる。
画像供給部101は、ライン遅延回路2300及びモジュール遅延回路900を備える。図19は、入力画像の色数が2の場合のライン遅延回路2300の構成例を示す。ライン遅延回路2300は、バッファ2341~2368を有している。
ライン遅延回路2300は、図16(B)に示すように、2つのシアン画素及び2つのマゼンタ画素の画素データを取得する。ライン遅延回路2300は、最初のサイクルでは、図16(A)の斜線で示される、1番目のデータ列の左端の2つの画素の画素データを取得することができる。また、ライン遅延回路2300は、次のサイクルでは、2番目のデータ列の左端の2つの画素の画素データを取得することができる。そして、ライン遅延回路2300は、最後のデータ列の画素データを取得すると、再度1番目のデータ列の未取得の画素データを取得する動作を繰り返すことができる。この取得処理は、4つではなく2つの連続する画素の画素データが取得される点を除き、ライン遅延回路800と同様である。
ライン遅延回路2300は、こうして取得した画素データ2230~2233に対してライン間遅延を与える。この処理例では、それぞれの色ごとにライン間遅延が与えられる。このため、ライン遅延回路2300は、それぞれの色ごとに保持用のバッファと出力用のバッファを有している。例えば、ライン遅延回路2300は、2番目のデータ列からの入力データ2231に対して1画素のライン間遅延を与えるために、保持用のバッファ2345,2348及び出力用のバッファ2346,2347,2349,2350を有する。このような構成により、バッファ2345に保持されたシアン画素データと、バッファ2348に保持されたマゼンタ画素データとを同時に、次に入力される同じ2番目のデータ列からの画素データとともに出力できる。このように、色数に応じた数の遅延用のバッファ及び保持用のバッファをライン遅延回路2300に設けることで、所望のライン間遅延を与えることが可能となる。
モジュール遅延回路900の構成は実施形態1と同様であり、その説明を省略する。モジュール遅延回路900に入力される画素データ2230には、マゼンタ2画素の画素データとシアン2画素の画素データが並んでいる。そして、この画素データ2230にはモジュール間遅延が付加されて画像処理部110~113に入力される。よって、マゼンタの画素データは、シアンの画素データに対し、2サイクル遅延して画像処理部で処理される。もっとも、色間の遅延差が生じないように、同じ色の画素データ間にのみモジュール間遅延を付加してもよい。例えばバッファ912,914,915,916を用いず、バッファ911,913を有するモジュール遅延回路を用いることができる。この場合、マゼンタの画素データとシアンの画素データの間にモジュール間遅延は付加されない。
データ転送経路2001の詳細な構成を図14に示す。データ転送経路2001は、経路制御部2002、セレクタ2003~2006、及び経路2010~2017を有している。経路2010~2017は、画像処理部110~113の間での拡散誤差の伝播経路である。経路制御部2002は、これらの経路2010~2017を通るデータ転送を制御する。
例えば、入力画像の色数が1の場合、経路制御部2002は、セレクタ2003~2006を1に設定し、画像処理部110~113の間の全ての経路を有効にすることができる。この状態においては、4つの画像処理部110~113が1つの色の画素データを並列に処理することができる。なお、図14には、この場合に画像処理部110~113の全ての組み合わせの間に経路が存在することが示されている。しかしながら、冗長な経路を減らすため、図13に示されるように、処理画素と参照画素との関係から必要な経路のみ設けてもよい。
入力画像の色数が2の場合、経路制御部2002は、セレクタ2003~2006を0に設定することができる。この場合、画像処理部110と画像処理部111との間の経路、及び画像処理部112と画像処理部113との間の経路は有効であるが、画像処理部間の他の経路は有効ではない。この状態においては、2つの画像処理部が1つの色の画素データを並列に処理することができる。
画像出力部103は、画像処理部110~113が処理した画素データについて、ライン間遅延とモジュール間遅延とを解消して、色ごとにメモリ(例えばDRAM)に出力する。画像出力部103は、実施形態1と同様の方法で、画像供給部101で与えたライン間遅延及びモジュール間遅延による遅延差がなくなるように、遅延を与えることができる。
実施形態2における画像処理装置195の動作を、図12のフローチャートに沿って説明する。ステップS1200において、まず、データ転送経路2001の経路が設定される。経路は、入力画像の色数と画像処理部の数の組み合わせに応じて決定される。
例えば、入力画像の色数が1の場合には、上述したように経路制御部2002による経路の制御が行われる。この場合、以降の処理は実施形態1と同様に行うことができるため、説明を省略する。
また、入力画像の色数が4の場合には、それぞれの色の画素データが1つの画像処理部で処理される。経路制御部2002は、1つの画像処理部が1つの色の画素データを処理するように、画像処理部間の経路を制御する。この場合、画像処理部間の接続は必要ない。以降は、それぞれの画像処理部が各色の画素データに対して逐次処理を行えばよいため、処理の説明は省略する。
入力画像の色数が2の場合には、上述したように経路制御部2002による経路の制御が行われる。以下では、この場合の処理について説明する。ステップS1200において、画像入力部はさらに、図16(A)に示されるように、各色の処理領域を読み出す。
ステップS1201において、画像供給部101は画像入力部100から、図16(B)に示されるように4画素の画素データを取得し、ライン間遅延とモジュール間遅延とを与えて画像処理部に出力する。この例でも、図3に示す参照画素を用いて誤差拡散処理が行われるため、実施形態1と同様にライン間遅延は1画素であり、モジュール間遅延は1サイクルである。ライン間遅延は、上述のように色ごとに与えることができる。
実施形態1と同様に、ステップS1202において画像処理部110~113は誤差拡散処理を行い、ステップS1203において画像処理部110~113は拡散誤差の伝搬を行う。本実施例では、ステップS1200のように、色数と画像処理部の数との関係に応じて接続の経路が設定され、拡散誤差の伝搬が行われる。画像処理部間の接続関係は、実施形態1で述べたように、バンド領域の高さ又は長さを変更した場合でも変更する必要はない。
ステップS1204において画像処理部110~113はI値の画素データを出力する。ステップS1205において画像出力部103は、I値の画素データの遅延差を解消し、色毎にメモリに記録する。ステップS1206の処理は、実施形態1と同様である。
このように、本実施形態によれば、異なる色数の入力画像のそれぞれに対する並列処理が可能となる。また、データ転送経路2001を切り替えることによって、色数に応じた並列処理の制御が可能となる。
[実施形態3]
本発明に係る画像処理装置が行う処理は、誤差拡散処理には限られない。例えば、本発明に係る画像処理装置は、フィードバックを用いた処理を行うことができる。その一例として、実施形態3に係る画像処理装置は、画像データ中の水平線又は垂直線を検出する処理を並列に行う。本実施形態の処理は、図1に示す画像処理装置190が実現可能であり、その詳細な説明は省略する。
まず、画像処理部110~113が実施する水平線又は垂直線の検出処理を、図6を参照して説明する。図6(A)は、書類イメージ610と、書類イメージ610に対する図、水平線、及び垂直線の検出結果620を示す。この処理は、例えば、書類に対するOCR(Optical Character Recognition)処理の前処理として適用することができ、図表の罫線又は枠線を抽出することができる。この処理を用いて、書類イメージ610中の図表領域を特定し、又は罫線を削除することにより、OCRの精度向上が期待できる。
水平線又は垂直線の検出処理は、図6(B)のフローに従って実現することができる。まず、図6(C)に示すように処理画素を中心とした3画素×3画素の画素データに対して、垂直線成分抽出フィルタ及び水平線成分抽出フィルタが適用される。図6(D)は垂直線成分抽出フィルタのフィルタ係数の例を、図6(E)は水平線成分抽出フィルタのフィルタ係数の例を、それぞれ示す。垂直線成分抽出フィルタを適用することにより垂直線成分が抽出され、水平線成分抽出フィルタを適用することにより水平線成分が抽出される。
抽出された各成分を用いて、垂直線判定及び水平線判定が行われる。垂直線判定は、図6(F)に示すように、閾値THvと垂直線成分との比較によって行うことができる。例えば、垂直線成分が閾値THv以上の場合には、処理画素の位置に垂直線があると判定することができる。また、垂直線成分が閾値THvより小さい場合には、処理画素の位置に垂直線はないと判定することができる。同様に、水平線判定は、図6(G)に示すように、閾値THhと水平線成分との比較によって行うことができる。例えば、水平線成分が閾値THh以上の場合には、処理画素の位置に水平線があると判定することができる。また、水平線成分が閾値THhより小さい場合には、処理画素の位置に水平線はないと判定することができる。
ここで、垂直線及び水平線の判定基準となる閾値THv及びTHhの大きさは、フィードバック制御により調整することができる。例えば、隣接画素の判定結果と同一の判定結果が出やすくなるように、隣接画素の判定結果に応じて、閾値を変更することができる。一例として、既に検出処理が完了している、処理画素から垂直方向にある近傍画素に垂直線があると判定された場合、閾値THvを小さくし、処理画素に垂直線があると判定されやすくすることができる。同様に、既に検出処理が完了している、処理画素から水平方向にある近傍画素に水平線があると判定された場合、閾値THhを小さくし、処理画素に水平線があると判定されやすくすることができる。
画像データを、ラスタ処理順(左から右に、かつ上から下に走査)に処理する場合には、図6(H)に*印で示す処理画素に対する判定を、上に隣接する画素の垂直線判定結果と、左に隣接する画素の水平線判定結果とを参照して行うことができる。画像処理部110~113を用いて以下のように並列処理する場合であって、ある画像処理部が処理画素に対する判定を行う場合、上に隣接する画素についての垂直線判定結果はこの画像処理部が保持しており、判定のために参照することができる。一方、左に隣接する画素についての水平線判定結果は、他の画像処理部が保持しており、画像処理部間で転送することにより判定のために参照することができる。隣接画素の水平線判定結果が確定するタイミングと、処理画素の水平線判定結果を参照するタイミングの差を解消するため、隣接画素の水平線判定結果を、隣接画素を処理した画像処理部が保持してもよいし、処理画素を処理する画像処理部が保持してもよい。この点も、実施形態1と同様である。
画像処理部110~113には、実施形態1と同様に、処理領域3100の各画素を処理できる。以下、図17(A)を参照して並列処理方法の一例について説明する。図17(A)は、画像入力部100によって読み出された処理領域3100を示す。説明のために、処理領域3100には、データ列番号L0~L7及び画素番号P0~P15を付与している。
サイクルC1で画像処理部110は、データ列番号L0で画素番号P0(以下、「データ列番号:画素番号」と表現)の処理画素(L0:P0)を処理する。この結果、主走査方向にある処理画素(L0:P1)と、主走査方向とは異なる第2の方向にある処理画素(L1:P0)が処理可能になる。ここで、第2の方向は、下に1画素進む方向に決まる。
サイクルC2で、画像処理部111は、主走査方向にある処理画素(L0:P1)を処理する。また、画像処理部110は、第2の方向にある処理画素(L1:P0)を処理する。サイクルC3以降の処理も、実施形態1と同様である。
画像供給部101は、画像処理部110~113が判定処理を並列に実施するように、画像処理部110~113に画素データを供給する。図17(A)には、画像処理部110に画素データが提供される画素群を示している。画像処理部110により処理される処理画素は斜線で示されている。また、処理画素近傍の3画素×3画素の画素群が網点で示されている。画像供給部101は画像処理部110に斜線及び網点の画素の画素データを供給し、画像処理部110は斜線の処理画素についての処理結果を得る。
画素データは、同一画素番号の画素であれば上から下の順に画像処理部110へと供給される。例えば、画像供給部101は3画素×3画素の画素群3200の画素データを画像処理部110に供給し、画像処理部110は処理画素(L3:P8)の処理結果を得る。次に、画像供給部101は画素群3201の画素データを画像処理部110に供給し、画像処理部110は処理画素(L4:P8)の処理結果を得る。また、画像供給部101は、画素群3202のように処理領域下端の処理画素に対応する画素群の画素データを供給した後は、この処理画素の右列の上端にある処理画素に対応する画素群3203の画素データを供給する。なお、画素群3202及び画素群3203のように処理領域の上下端にある処理画素に対応する画素群は、処理領域外の画素を含む。このような処理領域外の画素データとしては、所定の値が用いられてもよいし、特定のデータ列の画素データが用いられてもよい。
図17(B)~(D)は、図17(A)と同様に、画像処理部111~113に画素データが供給される画素群を示す。
画像供給部101は、画像処理部110への画素データの供給をまず開始し、各画像処理が処理する処理画素が同一のデータ列にないように、画像処理部111、画像処理部112、及び画像処理部113の順に画素データの供給を開始する。図18を参照して、画像処理部110~113へ1画素ずつ供給タイミングをずらして画素データを供給する場合の並列処理の例を説明する。
図18は、処理領域3100のうち、画素番号P8~P12の部分を示す。図18において、網点の画素は処理済みであり、斜線の画素は処理画素である。上記説明した方法によれば、処理画素(L5:P8)、処理画素(L4:P9)、処理画素(L3:P10)及び処理画素(L2:P11)が、画像処理部110、111、112、及び113によって並列に処理される。
図18の矢印は、垂直線検出結果及び水平線検出結果の参照関係を示す。例えば、画像処理部111は、画素(L4:P8)及び画素(L3:P9)の処理結果を参照して処理画素(L4:P9)の処理を行う。また、例えば、画像処理部110は、処理領域の下端画素(L7:P8)を処理後、画素(L0:P12)を処理する。この場合、画像処理部110は、画素(L0:P11)の処理結果を参照して処理を行う。参照すべき処理結果は、画像処理部110が画素(L0:P11)を処理した画像処理部113から取得して保持しておいてもよいし、画像処理部113が保持しておき所望のタイミングで画像処理部110に転送してもよい。
本実施形態において、上下の画素参照関係については、各画像処理部が処理する処理画素の順番により決まる。また左右の画素参照関係については、参照される処理結果を他の画像処理部に転送することで、隣接画素の処理結果が参照可能となっている。また、各画像処理部110~113が異なるデータ列にある処理画素を処理することにより、処理結果を転送するための時間が確保される。本実施例では、同じデータ列にある画素の画素データの供給タイミングを各画像処理部に対して1サイクルずつずらしたが、同時に処理される画素が異なるデータ列にあれば、データの供給方法は限定されない。
以上の処理によって、フィードバックを用いて高精度に垂直線及び水平線を検出する処理を並列に実施することできる。本実施形態でも、実施形態1と同様、処理領域の大きさに影響を受けることなく、任意の高さM(M:自然数)及び任意の幅を有する処理領域に対して並列処理が可能である。
[実施形態4]
本発明の一実施形態に係るデータ処理装置は、音声データ、映像データ、又は各種センサデータなどの、時系列的に入力されるデータ群に対して並列処理を行うことができる。以下では、リカレントニューラルネットワークを用いて順次入力されるデータ群に対する処理を行うデータ処理装置について説明する。実施形態4に係るデータ処理装置は、リカレントニューラルネットワークを用いるデータ処理装置の一例であり、音声データをリアルタイムに認識することにより機械翻訳を行うデータ処理装置である。
図21は、リカレントニューラルネットワークを用いた音声データのリアルタイム機械翻訳の概念図である。本実施形態において、リカレントニューラルネットワークに順次入力される入力されるデータ群は、時系列的な音声の周波数データである。時系列的な音声データに対し、フーリエ変換などの前処理を施すことにより、後段の処理において解析しやすい周波数データを得ることができる。もっとも、リカレントニューラルネットワークに入力されるデータが周波数データに限定されるわけではない。本実施形態に係るデータ処理装置は、このような前処理を行う処理部を有していてもよい。
本実施形態に係るデータ処理装置は、周波数データに基づいて、音声に対応する文脈データを推定する推論処理を行う。具体的には、リカレントニューラルネットワークに周波数データが入力されると、学習済みのパラメータを用いた演算により文脈データが出力される。文脈データとは、音声によって示される内容を示すデータであり、例えば単語と単語間の関係とを示すデータであってもよい。このように推定された文脈データと、翻訳データベースとを照合することにより、音声に対応する機械翻訳結果が得られる。翻訳データベースは、例えば第1の言語の文脈データに対応する、第2の言語の文章を与えるデータベースであってもよいし、第1の言語の単語に対応する第2の言語の単語を与えるデータベースであってもよい。本実施形態に係るデータ処理装置は、このような機械翻訳処理を行う処理部を有していてもよい。
図22はリカレントニューラルネットワークの一例を示す。リカレントニューラルネットワークは、入力層、出力層、及び多段の隠れ層を有し、各層のノード(状態)がエッジで結合されているニューラルネットワークであって、ここで隠れ層のエッジは同じ層のノードに再帰的に接続されている。言い換えれば、隠れ層においては、前の層の出力結果に加えて、同じ層で生成されたデータ(中間データ)を用いて、演算が行われる。例えば、各隠れ層においては、あるデータに対する演算により得られた中間データを用いて、次のデータに対する演算を行うことができる。各ノードにおける演算及び各エッジの重みはパラメータにより表される。パラメータは、入力データに対してこのリカレントニューラルネットワークで得ることが期待される正解データを用いた学習により、事前に決定される。
このようなリカレントニューラルネットワークでは、各層が時系列的に入力されるデータを再帰的に利用することで、段階的に低次の推定から高次の推定までなされるといわれている。本実施形態の場合には、音声データからアルファベット又は五十音のような発音データが推定され、発音データから単語データが推定され、単語データから文脈データが推定されるという、段階的な推定が行われると考えられる。例えば、図21の例では、「りんごをたべる」という日本語の音声データから、「り」「ん」「ご」「を」「た」「べ」「る」という音節ごとの発音データ、及び「りんご」「を」「たべる」という単語ごとの単語データが順次得られる。そして、単語データから、「りんごをたべる」という内容を表す文脈データが得られ、この文脈データの意味を英語で表す"I eat an apple."という英文が得られる。
リカレントニューラルネットワークの推定精度は、一般的に隠れ層の段数が増えるほど高まるといわれるが、リアルタイム処理を行うためには処理時間が制限される。また、言語体系に応じて最低限必要な隠れ層の段数が異なる。このため、発音される言語によって適した隠れ層の段数が異なる。そして、とりわけ隠れ層の段数が可変であり、入力される音声データの長さも可変である場合に、フィードバックループを含むリカレントニューラルネットワークにおける並列処理は困難であった。本実施形態に係るデータ処理装置は、リカレントニューラルネットワークを用いた処理を並列化し、処理時間を短縮できる。
(データ処理装置の構成)
図23は本実施形態に係るデータ処理装置の構成を示す。本実施形態に係るデータ処理装置は、CPU2301のようなプロセッサ、RAM2302のようなメモリ、処理部2303、データ入力部2304、データ出力部2305、及びバス2306を備える。CPU2301は、RAM2302のようなメモリに格納されるコンピュータプログラムを用いて、データ処理装置全体の動作制御を行う。また、CPU2301は、機械翻訳の少なくとも一部の処理を行うことができる。
RAM2302は、CPU2301が使用するコンピュータプログラムを格納する。また、RAM2302は、入出力されるデータ、及び処理中に生成される一時的なデータを記憶するための記憶領域を提供することができる。処理部2303は、リカレントニューラルネットワークを用いた処理を行う処理部であり、CPU2301が前処理を行うことにより得られた音声データを用いて文脈データを推定する。データ入力部2304は、データ処理装置へのデータを取得することができ、例えば音声データをデータ処理装置に入力するためのマイク、及びユーザがデータ処理装置に指示を入力するため入力装置を含んでいてもよい。データ出力部2305は、データ処理装置からデータを外部に出力することができ、例えば翻訳結果を提示する表示装置を含んでいてもよい。上記の各部は、バス2306を介して接続されている。
(処理部2303の構成)
図24は処理部2303の構成例を示す。本実施形態に係る処理部2303は、データ供給部2401、演算ユニット2402,2403,2404,2405、及びデータ記憶部2406,2407,2408,2409を備える。
データ供給部2401は、前処理された音声データを所望のタイミングで演算ユニット2402に供給する。演算ユニット2402~2405は、リカレントニューラルネットワークを構成する隠れ層に対応する演算を行う。例えば、演算ユニット2402~2405のそれぞれは、リカレントニューラルネットワークの隠れ層の演算、及び入力されるエッジに対する重み付けを行うことができる。そして、このような演算により、演算ユニット2402~2405のそれぞれは、隠れ層の出力結果及び再帰的に参照される中間データを繰り返し生成する。1つの演算ユニットは、リカレントニューラルネットワークを用いた処理を行う間に複数回の演算処理を行う。また、1つの演算ユニットは、複数の隠れ層のそれぞれについての演算処理を行うことができる。すなわち、隠れ層演算ユニットは、対応する隠れ層についてのパラメータを用いて、エッジに対する重み付け及び演算を行うことができる。
データ記憶部2406~2409は、演算ユニットからの出力データをそれぞれ格納する。出力データは、所望のタイミングで次の演算ユニットへと伝搬される。また、データ記憶部2406~2409は、隠れ層の演算に用いられる、異なる演算処理時に得られた中間データを格納することができる。この中間データも、所望のタイミングで演算ユニットに提供される。
(動作説明)
最初のステップにおいて、データ入力部2304は、マイクなどを介して音声データを取得する。次のステップにおいて、CPU2301は、音声データに対して前処理を行う。前処理は特に限定されないが、例えば、音声データに含まれるノイズの低減処理、又はフーリエ変換による周波数変換処理であってもよい。前処理の目的は、文脈データの推定精度が上がるように音声データを加工することである。
次のステップにおいて、処理部2303は、前処理された音声データを用いて、文脈データの推定を行う。図25は、音声データから文脈データを推定する処理のフローを説明するための図である。図25は、8段の隠れ層を有するリカレントニューラルネットワークを用いた処理を、並列数4の処理が可能な処理部2303が行う場合の例を示す。
図25には、前処理された音声データが入力時刻に従って時系列上に並べられており、また各音声データに対する各演算ユニットの処理時間がマッピングされている。図25に示すように、本実施形態に係るデータ処理装置には、音声データa~iがデータ群として順次入力される。図25(A)には、さらに音声データから文脈データが得られるまでの、演算ユニットを通るデータの流れが矢印として示されている。また、図25(B)には、さらに演算ユニットで生成され、再帰的に参照される中間データの流れが矢印として示されている。
本実施形態において、複数の演算ユニットのうちの1つの演算ユニットは、隠れ層に対応する演算を行い、演算により生成された隠れ層の出力結果を異なる演算ユニットに転送する。例えば、音声データaに対する演算ユニット2402による1層目の処理が完了すると、次の層で用いられる出力データはデータ記憶部2406を介して即座に演算ユニット2403に転送される。また、演算ユニット2403による2層目の処理が完了すると、出力データはデータ記憶部2407を介して演算ユニット2404に転送される。同様に、演算ユニット2404による3層目の処理が完了すると、出力データはデータ記憶部2408を介して演算ユニット2405に転送される。このようにして、演算ユニット2405による4層目の処理までが完了すると、出力データはデータ記憶部2409に格納される。この出力データは、演算ユニット2402によって5層目の処理を行うのに用いられるが、図25の例においては音声データb,c,dが逐次入力されてその処理が始まっているため、この出力データはデータ記憶部2409にて待機する。
音声データbに対しても、音声データaと同様に演算ユニット2402~2405による1~4層目の処理が行われ、出力データがデータ記憶部2409に格納される。同様に、音声データc及び音声データcに対しても演算ユニット2402~2405による処理が行われる。ここで、処理中の音声データの数が、本実施例における隠れ層演算ユニットの数4と一致する。この場合、データ記憶部2409に格納されている、音声データaについての演算ユニット2405の出力データと、1度目の処理とは異なるパラメータを用いた、演算ユニット2402による5層目の処理が実行される。さらに、1度目とは異なるパラメータを用いた演算ユニット2403~2405による6~8層目の処理が実行され、音声データaに対応する推定された文脈データaが出力される。
一方、入力される音声データの個数(長さ)は不定である。このため、演算ユニットの数よりも多い数の音声データが連続して入力されることがある。例えば、図25(A)に示すように、5つの音声データe~iが連続して入力されることがある。この場合、音声データhが入力された時点で、処理中の音声データの数が、演算ユニットの数4に達する。この場合、音声データeについての、演算ユニット2402による5層目の処理を、すぐに実行することができる。一方で、図25(A)の例では、続けて入力された音声データiは、データ供給部2401に格納され、音声データe~hの処理が完了した時点で、音声データiに対する処理が行われている。データ供給部2401に格納する音声データの数は、演算ユニットの処理性能及び入力される音声データの時間分解能に基づいて決定することができる。また、図25(A)に示す例において、音声データiについて演算ユニット2405による4層目の処理が完了し、データ記憶部2409に出力データが格納された時点では、次の音声データの入力がない。この場合、直ちに演算ユニット2402による、1度目とは異なるパラメータを用いた音声データiの処理を行うことができる。
このように、本実施形態においては、データ処理装置が処理中であるデータ群の数が、並列数(演算ユニットの数)に達するまでは、新たなデータが入力されると、演算ユニットはこのデータに対する1層目の処理を開始する。一方で、データ処理装置が処理中であるデータ群の数が、並列数(演算ユニットの数)に達した場合、新たなデータの処理は開始されず、演算ユニットは既に処理中のデータ群に対する各層の処理を行う。この場合、既に処理中のデータ群に対する処理が完了してから、新たなデータの処理を開始することができる。このような構成によれば、並列処理が行われる割合を増やして全体の処理時間を短縮することで、データが入力されてからニューラルネットワークからの出力が得られるまでのレイテンシを短縮することができる。
また、複数の演算ユニットのうちの1つの演算ユニットは、同じ隠れ層についての中間データを再帰的に参照しながら隠れ層に対応する演算を行う。すなわち、このように音声データ入力から文脈データ推定までの処理が進行する一方で、各演算ユニットで生成され、再帰的に参照される中間データも、処理タイミングに合わせてデータ記憶部から演算ユニットに転送される。例えば、演算ユニット2402が音声データaの処理時に生成した中間データは、次に入力された音声データbに対する演算ユニット2402の処理時に参照される。同様に、演算ユニット2402が音声データdの処理時に生成した中間データは、次に入力された音声データeに対する演算ユニット2402の処理時に参照される。これらの参照タイミングは、リカレントニューラルネットワークを構成する隠れ層の位置に応じて定まる。例えば、演算ユニット2402による音声データdに対する1度目の処理(第1層の処理)と、音声データaに対する2度目の処理(第5層の処理)とは、リカレントニューラルネットワークの異なる隠れ層における演算に対応する。このため、演算ユニット2402による音声データaに対する2度目の処理は、音声データdに対する1度目の処理の直後に行われるが、音声データdに対する処理時に生成される中間データは参照されない。
このように、各演算ユニットは、同じ隠れ層についての中間データを再帰的に参照しながら隠れ層に対応する演算を行い、かつ演算により生成された隠れ層の出力結果を異なる演算ユニットに転送する。こうして、処理部2303が有する複数の演算ユニットは、リカレントニューラルネットワークを用いたデータ群に対する処理を行うことができる。なお、リカレントニューラルネットワークの入力層又は出力層において演算が行われてもよい。このような演算はCPU2301が行ってもよいし、演算ユニット2402~2405が中間データの参照を行わずに行ってもよい。
次のステップにおいて、CPU2301は、推定された文脈データを翻訳データベースと照合することで、翻訳語を生成する。データ出力部2305は、こうして生成された翻訳語を出力することができる。本実施形態においては、図25(A)のように、時系列的に入力される音声データに対する出力結果として、文脈データa、文脈データb、文脈データc、及び文脈データdなどがリアルタイムに順次得られる。このような出力結果を組み合わせて用いることで、徐々に翻訳精度を高めながら、CPU2301は翻訳語を生成することができる。CPU2301は、連続して得られた文脈データが異なる意味を示していると判定した場合、データ出力部2305に対して、これまでの翻訳語とは異なることがわかるように、翻訳語を出力するように指示することもできる。
以上のように、本実施形態によれば、任意の数のデータ群に対して、リカレントニューラルネットワークを用いた処理を行う処理部による並列処理を行うことで、処理を高速化することができる。また、リカレントニューラルネットワークの隠れ層の段数は可変であってもよく、1つの演算ユニットが同じデータ群を処理する回数を変更することにより、この場合でも並列処理を用いることができる。なお、リカレントニューラルネットワークの構成は、本実施形態で説明したものに限定されない。例えば、ノードの出力結果を再帰的に使用する構成を有するニューラルネットワークを用いた処理を、本実施形態に係るデータ処理装置は行うことができる。また、各ノードに記憶セルが設けられ、再帰的にノードの出力結果を使用する、LSTM(Long Short Term Memory)と呼ばれるニューラルネットワークを用いた処理を、本実施形態に係るデータ処理装置が行ってもよい。