2021年オープンキャンパス(青木・伊藤(康)研究室)
画像処理のしくみ

はじめに

いい景色を見つけたとき,おいしそうな食べ物が出てきたとき,何かあったときに,みなさんは,スマートフォンのカメラを使って気軽に写真を撮っていると思います.そして,写真の見映えをよくするために,写真加工アプリを使って「画像処理」をしていると思います.そんな気軽に使っている画像処理の原理は「数学」なんです.ここでは,簡単な数学を使った画像処理を紹介します.

画像とは?

画像は,図 1 のように濃淡値を表示したものです.簡単に言うと写真ですね.実際には,図 2 のように 0 から 255 までの濃淡値の集まりで画像が成り立っています.

Lena_2D
図 1:標準画像 Lena
Lena_2D
図 2:画像の濃淡値の3次元表示

画像を拡大すると・・・

図 1 の Lena ですが,実物のような見た目でした.目のあたりをどんどん拡大すると,どうなるでしょうか? 下の図を見ると画像がどんどん粗くなって,最後にはタイルを並べたように見えてきました.この四角いタイル 1 つが画像の最小単位を表す画素(ピクセル)です.画素が持っている値のことを輝度値(あるいは画素値)と呼びます.

Lena1
Lena2
Lena3
Lena4
図 3:Lena 画像の拡大

画像は行列?

画像を拡大すると,画素がきれいにタイル状に並んでいました.そして,このタイルには,輝度値という値が入っていました.図 4 のように,画素の上に輝度値を表示すると数字が入った表のように見えます.数字が入っている表だけを抜き出すと図 5 のようになります.縦方向を「行」,横方向を「列」と呼び,表全体を「行列」と呼びます.行番号を n1,列番号を n2 とするとき,行列全体を I(n1,n2) と表します.行番号と列番号を入れると,その場所にある値を呼び出すことができます.例えば,3 行 3 列目であれば,I(3,3) となり,その値は 102 となります.このように,画像は,行列そのものと考えられるので,行列に対する数学的な操作(足し算とか引き算)を行うことができます.これが画像処理になります.

matrix
図 4:画素と輝度値
matrix2
図 5:行列

画像の足し算

画像を足し算をしてみましょう.図 6 は,画像全体に 100 を足してみた例です.mandrill と呼ばれる標準画像に 100 を足すと画像全体が明るくなりました.行列の各要素に 100 が足されたので,画像全体の輝度値が大きくなって明るくなりました.図 7 は,2 枚の画像を足してみた例です.mandrill と pepper という標準画像を足してみると,重なったように見えます.両方の輝度値が足し合わされることで,mandrill と pepper が混ざったように見えます.

add1
図 6:画像と 100 の足し算
add2
図 7:2 枚の画像の足し算

画像の引き算

次は,画像を引き算してみましょう.図 8 は,画像全体から 100 を引いてみた例です.mandrill から 100 を引くと画像全体が暗くなりました.行列の各要素から 100 が引かれたので,画像全体の輝度値が小さくなり,暗くなりました.図 9 は,mandrill の位置を 1 画素だけずらして引き算をしてみた例です.少し見にくいですが,mandrill の輪郭のようなものがうっすらと見れます.完全に同じ画像同士を引き算すると真っ黒(すべての値が0)になりますが,少しでも差があると,その差が現れます.この性質を利用した応用を次で紹介します.

sub1
図 8:画像と 100 の引き算
sub2
図 9:1 画素だけずれた画像との引き算

大きな画像と小さい画像の引き算

画像の引き算の応用を紹介します.テンプレートと呼ばれる小さい画像があります.これは大きな画像の一部の画像です.このテンプレートが大きな画像のどこから取り出してきたのかを調べることができます.これは,テンプレートマッチングと呼ばれていて,今でも使われている画像処理の基本の 1 つです.もっとも単純な方法は,画像とテンプレートの差を求める方法です.一般的には,Sum of Absolute Differences (SAD) と呼ばれています.大きい画像からテンプレートと同じ大きさの画像を取り出して,テンプレートと引き算をして,すべての要素の絶対値の和を計算します.これを左上から 1 画素ずつずらしながら求めていくと,テンプレートと同じ位置では 0 に,それ以外では 0 より大きな値になります.このように,2 枚の画像で似た場所を探すときにテンプレートマッチングを使います.

template-matching
図 10:大きい画像と小さい画像(テンプレート)の引き算

画像の微分

画像も微分を計算することができます.ただ,高校で学ぶような連続関数で表現されていないので,簡単に計算できます.微分は,その場所での値の変化の傾きを求めます.高校数学ですと極限を使って計算する必要があります.画像は,離散点で表されているので,隣り合った画素の輝度値の引き算が微分に相当します.微分係数の値が大きいというのは,隣り合った画素の輝度値の変化が大きいということになります.図 11 のように,横方向の微分,縦方向の微分,縦・横方向の微分を隣接画像の引き算で求めることができます.隣り合った画素の輝度値の変化が大きい場所が白くなるので,画像の輪郭が現れます.

diff
図 11:画像の微分

画像の積分

先ほどは微分を求めてみたので,次は積分です.高校で学ぶ積分は,連続関数の積分なので,積分記号を使って計算をする必要があります.画像は,離散点で表されているので,輝度値の足し算が積分に相当します.図 12 は,指紋画像に対して行方向と列方向に積分を求めた結果になります.指紋の模様が黒いので,指紋のパターンがある場所は,積分の結果の値が小さくなっています.行方向と列方向の積分の結果を使うことで,画像における指紋領域を特定したり,指紋パターンの中心を見つけたりすることができます.

integral
図 12:画像の積分

まとめ

簡単ではありますが,画像処理のしくみを紹介しました.画像処理って難しそうと思っていたかもしれませんが,基本は,行列に対する足し算や引き算です.画像加工アプリを使うときに,どんな計算をしているのか想像してみてください.もちろん,高度な画像処理は,簡単な計算だけで成り立っていません.実際に高度な画像処理を行うためには,行列を扱う数学である「線形代数」や「ディジタル信号処理」などを勉強する必要があります.画像処理のしくみが気になった人は,数学の勉強を続けてみてください.

いろいろな画像処理を勉強したい人は,「ディジタル画像処理」を読んでみて下さい.画像処理の全般的な知識を勉強することができます.東北大学生のようにMATLABを使用することができれば,MathWorksが提供しているMATLABを用いた画像処理入門で基本的な画像処理を学ぶことができます.