この4月から子供が高校に進学した。同時に、お弁当を作る日々が始まった。
まぁ、それ自体は構わない。しかし、もう4〜5年前になろうか、何かの機会に小学生だった子供に弁当を作って持たせた時、同級生から「色彩がないね」と言われた、とのお言葉を帰宅した子供から頂いた。つらい。
となると、色彩の豊かさをスカラー値で表現してみたい、と思うのが普通である。
弁当の写真を撮って、その彩りの豊かさを評価する方法があれば、改良のモチベーションを保つのに役に立つ。と思ってちょっとググってみたがよくわからない。ので、彩りの豊かさの数値化を考えた。一つの色は一つの波長だろうとも思うが、写真データは RGB に分解されているので、その比が色ということになるだろう。でいまどきの写真は勝手にコントラストやらが調整されていたりするが、まぁ安易に考えると、色彩の豊かさ数値化アルゴリズムはこんな感じになろうか。
1. 明るい点と暗い点を5%ずつくらい捨てる
2. 各点で RGB の三値から比を二回取る $r = B/(G/R)
$
3. $r$ の分散を計算する
この最後の値が大きいほど彩り豊か、という判断である。Rスクリプトを書いて、試しにおかず部分だけ切り出した、だいぶ彩りの様子の違う画像3枚に対して計算してみたところ、0.0357、0.0548、0.0574 であった。数値だけを見てもなんとも分からないが、弁当を作るたびに継続的にこの値の変化を見ていけば、参考にはなろう。
library(jpeg)
# 弁当の写真のファイルは、JPEG フォーマットで拡張子は JPG に固定
# カレントディレクトリでファイル名に "JPEG" を含む全てのファイルが対象
# 画像の各ピクセルについて計算した R3 の値の分散値を彩りの豊かさを判断材料にする
for (f in list.files(pattern = "JPG")) {
img <- readJPEG(f); # 画像を行列に読み込み
L <- 3 * 0.05; # 暗い方の閾値
U <- 3 - L; # 明るい方の閾値
m <- img[,,1] + img[,,2] + img[,,3]; # 輝度値合計 0 < m < 3
imgR <- img[,,1]; # 赤の輝度値 0 < img < 1
imgG <- img[,,2]; # 緑の輝度値
imgB <- img[,,3]; # 青の輝度値
imgR <- imgR[(m > L) & (m < U)]; # 暗すぎる|明るすぎる点を捨てる
imgG <- imgG[(m > L) & (m < U)]; # 暗すぎる|明るすぎる点を捨てる
imgB <- imgB[(m > L) & (m < U)]; # 暗すぎる|明るすぎる点を捨てる
R1 <- imgG/imgR; # 緑と赤の比
R2 <- imgB/imgR; # 青と赤の比
R3 <- R2[R1 != 0] / R1[R1 != 0]; # 上の二つの比の比
cat(f, var(R3), "\n"); # 二つの比の比の分散
}
R のシンタックスハイライトでは、変数名に数字は入らない方がよさそうだ。