2値化とは
色のついている画像を白黒の2色に分けることを言います。
下の画像を見るとわかりやすいです。

[2値化前の左の画像]と[2値後の右の画像]を比べると2値化後の右の画像は白黒の画像になっていることが分かります。
このように2色に分けることを2値化と言い、この処理方法を2値化処理といいます。
画像の2値化処理をやってみよう
Q. どのようにして2値化が行われているのでしょうか?
A. しきい値を決めてそれを基準に白黒に分けている。
画像の色について
画像の色には、光の三原色である「赤(Red)」「緑(Green)」「青(Blue)」が使われています。

それを組み合わせて多彩な色を表現しています。
さて、これとしきい値がどのように関係しているのでしょうか?
実は、このしきい値は色の数値を指定して、その色より大きければ白、小さければ黒という風に2値化を行っているのです。
画像データを覗く
先ほどのRGB画像を読み込んでデータを覗いてみましょう。
# 画像を読み込むためのライブラリインポート
import cv2
# rgb画像を読み込み
i = cv2.imread("rgb.jpg")
# データの形を確認
i.shape
(200, 200, 3)
pythonというプログラミング言語を使って画像を読み込むと、「200行, 200列, 3個」という値が返ってきました。
さてどのような意味でしょうか?
画像データをexcelで表すと以下のように数字のデータが「200行, 200列」分表示されます。(*下のエクセル画像は適当に数値を入れただけなのでRGB画像のデータとは異なります)

次に「3」の部分です。なんで3個なのでしょうか。
実は、「赤(Red)」「緑(Green)」「青(Blue)」の3個なのです。
つまり、200行, 200列のデータが合計3つありますよ!って意味で
画像はこの三つの色の組み合わせでできています。と言うことを実際の画像からデータを読み込むことによって分かりました。
では、続いてデータの中身の数値はどのようになっているのかを見てみます。
コンピュータではRGBの数値が用意されている
「赤(Red)」「緑(Green)」「青(Blue)」はそれぞれ0~255までの値が用意されていて、
0は黒色、255は白色となります。
例えば、
- 赤のデータで、30は明るい赤、200は暗い赤
- 青のデータで、30は明るい青、200は暗い青
- 緑のデータで、30は明るい緑、200は暗い緑
なんてことが言えるわけです❗️
言葉で言うなら色の明るさを数字で管理していると言い換えることもできます。
先ほどの画像をもう一度見てみます。

左側の青色は、よく見ると濃い青色〜薄い青色へと色の変化があるのに気づきます。
つまり数値が変わっているってことなんですよね。
真ん中の緑、右側の赤も同様ですね。
では、青色と緑色の間は??、緑色と赤色の間は??RGBの色じゃないよ!!
これは、分かりますよね。色を組み合わせて表現しています。黄色なら緑+赤!!みたいな感じです。
RBG要素に分解
実際にこのRGBに分解してみるといろいろ見えてきます。
分解とは、先ほどのRGB画像データ(200行, 200列, 3個)を3つ(赤要素、緑要素、青要素の3つ)に分けました。と言うことです。

左側の青い画像を見てみると右側は真っ黒で青の色はありません。
つまり255(黒色)という数値が使われていることになります。
また、この三つの画像の左側を順に見ていくと、(暗い青、黒、黒)という風になっています。
この三つの画像を重ねると、暗い青が表現されるわけです。

間の色は、青+緑、緑+赤ですね。
画像はこのように三つの色のデータの重なりでできています。
少し話は長くなりましたが、しきい値を例えば100に設定すると
100を境に0~100の数値が黒色(0)に、100~255の数値は白色(255)へとデータを置き換え、2値化ができるというわけなのです。
2値化処理をしてみよう
では、プログラムを書いて実行してみます。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('rgb.jpg',0)
ret,thresh1 = cv2.threshold(img,100,255,cv2.THRESH_BINARY)
plt.imshow(images[1], 'gray')
plt.show()

こんな感じになります。
2値化 何に使うの?
- データが軽くなる。
- 目的の物の面積(単位は注意 あくまで画素数)を算出することが容易になる
- 輪郭を捉えることができる。
- 画像処理の研究など
コメント