【初心者向け】デジタル画像の基本概念と，画像圧縮符号化の理解に必要な前提知識


## 自己紹介
スマートファクトリーに向けた制御ソフトウェア設計のエンジニアです。

**エンジニアとしての経歴**

 + 大学院時代：動画像圧縮符号化アルゴリズム開発　　3年間
 + 前職の前半：カメラの電気設計　　　　　　　　　　3年半
 + 前職の後半：ＦＰＤ露光装置の制御ソフト設計　　　2年間

ハードウェア，ミドルウェア，ソフトウェアそれぞれをそこそこできるタイプ 。

↓twitter発信もしてます
https://twitter.com/ksk_taka?s=09

## 本記事の対象読者
　**画像処理をしてみたいけどそもそも画像の構成を知らない**という方向けです。
　そこそこの専門領域を、目で見てわかりやすく説明するよう心がけます。
　ソースコードについては一切記述しません。
　「概要」を知りたい方のみ以下にお進みください。
　技術系の知識はほぼ必要ありません。

## 記事の概要
以下の流れで説明します。

 1. **デジタル画像とは？**
 2. **画像圧縮符号化の概要**
 3. **画像圧縮符号化で利用する特性**
     1. 人間の視覚特性
     2. 画像の周波数特性

## １．デジタル画像とは？
### デジタル画像の定義
一般的にデジタル画像というと**画素を二次元に並べたもの**を指します（別名ラスターイメージ）。
デジタルカメラなどで撮影した後にモニタに表示されているもの、それが**デジタル画像**です。

相対する概念は**アナログ画像**になります。
　**フィルムカメラで撮影し，現像した写真**
　**絵画**
などが当てはまります。

学術的なごく限られた場面を除き、写真などのことをわざわざ「アナログ画像」と呼ぶ人はいないので
**画像と言われたらデジタル画像を指す**と認識して問題ありません。

### 画素を二次元に並べたもの
デジタルカメラやディスプレイなどのスペックで
　**画素**
　**ピクセル**
　**ドット**
という単語をよく聞くと思います。

**画素**と**ピクセル**は**完全に同じ意味**です。画素の英訳がピクセルだと思ってください。
一方で**ドット**は**意味が少々異なります**。

まずは下記の画像をご覧ください。
![1.モノクローム画像.png](https://qiita-image-store.s3.amazonaws.com/0/323105/152b0f03-d30d-9b87-c441-aeef0503100c.png)
画像は**モノクローム画像（モノクロ画像）**と**カラー画像**に分けられます。その点については後ほど。

上記はモノクロ画像の画素の並びを表現したものです。
例として**横に6000個**，**縦に4000個**の**計24,000,000個**の画素が並んでいるとします。
この画像は**2,400万画素**(**24メガピクセル**)の画像と呼ぶことができます。


1つ1つの画素には**明るさ（輝度値）の情報**が含まれています。
この**輝度値情報が含まれているかどうか？**が**画素とドットの概念の違い**になります。
ドットには，**基本的に輝度値情報は含まれていません。**


画素における輝度値は**黒が0**とし，**白が最大値**となります。
時折どっちがどっちだったか迷う人がいますが，**輝度値**という単語を覚えておけば間違えません。
**明るさの度合い**なので，**値が大きい方が明るく**なります。

輝度の最大値は画素に割り当てるのビット数により決まります。
最も広く使われているのが**8bit**。つまり**2の8乗=256**です。
**256段階で明るさを表現**しますので，**1つの画素は0から255までの値を持つ**ということになります。

他には**10bit**,**14bit**,**16bit**あたりがよく使われているかと思います。
![5.bar.png](https://qiita-image-store.s3.amazonaws.com/0/323105/de67d7ad-df7d-caa8-174f-6d68a4dd5878.png)



bit数が上がれば上がるほど，明るさの細かい変化を表現できるようになりますので，
**滑らかな画像の表現が可能**になります。

※
例えば**8bit画像の輝度値1**と**10bit画像の輝度値1**は**明るさが異なります**。
明るさを均等に分割しているのであれば，「**8bitの輝度値1 = 10bitの輝度値4（8bit輝度値×2×2 で10bit輝度値）**」となりますので**8bitでは表現できなかった明るさが10bitでは輝度値1~3で表現できるようになる**というわけです。

その代わり，bit数を上げた分だけ画像が持つ情報量（=**ファイルサイズ**）は大きくなります。

bitによる諧調の違いについては、下記のサイトが非常に参考になるので覗いて見て下さい。

**１画素の輝度の階調数を変えた例**
http://www.mis.med.akita-u.ac.jp/~kata/image/digitize/quantize.html

それでは，**8bitモノクロ画像が無圧縮状態でどれだけのデータ量を持つか？** を考えてみましょう。

画素数　　　　：**2,400万画素**
１画素あたり　：**8bit**
　24,000,000 × 8 = **192,000,000[bit]**
**8bit** = **1Byte**なので
　192,000,000 / 8 = **24,000,000[Byte]**
**1,024 Byte = 1 Kilobyte[KB]** なので
　24,000,000 / 1,024 = **23,437.5[KB]**
**1,024 KB = 1 Megabyte[MB]** なので
　23,437.5[KB] / 1,024 = **22.88818359375 [MB]**
画像のデータ量は**約22.9MB**となります。

これを覚えておいて下さい。

続いて**カラー画像**に入ります。

以下をご覧ください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/323105/32dfc949-665e-1a3c-5774-0c8fa290d5d0.png)

カラー画像は **赤(Red),緑(Green),青(Blue)** の3色で構成され、**RGBカラー画像**などと呼ばれます。

先ほどのモノクロ画像では，1画素が持つ値は**輝度値のみ**だけでしたが、
カラー画像では1画素につき**R,G,B** の **それぞれの値を持つ**ことになります。

モノクロ画像と同様，**1色につき8bit**であることが多いため，
**3色合わせて8×3=24bit**のデータを持つことになります。

先ほどと全く同じ6000×4000画素の画像を考えた場合，

画素数　　　　：**2400万画素**
１画素あたり　：**8bit × 3色**
となります。

単純に**モノクロ画像の3倍の情報量**を持つことになりますので，画像のデータ量は

　約22.9MB × 3 = **約68.7MB**

の大きさとなります。

ここで，Windowsのペイントを利用し，実際に画像のファイルサイズを確かめてみましょう。
![4.ペイント.png](https://qiita-image-store.s3.amazonaws.com/0/323105/65997429-22df-da4f-a9b4-b859ec4cc26f.png)

**ビットマップ**というのは**無圧縮の画像データ**のことです。
**24ビットビットマップ**というのは**8bit×3=24bitのフルカラーのビットマップ**ということです。

上記のByte数を見ると**72,000,054バイト**と記載があります。
一方，**画素数×bit数×カラー種類**でファイルサイズを計算すると**72,000,000[Byte]** となります。

ビットマップのファイルには，先頭アドレスから「このファイルがビットマップである事」などを表すヘッダ情報が**54Byte**分だけ含まれているため
合計ファイルサイズが**72,000,054Byte**となるわけです。

※具体的にはファイルヘッダが**14byte**，情報ヘッダが**40byte**です。詳細は以下サイトを参照下さい。
http://www.umekkii.jp/data/computer/file_format/bitmap.cgi

基本的に，モノクロ画像とカラー画像の違いは「1色か3色か」だけなので，
画像処理について学ぶ場合，**モノクロについて概念を押さえ，カラーに応用する**というスタンスで学んでいきましょう。

このページでも「カラーについて」と謳わない限りは基本的にモノクロ画像について記述します。

## 2．画像圧縮符号化の概要
現代は**SD Card**や**ハードディスク**などの保存媒体に**ギガバイト**，**テラバイト**級の大容量の情報を容易に保存できますし，
**4G**,**5G**の時代となり通信も超高速になりました。

しかし，20年近く前の世の中は**データの蓄積技術**も**伝送技術**もそこまで発展していなかったのです。

　**1999年**に発売されたSDカードの容量は**8MB，16MB**程度。
　**2000年**にサービス開始した**フレッツ・ISDN**の通信速度は**64kbps**（**1秒間に8KB**）

「**画像1枚で68MB**」などと言ったらぶん殴られる時代です。
そこで必要となったのが**画像の圧縮符号化技術**です。
以下**符号化**と言ったらいわゆる**画像圧縮符号化**のことを指していると思ってください。

### 可逆符号化と非可逆符号化

符号化技術は大きく**可逆符号化（LossLess符号化）**と**非可逆符号化（Lossy符号化）**に分かれます。
それぞれの意味は読んで字のごとくです。以下を見てみましょう。

![Lossless_vs_Lossy.png](https://qiita-image-store.s3.amazonaws.com/0/323105/ff6120ad-e886-f020-7e48-ea41f849522d.png)

**可逆符号化**は**符号化後の画像データに一切の劣化が生じない方式**です
**非可逆符号化**は**符号化後の画像データに劣化が生じ，もとのデータに戻すことはできない方式**です。

それぞれのメリット／デメリットと用途について見ていきましょう。

| 方式| メリット | デメリット | 用途 | ファイル形式|
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| **可逆符号化** | 劣化無し | データ削減量は微少(最大でも半分ほど) | 劣化の許されない医療や芸術などの分野，ハイエンド向けカメラ |各カメラメーカーの**RAW**，**PNG**など|
| **非可逆符号化** | 大幅なデータ削減(元の1/20など。画像や設定による) | 劣化有り | 一般的なカメラなど |**JPEG**，**GIF**，**JPEG2000**など|

最も広く使われているのは**非可逆符号化**である**JPEG**です。
皆さんも「**.jpg**」「**.jpeg**」などの拡張子の画像ファイルを見たことがあるのではないかと思います。

**静止画像のファイル拡張子は符号化方式を表していることがほとんど**です（ビットマップは無圧縮のため例外）


## 3．画像符号化で利用する特性
まず、JPEGの処理に入る前に**画像符号化で利用する特性**について説明します。
利用するのは以下2つです。

 - **人間の視覚特性**
 - **画像の周波数特性**

### 3-1．人間の視覚特性
人間の眼は以下のような特性を持っています。

#### 周波数に関して
低周波の変化・・・**敏感に察知する**
高周波の変化・・・**鈍感。察知しづらい**

これだけでは何のことか分かりづらいので，実際の画像で見てみましょう。
以下の4×4画素の画像を見てください。

![6.Low‗vs_High.png](https://qiita-image-store.s3.amazonaws.com/0/323105/1c396d5f-fec8-c648-4f52-702566222c7c.png)

信号処理を学んだことがある人はすぐに分かるかと思いますが，
そうでない人の為に簡単に説明すると
**低周波**は画像の中で**1画素ごとの明るさの変化が少ない**状態
**高周波**は画像の中で**1画素ごとの明るさの変化が激しい**状態
を指します。

①の画像は**4×4画素全てが同じ色=変化が全くない**状態なので**周波数が低い**画像と言えます。

一方，③の画像は**4×4画素の全ての画素が異なる明るさ**を持っている状態なので**周波数が高い**画像と言えます。

これらの画像に対して，**画像の下半分の色を濃くする処理**を掛けた結果が②，④です。
①→②の変化は見てすぐにわかると思いますが
③→④の変化は注意深く見ないとわからないと思います。

これが**低周波の変化に敏感，高周波の変化に鈍感**ということです。

#### 色差に関して
輝度の変化・・・**敏感に察知する**
色差の変化・・・**鈍感。察知しづらい**

またもや何のことだか分かりづらいと思うので説明します。

まず**輝度と色差とは何か？**ついて。
先ほど**カラー画像はR,G,Bの3色**という説明をしましたが，
実はカラー画像は**別の方法**でも表現することができます。

具体的には，それぞれの画素のR,G,Bの値を用いて
以下のY,U,Vを計算します。

　Y =  0.299R + 0.587G + 0.114B
　U = -0.169R - 0.331G + 0.500B
　V =  0.500R - 0.419G - 0.081B

この計算によって得られたY,U,Vは以下のように定義されます。
**Y：画素の輝度(明るさ)成分（モノクロ成分）**
**U：画素の色差(色合い)成分①**
**V：画素の色差(色合い)成分②**

ここで「**なぜこの式を用いるとR,G,Bの3成分が明るさ、色差①、色差②の3成分になるのか？**」は考えてはいけません。
「**よく分からないけどそういうものだ**」と思っておけばOKです。

フルカラーの画像を**R,G,Bの3要素に分けた場合**と**Y,U,Vの3要素に分けた場合**はそれぞれ以下の様になります。
![RGBvsYUV.png](https://qiita-image-store.s3.amazonaws.com/0/323105/18d42a80-116c-988c-6668-04e6b08cecbc.png)
※「RGB」「YUV」それぞれのwikipediaより引用

フルカラーの画像が明るさ（モノクロ）成分と，その他に分かれていることが見て取れると思います。
繰り返しますが，ここに関しては「**なぜか？**」は考えない方が良いです。
理解には色彩工学の専門知識が必要になります（筆者も完全には理解していません）

さて、上記でRGB→YUVの変換ができたところで
輝度，色差それぞれを変化させてみましょう。

![RGBvsYUV_2.png](https://qiita-image-store.s3.amazonaws.com/0/323105/5d714f96-7e7d-9145-8cb9-5c24bf0ee888.png)

**2×2画素（赤，青，緑，黄）からなるカラー画像①**に対し
**②それぞれの画素から輝度成分Yを20引いたもの**
**③それぞれの画素から色差成分Uを20引いたもの**
になります。

①→②と①→③のどちらの変化が分かりやすいか？を見ると
①→②の変化の方が分かりやすいかと思います。

これが**輝度の変化に敏感，色差の変化に鈍感**ということです。

### 3-2．画像の周波数特性
続けて，画像の周波数特性について確認していきましょう。

一般に，画像は**隣接する画素間の相関が非常に高い**と言われています。
簡単に言うと「**隣り合っている画素はよく似ている**」という意味です。

以下の画像を見てください。

![lenna.png](https://qiita-image-store.s3.amazonaws.com/0/323105/d31bd829-e99c-1273-2077-8e4462ed25c4.png)
こちらは画像処理の世界で評価画像としてよく利用されるlennaという画像です。

この画像のいくつかの領域を拡大して見てみましょう。![LennaPickup.png](https://qiita-image-store.s3.amazonaws.com/0/323105/d05e6e62-b20c-f322-9f74-113e8eeb7610.png)

上記を見てわかる通り，**隣り合う画素が非常によく似ている**ことが分かります。
**顔と背景**，**髪と帽子**などの境界で色が大きく変わっている部分はあるものの，
全体で見れば**隣り合う画素同士が似ている部分が多くを占める**ことが分かるかと思います。

上の方で出た**低周波**，**高周波**の話を思い返してください。
画像内の**画素ごとの変化が小さい**ものが低周波な画像
画像内の**画素ごとの変化が激しい**ものが高周波な画像
とお伝えしました。

今回の画像で見ると
**隣同士画素同士が似ている部分が多い**
→**色の変化が少ない領域が多い**
→**低周波な領域が多い**
→**エネルギーが低周波成分に集中する**
と言い換えることができます。

この**画像のエネルギーが低周波成分に集中する特性**は，
動画像を含め，現存する多くの符号化方式で活用されている非常に重要な特性です。

次回はこれらの特性を利用した符号化方式JPEGのアルゴリズムについて詳しく話していきます。