Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

画像中の画素値調査方法 ヒストグラム作成してみた

今回は画像に対してヒストグラムを作成する方法についてまとめていきたいと思います!!

はじめての画像処理技術(第2版)

新品価格
¥2,420から
(2020/10/17 21:17時点)

今後、画像に対して機械学習を行おうと思った時に画像処理関係の処理は覚えておいて損はないかな?と思い試してみました。
その中でも色情報の抽出はやってみたいな?と思い立ったのでいい内容ないかな?と考えてみたところ、
まずは基本である、画像内の色情報を抽出してみようと思い立ち、実施しました。

■画像でのヒストグラムについて

画像処理でのヒストグラムでは、横軸を諧調値(0~255)、縦軸を各諧調毎の画素数を取ります。
要するに、
「対象とした画像に対して各諧調毎に画素数はいくつか?」
を示します。

、、と言葉だけですとわかりにくいかと思うので、こちらのBlue(0,0,255)画像を用いてヒストグラムを作成いたします。
f:id:Elsammit:20201017175157p:plain

少し脱線しますが、
こちらのblue画像はnumpyとopencvを用いて、こちらの方法で生成させることができます。

import cv2
import numpy as np

HEIGHT = 256
WIDTH = 320

img_bgr = np.zeros((HEIGHT, WIDTH, 3))
img_bgr += [0,0,255][::-1]
cv2.imwrite('blue.png',img_bgr)

このblue画像に対してヒストグラムを作成してみますと、
B成分のみを抽出したヒストグラムは、
f:id:Elsammit:20201017183145p:plain

B、G成分のみを抽出したヒストグラムは、
f:id:Elsammit:20201017184925p:plain
となります。

今回の画素数は81920(256×320)になります。
その全てがB成分となるため、255成分が81920になります。

RG成分に対しては諧調なし(0諧調が81920)ですので、ヒストグラム上は諧調が0で81920になります。

■各諧調毎のヒストグラム作成

先ほどお見せしたヒストグラムを作成するためのコードはこちらになります。
※青色画像はすでに用意済みの場合のコードです。

import cv2
import numpy as np
import matplotlib.pyplot as plt

HEIGHT = 256
WIDTH = 320

img_bgr = cv2.imread("blue.png")
img_bgr = cv2.resize(img_bgr,(WIDTH, HEIGHT))
b, g, r = img_bgr[:,:,0], img_bgr[:,:,1], img_bgr[:,:,2]
img_histb, img_bins = np.histogram(np.array(b).flatten(), bins=np.arange(256))
img_histg, img_bins = np.histogram(np.array(g).flatten(), bins=np.arange(256))
img_histr, img_bins = np.histogram(np.array(g).flatten(), bins=np.arange(256))

plt.plot(img_histb, color='#0000FF')
plt.plot(img_histg, color='#FFFF00')
plt.plot(img_histr, color='#FFFF00')
plt.show()

まず、こちらにてRGB画像をR成分、G成分、B成分の画像に分割します。

b, g, r = img_bgr[:,:,0], img_bgr[:,:,1], img_bgr[:,:,2]

そして、

np.array(img2次元画像データ).flatten()

により、2次元データ(配列)を1次元データ(配列)に変換し、
numpyのヒストグラムによりヒストグラムを作成します。

img_histb, img_bins = np.histogram(np.array(b).flatten(), bins=np.arange(256))
img_histg, img_bins = np.histogram(np.array(g).flatten(), bins=np.arange(256))
img_histr, img_bins = np.histogram(np.array(g).flatten(), bins=np.arange(256))

ここで、

bins=np.arange(256)

横軸を0~256に明示的に指定することを意味します。

■試しに写真でヒストグラムを作成

青色のみの画像だとちょっと残念なので、こちらの画像でヒストグラムを作成してみます。
f:id:Elsammit:20201017203849j:plain


結果はこんな感じです。
f:id:Elsammit:20201017204407p:plain
それぞれ、
 赤:R成分
 青:B成分
 緑:G成分
の諧調情報になります。

海の領域が多いので青の諧調が高い画素が多くありますね!!


別の画像としてこちらでも確認。
f:id:Elsammit:20201017210151j:plain

ヒストグラムを作成してみると、
f:id:Elsammit:20201017210236p:plain
という感じになりました!!

全体的に白色だけど暗いから諧調低くてRGBが同じところに重なっているのかしら?

■最後に

画像からRGB成分に分離した上で濃淡を評価するためにヒストグラム作成してみました。
使用当初はRGB成分分離・評価することで、
風景やシチュエーションが判定できるかな?と思っておりましたが、
結構、明るさや太陽の位置などにより大きく左右されてしまうようで、
ヒストグラムだけでは簡単に評価できなさそうだな。。。と思いました😅

ただ、ヒストグラムによる情報も有用だと思うので、活かす方法を検討していきたいと思います!!
画像扱ってきましたが、当初は難しくてとっつきにくかったけど分かると面白いですね😆
もっと勉強してみたいと思います!!