図1は,8×8画素の白黒の画像例である。この図に対して,白を0,黒を1として表すと,図2に示すように8ビットのビット列が8行あるディジタルデータとして,画像データを表現することができる。 文字データしか送れない通信で画像データを送ろうとする場合,画像データを文字データであるかのように変換して通信する必要がある。 また,文字データと比べてデータ量の大きい画像データを効率よく通信するために,データを圧縮して送るという工夫がなされる。図2のビット列を左上から順に見ていくと,0が10個続き,次に1が34個続き,その次に0が20個続いていることが分かる。この同じ値が続く個数のことをランレングスという。これを利用して画像データを圧縮する方法を考える。 次に示す画像データの表現方法は,画像データの情報量を圧縮することを目的とする変換である。図2に示す画像データは,何ビットで表現されるか。 〔画像データの表現方法〕 (1) 画像データをランレングスで表現し,それらの値を最大15の範囲で区切っていく。例えば,ランレングスが20の場合は,15と5の二つのランレングスに分ける。 (2) 白と黒のランレングスをそれぞれ4ビットの2進数で表し,常に“白と黒”の8ビットの組みとして表現する。例えば,白のランレングスが15と5というように続く場合は,その間にランレングス0(2進数では0000)の黒を補い,白のランレングス15と黒のランレングス0の組みを作る。このように,白又は黒が続く場合は間に黒又は白,黒で始まる場合は先頭に白,白で終わる場合は末尾に黒のランレングス0を補うことで,常に白と黒の8ビットの組みを作る。
平成24年度 秋期 ITパスポート試験 問94
この問題の解説と、これまでの解答の記録です。
問 94
※ この問題は、解説作成時の検算で公表解答を確認しきれませんでした。判定は IPA 公表の解答どおりです。
不正解ア
12ビットは、区切りも組み化もせずに「白10・黒34・白20 の3つのランを4ビットずつで表した」3×4=12 に相当します。手順(1) の最大15での分割も、手順(2) の「常に白と黒の8ビット組み」も適用していません。そもそも34 や20 は4ビット (最大15) では表せないので、この数え方自体が規約に反します。
不正解イ
24ビットは、白10・黒34・白20 の3つのランを分割せずに1ラン=8ビットで数えた 3×8=24 です。これは同じ図2 を別の方式で符号化する問95 の答えであって、本問の方式ではありません。本問は手順(1) で最大15に区切るため黒34 が 15・15・4 に、白20 が 15・5 に分かれ、ランはそもそも3個では済みません。
- ウ
正解 図2 のビット列を、上の行から左→右へ一続きに読みます。 00000000 / 00111111 / 11111111 / 11111111 / 11111111 / 11110000 / 00000000 / 00000000 0 を白、1 を黒として数えると、 ・0 が10個 (第1行の8個 + 第2行の先頭2個) ・1 が34個 (第2行の残り6個 + 第3〜5行の24個 + 第6行の先頭4個) ・0 が20個 (第6行の残り4個 + 第7・8行の16個) で、10+34+20=64画素=8×8 と合います。つまりランレングスは「白10 → 黒34 → 白20」です。 手順(1):値を最大15の範囲で区切ります。白10 はそのまま、黒34 は 15+15+4、白20 は 15+5 に分かれるので、 白10 / 黒15 / 黒15 / 黒4 / 白15 / 白5 の6個のランレングスになります。 手順(2):これを常に「白と黒」の8ビット組みにします。先頭は白なので先頭の白0 は不要です。 1組目 白10・黒15 … 白→黒の並びなので、そのまま1組にまとまる 2組目 白0・黒15 … 黒が続くので間に白のランレングス0 を補う 3組目 白0・黒4 … 同じく黒が続くので白0 を補う 4組目 白15・黒0 … 白が続くので間に黒のランレングス0 を補う 5組目 白5・黒0 … 白で終わるので末尾に黒のランレングス0 を補う 組みは5組。1組が8ビット (白4ビット+黒4ビット) なので、 5組 × 8ビット = 40ビット よって正解は ウ の40 です。 実際のビット列は 10101111 00001111 00000100 11110000 01010000 (白10=1010、黒15=1111、白0=0000、黒4=0100、白15=1111、黒0=0000) となり、確かに40ビットです。元の64ビットが40ビットに縮んでいる点が、この方式が圧縮になっているということです。
不正解エ
48ビットは、手順(1) で区切った後の6個のランレングス (白10 / 黒15 / 黒15 / 黒4 / 白15 / 白5) を、1個ずつ独立した組みとみなして機械的に 6×8=48 と数えたものです。しかし手順(2) がランレングス0 の詰め物を入れるのは「同じ色が続くとき (間に反対色の0)」「黒で始まるとき (先頭に白0)」「白で終わるとき (末尾に黒0)」の三つの場合だけで、白→黒と自然に切り替わる箇所には詰め物は要りません。本問では先頭の 白10 と 黒15 がまさにその白→黒の並びなので、この2個が1組にまとまります。その1組ぶんだけ組数が6ではなく5になり、答えは48ではなく40になります。
- ランレングス法 (連長圧縮) は、同じ値が連続する長さをまとめて「色と個数」で表す可逆圧縮。まず画像データを白と黒のランの列 (本問では 白10 → 黒34 → 白20) に直すのが出発点で、ここを図から正確に読み取れるかが勝負どころ。
- この種の規約問題は暗記ではなく、与えられた手順を順番に機械的に適用する。(1) 最大15で区切ってランの個数を確定し、(2)「常に白と黒の組み」という制約から、色が続く / 黒で始まる / 白で終わる場合にランレングス0 の詰め物を入れて組数を数え、最後に 組数 × 8ビット を計算する。