こんばんわ!Keisukeです!
今日は, ヒストグラムから画像の色分けを行ってみたいと思います!
そもそも画像は, 色の情報を持った正方形が無数に集まって表現されています。
色の情報を持った正方形をピクセルと呼んでいます。
また, 色の情報は3色(赤:緑:青)から構成されており0~255の数値で表現されます。
0の時は暗く,255の時は明るい色になります。
例えば,
鮮やかな赤色
赤:255
緑:0
青:0
黒
赤:0
緑:0
青:0
白
赤:255
緑:255
青:255
となります!
この色情報が無数に集まっています!
よくカメラの性能を表す要素として1000万画素などがありますが画素数が多ければ多いほど画像を表現する色が多いということになるんですね!
ヒストグラムは横軸に色の値, 縦軸に存在分布が示されています。
また, ヒストグラムには2種類ありカラースケールと, グレースケールがあります。
カラースケールが持つ情報は, 色の分布と明るさになりますが, グレースケールは明るさのみの情報となります。
前回はOpenCVのライブラリを用いましたが, 今回は画像ファイルの構造理解とヒストグラムの構成理解のために解析は手動で行ってみます!
手順は
① 画像ファイルを読み込む
② 画像情報のR,G,Bに配列として保存する
③ R,G,Bの配列を色の値に振り分ける
④ R,G,Bからグレースケールの情報を抽出する
④ ヒストグラムを生成する
以下コード
**************************
import cv2
import numpy as np
from matplotlib import pyplot as plt
if __name__ == “__main__”:
# 画像読み込み
#img = cv2.imread(‘IMG_5671.JPG’) # 1219万画素 20分
img = cv2.imread(‘input.png’)
print(len(img))
img_r = []
img_g = []
img_b = []
for rgb in range(len(img[0][0])):
for y in range(len(img)):
for x in range(len(img[y])):
if(rgb is 0):
img_r.append(img[y][x][rgb])
if(rgb is 1):
img_g.append(img[y][x][rgb])
if(rgb is 2):
img_b.append(img[y][x][rgb])
# 0~256
hist_r = []
hist_g = []
hist_b = []
hist_k = []
for count_img in range(256):
add_r = 0
add_g = 0
add_b = 0
add_k = 0
print(count_img)
for size_img in range(len(img_r)):
if(count_img == img_r[size_img]):
add_r = add_r + 1
add_k = add_k + 1
if(count_img == img_g[size_img]):
add_g = add_g + 1
add_k = add_k + 1
if(count_img == img_b[size_img]):
add_b = add_b + 1
add_k = add_k + 1
hist_r.append(add_r)
hist_g.append(add_g)
hist_b.append(add_b)
hist_k.append(add_k)
”’
hist_gray = []
for i in range(len(hist_r)):
cal_gray = np.sqrt(pow(hist_r[i], 2) + pow(hist_g[i], 2) + pow(hist_b[i], 2))
hist_gray.append(cal_gray)
”’
plt.plot(hist_r,color = ‘r’)
plt.plot(hist_g,color = ‘g’)
plt.plot(hist_b,color = ‘b’)
plt.plot(hist_k,color = ‘k’)
plt.show()
**************************
実行結果
OpenCVを使わない場合はやたら時間がかかりました
1200万画素の写真は解析に2時間かかりました…
[今日の達成]
・OpenCVを使用せずヒストグラムを生成した
・画像ファイルの構造を理解した
[今日の未消化]
・色分けの方法