以下に、本発明の実施の形態について図面を参照して説明する。
図1は、本発明の一実施形態の家庭用TVゲーム機の構成の一例を示している。
この図に示すように、家庭用TVゲーム機は、装置全体の制御を行うCPU(Central Processing Unit)1(遷移情報算出手段、参照テーブル作成手段、符号化手段、可変長符号化手段)、座標変換などのジオメトリ演算を行うGTE(Graphic Transfer Engine)2、データを一時的に格納するためのメインメモリ3、画像データやプログラムが記録されているCD−ROMからデータを読み出すCD−ROMドライブ4、画像の処理を行うGPU(Graphic Processing Unit)5、GPU5で処理された画像データを格納するフレームバッファ6、および、フレームバッファ6から出力された映像信号を表示するテレビジョン受像機7により構成されている。
次に、この実施の形態の動作について説明する。
家庭用TVゲーム機の電源がオンの状態とされると、CPU1は、メインメモリ3に内蔵されているROM(Read Only Memory)から、起動プログラムを読み込む。そして、その起動プログラムを実行し、オペレーティングシステムを動作させる。
CPU1は、CD−ROMドライブ4から、アプリケーションプログラムを読み出し、メインメモリ3に内蔵されているRAM(Read Only Memory)に格納する。そして、格納されたアプリケーションプログラムを1処理単位ずつ読み出し、実行する。
アプリケーションプログラムにおいて、画像データが表示される処理が実行された場合、CPU1は、CD−ROMドライブ4から、複数の基本図形(ポリゴン)で構成された3次元オブジェクトデータ(ポリゴンの頂点(代表点)の座標値など)を読み出し、GTE2に供給する。
GTE2は、CPU1から供給された各ポリゴンの頂点の座標に対して、座標変換などのジオメトリ演算を実行し、得られたデータをGPU5に供給する。
GPU5は、CPU1を介してGTE2から出力されるポリゴンの座標値(3次元座標値)などのデータを入力し、その3次元の座標値を、所定の表示部に対応する2次元の座標値に変換した後、それらのデータからポリゴンに対応するピクセルデータを生成し、そのピクセルデータをフレームバッファ6に書き込み、レンダリング処理を実行する。
また、ゲームに登場するキャラクタ以外の画像(例えば、背景の画像)などは、後述する画像圧縮処理が施されて、図示せぬCD−ROMに記録されている。GPU5は、CD−ROMドライブ4から、後述する圧縮処理が施された画像データを読み出し、伸長処理を施した後、フレームバッファ6に出力する。フレームバッファ6では、ポリゴンから生成されたピクセルデータと、伸長された画像のピクセルデータに対して所定の重畳処理が施される。
フレームバッファ6に書き込まれたピクセルデータは、NTSC方式に準拠する映像信号に変換され、テレビジョン受像機7に出力される。テレビジョン受像機7は、入力された映像信号を画像として表示出力する。
図2は、図3のCPU40で実行される画像の符号化処理(後述する)と、図1のGPU5において実行される復号化処理の概要を示す図である。
前述したように、CD−ROMに記録されている画像データには、ポリゴンの頂点座標として記録されているものと、圧縮処理が施されたピクセルデータとして記録されているものの2種類がある。そのうち、圧縮処理が施されたピクセルデータは、以下のようなプロセスにより圧縮され、また、伸長処理が施される。
即ち、4ビットのピクセルデータA乃至Cは、2ビットのピクセルデータX1乃至X3に符号化される。そして、4ビットのピクセルデータA’乃至C’に復号化される。なお、符号化される場合に情報の取捨が行われるため、もとのピクセルデータA乃至CとA’乃至C’と同一とは限らない。
従って、本実施の形態では、先ず、A=A’となるような符号化を探索し、それが不可能な場合(A≠A’)には、次のピクセルデータの符号化前と復号化後の値が一致する(B=B’)ような符号化を探索する。次のピクセルデータにおいても、それが困難な場合(B≠B’)には、更に次のピクセルデータの符号化前と復号化後の値が一致する(C=C’)ような符号化が探索されることになる。
なお、以上の実施の形態では、3つのピクセルデータの場合について説明したが、4つ以上のピクセルデータに対しても、本発明は適用可能であることは勿論である。
次に、符号化装置の構成の一例について説明する。
図3は、本発明の符号化装置の一実施の形態の構成を示すブロック図である。この図において、CPU40は、各種演算を実行するとともに、装置各部の制御を行うようになされている。メモリ41は、RAMおよびROMにより構成されており、CPU40が実行するプログラムを記憶しているとともに、演算の途中経過のデータ等を一時的に記憶するようになされている。ハードディスク装置42は、符号化しようとするピクセルデータを記録している。CD作成装置43は、CPU40から供給される符号化されたデータをCD原盤に記録するようになされている。データが記録されたCD原盤をマスタとしてスタンパ処理を施すことにより、CDを作成することが可能となる。
次に、この実施の形態の動作について、図4に示すフローチャートを参照して説明する。この処理は、図3に示すメモリ41またはハードディスク装置42に格納されており、CPU40によって1処理単位ずつ読み出され、実行される。
この処理が実行されると、CPU40は、ステップS1において、ハードディスク装置42から符号化しようとするピクセルデータを、1処理単位ずつ読み出す。
なお、ピクセルデータは、隣接する複数の画素を単位ピクセル(Pixel)とし、各ピクセルの表示色に対応する参照値(インデックス)とされている。即ち、図6に示すように、インデックス“0”のピクセルは、R=30,G=92,B=240の3種類の信号からなる。また、同様に、インデックス“1”のピクセルは、R=55,G=189,B=92の信号からなる。
図4に戻って、ピクセルデータの入力が終了すると、ステップS2に進み、読み込まれたピクセルデータから参照テーブル(後述する)を作成し、メモリ41に格納するとともに、CD作成装置43に出力し、記録させる。
そして、ステップS3に進み、CPU40は、ステップS2において作成された参照テーブルに基づき、ピクセルデータを符号化する。そして、ステップS4に進み、CD作成装置43に符号化されたデータを出力して記録させる。
図5は、図4に示すステップS2の処理の詳細を示すフローチャートである。この処理が実行されると、CPU40は、ステップS20において、所定の領域(例えば、1画面分)のピクセルデータ(1処理単位分のデータ)をメモリ41から読み出す。
ステップS21では、例えば、水平走査方向に隣接する2つのピクセルのインデックスの遷移の頻度を測定し、遷移頻度テーブルを作成する。そして、ステップS22に進み、頻度が高い順に並び換え(ソート)を行う。
図7は、ステップS22の処理の結果得られる遷移頻度テーブルの一例を示している。この図の縦方向は、直前のピクセルのインデックスを示しており、また、横方向は、出現頻度の順番を示している。各ピクセルは、0乃至15の何れかの値を取る。
例えば、この図において、前ピクセルのインデックスが“0”である場合に、最も出現確率が大きい次のピクセルのインデックスは、“0”であり、その次に出現確率が大きいのが“1”,“13”,“2”の順である。
図8は、図7における各ピクセルの出現頻度(%)を示している。例えば、前述のように、前ピクセルが“0”である場合に、インデックスが“0”のピクセルの出現頻度は65%となっている。また、インデックスが“1”のピクセルの出現頻度は17%となっている。
また、図の右端に示されているエントロピは、理想的なハフマンコーディングがなされた場合に必要なビット数を示している。即ち、ハフマンコーディングでは、発生確率の高い符号(この例ではインデックス)に対しては短い伝送符号を、また、発生確率の低い符号に対しては長い伝送符号を付与する。従って、ビット数が大きい程、エントロピが大きく、また、発生確率が高いことを示している。このようなエントロピHは、以下に示す式により求めることができる。
H=Σp(x)log2{1/p(x)} ・・・(1)
但し、p(x)は、符号xの発生確率であり、エントロピHの単位は、bit/sampleである。
なお、図7の例における全てのインデックスのエントロピの相加平均は1.32である。
図5に戻って、ステップS23では、ステップS22でソートされた遷移頻度テーブルのうち、上位M種類が選択され、参照テーブルが作成される。図9は、M=4に設定した場合に得られる参照テーブルを示している。即ち、図7の左から4列分のデータが選択され、図9に示す参照テーブルが作成される。
ステップS24では、CPU40は、得られた参照テーブルをメモリ41に出力するとともに、CD作成装置43に出力し記録させる、そして処理を終了する(エンド)。
参照テーブルが作成されると、CPU40は、図4に示すステップS3以降の処理を実行し、ステップS1の処理において読み出されたピクセルデータを符号化してCD記録作成装置43に出力し、記録させる。
図11乃至図13は、図4のステップS3のピクセルデータ符号化処理の詳細を説明するフローチャートである。この処理は、参照テーブルが作成された後に実行されるようになされている。なお、これらのフローチャートの処理を説明する前に、図10を参照して、これらの動作の概略を説明する。
図10は、図11乃至図13のフローチャートの動作の概略を説明するための図である。いま、仮に、符号化前のピクセルのインデックスとして、X={6,5,8,9}が入力され、また、その場合の参照テーブルは、図9に示すものであるとする。
前述のように、図9の参照テーブルの列方向は、前のピクセルのインデックスを表し、また、行方向は、出現頻度の順番を示している。また、参照テーブルを2次元配列tblにより表すとすると、参照テーブルの各要素tbl[p,j](0≦p≦15,0≦j≦3)は、前ピクセルのインデックスがpであり、出現頻度がj番目であるピクセルのインデックスを示している。例えば、“6”,“5”と連続するインデックス(前述のXの第0番目と第1番目の要素(4ビット))を符号化することを考える。この場合、前ピクセルのインデックスを“6”とし、現ピクセルのインデックスを“5”とすると、これは、tbl[6,3]=5に対応している。従って、これら2つのインデックスを、このようなピクセルの遷移の順番を用いて“3”(2ビット)と表すことにする。
同様にして、Xの第1番目の要素“5”と第2番目の要素“8”は、tbl[5,2]=8に対応しており、従って、符号化値として“2”を得る。また、第2番目の要素“8”と第3番目の要素“9”とは、tbl[8,2]=9に対応しており、従って、符号化値として、“2”を得る。
以上の操作により、符号化後のデータZ’として、Z’={3,2,2}(2ビット)を得る。なお、符号化されたデータを復号する際には、Xの第0番目のデータ(=6)が必要となるので、この“6”(4ビット)も、CD作成装置43に同時に記録する。
以上のようにして符号化されたデータを復号化する場合は、Xの第0番目のインデックス“6”と、Z’の第0番目のデータ“3”より、tbl[6,3]=5として、第1番目のデータを復号化する。また、第2番目のデータは、復号化された第0番目のデータ“5”と、Z’の第1番目のデータ“2”から、tbl[5,2]=8を得る。更に、第3番目のデータも同様にして、tbl[8,2]=9を得ることができる。
次に、図9に示す参照テーブルに掲載されていないインデックスが、符号化しようとするデータに含まれている場合の動作について説明する。例えば、X={2,3,5,8}の場合について考える。
この場合、第0番目のインデックス“2”と第1番目のインデックス“3”は、tbl[2,1]=3より、“1”として符号化することが可能である。しかし、第1番目のインデックス“3”と第2番目のインデックス“5”は、図9の参照テーブル中には存在しない(図9の第3行目には“5”は存在しない)。
このような場合は、第1番目と第2番目のインデックスのマッチング(一致)を断念して、第2番目のインデックスの値を適宜変更し、変更された第2番目のインデックスと第3番目のインデックスのマッチングを図る。
即ち、図10に示すように、第1番目のインデックスが“3”である場合、次に続くことができるインデックスは、参照テーブルより、“3”,“2”,“1”,“4”である。また、これらの次に続くことができる第3番目のインデックスは、参照テーブルから、第2番目のインデックスが“3”である場合は、“3”,“2”,“1”,“4”となる。また、第2番目のインデックスが“2”である場合は、“2”,“3”,“1”,“0”となる。以下、図10に示す通りである。
ところで、Xの第3番目のインデックスは、“8”である。図10に示す樹形図では、第2番目のインデックスが“1”である場合と、“4”である場合に、第3番目のインデックスのそれぞれ第1番目に“8”が含まれている。従って、第2番目のインデックスを、これらの何れかに置換することにより、第1番目乃至第3番目の全てにおいてマッチングを図ることができる。
しかしながら、第2番目のインデックスはもともと“5”であることから、この値を“1”または“4”に置換することにより、元のデータとの間に誤差を生ずることになる。そこで、これらのインデックス“1”、または、“4”のうち、誤差のより少ない方を選択し、参照テーブルにより変換を行う。いま、仮に、第2番目のインデックスとして、“1”を選択した場合の方が誤差が少ないとすると、もともとのピクセルデータX={2,3,5,8}は、X’={2,3,1,8}に変換される。そして、参照テーブルにより、変換が施され、Z’={1,2,1}を得る。
なお、誤差の計算は、例えば、図6のカラールックアップテーブルにおいて、置換後と置換前のインデックスに対応するR,G,Bそれぞれの信号の差の2乗を加算した値を求め、この値がもっとも小さいくなるインデックスを選択するようにすればよい。
次に、図11に示す処理について説明する。
この処理が実行されると、ステップS40において、CPU40は、画像(画面)の垂直方向の座標を示す変数pを値“0”に初期設定する。そして、ステップS41に進み、CPU40は、pの値が垂直方向のピクセル数Hよりも小さいか否かを判定する。その結果、pがHよりも小さい(YES)と判定した場合は、ステップS42に進み、また、pがHよりも大きいかまたは等しい(NO)と判定した場合は処理を終了する(エンド)。
ステップS42では、CPU40は、符号化後のピクセルのインデックスが格納される2次元配列X’の第(p,0)番目に、符号化前のピクセルのインデックスが格納されている2次元配列Xの第(p,0)番目の値を代入する。即ち、画面の水平方向の第0番目のピクセルのインデックスは、初期値として符号化せずに配列X’に格納する。
ステップS43では、画面の水平方向の座標を示す変数qが値“1”に初期設定される。そして、ステップS44に進み、qの値が画面の水平方向のピクセル数Wよりも小さいか否かが判定される。その結果、qの値がWの値よりも大きいか、これらが等しい(NO)と判定された場合は、ステップS51に進み、変数pの値が“1”だけインクリメントされた後、ステップS41に戻り、同様の処理が繰り返される。また、qの値がWよりも小さい(YES)と判定された場合は、ステップS45に進む。
ステップS45では、探索の最大長が代入される変数nestmaxと、探索の結果を示すフラグが代入される変数successがそれぞれ値“0”に初期設定される。そして、ステップS46に進み、探索長を格納する変数nestが値“−1”に初期設定される。そして、ステップS47に進み、図12に示すサブルーチン(詳細は後述する)が呼び出されることになる。
ステップS47のサブルーチンの処理が終了すると、ステップS48に進み,変数nestmaxの値が“1”だけインクリメントされる。そして、ステップS49に進み、変数successの値が“1”よりも大きいか、または、等しいか否かが判定される。その結果、変数successの値が“0”である(NO)と判定された場合は、ステップS46に戻り同様の処理が繰り返される。また、変数successの値が“1”よりも大きいか、または、等しい(YES)と判定された場合は、ステップS50に進む。
ステップS50では、変数qに変数nestmaxの値が加算された後、ステップS44に戻り同様の処理が繰り返されることになる。
次に、図12に示すフローチャートについて説明する。
ステップS47において、図12のサブルーチンが呼び出されると、ステップS70において、変数nestの値が“1”だけインクリメントされる。そして、ステップS71に進み、変数rに、水平方向のピクセルの現在の座標qと、探索長nsetを加算した値が代入される。そして、ステップS72に進む。
ステップS72では、nestの値がnestmaxの値よりも小さいか否かが判定される。その結果、nestの値がnestmaxの値よりも小さい(YES)と判定された場合は、ステップS74に進み、また、nestの値がnestmaxの値よりも大きいか、これらが等しい(NO)と判定された場合は、ステップS79に進む。
ステップS74では、変数kが“0”に初期設定される。そして、ステップS75に進み、変数kの値がMの値(図5において、参照テーブルを作成する際に選択されたデータの種類)よりも小さいか否かが判定される。その結果、変数kの値がMの値よりも小さい(YES)と判定された場合は、ステップS76に進み、また、変数kの値がMの値よりも大きいか、これらが等しい(NO)と判定された場合は、ステップS93に進む。
ステップS76では、図9に示す参照テーブルが格納されている2次元配列tblの第(X’[p,r−1],k)番目の要素が、符号化後のピクセルのインデックスが格納される配列X’の第(p,r)番目に代入される。また、符号化値が格納される2次元配列Zの第(p,r)番目に変数kの値が格納される。そして、ステップS77に進む。
なお、図12に示すサブルーチンは再帰構造となっているので、ステップS77により呼び出される処理は、図12に示す処理自体となる。即ち、ステップS77の処理が実行されると、ステップS70の処理に戻り、同様の処理が繰り返されることになる。この部分の詳細な説明については、後述する。
ステップS77の処理が終了すると、ステップS78に進み、変数kの値が“1”だけインクリメントされ、ステップS75に戻り同様の処理が繰り返される。そして、変数kの値がMと等しくなった時点で、ステップS93に進むことになる。
また、ステップS72において、変数nestの値が変数nestmaxの値よりも大きいか、これらが等しい(NO)と判定された場合は、ステップS79に進む。ステップS79では、変数kが“0”に初期設定される。そして、ステップS80に進み、変数kの値がMの値よりも小さいか否かが判定される。その結果、変数kの値がMの値よりも大きいか、これらが等しい(NO)と判定された場合は、ステップS93に進む。また、変数kの値がMの値よりも小さい(YES)と判定された場合は、ステップS81に進む。
ステップS81では、図9に示す参照テーブルが格納されている2次元配列tblの第(X’[p,r−1],k)番目の要素と、符号化前のピクセルのインデックスが格納されている2次元配列Xの第(p,r)番目の要素が等しい(1)か、または、変数rの値がwの値と等しい(2)か否かが判定される。その結果、これら(1),(2)の少なくとも1つが満足される(YES)と判定された場合は、ステップS83に進み、また、何れも満足されない(NO)と判定された場合は、ステップS82に進む。ステップS82では、変数kの値が“1”だけインクリメントされ、ステップS80に戻り同様の処理が繰り返されることになる。
ステップS81においてYESと判定された場合は、ステップS83に進む。ステップS83では、変数successの値が“1”だけインクリメントされ、ステップS84に進む。ステップS84の処理はサブルーチンとなっており、この処理については後述する。
ステップS84の処理が終了すると、ステップS85に進む。ステップS85では、変数errに格納されている誤差積算値が、変数errminに格納されている誤差積算値の最小値よりも小さい(1)か、または、変数successの値が“1”である(2)か否かが判定される。その結果、これら(1),(2)の少なくとも1つが満足されている(YES)と判定された場合は、ステップS86に進み、また、何れも満足されない(NO)と判定された場合は、ステップS93に進む。
ステップS86では、変数errの値が変数errminに代入される。即ち、現在までの誤差積算値の最小値が変数errの値によって更新される。
ステップS87では、2次元配列Zの第(p,r)番目に変数kの値が格納され、ステップS88に進む。ステップS88では、配列Xの第(p,r)番目の要素が配列X’の第(p,r)番目に代入される。そして、ステップS89に進み、変数jに変数qの値が代入される。
ステップS90では、変数jの値が変数rの値よりも小さいか、または、これらが等しいか否かが判定される。その結果、変数jの値が変数rの値よりも大きい(NO)と判定された場合は、ステップS93に進む。また、変数jの値が変数rの値よりも小さいか、これらが等しい(YES)と判定された場合は、ステップS91に進む。
ステップS91では、配列Zの第(p,j)番目の要素が、配列Z’の第(p,j)番目に代入される。そして、ステップS92に進み、変数jの値が“1”だけインクリメントされ、ステップS90に戻り同様の処理が繰り返されることになる。そして、変数jの値が変数rの値よりも大きくなった時点でステップS93に進む。
ステップS93では、変数nestの値が“1”だけディクリメントされ、元の処理に復帰(リターン)する。即ち、ステップS77の処理から呼び出された(コールされた)場合には、ステップS78の処理に復帰する。また、図11のステップS47の処理から呼び出された場合は、ステップS48の処理に復帰することになる。
図13は、図12のステップS84に示すサブルーチン(ERROR)の処理の詳細を説明するフローチャートである。この処理が実行されると、ステップS100において、誤差積算値が格納される変数errが“0”に初期設定される。そして、ステップS101に進み、変数rに変数qの値が代入され、ステップS102に進む。
ステップS102では、変数rの値が(q+nestmax)の値よりも小さいか否かが判定される。その結果、変数rの値が(q+nestmax)の値よりも小さい(YES)と判定された場合は、ステップS103の処理に進む。
ステップS103の処理では、変数errの現在の値に、{R(X’[p,r])−R(X[p,r])}2の値が加算される。即ち、配列XとX’によって指定される、カラールックアップテーブル(後述する)の赤信号のレベル差(誤差)の2乗の値が、変数errに加算される。
ステップS104の処理では、変数errの現在の値に、{G(X’[p,r])−G(X[p,r])}2の値が加算される。即ち、配列XとX’によって指定される、カラールックアップテーブルの緑信号のレベル差(誤差)の2乗の値が、変数errに加算される。
ステップS105の処理では、変数errの現在の値に、{B(X’[p,r])−B(X[p,r])}2の値が加算される。即ち、配列XとX’によって指定される、カラールックアップテーブルの青信号のレベル差(誤差)の2乗の値が、変数errに加算される。
そして、ステップS106に進み、変数rの値が“1”だけインクリメントされ、ステップS102に戻り同様の処理が繰り返されることになる。そして、変数rの値と(q+nestmax)の値が等しくなった時点で、元の処理に復帰(リターン)することになる。
次に、以上のフローチャートの動作を具体的に説明する。
いま、ピクセルデータとして、X[0,i]={2,3,5,8}(i=0,1,2,3)が読み込まれたとする(H=1,W=4)。また、このとき、これらのデータに対する参照テーブが図9に示すものである場合について考える。なお、このときの処理は、前述の場合と同様であるので、図10の樹形図を適宜参照しながら説明する。
以上のような状況において、図11に示す処理が実行されると、ステップS40において、画面の垂直方向の座標を示す変数pが“0”に初期設定される。そして、ステップS41に進み、変数pの値が水平方向のピクセル数H(=1)よりも小さいか否かが判定される。いま、p=0であるので、YESと判定され、ステップS42に進む。
ステップS42では、配列X’の第(p,0)番目に、配列Xの第(p,0)番目の値が代入される。即ち、いま、p=0であることから、配列X’の第(0,0)番目に、インデックス“2”が格納されることになる。
ステップS43では、画面の水平方向の座標を示す変数qに値“1”が代入され、ステップS44に進む。
ステップS44では、変数qの値が水平方向のピクセル数W(=4)よりも小さいか否かが判定される。いま、q=1であるので、YESと判定され、ステップS45に進む。
ステップS45では、変数nestmaxと変数successが“0”に初期設定される。そして、ステップS46においては、変数nestが“−1”に初期設定される。
そして、ステップS47に進み、図12に示すサブルーチンが呼び出されることになる。
図12に示すサブルーチンが呼び出されると、ステップS70において、変数nestの値が“1”だけインクリメントされる。そして、ステップS71において、変数rに値(q+nest)が代入される。いま、nest=−1であるから、ステップS70の処理により、nest=0(−1+1)となり、また、q=1であるので、ステップS71の処理によりr=1(=1+0)となる。
ステップS72では、nest=0,nestmax=0であるので、NOと判定され、ステップS79に進む。
ステップS79では、変数kが“0”に初期設定される。ステップS80では、変数kの値がM(図5において、参照テーブルを作成する際に選択されたデータの種類)の値よりも小さいか否かが判定される。いま、k=0であり、また、M=4であるので、YESと判定され、ステップS81に進む。
ステップS81では、図9に示す参照テーブルが格納されている2次元配列tblの第(X’[p,r−1],k)番目の要素が、符号化前のピクセルのインデックスが格納されている2次元配列Xの第(p,r)番目の要素と等しいか否かが判定される。いま、p=0,r=1であるので、配列tblの第(X’[0,0],0)番目の要素と、配列Xの第(0,1)番目の要素が比較される。
配列X’の第(0,0)番目には、図11のステップS42において、配列Xの第(0,0)番目の要素“2”が代入されているので、X’[0,0]=2となり、配列tblの第(2,0)番目(図9の第2行目の第0列め)の要素は、“2”となる。また、配列Xの第(0,1)番目の要素は、“3”である。従って、これらは等しくない(NO)と判定され、ステップS82に進み、変数kの値が“1”だけインクリメントされ、ステップS80に戻る。
いま、k=1であるので、ステップS80では、YESと判定され、ステップS81に進む。ステップS81では、k=1であることから、配列tblの第(2,1)番目(図9の第2行目の第1列目)の要素は、“3”となり、配列Xの第(0,1)番目の要素“3”と等しい(YES)と判定され、ステップS83に進む。
ステップS83では、変数successの値が“1”だけインクリメントされ、success=1とされた後、ステップS84に進み、図13のサブルーチンが呼び出される。
図13のサブルーチンのステップS100では、変数errが“0”に初期設定される。そして、ステップS101では、変数rにqの値が代入される。いま、q=1であるので、r=1となる。
次に、ステップS102では、変数rの値が(q+nestmax)の値よりも大きいか否かが判定される。いま、r=1であり、また、q=1,nestmax=0であるので、ステップS102では、NOと判定され、図12のステップS85に復帰する。
ステップS85では、変数errの値が変数errminの値よりも小さいか、または、変数successの値が“1”であるか否かが判定される。いま、success=1であるので、ステップS85ではYESと判定され、ステップS86に進む。
ステップS86では、変数errの値(=0)が変数errminに代入される。そして、ステップS87に進み、変数kの値が2次元配列Zの第(p,r)番目に代入される。即ち、Z[0,1]=1とされる。そして、ステップS88に進み、配列Xの第(p,r)番目の要素が配列X’の第(p,r)番目に代入される。いま、p=0,r=1であるので、配列Xの第(0,1)番目の要素“3”が、配列X’の第(0,1)番目に代入されることになる。
続くステップS89では、変数q(=1)の値が変数jに代入され、ステップS90に進む。
ステップS90では、変数jの値が変数rの値よりも小さいか、または等しいか否かが判定される。いま、j=1であり、r=1であるので、YESと判定され、ステップS91に進む。
ステップS91では、配列Zの第(p,j)番目の要素が配列Z’の第(p,j)番目に代入される。即ち、いま、j=1,p=0であるので、配列Z’の第(0,1)番目の要素“1”が配列Z’の第(0,1)番目に代入されることになる。
そして、ステップS92に進み、変数jの値が“1”だけインクリメントされてj=2とされた後、ステップS90に戻る。ステップS90では、j=2であり、また、r=1であるので、NOと判定され、ステップS93に進む。
ステップS93では、変数nestの値が“1”だけディクリメントされ、元の処理(図11のステップS48)に復帰(リターン)する。
ステップS48では、変数nestmaxの値が“1”だけインクリメントされ、ステップS49に進む。ステップS49では、変数successの値が“1”以上であるか否かが判定される。いま、図12のステップS83の処理において、success=1とされているので、YESと判定され、ステップS50に進む。
ステップS50では、変数qに変数nestmaxの値が加算され、q=2とされ、ステップS44に戻る。
ステップS44では、q<W(=4)であることからYESと判定され、ステップS45に進む。そして、変数nestmaxと変数successの値がそれぞれ“0”に再度初期設定される。
ステップS46では、変数nestが“−1”に初期設定され、ステップS47に進み、サブルーチンが再度呼び出される。
図12のステップS70では、変数nestの値が“1”だけインクリメントされ、nest=0とされる。また、ステップS71では、変数rに(q+nest)の値(=2)が代入され、ステップS72に進む。
ステップS72では、nest=0,nestmax=0であることから、NOと判定され、ステップS79に進み、変数kの値が“0”に初期設定された後、ステップS80に進む。
ステップS80では、変数kの値が変数Mの値よりも小さいか否かが判定される。いま、k=0であり、また、M=4であるので、YESと判定され、ステップS81に進む。
ステップS81では、前述のように、図9に示す参照テーブルが格納されている配列tblの第(X’[p,r−1],k)番目の要素と、符号化前のピクセルのインデックスが格納される配列Xの第(p,r)番目の要素が等しいか、または、変数rの値が画面の水平方向のピクセル数Wの値と等しいか否かが判定される。いま、p=0,r=2,k=0であるから、配列tblの第(X’[0,1],0)番目の要素と配列Xの第(0,2)番目の要素が比較される。
配列X’の第(0,1)番目の要素は、ステップS88の処理において、値“3”が代入されているので、X’[0,1]=3である。従って、tbl[3,0]=3となり、また、配列Xの第(0,2)番目の要素は“5”であるので、tbl(X’[p,r−1],k)≠X[p,r]となる。更に、r≠Wであるので、ステップS81では、NOと判定され、ステップS82に進む。
図12に戻って、ステップS82では、変数kの値が“1”だけインクリメントされ、ステップS80に戻る。
ステップS80では、k=1であるので、NOと判定され、ステップS81に進む。ステップS81では、配列tblの第(X’[0,1],1)番目の要素“2”(図9の第3行目の第1列目の要素)と、配列Xの第(0,2)番目の要素“5”が比較される。その結果、NOと判定され、ステップS82に進む。
第2回目と第3回目の処理(k=2,3)では、図9に示す配列tblの第3行目の第2列目の要素(=1)と第3列目の要素(=4)と、配列Xの第(0,2)番目の要素(=5)がそれぞれ比較される。そして、双方ともにNOと判定され、第4回目の処理において、ステップS80でNOと判定され、ステップS93に進む。そして、ステップS93において、変数nestの値が“1”だけディクリメントされ、図11のステップS48に復帰(リターン)する。
即ち、第1番目と第2番目のピクセルの遷移パターンは、参照テーブルに含まれていないと判定されたので、その場合、第1番目のピクセルの後に継続可能なピクセルのインデックスを参照テーブルより見つけだし(この場合“3”,“2”,“1”,“4”が継続可能)、更にその次(第3番目)に継続可能なピクセルのインデックスを同様に参照テーブルより見つけだすことにより作成される樹形図(図10参照)の各パスのうちで最適なパスを以降の処理により選択する。
ステップS48では、変数nestmaxの値が“1”だけインクリメントされてnestmax=1とされ、ステップS49に進む。ステップS49では、success=0であるので、NOと判定され、ステップS46に戻る。
ステップS46では、変数nestの値が“−1”に再設定され、ステップS47においてサブルーチンが呼び出される。
図12のステップS70では、変数nestの値が“1”だけインクリメントされてnest=0とされる。ステップS71では、変数rに(q+nest)の値(=2)が代入される。
ステップS72では、変数nestの値が変数nestmaxの値よりも小さいか否かが判定され、いま、nest=0,nestmax=1であるので、YESと判定され、ステップS74に進む。
ステップS74では、変数kの値が“0”に初期設定され、ステップS75に進み、変数kの値がMの値(図5において、参照テーブルを作成する際に選択されたデータの種類)よりも小さいか否かが判定される。いま、k=0,M=4であるので、YESと判定され、ステップS76に進む。
ステップS76では、配列tblの第(X’[p,r−1],k)番目の要素が配列X’の第(p,r)番目に代入されるとともに、変数kの値が配列Zの第(p,r)番目に格納される。即ち、いま、p=0,r=2であるので、X’[p,r−1]=3であり、また、k=0であるので、tbl[3,0]の要素“3”が配列X’の第(0,2)番目に代入されるとともに、配列Zの第(0,2)番目に値“0”が代入される。即ち、図10の樹形図において、第2番目のピクセルのインデックスとして“3”が選択される。そして、ステップS77に進む。
ステップS77では、サブルーチンが呼び出される。前述のように、ステップS77のサブルーチンコールの結果、図12に示すサブルーチン自体が呼び出されることになるので、ステップS70の処理が実行される。
ステップS70では、変数nestの値が“1”だけインクリメントされ、nest=1とされ、ステップS71に進む。ステップS71では、変数rに(q+nest)の値(=3)が代入される。
続くステップS72では、変数nestの値と、変数nestmaxの値が共に“1”であることから、NOと判定され、ステップS79に進む。
ステップS79では、変数kの値が“0”に初期設定され、ステップS80に進む。ステップS80では、M=4であることからYESと判定され、ステップS81に進む。
ステップS81では、配列tblの第(X’[p,r−1],k)番目の要素と、配列Xの第(p,r)番目の要素が等しいか、または、変数rとWの値が等しいか否かが判定される。いま、p=0,r=3,k=0であることから、X’[p,r−1]=X’[0,2]=3(ステップS76において代入された値)となるので、tbl(X’[p,r−1],k)=tbl[3,0]=3(図9の第3行目の第0列目の要素)となる。また、X[p,r]=X[0,3]=8であるので、ステップS81では、NOと判定され、ステップS82に進む。
即ち、図10の第2番目のピクセルのインデックスが“3”である場合であって、第3番目のピクセルのインデックスが“3”である場合に、この第3番目のインデックス“3”は、符号化前のデータ“8”とは一致しないのでNOと判定される。
ステップS82では、変数kの値が“1”だけインクリメントされてk=1とされ、ステップS80に戻る。ステップS80では、M=4であることからYESと判定され、ステップS81に進む。
ステップS81では、前述の場合と同様に、配列tblの第(3,1)番目の要素“2”(図10の第2番目のインデックスが“3”であり、第3番目のインデックスが“2”である場合)と、配列Xの第(0,3)番目の要素“8”とが比較され、その結果、NOと判定され、ステップS82に進む。
同様の処理は、配列tblの第(3,2)番目の要素“1”と第(3,3)番目の要素“4”についても実行される。しかしながら、これらの何れの場合においてもNO(配列Xの第(0,3)番目の要素“8”とは異なる)と判定され、第5回目のループ(k=4)のステップS80でNOと判定され、ステップS93に進む。そして、変数nestの値が“1”だけディクリメントされてnest=0とされた後、元の処理(ステップS78)に復帰(リターン)する。
即ち、第2番目のインデックスが“3”である場合には、第3番目のインデックスとして“8”(符号化前のピクセルデータのインデックス)は継続しない(NO)と判定される。
ステップS78では、変数kの値が“1”だけインクリメントされてk=1とされ、ステップS75に戻る。ステップS75では、YESと判定されるので、ステップS76に進む。ステップS76では、配列tblの第(X’[p,r−1],k)番目の要素が配列X’の第(p,r)番目に代入される。即ち、いま、p=0,r=2,k=1であるので、tbl(X’[p,r−1],k)=tbl[3,1]=2となり、この値“2”が配列X’の第(0,2)番目に代入されることになる。また、配列Zの第(0,2)番目に“1”が代入される。そして、ステップS77に進み、サブルーチンが呼び出される(ステップS70の処理が実行される)。
即ち、これ以降の処理においては、第2番目のインデックスが“2”である場合(図10参照)について処理が行われることになる。
ステップS70では、変数nestの値が“1”だけインクリメントされ、nest=1とされ、ステップS71において、変数rに(q+nest)の値(=3)が代入される。
続くステップS72では、nest=1,nestmax=1であることからNOと判定され、ステップS79に進み、変数kの値が“0”に初期設定される。そして、ステップS80に進む。
ステップS80では、k=0であるのでYES(0<4)と判定され、ステップS81に進む。ステップS81では、配列tblの第(X’[p,r−1],k)の要素と、配列Xの第(p,r)番目の要素が等しいか、または、変数rの値とWとが等しいか否かが判定される。いま、p=0,r=3,k=0であるので、X’[p,r−1]=2(ステップS76において代入された値)である。従って、tbl(X’[p,r−1],k)=2となり、また、X[p,r]=8であるので、ステップS81では、NOと判定され、ステップS82に進む。
即ち、第2番目のインデックスが“2”である場合の、第3番目のインデックスの第0番目の値は“2”であるので、符号化前のデータ“8”と一致しない(NO)と判定される。
続いて、k=1,2,3の処理では、tbl(X’[p,r−1],k)の値は、“3”,“1”,“0”(図10の第2番目のインデックスが“2”である場合の第3番目のインデックスの第1乃至第3番目の値)となる。前述のように、X[p,r]=8であるので、何れの処理においてもNOと判定される。従って、第4回目(k=4)のステップS80においてNOと判定され、ステップS93進む。そして、変数nestの値が“1”だけディクリメントされてnest=0とされ、ステップS78の処理に復帰(リターン)する。
ステップS78では、変数kの値が“1”だけインクリメントされてk=2とされ、ステップS75に戻り、YESと判定され、ステップS76に進む。そして、前述の場合と同様の処理が実行され、配列X’の第(0,2)番目に、配列tblの第(3,2)番目の要素“1”が代入されるとともに、配列Zの第(0,2)番目に値“2”が代入され、ステップS77において、サブルーチンが呼び出される。
即ち、第2番目のインデックスの値が“1”とされ、サブルーチンが呼び出されることになる。
それ以降の処理は、前述の場合と同様である。即ち、ステップS70の処理によりnest=1とされ、また、ステップS71の処理により、変数rに(q+nest)の値(=3)が代入された後、ステップS72において、NOと判定され、ステップS79に進む。
そして、第0回目(k=0)の処理では、配列tblの第(X’[p,r−1],k)番目の要素と、配列Xの第(p,r)番目の要素が等しいか、または、変数rの値とWの値が等しいか否かが判定される。いま、p=0,r=3,k=0であるので、X’[p,r−1]=1(ステップS76で代入された値)となる。従って、tbl(X’[p,r−1],k)=1となり、また、X[p,r]=8であることからNOと判定される。
次に、第1回目(k=1)の処理では、tbl(X’[p,r−1],k)=8となるので、ステップS81においてYESと判定される。即ち、図10の第2番目のインデックスが“1”であり、第3番目のインデックスの第2番目は、“8”であるので、YESと判定され、ステップS83に進む。そして、変数successの値が“1”だけインクリメントされた後、ステップS85に進み、図13に示すサブルーチンがコールされることになる。
図13のステップS100では、変数errが“0”に初期設定され、続くステップS101では、変数rに変数qの値(=2)が代入される。そして、ステップS102に進む。
ステップS102では、変数rの値が(q+nestmax)の値よりも小さいか否かが判定される。いま、r=2であり、また、(q+nestmax)=3であるので、YESと判定され、ステップS103に進む。
ステップS103乃至ステップS105では、第2番目のインデックスを変更した(この場合、“5”から“1”に変更した)ことに伴い発生する、R,G,Bそれぞれの信号の誤差が計算され、変数errに代入される。
即ち、配列X={2,3,5,8}であり、いま、第1番目の要素“3”と第2番目の要素“5”の遷移は、図9に示す遷移テーブルには存在しない(tblの第3行目には要素“5”が存在しない)ので、第1番目と第2番目の要素との間でのマッチングを断念し、第2番目の要素と第3番目の要素との間でマッチングを図るために、配列X’の第2番目に、“3”,“2”,“1”,“4”をステップS76においてそれぞれ代入し、ステップS81の処理において、配列X’の第2番目の要素と、配列Xの第3番目の要素(=8)との間でマッチングを図る(パスを検索する)。
その結果マッチングが得られたパスに対して誤差を計算する。即ち、第2番目の要素は、元の要素(=5)とは異なるので、新たな第2番目の要素を図6に示すカラールックアップテーブルに代入した場合、元のR,G,Bそれぞれの信号との間の誤差が生ずることになるので、これら各々の誤差の2乗の和をerrとして計算する。そして、マッチングが得られたパスの内、誤差が最小となるパスが選択されることになる。
ステップS103では、変数errに{R(X’[p,r])−R(X[p,r])}2の値が加算される。同様に、ステップS104では、変数errに{G(X’[p,r])−G(X[p,r])}2の値が加算され、また、ステップS105では、変数errに{B(X’[p,r])−B(X[p,r])}2の値が加算される。
そして、ステップS106に進み、変数rの値が“1”だけインクリメントされた後、ステップS102に戻る。ステップS102では、変数rの値が(q+nestmax)の値よりも小さいか否かが判定される。いま、r=3,q=2,nestmax=1であるので、NOと判定され、ステップS85の処理に復帰(リターン)することになる。
ステップS85では、変数errの値が変数errminの値よりも小さいか、または、変数successの値が“1”であるか否かが判定される。いま、ステップS83において、success=1とされているので、YESと判定され、ステップS86に進む。そして、変数errminに変数errの値が代入される。いまの場合、配列X’の第2番目の要素を“5”から“1”に変更したために生ずる誤差が変数errminに代入されることになる。
続くステップS87において、配列Zの第(0,3)番目に変数kの値(=1)が代入され、更に、ステップS88において、配列Xの第(0,2)番目の要素“8”が、配列X’の第(0,2)番目に代入される。そして、ステップS89に進み、変数jに変数qの値が代入される。いま、q=2であるので、j=2とされ、ステップS90に進む。
ステップS90では、変数jの値が変数rの値以下であるか否かが判定される。いま、r=3であるので、YESと判定され、ステップS91に進む。ステップS91では、配列Zの第(p,j)番目の要素が、配列Z’の第(p,j)番目に代入される。即ち、Z[0,2]=2が、配列Z’の第(0,2)番目に代入される。
そして、ステップS92に進み、変数jの値が“1”だけインクリメントされてj=3とされた後、ステップS90に戻る。ステップS90では、YES(3≦3)と判定され、ステップS91に進む。
ステップS91では、Z[0,3]=1が、配列Z’の第(0,3)番目に代入された後、ステップS92に進み、変数jの値が“1”だけインクリメントされた後、ステップS90に戻り、NOと判定されてステップS93に進む。
ステップS93では、変数nestの値が“1”だけディクリメントされてnest=0とされ、ステップS78の処理に復帰(リターン)する。
ステップS78では、変数kの値が“1”だけインクリメントされてk=3とされ、ステップS75の処理に戻る。ステップS75では、YES(3<4)と判定され、ステップS76に進む。
ステップS76では、配列tblの第(X’[p,r−1],k)番目の要素が配列X’の第(p,r)番目に代入される。即ち、いま、p=0,r=3,k=3,r=2であるので、tbl(X’[p,r−1],k)=4となり、この値“4”が配列X’の第(0,2)番目に代入される。また、配列Zの第(0,2)番目に値“3”が代入される。そして、ステップS77に進み、サブルーチンがコールされる(ステップS70の処理が実行される)。
即ち、図10において、第2番目のインデックスの値が“4”である場合に対して処理が実行される。
ステップS70以降は、前述の場合と同様の処理が実行される。いま、配列tblの第(4,1)番目の要素(図9の第5行目の第2列目)は、“8”であるので、1回目(k=1)のループのステップS81において、YESと判定され、ステップS83に進む。
即ち、図10において、第2番目のインデックスが“4”である場合に、第3番目のインデックスの第1番目は“8”であるのでYESと判定される。
ステップS83では、変数successの値が“1”だけインクリメントされ、ステップS84に進む。
ステップS84では、図13に示すサブルーチンが呼び出され、前述の場合と同様に、第2番目のインデックスを“5”から“4”に変更したことにより生ずる誤差が計算され、変数errに代入されて復帰(リターン)する。
ステップS85では、変数errの値がerrminの値よりも小さいか、または、変数successの値が“1”であるか否かが判定される。いま、仮に、err>errminであるとする。即ち、図10において、第2番目のインデックスが“1”である場合のパスの方が第2番目のインデックスが“4”である場合のパスよりも誤差が小さいとすると、success=2であるので、ステップS85では、NOと判定され、ステップS93に進む。そして、変数nestの値が“1”だけディクリメントされた後、ステップS78の処理に復帰(リターン)する。
ステップS78では、変数kの値が“1”だけインクリメントされてk=4とされ、ステップS75に戻る。ステップS75では、NOと判定されるので、ステップS93に進み、変数nestの値が“1”だけディクリメントされた後、図11のステップS48に復帰(リターン)する。
ステップS48では、変数nestmaxの値が“1”だけインクリメントされた後、ステップS49に進む。ステップS49では、success=2であることからYESと判定され、ステップS50に進む。そして、変数qにnestmaxの値が加算されてq=4とされ、ステップS44の処理に戻る。
いま、仮に、画面の水平方向のピクセル数W=4であり、また、画面の垂直方向のピクセル数H=1であるので、ステップS44では、NOと判定され、ステップS51の処理に分岐する。
ステップS51では、変数pの値が“1”だけインクリメントされ、ステップS41に戻る。いま、p=1であり、また、H=1であるので、ステップS41では、NOと判定され、処理を終了する(エンド)。
以上の処理によれば、符号化前のピクセルのインデックス(4ビット)として、X={2,3,5,8}が入力された場合、符号化後のピクセルのインデックス(4ビット)は、X’={2,3,1,8}となる。また、符号化後のデータZ’(2ビット)は、Z’={1,2,1}となる。
従って、以上の実施の形態によれば、入力されたピクセルデータを、隣接するピクセルの遷移の出現頻度が大きい順にリストアップされた参照テーブルを参照することにより、効率よく圧縮処理することが可能となる。
図14は、図1に示すGPU5の詳細な構成の一例を示している。
この図において、テーブル50(参照テーブル記憶手段、入力手段、復号化手段)は、入力されるピクセルデータに対応する参照テーブル(図9参照)が格納されており、符号化された2ビットのデータ(以下、符号化データと略記する)の入力を受け、対応する4ビットのピクセルデータ(元のデータ)を出力するようになされている。遅延回路(D)51(復号化手段)は、テーブル50から出力された4ビットのデータを、1データ分だけ遅延し、テーブル50に供給するようになされている。スイッチ52は、GPU5に入力されたピクセルデータが第0番目(最初)のデータ(4ビット)である場合は、スイッチをexceptional pass側に切り換え、このデータをカラールックアップテーブル53(カラールックアップテーブル記憶手段、変換手段)に供給する。また、それ以外のデータ(2ビット)が入力された場合は、スイッチ52の接続がテーブル50側に変更され、テーブル50から出力される、復号化処理が施されたデータがカラールックアップテーブル53に出力されるようになされている。
カラールックアップテーブル53は、図6に示すカラールックアップテーブルが格納されており、スイッチ52を介して供給された復号化処理が施されたデータを入力し、そのデータに対応するR,G,Bの画像信号をそれぞれ出力する。
画像の符号化処理は、例えば、画面の特定の領域(例えば、類似した画像のパターンよりなる領域)を1処理単位として実行されるので、参照テーブルとカラールックアップテーブルは、処理単位毎に作成される。従って、これら2つのテーブルのデータは、新たな処理単位のデータが入力される直前に読み出され、テーブル50と、カラールックアップテーブル53にそれぞれ格納される。
次に、以上の実施の形態の動作について説明する。
図1に示すCPU1は、CD−ROMドライブ4に制御信号を送り、図示せぬCD−ROMに記録されている、参照テーブルのデータと、カラールックアップテーブルのデータを読み出し、GPU5に供給する。GPU5は、これらのデータを入力し、参照テーブルのデータは、テーブル50に、また、カラールックアップテーブルのデータは、カラールックアップテーブル53にそれぞれ格納する。
それぞれのテーブルへのデータの格納が終了すると、CPU1は、CD−ROMドライブ4に対して、制御信号を送り、ピクセルデータ(2ビット)読み出させ、GPU5に供給させる。
第0番目(最初)のピクセルデータ(4ビット)が入力されると、GPU5のスイッチ52がexceptional pass側に切り換えられ、入力されたデータは、カラールックアップテーブル53に供給されると同時に、遅延回路51に供給される。
次に、第1番目の符号化データ(2ビット)が入力されると、このデータはテーブル50に供給される。このとき、遅延回路51からは、第0番目のデータが出力されるので、テーブル50は、入力された第1番目のデータと、遅延回路51から出力されたデータより、元のピクセルデータ(4ビット)を復号し、出力する。
いま、スイッチ52は、テーブル50側に接続されているので、テーブル50から出力されたデータは、遅延回路51とカラールックアップテーブル53に出力される。カラールックアップテーブル53は、入力されたデータに対応する大きさのR,G,B信号をそれぞれ出力する。
第2番目以降の符号化データに対しても同様の処理が繰り返され、復号化されたR,G,B信号が逐次出力されていく。このような処理は、1処理単位が終了するまで繰り返される。そして、次の処理単位が復号化される場合には、CD−ROMドライブ4から、新たな参照テーブルとカラールックアップテーブルのデータが読み出され、カラールックアップテーブル53とテーブル50にそれぞれ格納された後に、復号化処理が実行される。
以上の実施の形態によれば、ピクセルデータの遷移情報と、既に復号化された隣接ピクセルの情報を用いることにより、画像情報を効率よく圧縮することが可能となるとともに、表現可能な色の種類を増加させることが可能となる。
図15は、本発明の他の実施の形態の構成の一例を示すブロック図である。
この図において、図14と同一の部分には同一の符号を付してあるので、その説明は省略する。この図においては、2つの遅延回路51−1と遅延回路51−2が具備されており、それぞれの遅延回路の出力がテーブル50に入力されるようになされている。また、スイッチ52は、第0番目と第1番目の符号化データが入力される場合に、exceptional pass側に接続されるようになされている。
また、テーブル50に格納されている参照テーブルは、図16に示すように、1つ前と2つ前のピクセルデータ(縦方向)と、符号化データ(横方向)より、元のデータを復号するようになされている。例えば、2つ前と1つ前のピクセルデータがそれぞれ“0”,“1”である場合(第1行目)に、符号化データが“3”であるとき(第3列目)は、復号データは、“6”となる。
その他の構成は、図14における場合と同様である。
次に、この実施の形態の動作について簡単に説明する。
第0番目の符号化データ(4ビット)が入力されると、テーブル50に供給される。また、このときスイッチ52は、exceptional pass側に接続されているので、第0番目のピクセルデータは、カラールックアップテーブル53と、遅延回路51−1に供給される。カラールックアップテーブル53は、入力されたピクセルデータに対応するR,G,B信号を図6に示すカラールックアップテーブルを参照して生成し、出力する。
第1番目の符号化データ(4ビット)が入力された場合にも、スイッチ52は、exceptional pass側に接続されている。従って、第1番目のピクセルデータは、カラールックアップテーブル53と遅延回路51−1に供給される。カラールックアップテーブル53は、入力されたピクセルデータに対応するR,G,B信号を生成し、出力する。
第2番目の符号化データ(2ビット)が入力されると、スイッチ52は、テーブル50側に接続が変更される。テーブル50は、第2番目の符号化データ、遅延回路51−1から出力されるデータ(1つ前のデータ)、および、遅延回路51−2から出力されるデータ(2つ前のデータ)を参照テーブルに適用することにより、元のデータを復号化する。復号化されたデータは、スイッチ52を介してカラールックアップテーブル53に供給されるとともに、遅延回路51−1に供給される。
カラールックアップテーブル53は、テーブル50により復号化されたピクセルデータに対応するR,G,B信号を出力する。
以上の動作は、1処理単位が終了するまで繰り返され、画像データが再生されることになる。1処理単位が終了すると、CD−ROMドライブ4から新たな処理単位のカラールックアップテーブルと参照テーブルのデータが読み出され、カラールックアップテーブル53とテーブル50にそれぞれ格納された後、新たな符号化データの読み出しが開始されることになる。
以上の実施の形態によれば、ピクセルデータの遷移情報、既に復号化された2つの隣接ピクセルの情報を用いることにより、表現可能な色の種類を増加させることが可能となるとともに、各ピクセルデータの発生確率を下げることが可能となるので、エントロピを更に下げることが可能となる。例えば、図7に示す例では、1.32であるエントロピを、1.18程度に下げることが可能となる。その結果、符号化時に発生する誤差を更に低減させることが可能となる。
図17は、本発明の更に他の実施の形態の構成を示すブロック図である。
この図において、図14と同一の部分には同一の符号が付してあるので、その説明は省略する。この実施の形態では、画面の水平ピクセルデータ数だけ遅延する遅延回路(H)60(復号化手段)が新たに追加されている。また、スイッチ52は、第0番目から水平ピクセル分の符号化データ(第0番目の水平ピクセルデータ)の入力が終了するまでは、exceptional pass側に接続されるようになされている。
また、テーブル50に格納されている参照テーブルは、図16に示す参照テーブルの、2つ前のデータが1水平ピクセル前のピクセルデータと置換されたものとされている。
その他の構成は、図14における場合と同様である。
この例では、前述のように、スイッチ52は、第0番目(最初)の1水平ピクセル分の符号化データ(4ビット)が入力されている場合は、exceptional pass側に接続される。従って、入力された符号化データは、スイッチ52を介して遅延回路60に供給されるとともに、カラールックアップテーブル53に供給される。カラールックアップテーブル53は、入力された符号化データに対応するR,G,B信号を出力する。
なお、このとき、テーブル50は、復号化処理を実行しないので、入力されたピクセルデータと遅延回路51から出力されるデータは無視されることになる。
次に、第1番目の水平ピクセルのデータの入力が開始されると、スイッチ52は、テーブル50側に接続が変更される。テーブル50は、入力された符号化データ、遅延回路51から出力される1つ前のデータ、および、1水平ピクセル分前のデータを参照テーブルに適用し、元のデータを復号化する。復号化されたデータは、スイッチ52を介してカラールックアップテーブル53に供給される。カラールックアップテーブル53は、復号化されたデータに対応するR,G,B信号をカラールックアップテーブルを参照して生成し、出力する。
以上の処理は、1処理単位分繰り返される。そして、1処理単位の処理が終了すると、CD−ROMドライブ4から、新たなカラールックアップテーブルと参照テーブルのデータが読み出され、カラールックアップテーブル53とテーブル50にそれぞれ格納される。そして、新たな処理単位の符号化データの復号化処理が実行される。
以上のような実施の形態によれば、1つ前のピクセルだけでなく、1水平ライン前のピクセルのデータとの間のインデックスの遷移情報に応じてデータを圧縮(符号化)し、復号化するようにしたので、図14の実施の形態に比べて、符号化時の誤差の発生を抑制することが可能となる。
なお、以上の実施の形態では、図9に示す参照テーブルを作成する場合、出現確率が上位4通りのピクセルを選択するようにした。しかしながら、本発明はこのような場合に限定されるものではない。例えば、出現確率とともに、隣接ピクセルとの色の変化の差(R,G,B空間における距離)を考慮して、参照テーブルを作成するようにしてもよい。
例えば、出現確率が低い場合でも、隣接ピクセルとの色が極端に異なる場合(変化の差が大きい場合)では、エラーの発生が増加することが考えられるので、4通りのピクセルとして、最初の1つは、出現確率が最も高いピクセルを選択し、以下の3つは、出現確率と色の差の双方にある重み付けをして得られた結果に応じて選択するようにしてもよい。このような方法によれば、隣接ピクセルとの色の変化が極端に大きな場合においても圧縮(符号化)時のエラーを抑制することが可能となる。
また、単一の画像中に性質(表示パターンなど)の異なる部分が存在している場合は、画像を性質に応じて複数の領域に分割してそれぞれを処理単位とし、それぞれの領域に対して作成された参照テーブルを元に、各処理単位(領域)を復号化するようにしてもよい。そのような構成によれば、伝送または記録する参照テーブルのデータ数は増加するが、符号化時における符号化誤差を低減することが可能となる。
更に、以上の実施の形態では、参照テーブルにより符号化された情報は、そのまま出力されるようにしたが、例えば、可変長符号化(ランレングス符号化またはハフマン符号化など)を用いて更に符号化してから出力するようにしてもよいことは勿論である。このような構成によれば、画像情報を更に圧縮することが可能となる。
ところで、家庭用TVゲーム機などにおいては、スプライトによるキャラクタの描画時に、特定のインデックス(以下、特定インデックスと略記する)を有する領域を透明領域とみなし、その領域を描画しない手法が用いられることがある。
例えば、前述の特定インデックスが0であるとすると、図18に示すインデックスデータは、図19に示すような表示画面として描画されることになる。このような画像データに対して前述のような画像圧縮を施した場合、仮に、この特定インデックスが他のデータに変換されたとすると、その部分は特定の表示色により表示されることなり、画像情報が著しく変容してしまう。また、逆に、特定インデックスが他のインデックス変換された場合も、輪郭情報が欠落することになる。
図20は、前述の特定インデックスが含まれているデータに対応する参照テーブル作成処理の一例を示している。なお、この図において、図5と同一の処理には同一の符号が付してあるので、その説明は省略する。
図20に示す処理では、図5の処理に比較してステップS60とステップS61とが新たに追加されている。ステップS60では、特定インデックスF(=0)への遷移が存在するか否かが判定される。その結果、特定インデックスへの遷移が存在する(YES)と判定された場合には、ステップS61に進む。また、特定インデックスへの遷移が存在しない(NO)と判定された場合には、ステップS23に進む。
ステップS61では、遷移頻度が第M番目のインデックスと、特定インデックスとが置換される。そしてステップS23に進む。
ステップS23では、遷移頻度が上位M種類のインデックスが選択される。即ち、特定インデックスFに遷移するデータが含まれている場合には、ステップS61において、この特定インデックスFが第M番目のインデックスと置換されることになるので、ステップS23において選択される上位M種類のインデックスには、特定インデックスが必ず含まれることになる。従って、特定インデックスは確実に保存されることになる。
図21は、図11のステップS47のサブルーチンを、特定インデックスに対応するように変更した処理を説明するフローチャートである。なお、この図において、図12の場合と同一の処理には同一の符号が付してあるのでその説明は省略する。
この処理では、ステップS110が新たに追加されている。このステップS110の処理では、特定インデックスではないピクセルデータ(X[p,r]≠F)が、特定インデックスに変換された(X’[p,r]=F)か否かが判定される。その結果、特定インデックス以外のピクセルデータが特定インデックスに変換された(YES)と判定された場合には、ステップS75に戻り、図12の処理において説明したのと同様の処理を繰り返すことになる。また、ステップS110において、特定インデックス以外のピクセルデータが特定インデックスに変換されていない(NO)と判定された場合には、ステップS77に進み、データの変換処理が継続されることになる。
従って、以上の処理によれば、特定インデックス以外のデータが特定インデックスに変換された場合には、ステップS110においてYESと判定され、その変換に対する処理は無視されることになるので、特定インデックス以外のデータが特定インデックスに変換されることを防止することができる。
なお、以上の実施の形態では、特定インデックスに遷移するデータが存在する場合には、この特定インデックスを第M番目のデータと置換するようにしたが、本発明はこのような場合に限定されるものではない。例えば、特定インデックスを第(M−1)番目のデータと置換してもよいことは勿論である。