以下、本発明を図示する実施形態に基づいて説明する。
<<< §1. 基本的な実施形態の構成 >>>
図1は、本発明の基本的な実施形態に係る合成画像作成装置100の構成を示すブロック図である。この装置は、外部から与えられる合成画像作成コマンドCに基づいて、複数の素材画像を合成して合成画像Pを作成し、これを出力する機能を有している。図示のとおり、この合成画像作成装置100は、素材画像格納部110、コマンド入力部120、コントローラ部130、データ伸張部140、合成処理部150、データ出力部160、部分画像メモリ171,172によって構成されている。
素材画像格納部110は、合成に用いる個々の素材画像を格納するための構成要素である。図2は、この素材画像格納部110内に格納されている素材画像M1〜M4の例を示す平面図である。実際には、より多数の素材画像を用意するのが一般的であるが、ここでは、説明の便宜上、図示のとおり、樹木の素材画像M1、鳥の素材画像M2、小屋の素材画像M3、犬の素材画像M4という4組の素材画像が用意されているものとする。また、各素材画像M1〜M4は、それぞれ本来の絵柄の領域を包摂する包摂矩形R1〜R4内の画像データとして用意されているものとする。すなわち、各素材画像は、いずれも矩形内にマトリックス状に配置された画素の集合体によって構成されている。
もっとも、素材画像格納部110内には、図2に示すような素材画像M1〜M4がそのまま格納されるわけではなく、圧縮された画像データの形で格納されることになる。本願では、説明の便宜上、圧縮された画像データを示す符号には「*」印を付して区別できるようにしている。図1の素材画像格納部110内に格納されている素材画像M1*〜M4*は、それぞれ図2に示す素材画像M1〜M4の画像データを圧縮することにより得られた圧縮画像データである。
ここに示す実施形態の場合、素材画像格納部110はROMによって構成されており、各素材画像は、圧縮された状態で、このROM内の所定のアドレスに格納されている。一方、コマンド入力部120、コントローラ部130、データ伸張部140、合成処理部150、データ出力部160、部分画像メモリ171,172は、後述する各機能を果たす回路部品を備えた半導体集積回路によって構成されている。したがって、ここに示す実施形態の場合、合成画像作成装置100は、素材画像格納部110を構成する1チップのROMと、その余の各構成要素120〜172の集合体として機能する1チップのLSIと、によって実現されている。
ここで重要な点は、各素材画像M1〜M4の圧縮方法である。一般的な画像データの圧縮方法では、画像ファイル全体を一括して圧縮して1つの圧縮データを得るという方法を採る。このような圧縮方法を採用すると、データ伸張時に圧縮データ全体を一括して伸張して元の画像ファイルに戻すという方法を採ることになる。これに対して、本発明では、個々の素材画像を所定の単位領域ごとにそれぞれ独立して伸張可能な態様で圧縮するという方法を採る。そのため、データ伸張時には、指定された任意の単位領域についてのみ伸張を行うことができる。
結局、素材画像格納部110内には、個々の素材画像M1〜M4が、所定の単位領域ごとにそれぞれ独立して伸張可能な態様で圧縮された画像データM1*〜M4*として格納されていることになるので、たとえば、「素材画像M1*の第k番目の単位領域」という指定を行えば、該当する単位領域内の画像データのみを独立して伸張して利用することができる。このような圧縮形態の具体例については後述する。
さて、ここでは具体例として、図2に示す4組の素材画像を用いて、図3に示すような合成画像Pを作成する場合を考えてみよう。この合成画像Pは、横幅ph、縦幅pvをもった矩形の画像であり、マトリックス状に配置された画素の集合体によって構成されている。前掲の各特許文献に開示されている従来の一般的な合成画像作成装置の場合、このような合成画像Pを作成するために、横幅ph、縦幅pvをもった画像を格納するのに必要な容量をもったフレームメモリが必要であった。また、素材画像を相互に重ね合わせる処理を行う必要上、素材画像を展開するための画像メモリとして、上記フレームメモリの数倍から十数倍の容量をもったメモリも必要であった。そのため、高速で大容量のメモリが必要になり、製造コストの高騰、装置の大型化が避けられないという問題が生じることは既に述べたとおりである。
そこで本発明では、まず、作成対象となる合成画像Pを複数M個の部分画像に分割して取り扱うようにしている。図4は、図3に示す合成画像Pを4分割して、部分画像Q1〜Q4に分けた状態を示す平面図である。個々の部分画像Q1〜Q4は、いずれも作成対象となる合成画像Pの一部を構成する画像であり、横幅ph、縦幅q(q=pv/4)をもつ横方向に細長い矩形画像になる。理論的には、合成画像Pを必ずしも等分割する必要はないが、実用上は、部分画像メモリ171,172の構成を共通化できるように、各部分画像Q1〜Q4の横幅および縦幅が互いに等しくなるように等分割するのが好ましい。
図1に示す部分画像メモリ171,172は、部分画像Q1〜Q4を格納するためのメモリである。ここに示す実施例の場合、部分画像Q1〜Q4は、合成画像Pを等分割した画像であるためサイズは共通している。したがって、部分画像メモリ171,172としては、横幅ph、縦幅qという共通サイズの矩形画像を格納するのに適した容量のメモリを用意しておけばよい。合成画像Pを等分割しない場合は、得られる部分画像は互いにサイズが異なってしまうため、部分画像メモリ171,172としては最大サイズに合わせたものを用意する必要がある。この場合、メモリ容量の一部が無駄になるため、実用上は好ましくない。よって、実用上は、個々の部分画像メモリ171,172が、作成対象となる合成画像Pを縦方向にM分割することにより得られる横方向に細長い部分画像を格納することができるようにすればよい。
ここに示す実施形態では、2組の部分画像メモリ171,172が用意されているが、これは両者を交互に利用することにより、一方の部分画像メモリ上で部分画像を作成する処理を実行中に、他方の部分画像メモリ上に作成された部分画像を外部へ出力できるようにするためである。データ出力部160は、各部分画像メモリ171,172内に生成された第1番目〜第M番目の部分画像を順次外部へ出力する処理を行う。
たとえば、図4に示す例の場合、まず、部分画像メモリ171上で第1番目の部分画像Q1を作成する処理を行い、続いて、部分画像メモリ172上で第2番目の部分画像Q2を作成する処理を行う。そして、この第2番目の部分画像Q2の作成中に、データ出力部160によって、第1番目の部分画像Q1が外部へ出力される。次に、部分画像メモリ171上で第3番目の部分画像Q3を作成する処理を行うが、その作成中に、データ出力部160によって、第2番目の部分画像Q2が外部へ出力される。そして、部分画像メモリ172上で第4番目の部分画像Q4を作成する処理を行うが、その作成中に、データ出力部160によって、第3番目の部分画像Q3が外部へ出力され、最後に、データ出力部160によって、第4番目の部分画像Q4が外部へ出力される。
このように、本発明では、作成対象となる合成画像P全体を格納するための画像メモリを用いる代わりに、個々の部分画像Q1〜Q4をそれぞれ格納するための部分画像メモリ171,172が用いられる。図4では、説明の便宜上、M=4に設定し、合成画像Pを4分割した例を示したが、実際には、Mをより大きな値に設定し、分割数を増やすようにするのが好ましい。たとえば、M=20に設定して20分割すれば、部分画像メモリ171,172としては、本来の合成画像Pを格納する容量の1/20の容量をもったメモリを用意すれば足りる。2組の部分画像メモリ171,172の合計容量値を見ても、本来の合成画像Pを格納する容量の1/10になり、必要な画像メモリの容量を大幅に削減することができる。
また、データ出力部160によって、部分画像メモリ171,172内に作成された個々の部分画像Q1,Q2,Q3,Q4が順次連続して出力されることになるので、装置100内には、合成画像P全体を格納するための画像メモリが設けられていないにもかかわらず、外部からは、あたかも合成画像P全体を格納するフレームメモリから合成画像Pが読み出されて出力されているように見える。ここでは、1枚の合成画像P(静止画像)を作成する例を述べるが、実際には、このような合成画像Pを連続して複数枚作成して順番に出力することにより、装置100から動画の画像データを供給することができるようになる。
なお、出力する合成画像Pのデータ形式を、ディスプレイ装置に直接与えることができる形式にする場合は、データ出力部160に、表示用同期信号(水平同期信号および垂直同期信号)を付加する機能をもたせておけばよい。具体的には、部分画像メモリ171,172内の各部分画像を出力する際に、第1行目の画素ラインを水平走査した後に水平同期信号を付加し、第2行目の画素ラインを水平走査した後に水平同期信号を付加し、... というように、各画素ラインのデータに水平同期信号を付加して出力し、合成画像Pの最終画素ラインを出力した後に、垂直同期信号を付加する処理を行えばよい。このように表示用同期信号を付加する上では、図4に示すように、合成画像Pを縦方向にM分割しておくと便利である。
続いて、部分画像メモリ171,172上に、部分画像Q1〜Q4を作成する処理を行うための構成要素について説明する。まず、コマンド入力部120は、外部から与えられた合成画像作成コマンドCを入力するための構成要素である。ここで、合成画像作成コマンドCは、特定の合成画像Pを作成することを示すコマンドであり、特定の素材画像を特定の大きさで特定の位置に配置することを示す情報を含んでいる。
図5は、図3に示す合成画像Pを作成するための合成画像作成コマンドCに含まれる具体的な情報内容を示す平面図である。この例の場合、合成画像作成コマンドCには、次の4組の情報が含まれている。
<樹木の割付情報:素材画像M1を倍率m1で位置L1(x1,y1)に配置>
<鳥の割付情報:素材画像M2を倍率m2で位置L2(x2,y2)に配置>
<小屋の割付情報:素材画像M3を倍率m3で位置L3(x3,y3)に配置>
<犬の割付情報:素材画像M4を倍率m4で位置L4(x4,y4)に配置>
図5に示す例の場合、作成対象となる合成画像Pの左上隅点に原点Oをとり、図の右方向にX軸、下方向にY軸をとった二次元XY座標系を定義している。各素材画像M1〜M4の割付位置は、当該素材画像の左上隅点の位置を示す配置基準点L1〜L4のXY座標値によって定められる。たとえば、図示の例の場合、樹木の素材画像M1については、座標値(x1,y1)をもつ配置基準点L1に、左上隅点がくるような配置が指定されている。ここで、倍率m1は、縦方向および横方向についての拡大率を示すものであり、m1>1の場合は、元の素材画像M1が縦横m1倍に拡大されて割り付けられ(画素の補間が行われる)、m1<1の場合は、元の素材画像M1が縦横m1倍に縮小されて割り付けられる(画素の間引きが行われる)。
なお、素材画像同士が部分的に重なり合いを生じる場合には、コマンド入力部120が、複数の素材画像についての奥行き方向に関する配置順序を含む合成画像作成コマンドCを入力できるようにしておき、重なり合う部分について、いずれの素材画像(レイヤー)を優先して表示するかを判断できるようにしておく。図5に示す例の場合、樹木,小屋,犬が部分的に重なり合いを生じているが、奥行き方向に関する配置順序は、樹木→小屋→犬の順になっている。したがって、合成画像作成コマンドCには、少なくとも、素材画像M1→M3→M4という奥行き方向に関する配置順序を示す情報を含ませておくようにする。
コマンド入力部120には、入力した合成画像作成コマンドCを格納するコマンドバッファ121が設けられている。前述したように、合成画像Pを連続して複数枚作成して順番に出力することにより動画の画像データを供給する場合、複数枚の合成画像に共通して適用すべきコマンドについては入力を省略し、コマンドバッファ121に格納されているコマンドを流用できる。たとえば、図5に示す例の場合、樹木および小屋は移動しないため、ズームやパンなどの効果による視界領域の変化が生じない限り、位置L1,L3や倍率m1,m3は一定であり、コマンドバッファ121に格納されている情報を流用することができる。
コントローラ部130は、図4に示す例のように、作成対象となる合成画像Pを複数M個の部分画像に分割し、第1番目〜第M番目の部分画像をそれぞれ所定の部分画像メモリ171,172内に生成するための指示を、順次、データ伸張部140および合成処理部150に与える機能を果たす。
すなわち、コントローラ部130は、第i番目(1≦i≦M)の部分画像Qiを生成するために、合成画像作成コマンドCに基づいて、第i番目の部分画像Qiに含まれるべき特定の素材画像の特定の単位領域を伸張対象として認識し、認識した伸張対象についての伸張処理を、データ伸張部140に対して指示する。データ伸張部140は、いわゆるデコーダによって構成され、与えられた指示を受けて、素材画像格納部110に格納されている圧縮された画像データM1*〜M4*のうち、指示された素材画像の指示された単位領域の部分を伸張する処理を行う。
また、コントローラ部130は、合成処理部150に対して、部分画像メモリのうちの1つを、第i番目の部分画像を作成するための作業場所として指定する。ここに示す実施例のように、2組の部分画像メモリ171,172が設けられている場合には、これらを交互に作業場所として指定すればよい。すなわち、奇数番目の部分画像については部分画像メモリ171を作業場所として指定し、偶数番目の部分画像については部分画像メモリ172を作業場所として指定すればよい。
コントローラ部130は、更に、合成画像作成コマンドCに基づいて、データ伸張部140が伸張した個々の画像データを書き込むべき部分画像メモリ上の目標アドレスを決定するために必要な情報を収集し、これを合成処理部150に与える処理を行う。合成処理部150は、データ伸張部140によって伸張された画像データを、作業場所として指定された部分画像メモリ上の所定の目標アドレスに保存する書込処理を行う。
ここでは、データ伸張部140によって行われるデータ伸張処理と、合成処理部150によって行われる書込処理とを、より具体的な例に基づいて説明しよう。図6の左の図は、素材画像格納部110内に格納される素材画像M1の圧縮形態の一例を示す平面図である。図示のとおり、素材画像M1は、樹木の絵柄を包摂矩形R1内に収容した矩形状の画像である。この実施例の場合、素材画像M1を、横幅が包摂矩形R1の横幅に等しく、縦幅が包摂矩形R1をK等分した値uに等しい、横方向に細長いK個の単位領域U1〜UKに分割している。包摂矩形R1は、その縦幅が各単位領域の縦幅uの整数倍(u×K)になるように調整されているため、その底部に若干の余白領域(図にハッチングを施して示す領域)が生じている。ここでは、各単位領域U1〜UK内の素材画像を単位画像M1(1)〜M1(K)と呼ぶことにする。
一方、図6の右の図は、素材画像M1に対して圧縮処理を施して得られる圧縮された素材画像M*の構成図である。第1番目の単位領域U1内の単位画像M1(1)は、圧縮処理により単位圧縮データM1(1)*となり、第k番目の単位領域Uk内の単位画像M1(k)は、圧縮処理により単位圧縮データM1(k)*となる。圧縮前の単位画像M1(1)〜M1(K)は、同一の画素配列をもった同一サイズの画像であるため、いずれも同じ容量をもった画像データになるが、圧縮された単位圧縮データM1(1)*〜M1(K)*は、圧縮効率がそれぞれ異なるため、互いに容量が異なった画像データになる。図6の右の図において、各単位圧縮データM1(1)*〜M1(K)*のバーがそれぞれ異なる長さで示されているのは、互いにデータ容量が異なるためである。
結局、素材画像格納部110には、横幅が素材画像の包摂矩形Rの横幅に等しく、縦幅がこの包摂矩形RをK等分した値uに等しい、横方向に細長い単位領域U内の画像の集合体からなる素材画像が、個々の単位領域ごとに圧縮された状態で格納されていることになる。なお、実用上は、図4に示す各部分画像Q1〜Q4の縦幅qが、図6に示す各単位領域U1〜UKの縦幅uよりも大きくなるような設定(q>uとする設定)を行うのが好ましい。これは、q≦uとする設定を行うと、伸張した単位領域のうち、部分画像の枠外に食み出る領域が大きくなるためである。部分画像の枠外に食み出た領域は、部分画像の生成処理には利用されないので無駄になってしまう。
ここで重要な点は、単位圧縮データM1(1)*〜M1(K)*は、それぞれが独立して伸張可能な態様で圧縮されている点である。たとえば、コントローラ部130からデータ伸張部140に対して、素材画像M1の第k番目の単位領域Ukのみを伸張する旨の指示を与えれば、データ伸張部140は、素材画像格納部110から、素材画像M1の第k番目の単位圧縮データM1(k)*を読み出し、これを単独で伸張して単位画像M1(k)を得ることができる。
図5に例示したとおり、合成画像作成コマンドCには、合成画像Pを作成する上で、どの素材画像をどの位置にどの倍率で割り付けるべきかを示す情報が含まれている。したがって、コントローラ部130は、この合成画像作成コマンドCに基づいて、第i番目(1≦i≦M)の部分画像Qiを生成するために必要な特定の素材画像の特定の単位領域を伸張対象として認識し、認識した伸張対象についての伸張処理を、データ伸張部140に対して指示することができる。
図7は、図4に示す部分画像Q1の作成プロセスを示す平面図である。コントローラ部130は、合成画像作成コマンドCに基づいて、第1番目の部分画像Q1内には、素材画像M1の単位領域U1〜U4に属する単位画像M1(1)〜M1(4)と、素材画像M2の単位領域U1〜U2に属する単位画像M2(1)〜M2(2)とが必要であることを認識する。当該認識処理は、部分画像Q1のサイズ、各素材画像M1〜M4のサイズ、各単位領域U1〜UKのサイズ(これらの情報は、予め、素材画像格納部110やコントローラ部130内に格納しておけばよい)と、合成画像作成コマンドCに含まれる配置基準点L1〜L4の座標値とに基づく幾何学的な演算によって行うことができる。
その結果、図7に示すように、ハッチングを施した合計6組の単位画像が伸張対象として認識され、データ伸張部140に対してこれら伸張対象についての伸張指示が与えられる。データ伸張部140は、この伸張指示を受けて、素材情報格納部110から、単位圧縮データM1(1)*〜M1(4)*およびM2(1)*〜M2(2)*を読み出して伸張処理を施し、単位画像M1(1)〜M1(4)およびM2(1)〜M2(2)を得る。
一方、コントローラ部130は、合成処理部150に対して、部分画像Q1を作成するための作業場所として、部分画像メモリ171を指定するとともに、データ伸張部140が伸張した上記6組の単位画像を書き込むべき目標アドレスを決定するために必要な情報を与える。具体的には、たとえば、素材画像M1を構成する4組の単位画像M1(1)〜M1(4)を書き込むべき目標アドレスを決定するために必要な情報としては、配置基準点L1の座標値(x1,y1)と単位領域の縦幅uとを与えればよい。
合成処理部150は、このような情報に基づいて、単位画像M1(1)については、その左上隅点が座標値(x1,y1)に対応する配置基準点L1にくるように部分画像メモリ171上の特定の目標アドレスに書き込む処理を行うことができる。また、単位画像M1(2)については、その左上隅点が座標値(x1,y1+u)に対応する配置基準点L1′にくるように部分画像メモリ171上の特定の目標アドレスに書き込む処理を行うことができる。以下、同様に、合成処理部150は、データ伸張部140によって伸張された画像データを、作業場所として指定された部分画像メモリ171上の所定の目標アドレスに保存する書込処理を行う。
なお、図4に示す例において、部分画像Q1の場合は、割付対象となる2つの素材画像M1,M2(樹木と鳥)が相互に重なり合う部分がないので、両者についての処理をどのような順序で行っても問題ないが、部分画像Q2,Q3,Q4の場合は、複数の素材画像が部分的に重なり合いを生じているので、順序を考慮した処理を行う必要がある。したがって、実用上は、前述したとおり、コマンド入力部120が、複数の素材画像についての奥行き方向に関する配置順序を含む合成画像作成コマンドCを入力し、合成処理部150が、奥から手前に向かう配置順序に従って複数の素材画像についての処理順を定め、当該処理順に従って個々の素材画像ごとに書込処理を実行してゆくようにすればよい。
図4に示す例の場合、鳥に関しては、他の素材との重なり合いはないが、樹木・小屋・犬に関しては、樹木が最も奥に配置され、その手前に小屋、更にその手前に犬が配置されている。そこで、ここでは、樹木→鳥→小屋→犬の順に奥から配置するように定めた場合を考えてみよう。この場合、合成画像作成コマンドCには、M1→M2→M3→M4という配置順序を示す情報が含まれており、合成処理部150は、この配置順序に従って、個々の素材画像についての処理を実行することになる。
ここでは、部分画像Q3についての処理を例にとって説明してみよう。図4に示すとおり、部分画像Q3には、素材画像M1(樹木),M3(小屋),M4(犬)が含まれているので、作業場所として指定された部分画像メモリ171に対して、この順に書込処理が行われる。
まず、図8に示すように、素材画像M1(樹木)についての処理が行われる。具体的には、図8にハッチングを施して示すように、単位画像M1(8)〜M1(12)を伸張対象とする指示がデータ伸張部140に対して与えられる。そして、伸張された各単位画像は、合成処理部150によって、作業場所となる部分画像メモリ171の所定アドレスに書き込まれる(このとき、単位画像M1(8)およびM1(12)のうちの部分画像Q3の枠から食み出した部分については、書込みは行われず、データは捨てられる)。
続いて、図9に示すように、素材画像M3(小屋)についての処理が行われる。すなわち、図9にハッチングを施して示すように、単位画像M3(2)〜M3(6)に対する伸張処理が行われ、作業場所となる部分画像メモリ171の所定アドレスに書き込まれる。このとき、データは、メモリに対して上書きされるため、素材画像M1(樹木)との重なり部分については、素材画像M3(小屋)のデータに書き換えられることになる。
最後に、図10に示すように、素材画像M4(犬)についての処理が行われる。すなわち、図10にハッチングを施して示すように、単位画像M4(1)に対する伸張処理が行われ、作業場所となる部分画像メモリ171の所定アドレスに書き込まれる。このときも、データは、メモリに対して上書きされるため、素材画像M3(小屋)との重なり部分については、素材画像M4(犬)のデータに書き換えられることになる。かくして、部分画像Q3に対する処理は完了する。完成した部分画像Q3の画像データは、部分画像メモリ171からデータ出力部160を経て、合成画像Pの一部として外部へ出力される。
このように、図1に示す合成画像作成装置100によれば、作成対象となる合成画像Pは、図4に示すように個々の部分画像Q1〜Q4ごとに部分画像メモリ171もしくは172上で順番に作成され、データ出力部160によって、直接外部へと出力される。したがって、装置100内には、合成画像P全体を格納するための大容量メモリを用意しておく必要はない。
また、素材画像格納部110内には、素材画像が単位領域ごとにそれぞれ独立して伸張可能な態様で圧縮された画像データとして用意されているので、画像の合成作業は、素材画像全体を伸張することなく、必要な単位領域ごとに伸張しながら実行することができる。データ伸張部140が伸張したデータを、合成処理部150によって部分画像メモリ171,172の目標アドレスに直接書き込むようにすれば、伸張した単位画像を一時的に格納しておくメモリを用意しておけば足り、伸張した素材画像全体を格納するメモリは不要になる。その結果、装置のコストダウンとともに小型化を図ることが可能になる。
更に、素材画像の必要な単位領域だけを伸張しながら画像合成処理を行うことができるため、表示領域外に位置するような無駄な領域についての伸張処理を避けることができるようになるので、無駄な処理時間を省き、より高速な合成処理が可能になるという副次的な効果も得られる。
<<< §2. 素材画像の圧縮方法 >>>
§1で述べたとおり、本発明に係る合成画像作成装置100の素材画像格納部110には、単位領域ごとにそれぞれ独立して伸張可能な態様で圧縮された画像データとして、個々の素材画像を格納しておく必要がある。ここでは、このような態様で素材画像を圧縮する具体的な方法を説明する。
図11は、画像データの圧縮方式として広く利用されているJPEG方式による画像データの圧縮方法の一例を示す平面図である。JPEG方式では、縦横マトリックス状に配置された多数の画素の集合からなる素材画像Mを、8×8画素のブロック単位で取り扱うことにより圧縮が行われる。図示の例の場合、第1のブロック行は、圧縮対象ブロックB11,B12,B13,…,B1zによって構成され、第2のブロック行は、圧縮対象ブロックB21,B22,B23,…,B2zによって構成され、以下、同様である。
1つの圧縮対象ブロックは、いずれも8行8列に配置された64個の画素の集合体によって構成されており、各画素には、それぞれ画素値が定義されている。ここでは、カラー画像を構成する個々の画素が、輝度値Yと色差成分値Cb,Crとを有する画素値をもっているものとしよう。JPEG方式の画像圧縮フォーマットには様々な規格が存在する。図12には、そのうちの代表的な3つを例示した。
図12(a) は、JPEG(YUV444)と呼ばれているフォーマットを示すものである。ここで、ブロックB11(Y),B11(Cb),B11(Cr)は、図11に示すブロックB11を構成する64個の画素の輝度値Yおよび色成分値Cb,Crを示している。続くブロックB12(Y),B12(Cb),B12(Cr)は、図11に示すブロックB12を構成する64個の画素の輝度値Yおよび色成分値Cb,Crである。このようなブロックについて、それぞれ離散コサイン変換を行うことにより、素材画像の圧縮データM*が得られる。圧縮効率は、ブロック内の画素値の分布状態に応じて異なるため、得られた圧縮データM*の容量は不定長になる。
図12(b) は、JPEG(YUV422)と呼ばれているフォーマットを示すものである。輝度値Yについては、それぞれが8行8列に配置された64個の画素によって構成されているが、色成分値Cb,Crについては、2つのブロック(たとえば、B11,B12)についての画素(8行16列の画素)を、8行8列に配置された64個の画素にまとめてしまっている(横方向に間引きもしくは平均化される)。また、図12(c) は、JPEG(YUV420)と呼ばれているフォーマットを示すものである。輝度値Yについては、それぞれが8行8列に配置された64個の画素によって構成されているが、色成分値Cb,Crについては、4つのブロック(たとえば、B11,B12,B21,B22)についての画素(16行16列の画素)を、8行8列に配置された64個の画素にまとめてしまっている(縦横方向ともに、間引きもしくは平均化される)。
上述したJPEG方式をはじめ、様々なデータ圧縮方式が公知であるが、従来の一般的なデータ圧縮方式は、圧縮対象となる画像データをファイル単位で一括して圧縮し、これを伸張することを前提としているため、ある特定の一部分のみを選択的に伸張することはできない。たとえば、図11に示す例の場合、素材画像Mを構成する画像は、個々のブロックB11,B12,B13,... といった単位で圧縮されるものの、最終的に得られる圧縮された素材画像M*は、個々のブロックについての圧縮データを羅列したものになるため、特定のブロックの部分のみを選択的に伸張することはできない。
特定の部分(単位領域)のみを選択的に伸張することができるようにするには、1つの単位圧縮データとこれに後続する次の単位圧縮データとの間に区切りを示す情報を付加しておく必要がある。そこで、以下に述べる本願実施例では、素材画像格納部110には、個々の単位領域についての単位圧縮データと、個々の単位圧縮データの間に介挿された区切情報データと、を有する画像データとして、個々の素材画像を格納するようにしている。
図13は、圧縮された素材画像M*のフォーマットを、従来例および本願実施例を対比させて示す平面図である。図13(a) は、従来の一般的なフォーマット例を示している。この例の場合、圧縮データM*の前にヘッダ部Hが付加され、後にフッタ部Fが付加されている。通常、ヘッダ部Hには、圧縮に用いたフォーマットを示すコード、全データ容量、素材画像の縦横のサイズなどの情報が書き込まれ、フッタ部Fには、ファイルの終端を示すコード(EOF)が書き込まれる。ヘッダ部Hとフッタ部Fに挟まれた部分が、圧縮された素材画像M*の本体部分であるが、ここには、もとの素材画像Mのデータファイル全体を圧縮することによって得られたデータがそのまま収容される。
これに対して、図13(b) は、本発明の一実施例に係るフォーマットを示している。ここで、ヘッダ部Hおよびフッタ部Fの構成は従来のフォーマットと同様であるが、圧縮された素材画像M*の本体部分は、個々の単位圧縮データの間に区切情報データを挿入したものになっている。すなわち、区切情報データD(1),D(2),... ,D(K)は、個々の単位圧縮データM(1)*,M(2)*,... ,M(K)*の間の区切りを示すデータになっている。データ伸張部140は、この区切情報データに基づいて単位圧縮データ間の区切り位置を認識し、伸張対象として指示された特定の単位領域に対する伸張処理を行うことができる。
たとえば、図11に示す例において、素材画像Mを構成する1ブロック行を1単位領域Uに設定した場合を考えてみよう。この場合、各単位領域Uの縦幅u=8画素ということになり、第1の単位領域U1は、ブロックB11〜B1zで構成される領域、第2の単位領域U2は、ブロックB21〜B2zで構成される領域ということになる。そして、図13(b) に示す単位圧縮データM(1)*は、ブロックB11〜B1zからなる単位画像を圧縮して得られるデータであり、単位圧縮データM(2)*は、ブロックB21〜B2zからなる単位画像を圧縮して得られるデータということになる。
したがって、図11に示す素材画像Mのうち、第2の単位領域U2(ブロックB21〜B2z)の部分のみを伸張する旨の指示を受けた場合、データ伸張部140は、この圧縮された素材画像M*をヘッダ部Hから順次読み取ってゆき、区切情報データD(1)を1つ目の区切りとして認識し、区切情報データD(2)を2つ目の区切りとして認識した後に、これに後続する単位圧縮データM(2)*の部分(3つ目の区切情報データD(3)の直前まで)を伸張対象として把握し、この伸張対象となる部分のみを伸張して第2の単位領域U2内の単位画像M(2)を得ることができる。
なお、区切情報データDとしては、単位圧縮データとしては用いられることがない特殊コードからなるマーカを用いるようにすればよい。たとえば、圧縮方式としてJPEG方式を採用した場合、圧縮後のデータ自身としては「FFmm」なる2バイトコード(但し、mmは、00以外の1バイトコードで、「マーカ種」と呼ばれる)が用いられることはない。そこで、この「FFmm」なる特殊コードをマーカとして用いるようにすれば、データ伸張部140は、ヘッダ部Hに後続するデータを1バイトずつチェックしてゆき、「FFmm」に遭遇した場合に、これをマーカとして検出することができ、単位圧縮データ間の区切り位置を認識することができる。
図14は、図6の左に示す素材画像M1についての圧縮データのフォーマットを、従来例と本願実施例とを対比させた形で示す平面図である。図6の左に示す素材画像M1を各単位領域U1〜UKに分け、各単位画像M1(1)〜M1(K)に対して圧縮処理を施せば、図6の右に示すような単位圧縮データM1(1)*〜M1(K)*が得られることは§1で述べたとおりである。
従来の一般的なフォーマットでは、図14(a) に示すように、単位圧縮データM1(1)*〜M1(K)*(前述したとおり、これらは不定長のデータになる)を羅列したデータ群を、ヘッダ部Hとフッタ部Fとの間に挟み込んだ形式のデータが、圧縮された素材画像M*のデータファイルになる。図14(a) では、説明の便宜上、個々の単位圧縮データM1(1)*,M1(2)*,M1(3)*,... の間に区切り線が描かれているが、実際には、このような区切りの情報は含まれていない。したがって、伸張処理を行う際には、ヘッダ部Hに後続するデータを先頭から順次伸張してゆく処理を行わざるを得ず、結果的に、圧縮された素材画像M*のデータファイル全体を伸張せざるを得ない。
これに対して、本発明の実施例に係るフォーマットでは、図14(b) に示すように、各単位圧縮データM1(1)*〜M1(K)*の間に、それぞれ区切情報データD(1)〜D(K)が挿入されているので(ヘッダ部Hに後続する区切情報データD(1)は省略可)、データ伸張部140は、各単位圧縮データM1(1)*〜M1(K)*の区切りを認識し、指定された任意の単位圧縮データのみを独立して伸張することができる。たとえば、各区切情報データD(1)〜D(K)として、特殊コード「FFmm」なる2バイトのマーカを記録しておけば、「FFmm」なるデータに遭遇した時点で区切りの認識が可能になる。
具体的には、第k番目の単位領域Ukに対応する単位画像を伸張する旨の指示が与えられた場合、ヘッダ部Hに後続するデータを順に読み込んでゆき、第k回目の「FFmm」に遭遇した後から、第(k+1)回目の「FFmm」(もしくは、フッタ部F)に遭遇するまでの間のデータを単位圧縮データM1(k)*として抽出し、これを伸張する処理を行えばよい。各区切情報データDとしては、特殊コード「FFmm」なるマーカなど、たかだか2バイト程度のデータを用いればよいので、図14(a) に示すフォーマットの代わりに図14(b) に示すフォーマットを用いても、圧縮されたデータファイルの全体の容量はそれほど変わらない。
なお、区切情報データDには、マーカ以外の付加情報を組み込むことも可能である。たとえば、マーカとなる特殊コード「FFmm」に任意の数バイトのコード「xx」を付加して、「FFmmxx」なるデータを区切情報データDとして用いるようにすれば、付加コード「xx」の部分によって、付加的な情報を伝達することができる。
たとえば、図15は、付加コード「xx」として、後続する単位圧縮データのデータサイズを示すサイズ情報を付加したフォーマットの例を示す平面図である。図示のとおり、第k番目の区切情報データD(k)は、マーカとして機能する2バイトコード「FFmm」とサイズ情報S(k)とによって構成されている。ここで、サイズ情報S(k)は、後続する単位圧縮データM(k)*のデータサイズを示している。同様に、第(k+1)番目の区切情報データD(k+1)は、マーカとして機能する2バイトコード「FFmm」とサイズ情報S(k+1)とによって構成されている。ここで、サイズ情報S(k+1)は、後続する単位圧縮データM(k+1)*のデータサイズを示している。
このように、区切情報データD(k)が、後続する単位圧縮データM(k)*のデータサイズを示すサイズ情報S(k)を含んでいれば、データ伸張部140は、このサイズ情報に基づいて、次の区切情報データのアドレスを認識してこれにアクセスすることができるので、マーカ「FFmm」を探すために単位圧縮データを1バイトずつチェックする作業を省略することができる。
前述したとおり、ここに示す実施形態の場合、素材画像格納部110はROMによって構成されているので、このROMのアドレス空間上の所定のアドレスが認識できれば、当該アドレスのデータにアクセスすることができる。したがって、たとえば、図15に示す例の場合、第k番目の区切情報データD(k)のマーカ「FFmm」が検出できれば、続くサイズ情報S(k)を参照することにより(サイズ情報S(k)のデータ長は、予め定めておく)、単位圧縮データM(k)*を読み飛ばし、直ちに第(k+1)番目の区切情報データD(k+1)のマーカ「FFmm」の検出ができる。このような検索方法を採れば、区切情報データDの部分のみを飛び飛びに読み込みながら、指定された単位圧縮データに辿り着くことができ、効率的な検索が可能になる。
一方、図16は、付加コード「xx」として、次の区切情報データの位置を示すアドレス情報を付加したフォーマットの例を示す平面図である。この例では、第k番目の区切情報データD(k)は、マーカとして機能する2バイトコード「FFmm」とアドレス情報A(k+1)とによって構成されている。ここで、アドレス情報A(k+1)は、次の区切情報データD(k+1)の先頭アドレスを示している。同様に、第(k+1)番目の区切情報データD(k+1)は、マーカとして機能する2バイトコード「FFmm」とアドレス情報A(k+2)とによって構成されている。ここで、アドレス情報A(k+2)は、次の区切情報データD(k+2)の先頭アドレスを示している。
このように、区切情報データD(k)が、次の区切情報データD(k+1)の位置を示すアドレス情報A(k+1)を含んでいれば、データ伸張部140は、このアドレス情報に基づいて、次の区切情報データにアクセスすることができるので、マーカ「FFmm」を探すために単位圧縮データを1バイトずつチェックする作業を省略することができる。たとえば、図16に示す例の場合、第k番目の区切情報データD(k)のマーカ「FFmm」が検出できれば、続くアドレス情報A(k+1)を参照することにより(アドレス情報A(k+1)のデータ長は、予め定めておく)、単位圧縮データM(k)*を読み飛ばし、直ちに第(k+1)番目の区切情報データD(k+1)のマーカ「FFmm」の検出ができる。このような検索方法を採れば、区切情報データDの部分のみを飛び飛びに読み込みながら、指定された単位圧縮データに辿り着くことができ、効率的な検索が可能になる。
図15に示す実施例では、次の区切情報データD(k+1)の先頭アドレスを認識するために、現アドレスにサイズ情報S(k)に基づく値を加算する演算が必要になるが、図16に示す例の場合は、次の区切情報データD(k+1)の先頭アドレスA(k+1)が直接記録されているので、そのような演算は不要になるというメリットがある。ただ、大量の素材画像を用意しておく必要がある場合、素材画像格納部110として機能するROMのアドレス空間も大きくなり、ROMのアドレス長はそれだけ長くなる。したがって、アドレス情報を含む区切情報データのデータ長も長くなってしまうというデメリットがあるので、そのような場合は図15に示す実施例を採るのが好ましい。
図17に示す実施例は、別なアプローチに基づくフォーマットを示すものである。既に述べたとおり、圧縮された素材画像M*のデータファイルの先頭にはヘッダ部Hが付加されている。ここに示す実施例は、このヘッダ部Hに個々の単位領域についての単位圧縮データの先頭アドレスを示すアドレス情報を書き込むようにしたものである。図示のA(1),A(2),A(3),,,, ,A(k),... は、それぞれ単位圧縮データM(1)*,M(2)*,M(3)*,,,, ,M(k)*,... の先頭アドレスを示すアドレス情報である。この実施例では、これらのアドレス情報を一括して、ヘッダ部Hに書き込むようにしている。
したがって、データ伸張部140は、このヘッダ部Hに書き込まれているアドレス情報に基づいて、必要な単位領域内の画像データへアクセスすることが可能になる。たとえば、第k番目の単位領域Ukに対応する単位画像M(k)を伸張する旨の指示が与えられた場合、データ伸張部140は、ヘッダ部Hのアドレス情報を参照することにより、第k番目の単位圧縮データM(k)*の先頭アドレスA(k)および第(k+1)番目の単位圧縮データM(k+1)*の先頭アドレスA(k+1)を認識した上で、アドレスA(k)〜A(k+1)の直前までのデータを読み出し、これを伸張する処理を行えばよい。
図17に示す例では、各単位圧縮データ間に区切情報データを介挿していないが、もちろん、マーカが記録された区切情報データを介挿するようにしてもよい。この場合、第k番目の単位圧縮データM(k)*の先頭アドレスA(k)のみを認識し、当該先頭アドレスA(k)から次の単位圧縮データのマーカ直前までのデータを読み出せばよい。
<<< §3. コントローラ部の処理 >>>
続いて、図1に示す合成画像作成装置100におけるコントローラ部130の具体的な処理手順を述べる。ここでは、図18に示すとおり、合成画像Pを、縦幅qをもった4組の部分画像Q1〜Q4に分割し、コントローラ部130が、個々の部分画像Q1〜Q4を部分画像メモリ内に生成するための指示を、順次、データ伸張部140および合成処理部150に与える場合を考えてみる。
図示のとおり、合成画像Pの左上隅点に原点Oをとり、図の右方向にX軸、下方向にY軸をとった二次元XY座標系を定義すれば、各部分画像Q1〜Q4の左上隅点の座標値は、それぞれO(0,0),G(0,q),G(0,2q),G(0,3q)で表される。一般に、第i番目の部分画像Qiの左上隅点の座標値は、G(0,(i−1)×q)、左下隅点の座標値は、G(0,i×q)になる。コントローラ部130は、部分画像Qiについての処理を行う際に、まず、この隅点の座標値を利用して、個々の素材画像が部分画像Qi内に含まれているか否かを判定する処理を行うことができる。含まれていると判定された素材画像については、更に、当該素材画像のどの単位領域が含まれているかを調べる処理を行い、該当する単位領域を伸張領域として、データ伸張部140に対して伸張処理を行う指示を与える。
図19は、第i番目の部分画像Qi内に第j番目の素材画像Mjが含まれるか否かを判定する判定法の一例を示す平面図である。判定は、素材画像Mjの配置位置を示す配置基準点Lj(素材画像Mjの左上隅点)の座標値(xj,yj)と部分画像Qiの左下隅点の座標値(0,i×q)とを比較することによって行われる。具体的には、それぞれのY座標値を比較して、「yj<i×q(式(1))」が満足されれば、部分画像Qi内に素材画像Mjが含まれる可能性がある、と判断することができる。逆に、上記式(1)が満足されなければ、部分画像Qiの処理に関して素材画像Mjは考慮する必要がないことになる。
上記式(1)が満足された場合は、続いて、素材画像Mj内のどの単位領域が部分画像Qi内に含まれるかが調べられ(一部が含まれる場合も含む)、含まれる単位領域内の単位画像が伸張対象として指定される。図19に示す例の場合、部分画像Qiの形成面上に割り付けられる素材画像Mjは、縦幅m×vj、横幅m×hjの大きさをもっている。ここで、vjおよびhjは、素材画像格納部110内に格納されている元の素材画像の縦および横のサイズであり、mは合成画像作成コマンドCで指定された割付倍率である。また、部分画像Qiの形成面上に割付後の各単位領域の縦幅は、m×uで与えられる。
したがって、yj+k×m×u<i×q+m×uを満たす整数kの最大値kmaxを求めれば、第1番目〜第kmax番目の単位領域が伸張対象ということになる。図示の例の場合、kmax=4になるため、ハッチングを施して示した第1〜第4の単位領域内の画像が伸張対象になる。
なお、上の例では、X軸方向に関する割付位置に関するチェックは行っていないが、必要な場合は、座標値xjおよび横幅m×hjを考慮して、素材画像Mjが部分画像Qiの横幅の範囲内に位置するか否かの判定も行うようにすればよい。もちろん、否定的な判定結果が得られた場合には、部分画像Qiの処理に関して素材画像Mjは考慮する必要がないことになる。
図20は、部分画像Qiと素材画像Mjとの別な位置関係を示す平面図である。図19に示す例では、配置基準点Ljが部分画像Qiの内部に位置していたが、図20に示す例では、配置基準点Ljが部分画像Qiの外部上方に位置している。このような位置関係にある場合、伸張対象とすべき単位領域は、位置ξ1〜ξ2の間に位置するハッチングを施した単位領域、すなわち、第(α+1)番目〜第β番目の単位領域になる。別言すれば、第1番目〜第α番目の単位領域は、伸張対象から除外するべきである。もちろん、除外しなくても、合成処理部150は、部分画像Qi外の画像データについての書込処理は行わないので、処理に支障が生じるわけではないが、無駄な伸張処理が行われることになる。
そこで、実用上は、上記式(1)「yj<i×q」の判定を行い、肯定的な判定結果が得られた場合には、続いて図20の式(2)「yj≦(i−1)×q−m×u」の判定を行うようにすればよい。式(2)は、部分画像Qiの外部上方に、伸張対象から除外すべき単位領域が存在するか否かを判定するための条件式になっており、当該条件式が満足された場合、除外すべき単位領域が少なくとも1つ存在することになる。
図20の式(3)「(i−1)×q−m×u<(yj+α×m×u)≦(i−1)×q」は、式(2)が満足された場合に、伸張対象から除外すべき単位領域を求めるための式である。ここで、(yj+α×m×u)は、位置ξ1のY座標に対応する値であり、結局、式(3)は、位置ξ1が、「(i−1)×q−m×u」の位置よりも下にあり、「(i−1)×q」の位置もしくはそれより上にある、という条件を示していることになる。そこで、式(3)を満足する整数αを求め、第1番目〜第α番目の単位領域まで読み飛ばし、第(α+1)番目の単位領域から第β番目の単位領域まで順次処理を行えば、図20にハッチングを施して示す単位領域についての処理が完了する。
このとき、値βは、図20の式(4)「i×q≦(yj+β×m×u)<i×q+m×u」を満足する整数として求めることができる。ここで、(yj+β×m×u)は、位置ξ2のY座標に対応する値であり、結局、式(4)は、位置ξ2が、「i×q」の位置もしくはそれより下にあり、「i×q+m×u」の位置よりも上にある、という条件を示していることになる。式(2)を満たさない場合は、第1番目の単位領域から第β番目の単位領域までを伸張対象とすればよい。
なお、図1に示すコントローラ部130には、ステータスバッファ131が組み込まれている。このステータスバッファ131は、第i番目の部分画像Qiを生成する際に行った処理に関する履歴情報を格納する機能を有しており、コントローラ部130は、第(i+1)番目の部分画像Q(i+1)を生成する際に、このステータスバッファ131に格納されている履歴情報を利用した処理を行うことができる。
たとえば、図20に示す例は、第i番目の部分画像Qiに関して、第j番目の素材画像Mjについての処理を行う例であり、素材画像Mjの第(α+1)番目〜第β番目の単位領域内の画像を、所定の部分画像メモリの所定の目標アドレスに書き込む処理が行われる。このとき、第β番目の単位領域についての処理が完了すると、素材画像Mjに関する処理はそこで終了し、続いて、第(j+1)番目の素材画像M(j+1)に関する処理に移行する。別言すれば、素材画像Mjについての第(β+1)番目以降の単位領域についての処理は行われない。
そこで、第i番目の部分画像Qiに関する処理において、素材画像Mjについては第β番目の単位領域までで処理が中断した旨の履歴情報をステータスバッファ131に格納しておくようにすれば、後に、第(i+1)番目の部分画像Q(i+1)に関する処理を行う際に、当該履歴情報を利用した処理が可能になる。具体的には、部分画像Q(i+1)に関する処理では、素材画像Mjは必ず処理対象となるので(すなわち、素材画像Mjを構成する少なくとも1つの単位領域が部分画像Q(i+1)内に含まれているので)、素材画像Mjに関しては、式(1)の条件判定を省略することができる。
また、第i番目の部分画像Qiに関する処理における素材画像Mjについての履歴情報として、第β番目の単位領域の一部についての書込処理を行った旨の情報をステータスバッファ131に格納しておけば、部分画像Q(i+1)に関する素材画像Mjについて処理を、第β番目の単位領域から続行することが可能になるので、式(2)や式(3)の条件判定も省略することができる。
この他、ステータスバッファ131には、各素材画像の縦幅や横幅、割付倍率mなど、繰り返し利用される様々なデータを格納しておくことができ、これらのデータを利用することにより、コントローラ部130の処理を効率化することができる。
図21は、上述した基本方針に基づいて、コントローラ部130が実行する処理手順を示す流れ図である。まず、ステップS1において、部分画像Qの番号を示すパラメータiが初期値1に設定される。続くステップS2では、第i番目の部分画像Qiについての処理が開始する。すなわち、コントローラ部130は、合成処理部150に対して、1つの部分画像メモリを作業場所に指定する。図1に示す例の場合、一対の部分画像メモリ171,172が用意されているので、パラメータiが奇数値の場合は部分画像メモリ171を作業場所として指定し、パラメータiが偶数値の場合は部分画像メモリ172を作業場所として指定すればよい。そうすれば、個々の部分画像ごとに、部分画像メモリ171もしくは172が交互に指定されることになる。
次のステップS3では、素材画像Mの番号を示すパラメータjが初期値1に設定される。そして、ステップS4において、第i番目の部分画像Qi内に第j番目の素材画像が含まれているか否かの判定が行われる。具体的には、図19の式(1)の条件判定が行われる。肯定的な判定が行われた場合には、ステップS5へと進み、伸張対象となる単位領域を認識し、データ伸張部140に対して、これら伸張対象についての伸張処理を指示する。具体的には、図20の式(2)〜式(4)に基づいて、伸張対象となる単位領域(図示の例の場合、第(α+1)番目〜第β番目の単位領域)の認識が行われる。
そして、ステップS6では、伸張された画像データについて、目標アドレスを決定するための情報を合成処理部150に与える処理が行われる。具体的には、図20に示す例の場合、素材画像Mjについての配置基準点Ljの座標値(xj,yj)および割付倍率mが合成処理部150に与えられる。また、合成処理部150内に、各単位領域の縦幅uや部分画像Qiの縦幅qの情報が登録されていない場合には、必要に応じてこれらの情報も与えるようにする。合成処理部150は、これらの情報に基づいて、データ伸張部140が伸張した画像データを、作業場所として指定された部分画像メモリの目標アドレスに書き込む処理を行う。
続いて、ステップS7において、これまでの処理の履歴情報をステータスバッファ131に保存する処理が行われる。前述したとおり、ここで保存された履歴情報は、パラメータiを更新した後に行われるステップS4,S5の処理で利用され、処理の効率化が図られる。
ステップS8では、合成画像作成コマンドCで指定されている全素材についての処理が終了したか否かが判断され、肯定的な判断がなされるまで、ステップS9を経てパラメータjが更新され、ステップS4からの処理が繰り返し実行される。なお、合成画像作成コマンドCにおいて、複数の素材画像についての奥行き方向に関する配置順序が指定されている場合には、奥から手前に向かう配置順序に従って各素材画像Mの番号を示すパラメータjが付されるようにする。
ステップS8で肯定的な判断がなされると、第i番目の部分画像Qiについての処理は終了である。§1で述べたとおり、部分画像メモリ171もしくは172上に部分画像Qiが作成されると、データ出力部160によって、当該部分画像Qiは合成画像Pの一部として外部へ出力される。
続くステップS10では、全部分画像についての処理が終了したか否かが判断され、肯定的な判断がなされるまで、ステップS11を経てパラメータiが更新され、ステップS2からの処理が繰り返し実行される。こうして、ステップS10で肯定的な判断がなされると、合成画像作成コマンドCに基づく合成画像Pの作成作業は完了する。
<<< §4. 種々の変形例 >>>
以上、本発明の基本的実施形態に係る合成画像作成装置100の構成および動作を、§1〜§3に渡って述べたが、最後に、本発明の変形例をいくつか述べておく。
<4−1. マスク画像の併用>
これまでの実施形態では、素材画像格納部110内に圧縮された状態で格納される素材画像として、図2に示すような素材画像M1〜M4を用いた例を示した。これらの素材画像は、樹木、鳥、小屋、犬などのモチーフとなる絵柄を包摂矩形R1〜R4に収容した矩形状の画像によって構成されている。通常、画像データは、このような矩形状のデータとして取り扱うのが一般的であるが、これら素材画像M1〜M4を用いて、図3に示すような合成画像Pを得るためには、各素材画像について、前景領域(モチーフとなる絵柄部分)と背景領域とを区別し、前景領域のみを抽出して利用する必要がある。
前景領域と背景領域とを区別するには、たとえば、背景領域の画素に、前景領域には用いられていない固有の画素値を与える等の方法を採ることができるが、素材画像とは別個にマスク画像を用意する方法を採ってもよい。図22は素材画像とそのマスク画像とを対比して示す平面図である。図22(a) は、図2に示す素材画像M1と同じ樹木をモチーフとした素材画像である。樹木のモチーフは、包摂矩形R内に収容されており、全体としては矩形状の画像を構成している。ここで、本来の素材は、モチーフとなっている樹木を構成する前景領域Pfの部分であり、背景領域Pbの部分は、合成画像Pを作成する上では不要である。
そこで、図22(b) に示すようなマスク画像を用意する。このマスク画像は、画素値「0」をもった画素の集合からなる領域(図の白地領域)と、画素値「1」をもった画素の集合からなる領域(図のハッチング領域)とによって構成される二値画像であり、前者は、図22(a) における前景領域を示し、後者は、図22(a) における背景領域を示している。この図22(b) に示すマスク画像は、図22(a) に示す素材画像の背景領域Pbを隠蔽する機能を有する。
素材画像格納部110内に、図22(a) に示すような前景領域Pfと背景領域Pbとによって構成される素材画像とともに、図22(b) に示すようなマスク画像を、いずれも圧縮された画像データとして格納しておくようにし、データ伸張部140が、このマスク画像を含めた伸張処理を行うようにすれば、合成処理部150は、このマスク画像を用いて前景領域Pfと背景領域Pbとを区別し、前景領域Pfについてのみ書込処理を行うことができる。
<4−2. 画像のブレンド処理>
§1では、図3に示す合成画像Pを作成する際に、樹木→鳥→小屋→犬の順に奥から配置する作業手順を説明した。この例では、樹木、小屋、犬が相互に重なりを生じており、重なり合った部分については、後から処理される素材画像の内容を部分画像メモリ上に書き込む処理を行うことにより、手前に位置する素材画像に置き換えられることになる。一般的な素材であれば、このように、奥に位置する素材画像から順に書込処理(メモリへの上書き処理)を行ってゆくようにすれば、重なり具合に矛盾のない合成画像を作成することができる。
しかしながら、必要に応じて、個々の素材画像に透明度というパラメータを設定し、奥に配置された素材画像が透けて見えるような合成画像を作成することも可能である。具体的には、コマンド入力部120が、複数の素材画像についての奥行き方向に関する配置順序と、個々の素材画像についての透明度と、を含む合成画像作成コマンドCを入力できるようにしておき、合成処理部150が、奥から手前に向かう配置順序に従って複数の素材画像についての処理順を定め、当該処理順に従って個々の素材画像ごとに透明度を考慮した合成演算をともなう書換処理を実行してゆくようにすればよい。
ここで、透明度を考慮した合成演算は、一般にブレンド処理と呼ばれている演算であり、部分画像メモリ上に記録されている既存の画素値(第(j−1)番目以前の素材画像についての処理で記録された画素値)と、現在の処理対象となる素材画像についての画素値(第j番目の素材画像についての画素値)とをブレンドすることによって、新たな画素値(ここでは、ブレンド値と呼ぶことにする)を求める演算である。
図23は、このブレンド処理の具体例を示す平面図である。この例は、図4に示す部分画像Q3を作成するプロセスの最終段階を示すものである。すなわち、既に素材画像M1(樹木)の上に素材画像M3(小屋)を配置する処理が完了している状態において、更に、素材画像M4(犬)を配置する処理を行うプロセスを示している。ここでは、この素材画像M4(犬)に透明度Tが設定されていたものとしよう。この透明度Tは、0≦T<1の間の値をとるパラメータであり、T=0の場合は、奥に配置された素材画像が全く透けて見えない状態を示し、Tが1に近づくほど、奥に配置された素材画像が透けて見える割合が増えることになる。図23に示す例の場合、犬の絵柄の奥に小屋の絵柄が透けて見えることになる。
これまで述べてきた実施形態は、T=0の場合の例であり、素材画像M4(犬)についての処理を行うと、部分画像メモリ上では、この素材画像M4(犬)の情報が新たに書き込まれ、既存の素材画像M3(小屋)の情報は失われることになる。たとえば、図23に示す例の場合、部分画像メモリ上に記録されていた部分画像Q3の画素E1の位置には、素材画像M4(犬)の画素E2の新たな画素値が書き込まれることになる。
すなわち、これまで述べてきた実施形態の場合、第j番目の素材画像Mjについての処理とは、当該素材画像Mjを構成する個々の画素の画素値を、部分画像メモリ上の所定の目標アドレスに書き込む「書込処理」と言うことができる。この「書込処理」では、目標アドレスに保存されていた既存の画素値(第(j−1)番目の素材画像M(j−1)についての処理を行った時点の画素値)は何ら参照されることはない。
これに対して、ここで述べる変形例では、図23に示すように、部分画像メモリ上の目標アドレスに位置する画素E1の画素値(ここでは、同じ符号E1で示す)と、当該目標アドレスに記録すべき素材画像M4上の画素E2の画素値(ここでは、同じ符号E2で示す)とについて、透明度を考慮したブレンド処理を行い、得られた新たな画素値E3によって、画素E1の画素値E1を書き換える「書換処理」と言うことができる。ここで、ブレンド処理としては、たとえば、E3=T・E1+(1−T)・E2なる演算に基づいて新たな画素値E3を求める処理を行えばよい。もちろん、合成画像作成コマンドにおいて、透明度の指定とともに、ブレンド処理の方法を指定できるようにしておき、指定された方法に基づくブレンド処理が行われるようにしてもよい。
要するに、これまでの実施形態では、合成処理部150は、データ伸張部140によって伸張された画像データを、作業場所として指定された部分画像メモリ上の所定の目標アドレスに保存する「書込処理」(既存データとは無関係に新たなデータを書き込む処理)を行っていたが、ここで述べる変形例の場合、合成処理部150は、データ伸張部140によって伸張された画像データと目標アドレスに保存されていた既存の画像データとについて所定の合成演算(たとえば、上記ブレンド処理の演算)を行った上で、得られた新たな画像データを当該目標アドレスに保存する「書換処理」(既存データと新たなデータとを合成して既存データを書き換える処理)を行うことになる。
<4−3. 部分画像メモリの選択法>
図1に示す基本的な実施形態に係る合成画像作成装置100には、2組の部分画像メモリ171,172が設けられている。このように、部分画像メモリを2組設けている理由は、§1で述べたとおり、両者を交互に利用することにより、一方の部分画像メモリ上で部分画像を作成する処理を実行中に、他方の部分画像メモリ上に既に作成済みの部分画像をデータ出力部160を介して外部へ出力できるようにするためである。
たとえば、第i番目の部分画像Qiが部分画像メモリ171上に作成されると、当該部分画像Qiは、データ出力部160によって、合成画像Pの一部として外部へ出力されることになるが、1バイト単位のデータ列として時系列で出力されるため、部分画像Qiを構成する全データの出力を完了するまでには時間が必要であり、その間、部分画像メモリ171は、新たな部分画像を作成する処理に利用することはできない。そこで、もう1組の部分画像メモリ172を設けておけば、部分画像メモリ171が部分画像Qiを出力中に、第(i+1)番目の部分画像Q(i+1)を部分画像メモリ172上に作成する処理を並行して行うことが可能になる。
もちろん、本発明に用いる部分画像メモリの総数は2組に限定されるものではなく、複数N組であればよいので、3組以上の部分画像メモリを設けるようにしてもかまわない。2組の部分画像メモリを用いた実施形態では、これまで述べたとおり、両者を交互に選択して新たな部分画像の作成に利用することになるが、3組以上の部分画像メモリを用いる場合には、いわゆるローテーションシフトによる順次選択を行いながら、新たな部分画像の作成に利用すればよい。
具体的には、コントローラ部130が、第i番目(1≦i≦M)の部分画像Qiを生成する際に、iをNで除した剰余wを求め、N個の部分画像メモリのうちの第w番目(但し、w=0の場合は、第N番目)の部分画像メモリを作業場所として指定し、データ出力部160が、第1番目の部分画像メモリ〜第N番目の部分画像メモリに生成された部分画像を順番に出力する処理を、全M個の部分画像Q1〜QMの出力が完了するまで繰り返し実行するようにすればよい。
もっとも、3組以上の部分画像メモリを設けた場合の作業場所の選択法は、上述したローテーションシフトによる順次選択法に限定されるものではない。要するに、データ出力部160が外部にデータを出力途中の部分画像メモリ以外のメモリ(別言すれば、過去に作成された部分画像の出力処理が既に完了したメモリ)を選択すればよい。一般的には、コントローラ部130は、第i番目(1≦i≦M)の部分画像を生成する際に、全N個の部分画像メモリのうち、第(i−1)番目の部分画像Qiに対して指定されたもの以外の1つ(つまり、直前に作業場所として指定されたもの以外の1つ)を作業場所として選択する指示を合成処理部150に与えればよい。
なお、部分格納メモリの総数Nを多くすればするほど、出力終了待ち合わせ時間は短くてすむが、必要な総メモリの容量は大きくなり、製造コストは高騰する。
<4−4. データ伸張部の総数>
図1に示す基本的な実施形態に係る合成画像作成装置100には、1組のデータ伸張部140のみが設けられているが、複数組のデータ伸張部(デコーダ回路)を設けておけば、より高速な伸張処理が可能になる。たとえば、複数の素材画像を伸張する必要がある場合、複数のデータ伸張部にそれぞれ分担させ、並列処理で伸張を行うようにすれば、伸張処理に要する時間を短縮することができる。
<4−5. ステータスバッファの利用形態>
§3では、図1に示すコントローラ部130に組み込まれているステータスバッファ131の機能を簡単に説明したが、ここでは、このステータスバッファ131を利用した具体的な処理プロセスを説明しよう。
いま、図24に示すように、第1の部分画像Q1を作成するプロセスを考えてみる。図示のとおり、部分画像Q1に対しては、素材画像M1(樹木)と素材画像M2(鳥)が割り付けられるが、これらの素材画像は、いずれも部分画像Q1とQ2の境界線Bを跨いで割り付けられる画像である。そこで、ここでは、このように部分画像間の境界線を跨いで割り付けられる素材画像を、跨線素材画像と呼ぶことにする。
これら跨線素材画像M1,M2については、部分画像Q1に関する割付処理を完了した後、引き続いて、部分画像Q2に関する割付処理も行われることになるので、処理の引き継ぎが行われるようにすれば、作業効率を向上させることができる。ステータスバッファ131は、この処理の引き継ぎのための情報を一時保存するために利用することができる。すなわち、部分画像Q1を生成する際に行った処理に関する履歴情報をステータスバッファ131に格納しておけば、部分画像Q2を生成する際に、当該履歴情報を利用した効率的な処理を行うことができる。
図24に示す例の場合、部分画像Q1を生成する処理では、跨線素材画像M1については、ハッチングを施して示す単位画像M1(1)〜M1(4)が処理対象となり、跨線素材画像M2については、ハッチングを施して示す単位画像M2(1)〜M2(2)が処理対象となる。すなわち、これらの単位画像が伸張対象となり、また、部分画像メモリへの書込処理や書換処理の対象となる。
そこで、コントローラ部130が、部分画像Q1を生成する処理を行う際に、跨線素材画像M1については、境界線Bに跨がって配置される境界単位領域M1(4)の先頭アドレスA(M1(4))をステータスバッファ131に記憶し、跨線素材画像M2については、境界線Bに跨がって配置される境界単位領域M2(2)の先頭アドレスA(M2(2))をステータスバッファ131に記憶しておくようにすれば、これらのアドレスを部分画像Q2を生成する処理に利用することができる。
具体的には、部分画像Q2を生成する処理では、跨線素材画像M1については、境界単位領域M1(4)以降の各単位領域についての処理を指示する必要があり、跨線素材画像M2については、境界単位領域M2(2)以降の各単位領域についての処理を指示する必要があるが、ステータスバッファ131を参照すれば、これら境界単位領域M1(4),M2(2)の先頭アドレスA(M1(4)),A(M2(2))を直ちに入手して、データ伸張部140に伝達することが可能になる。
もちろん、アドレスA(M1(4)),A(M2(2))は、配置基準点L1(x1,y1),L2(x2,y2)の座標値、単位領域の縦幅u、割付倍率m、単位領域の番号kを用いた演算を行えば算出することができるが、ステータスバッファ131にこれらのアドレスを記憶しておくようにすれば、そのような演算を省略し、より効率的な作業を行うことができる。
なお、境界単位領域が境界線に接して配置される場合も、ほぼ同様の処理を行えばよい。たとえば、図24に示す例の代わりに、図25に示す例を考えてみよう。図24に示す例では、境界単位領域M1(4)が境界線Bに跨がって配置されていたのに対し、図25に示す例では、境界単位領域M1(3)が境界線Bの上方に接して配置されている(部分画像Q1,Q2の境界線Bが、ちょうど単位領域M1(3),M1(4)の境界線にもなっている)。このような場合も、部分画像Q1を生成する処理を行う際に、境界単位領域M1(3)の先頭アドレスA(M1(3))をステータスバッファ131に記憶しておくようにすれば、部分画像Q2を生成する処理を行う際に、この先頭アドレスA(M1(3))を参照して、伸張対象となる単位領域のアドレスを指定することができる。
なお、この場合、部分画像Q2を生成する処理を行う際に伸張対象となる単位領域は、単位領域M1(3)ではなく、次の単位領域M1(4)になるので、ステータスバッファ131に記憶されていたアドレスA(M1(3))に基づいて、次の単位領域M1(4)の先頭アドレスA(M1(4))を求める演算が必要になる。もちろん、部分画像Q1を生成する処理を行う際に、境界線Bの下方に接する境界単位領域M1(4)の先頭アドレスA(M1(4))をステータスバッファ131に記憶するようにすれば、部分画像Q2を生成する処理を行う際には、当該先頭アドレスA(M1(4))をそのまま利用することができる。
結局、この変形例を一般論として説明すれば、コントローラ部130が、第i番目の部分画像Qiに関する伸張処理の指示を行う際に、第i番目の部分画像Qiと第(i+1)番目の部分画像Q(i+1)との境界線Bに跨がって配置される跨線素材画像の境界線Bに跨がってもしくは境界線Bに接して配置される境界単位領域の先頭アドレスを記憶しておくようにし、第(i+1)番目の部分画像Q(I+1)に関する跨線素材画像についての伸張処理の指示を行う際に、記憶されていた境界単位領域の先頭アドレスを参照して、伸張対象となる単位領域内の画像データのアドレスを指示すればよい。
<4−6. 後続する部分画像についての先行処理>
図24に示す部分画像Q1を作成するプロセスでは、跨線素材画像M1については単位画像M1(1)〜M1(4)が伸張対象となり、跨線素材画像M2については単位画像M2(1)〜M2(2)が伸張対象となる。したがって、部分画像Q1を作成するプロセスにおいて、データ伸張部140は、これら伸張対象についての伸張処理を行い、合成処理部150は、作業場所として指定された部分画像メモリに対して、伸張された単位画像の書込処理を行うことになる。
ただ、これまでの実施形態では、部分画像Q1の領域から食み出した部分のデータはそのまま捨てられる。たとえば、図24に示す例の場合、単位画像M1(4)やM2(2)は、境界線Bに跨がって配置された跨線単位領域について伸張された単位画像であるため、部分画像Q1に含まれる部分(上方部分)については、作業場所となる部分画像メモリに書き込まれることになるが、部分画像Q2に含まれる部分(下方部分)については、そのまま捨てられることになり、部分画像Q1を作成するプロセスにおいて利用されることはない。
一方、後続して行われる部分画像Q2を作成するプロセスでは、やはり単位画像M1(4)やM2(2)の一部分(下方部分)が必要になるため、同じ跨線単位領域についての伸張処理が再度実行されることになる。このように、伸張処理は、単位領域ごとに行われるため、隣接する部分画像の境界線Bに跨がって配置される跨線単位領域については、無駄な処理が生じてしまう。
ここで述べる変形例は、このような無駄な処理を解消するためのアプローチを示すものである。この変形例を実施する場合、合成処理部150は、部分画像Q1を作成するプロセスにおいて、境界線Bに跨がって配置される跨線単位領域について伸張された単位画像M1(4)およびM2(2)のうち、部分画像Q1に含まれる部分については、これまで述べてきた実施形態と同様に、部分画像Q1についての作業場所として指定された部分画像メモリに対して書込処理を行い、部分画像Q2に含まれる部分については、部分画像Q2についての作業場所として指定される次段の部分画像メモリに対して先行した書込処理を行うようにする。そうすれば、続いて行われる部分画像Q2を作成するプロセスでは、先行して行われた書込処理の結果を利用した処理を行うことができる。
たとえば、図24に示す例において、部分画像Q1についての作業場所として部分画像メモリ171が指定され、部分画像Q2についての作業場所として部分画像メモリ172が指定された場合を考えてみよう。この場合、部分画像Q1を作成するプロセスでは、跨線素材画像M1を構成する単位画像M1(1),M1(2),M1(3)およびM1(4)の上方部分(境界線Bより上の部分)について、部分画像メモリ171に対する書込処理が実行されるとともに、単位画像M1(4)の下方部分(境界線Bより下の部分)については、次段の部分画像メモリ172に対する先行した書込処理が実行される。また、跨線素材画像M2を構成する単位画像M2(1)およびM2(2)の上方部分(境界線Bより上の部分)について、部分画像メモリ171に対する書込処理が実行されるとともに、単位画像M2(2)の下方部分(境界線Bより下の部分)について、次段の部分画像メモリ172に対する先行した書込処理が実行される。
このように、次段の部分画像メモリ172に対する先行した書込処理を実行すれば、伸張処理を行って得られた単位画像の一部が無駄になるのを防ぐことができる。すなわち、後続して行われる部分画像Q2を作成するプロセスでは、既に、単位画像M1(4)の下方部分(境界線Bより下の部分)および単位画像M2(2)の下方部分(境界線Bより下の部分)の内容が、部分画像メモリ172に書き込まれているので、これらについての再度の伸張処理や書込処理を省略することができる。
この変形例を一般論として説明すれば、合成処理部150が、第i番目の部分画像Qiに関する指示に基づいて書込処理もしくは書換処理を行う際に、第i番目の部分画像Qiと第(i+1)番目の部分画像Q(i+1)との境界線Bに跨がって配置される跨線素材画像の当該境界線Bに跨がって配置される跨線単位領域について伸張された画像データのうち、第(i+1)番目の部分画像Q(i+1)に含まれる部分については、第(i+1)番目の部分画像Q(i+1)についての作業場所として指定される次段部分画像メモリに対して先行した書込処理もしくは書換処理を行い、第(i+1)番目の部分画像Q(i+1)に関する指示に基づいて書込処理もしくは書換処理を行う際に、この先行した書込処理もしくは書換処理の結果を利用した処理を行うようにすればよい。
もちろん、先行した書込処理もしくは書換処理を行う対象となる次段部分画像メモリは、新たな部分画像を作成する処理の準備が完了した状態(すなわち、過去に作成した部分画像の全データが、データ出力部160を介して既に外部に出力されている状態)になっている必要がある。したがって、この変形例を実施する場合、実用上は、部分画像メモリの総数Nを3以上に設定し、§4−3で述べたローテーションシフトによる順次選択法により、作業場所の選択を行うようにするのが好ましい。
なお、部分画像Q(i+1)において、新たな素材画像が登場した場合などでは、部分画像Qiを作成するプロセスにおいて次段部分画像メモリに対して先行して行った書込処理もしくは書換処理の結果に矛盾が生じるケースもあるが、そのようなケースについては、これまで述べてきた基本的な実施形態と同様に、部分画像Q(i+1)を作成するプロセスにおいて、跨線単位領域についての処理を再度実行すればよい。
<4−7. 単位領域の変形例>
これまで述べてきた実施形態は、図6に示す例のように、モチーフとなる所定の絵柄(たとえば、樹木の絵柄)を含む包摂矩形R1からなる素材画像M1を縦方向にK等分することにより、縦幅uをもった横方向に細長いK個の単位領域を設定していたが、本発明における単位領域の設定は、このような態様に限定されるものではない。
たとえば、図26は、素材画像M1上に設定した単位領域の変形例を示す平面図である。この例の場合、包摂矩形R内の素材画像M1を、横方向に3分割、縦方向に14分割することにより、合計42個の単位領域を設定している。その結果、1行目には、3組の単位領域M1(11),M1(12),M1(13)が配置され、2行目には、3組の単位領域M1(21),M1(22),M1(23)が配置され、... ,以下、同様である。もちろん、個々の単位領域内の画像データは、それぞれ独立して伸張可能な態様で圧縮される。
各単位領域は、いずれも横幅a、縦幅bをもった矩形になる。一般論として説明すれば、横幅が所定値aの整数倍、縦幅が所定値bの整数倍のサイズをもった包摂矩形R内に素材画像M1を定義し、横幅が値a、縦幅が値bである単位領域を設定すればよい。ここで、包摂矩形Rは、その横幅が単位領域の横幅aの整数倍、縦幅が単位領域の縦幅bの整数倍になるように調整されているため、その右端部および底部に若干の余白領域(図にハッチングを施して示す領域)が生じている。
このように、素材画像を縦横に分割して単位領域を設定すると、より効率的な処理が可能になる。たとえば、図27に示す例のように、ある部分画像Qに対して、素材画像M1を図示の位置に割り付ける場合を考えてみよう。この場合、伸張対象となる単位領域は、図にハッチングを施して示す14組の単位領域(第4〜10行目の第2列目および第3列目の単位領域)のみになり、第1列目の単位領域については伸張する必要はない。すなわち、素材画像を縦横に分割して単位領域を設定することにより、伸張対象となる単位領域をきめ細かく指定することが可能になり、無駄な部分についての伸張処理を省くことが可能になる。