図1は,8×8画素の白黒の画像例である。この図に対して,白を0,黒を1として表すと,図2に示すように8ビットのビット列が8行あるディジタルデータとして,画像データを表現することができる。 文字データしか送れない通信で画像データを送ろうとする場合,画像データを文字データであるかのように変換して通信する必要がある。 また,文字データと比べてデータ量の大きい画像データを効率よく通信するために,データを圧縮して送るという工夫がなされる。図2のビット列を左上から順に見ていくと,0が10個続き,次に1が34個続き,その次に0が20個続いていることが分かる。この同じ値が続く個数のことをランレングスという。これを利用して画像データを圧縮する方法を考える。 次に示す画像データの表現方法は,画像データの情報量を圧縮することを目的とする変換である。図2に示す画像データは,何ビットで表現されるか。 〔画像データの表現方法〕 (1) 画像データをランレングスで表現し,それらの値を最大128の範囲で区切る。例えば,ランレングスが200の場合は,128と72の二つのランレングスに分ける。 (2) (1)で表現したそれぞれの値から1を引き,2進数7ビットで表現する。各7ビットに対して,白の場合は0を,黒の場合は1を,それぞれの色情報として先頭ビットに補って各8ビットで表現する。
平成24年度 秋期 ITパスポート試験 問95
この問題の解説と、これまでの解答の記録です。
問 95
※ この問題は、解説作成時の検算で公表解答を確認しきれませんでした。判定は IPA 公表の解答どおりです。
不正解ア
7ビットは、ランレングス1個の「数値部分」だけの長さです。手順(2) は数値の7ビットに色情報の先頭1ビットを補って各8ビットにすると定めているので1個でも8ビット必要ですし、そもそも図2 にはランレングスが三つあります。単位 (1個ぶん) と全体量 (画像データ全体) を取り違えた値です。
不正解イ
8ビットは、ランレングス1個ぶんの符号長です。色情報1ビット+数値7ビットという1個の構成としては正しいのですが、設問が問うているのは図2 の画像データ全体を表現するのに必要なビット数です。図2 のランは 白10・黒34・白20 の三つあるので、その3倍が必要になります。
不正解ウ
21ビットは 3×7 で、ランレングスが三つであることは正しく数えられていますが、各ランの先頭に補う色情報の1ビットを数え落としています。手順(2) は「白の場合は0を、黒の場合は1を、それぞれの色情報として先頭ビットに補って各8ビットで表現する」と明記しており、1個あたりは7ビットではなく8ビットです。3ビットぶん不足しています。
- エ
正解 図2 のビット列を左上から順に読むと、白 (0) が10個、黒 (1) が34個、白 (0) が20個続いています。つまりランレングスは「白10 → 黒34 → 白20」の三つです (10+34+20=64画素=8×8)。 手順(1):ランレングスの値を最大128の範囲で区切ります。10・34・20 はどれも128以下なので、分割は起こりません。ランレングスは三つのままです。 手順(2):それぞれの値から1を引いて2進数7ビットで表し、先頭に色情報の1ビット (白は0、黒は1) を補って8ビットにします。 ・白10 → 10-1=9 → 7ビットで 0001001 → 先頭に白の0 を補って 00001001 ・黒34 → 34-1=33 → 7ビットで 0100001 → 先頭に黒の1 を補って 10100001 ・白20 → 20-1=19 → 7ビットで 0010011 → 先頭に白の0 を補って 00010011 ランレングスが三つ、1個あたり8ビットなので 3×8=24ビット。よって正解は エ です。元の画像データは64ビットでしたから、24ビットに圧縮できたことになります (圧縮率 24÷64=37.5%)。 なお「1を引く」のは、ランレングスが必ず1以上128以下であるのに対し、7ビットで表せるのは0〜127だからです。1〜128 を 0〜127 にずらすことで、128 までのランを7ビットに収めています。
- ランレングス法 (連長圧縮) は、同じ値が連続する個数を符号化する可逆圧縮方式。まず画像データを「色と連続個数」の並びに読み替えることが出発点で、図2 は 白10 → 黒34 → 白20 の三つのランになる。総ビット数は (ランの個数)×(1個あたりの符号長) で求める。
- 符号化規約は「区切りの上限」と「1個あたりの符号長」の二点を必ず確認する。本問は上限128なので 10・34・20 は分割されずランは3個のまま、1個あたりは数値7ビット+色情報1ビットで8ビット。よって 3×8=24ビットとなり、元の64ビットが37.5%に圧縮される (圧縮率=圧縮後÷圧縮前)。