##自己紹介
スマートファクトリーに向けた制御ソフトウェア設計のエンジニアです。
エンジニアとしての経歴
- 大学院時代:動画像圧縮符号化アルゴリズム開発 3年間
- 前職の前半:カメラの電気設計 3年半
- 前職の後半:FPD露光装置の制御ソフト設計 2年間
ハードウェア,ミドルウェア,ソフトウェアそれぞれをそこそこできるタイプ 。
↓twitter発信もしてます
https://twitter.com/ksk_taka?s=09
##本記事の対象読者
画像処理をしてみたいけどそもそも画像の構成を知らないという方向けです。
そこそこの専門領域を、目で見てわかりやすく説明するよう心がけます。
ソースコードについては一切記述しません。
「概要」を知りたい方のみ以下にお進みください。
技術系の知識はほぼ必要ありません。
##記事の概要
以下の流れで説明します。
- デジタル画像とは?
- 画像圧縮符号化の概要
-
画像圧縮符号化で利用する特性
- 人間の視覚特性
- 画像の周波数特性
##1.デジタル画像とは?
###デジタル画像の定義
一般的にデジタル画像というと画素を二次元に並べたものを指します(別名ラスターイメージ)。
デジタルカメラなどで撮影した後にモニタに表示されているもの、それがデジタル画像です。
相対する概念はアナログ画像になります。
フィルムカメラで撮影し,現像した写真
絵画
などが当てはまります。
学術的なごく限られた場面を除き、写真などのことをわざわざ「アナログ画像」と呼ぶ人はいないので
画像と言われたらデジタル画像を指すと認識して問題ありません。
###画素を二次元に並べたもの
デジタルカメラやディスプレイなどのスペックで
画素
ピクセル
ドット
という単語をよく聞くと思います。
画素とピクセルは完全に同じ意味です。画素の英訳がピクセルだと思ってください。
一方でドットは意味が少々異なります。
まずは下記の画像をご覧ください。
画像はモノクローム画像(モノクロ画像)とカラー画像に分けられます。その点については後ほど。
上記はモノクロ画像の画素の並びを表現したものです。
例として横に6000個,縦に4000個の計24,000,000個の画素が並んでいるとします。
この画像は2,400万画素(24メガピクセル)の画像と呼ぶことができます。
1つ1つの画素には明るさ(輝度値)の情報が含まれています。
この輝度値情報が含まれているかどうか?が画素とドットの概念の違いになります。
ドットには,基本的に輝度値情報は含まれていません。
画素における輝度値は黒が0とし,白が最大値となります。
時折どっちがどっちだったか迷う人がいますが,輝度値という単語を覚えておけば間違えません。
明るさの度合いなので,値が大きい方が明るくなります。
輝度の最大値は画素に割り当てるのビット数により決まります。
最も広く使われているのが8bit。つまり2の8乗=256です。
256段階で明るさを表現しますので,1つの画素は0から255までの値を持つということになります。
他には10bit,14bit,16bitあたりがよく使われているかと思います。
bit数が上がれば上がるほど,明るさの細かい変化を表現できるようになりますので,
滑らかな画像の表現が可能になります。
※
例えば8bit画像の輝度値1と10bit画像の輝度値1は明るさが異なります。
明るさを均等に分割しているのであれば,「8bitの輝度値1 = 10bitの輝度値4(8bit輝度値×2×2 で10bit輝度値)」となりますので8bitでは表現できなかった明るさが10bitでは輝度値1~3で表現できるようになるというわけです。
その代わり,bit数を上げた分だけ画像が持つ情報量(=ファイルサイズ)は大きくなります。
bitによる諧調の違いについては、下記のサイトが非常に参考になるので覗いて見て下さい。
1画素の輝度の階調数を変えた例
http://www.mis.med.akita-u.ac.jp/~kata/image/digitize/quantize.html
それでは,**8bitモノクロ画像が無圧縮状態でどれだけのデータ量を持つか?**を考えてみましょう。
画素数 :2,400万画素
1画素あたり :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となります。
これを覚えておいて下さい。
続いてカラー画像に入ります。
以下をご覧ください。
カラー画像は**赤(Red),緑(Green),青(Blue)**の3色で構成され、RGBカラー画像などと呼ばれます。
先ほどのモノクロ画像では,1画素が持つ値は輝度値のみだけでしたが、
カラー画像では1画素につきR,G,Bのそれぞれの値を持つことになります。
モノクロ画像と同様,1色につき8bitであることが多いため,
3色合わせて8×3=24bitのデータを持つことになります。
先ほどと全く同じ6000×4000画素の画像を考えた場合,
画素数 :2400万画素
1画素あたり :8bit × 3色
となります。
単純にモノクロ画像の3倍の情報量を持つことになりますので,画像のデータ量は
約22.9MB × 3 = 約68.7MB
の大きさとなります。
ここで,Windowsのペイントを利用し,実際に画像のファイルサイズを確かめてみましょう。
ビットマップというのは無圧縮の画像データのことです。
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符号化)**に分かれます。
それぞれの意味は読んで字のごとくです。以下を見てみましょう。
可逆符号化は符号化後の画像データに一切の劣化が生じない方式です
非可逆符号化は符号化後の画像データに劣化が生じ,もとのデータに戻すことはできない方式です。
それぞれのメリット/デメリットと用途について見ていきましょう。
方式 | メリット | デメリット | 用途 | ファイル形式 |
---|---|---|---|---|
可逆符号化 | 劣化無し | データ削減量は微少(最大でも半分ほど) | 劣化の許されない医療や芸術などの分野,ハイエンド向けカメラ | 各カメラメーカーのRAW,PNGなど |
非可逆符号化 | 大幅なデータ削減(元の1/20など。画像や設定による) | 劣化有り | 一般的なカメラなど | JPEG,GIF,JPEG2000など |
最も広く使われているのは非可逆符号化であるJPEGです。
皆さんも「.jpg」「.jpeg」などの拡張子の画像ファイルを見たことがあるのではないかと思います。
静止画像のファイル拡張子は符号化方式を表していることがほとんどです(ビットマップは無圧縮のため例外)
##3.画像符号化で利用する特性
まず、JPEGの処理に入る前に画像符号化で利用する特性について説明します。
利用するのは以下2つです。
- 人間の視覚特性
- 画像の周波数特性
###3-1.人間の視覚特性
人間の眼は以下のような特性を持っています。
####周波数に関して
低周波の変化・・・敏感に察知する
高周波の変化・・・鈍感。察知しづらい
これだけでは何のことか分かりづらいので,実際の画像で見てみましょう。
以下の4×4画素の画像を見てください。
信号処理を学んだことがある人はすぐに分かるかと思いますが,
そうでない人の為に簡単に説明すると
低周波は画像の中で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要素に分けた場合はそれぞれ以下の様になります。
※「RGB」「YUV」それぞれのwikipediaより引用
フルカラーの画像が明るさ(モノクロ)成分と,その他に分かれていることが見て取れると思います。
繰り返しますが,ここに関しては「なぜか?」は考えない方が良いです。
理解には色彩工学の専門知識が必要になります(筆者も完全には理解していません)
さて、上記でRGB→YUVの変換ができたところで
輝度,色差それぞれを変化させてみましょう。
2×2画素(赤,青,緑,黄)からなるカラー画像①に対し
②それぞれの画素から輝度成分Yを20引いたもの
③それぞれの画素から色差成分Uを20引いたもの
になります。
①→②と①→③のどちらの変化が分かりやすいか?を見ると
①→②の変化の方が分かりやすいかと思います。
これが輝度の変化に敏感,色差の変化に鈍感ということです。
###3-2.画像の周波数特性
続けて,画像の周波数特性について確認していきましょう。
一般に,画像は隣接する画素間の相関が非常に高いと言われています。
簡単に言うと「隣り合っている画素はよく似ている」という意味です。
以下の画像を見てください。
こちらは画像処理の世界で評価画像としてよく利用されるlennaという画像です。
上記を見てわかる通り,隣り合う画素が非常によく似ていることが分かります。
顔と背景,髪と帽子などの境界で色が大きく変わっている部分はあるものの,
全体で見れば隣り合う画素同士が似ている部分が多くを占めることが分かるかと思います。
上の方で出た低周波,高周波の話を思い返してください。
画像内の画素ごとの変化が小さいものが低周波な画像
画像内の画素ごとの変化が激しいものが高周波な画像
とお伝えしました。
今回の画像で見ると
隣同士画素同士が似ている部分が多い
→色の変化が少ない領域が多い
→低周波な領域が多い
→エネルギーが低周波成分に集中する
と言い換えることができます。
この画像のエネルギーが低周波成分に集中する特性は,
動画像を含め,現存する多くの符号化方式で活用されている非常に重要な特性です。
次回はこれらの特性を利用した符号化方式JPEGのアルゴリズムについて詳しく話していきます。