こんにちは、タナカです。
今回の記事では画像処理について説明します。
画像処理とはカメラから取得した画像データを加工したり、画像の情報を読み取ったりする技術のことを言います。
実際に撮影した画像には何がどこに映っているのか、その物体の色は何色なのかなど画像データから様々な特徴量を取得することができます。
では、実際にその特徴量を知るためにはどうればいいのか、今回はpythonのopencvというライブラリを使って説明していきたいと思います。
- コードを書きながら画像処理を理解する
1. 画像データとは
画像処理をするためには、そもそも画像データとは何かを理解する必要があります。こちらの画像を使って画像データとは何かを理解していきたいと思います。
これは、普段PCやスマホなどで見るただの画像です。この画像を拡大してみると、ピクセルと呼ばれる細かい四角で構成されていることを確認できます。
そのピクセルは、画素値と呼ばれる0~255の数字を保持しています。今回はカラー画像になるので、1つのピクセルでR(red)、G(green)、B(blue)の3つの値を保持しており、実際に拡大した個所の画素値の分布をヒストグラムで確認すると赤色が高い数値(150付近)を示していることがわかります。
もちろん、このリンゴは人間の目から見ても赤色の画素値が高そうだなとわかりますよね。
つまり、この画素値(RGB)の組み合わせで色というものが形成されていることになります。
それでは、実際に画素値というものを確認していきましょう。opencvを使って画像データを読み込みます。
import cv2
# 画像の読み込み
img = cv2.imread('apple-1834639_640.jpg')
# opencvではBGRで読み込まれるためRGBの順番に変更
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# (x, y) = (500, 200)の位置から(w, h) = (20, 20)で切り出し
print(rgb[200:220, 500:520])
画像の原点は左上になります。右方向に+x、下方向に+yという値の取り方をします。
先ほどのリンゴの画像から、(x, y) = (500, 200)の位置から(w, h) = (20, 20)で切り出した画像の画素値を確認しています。
左の上の画素値は(149, 95, 93)という値を保持しており、その一つ右にずれた画素値の値が(119, 82, 76)という値を保持していることを意味します。
つまり、画像データというものはすべて定量値で表現することが可能ということです。これが画像データと呼ばれるものです。
この定量値に対して、四則演算をすることで画像を加工し、特徴を抽出することができるのです。
2. 画像データを加工する
先ほど、画像データは画素値と呼ばれるものを保持しているという話をしました。この画素値に対して、何かしらの四則演算をすることで画像を加工することができます。
今回は画像の加工の一例として、カラー画像をグレースケール画像に変換することをやってみます。今回はテレビ放送など人間の視覚特性を加味したYUV変換で行います。
そのときの変換式はこちらになります。
r、g、bはそれぞれ赤、緑、青の画素値となります。
コードで書くとこのようになります。
# rgbを各成分に分ける
r, g, b = cv2.split(rgb)
# グレースケール変換
gray = r * 0.299 + g * 0.587 + b * 0.114
実際の結果がこちらになります。
ここで言いたいのは、先ほどの(r, g, b) = (149, 95, 93)という画素値に対して、上式を使って計算を行い、ある値を取得したということです。これがすべてのピクセルで行われ、最終的にグレースケール画像となるのです。
つまり画像処理とは画素値に対して、何かしらの数値を四則演算するということです。
まとめ
画像データとは、RGB値など定量的に評価できるものです。その定量値を画素値と言います。
画像処理とは、この画素値と呼ばれる値に四則演算することを言います。
画像処理には、画像の中の特徴を抽出するものもあるので、次回の記事で紹介したいと思います。