画像の色彩
RGB 分解
# e301.py ... decompose color image to R,G,B channels
import Image
img = Image.open('sample.ppm')
width, height = img.size
imgR = Image.new('L', (width, height))
imgG = Image.new('L', (width, height))
imgB = Image.new('L', (width, height))
for j in range(height):
for i in range(width):
r, g, b = img.getpixel((i, j))
imgR.putpixel((i, j), r)
imgG.putpixel((i, j), g)
imgB.putpixel((i, j), b)
imgR.save('r.pgm')
imgG.save('g.pgm')
imgB.save('b.pgm')
YUV 分解
# e302.py ... split into YUV components
import Image
img = Image.open('sample.ppm')
width, height = img.size
imgY = Image.new('L', (width, height))
imgU = Image.new('L', (width, height))
imgV = Image.new('L', (width, height))
for j in range(height):
for i in range(width):
r, g, b = img.getpixel((i, j))
y = 0.299 * r + 0.587 * g + 0.114 * b
u = (-0.14713 * r - 0.28886 * g + 0.436 * b)+128
v = ( 0.615 * r - 0.51499 * g - 0.10001 * b)+128
imgY.putpixel((i, j), y)
imgU.putpixel((i, j), u)
imgV.putpixel((i, j), v)
imgY.save('y.pgm')
imgU.save('u.pgm')
imgV.save('v.pgm')
YUV から再構成
# e303.py ... compose RGB color image from YUV
import Image
imgY = Image.open('y.pgm')
imgU = Image.open('u.pgm')
imgV = Image.open('v.pgm')
width, height = imgY.size
img = Image.new('RGB', (width, height))
for j in range(height):
for i in range(width):
y = imgY.getpixel((i, j))
u = imgU.getpixel((i, j)) - 128
v = imgV.getpixel((i, j)) - 128
r = y + 1.13983 * v
g = y - 0.39465 * u - 0.58060 * v
b = y + 2.03211 * u
img.putpixel((i, j), (r, g, b))
img.show()
以下、発展課題
UV の情報量を減らす
- YUV のうち UV は色に関する情報で輝度に関する情報 Y に比較して精度を落とすことができると言われている。
- 次のコードを e303.py の適当な箇所に挿入して、画像がどのように変化するか確かめなさい。
- プログラムのファイル名は e304.py とすること。
# shrink and expand to reduce information
imgU = imgU.resize((width/2, height/2), Image.ANTIALIAS
).resize((width, height))
imgV = imgV.resize((width/2, height/2), Image.ANTIALIAS
).resize((width, height))
- 2 を 4 に変えて試してみてもよい
色あい、あざやかさの調整
- u, v は画像の色だけを取り出したものである。
- ゆえに u, v の値を調整すると、色だけを変化させることができる。
- u, v は 参考 の図にあるように、2次元で表されるので、(u, v) ベクトルの「向き」と「大きさ」を変化させてみよう。
(u, v) の向きを調整
# e305.py
import Image
from math import cos, sin, pi
def hue(t, u, v):
x = cos(t) * u - sin(t) * v
y = sin(t) * u + cos(t) * v
return x, y
imgY = Image.open('y.pgm')
imgU = Image.open('u.pgm')
imgV = Image.open('v.pgm')
width, height = imgY.size
img = Image.new('RGB', (width, height))
for j in range(height):
for i in range(width):
y = imgY.getpixel((i, j))
u = imgU.getpixel((i, j)) - 128
v = imgV.getpixel((i, j)) - 128
u, v = hue(pi/6, u, v)
r = y + 1.13983 * v
g = y - 0.39465 * u - 0.58060 * v
b = y + 2.03211 * u
img.putpixel((i, j), (r, g, b))
img.show()
Hue について
- e305.py で関数名を hue としたが、色相(Hue)は別の定義があるので、(u, v) の向きを変える関数とは異なっている。
- ここでは似たような機能であることから、便宜的に hue() と名付けてある。
(u, v) の大きさを調整
- e305.py に、(u, v) の大きさを調整する関数を付け加えなさい。
- 関数は saturation(s, u, v) の形で呼び出し、hue と同様 (u, v) のタプルを返すものとする。
- hue, saturation のパラメータ (t, s) を適当に変化させて、どのような画像になるか確かめなさい。
Saturation について
- 彩度という呼び名があるが、ここで使っているものは定義とは異なる。
- 初期のカラーテレビには 輝度・コントラスト に加えて、色相(Hue)・彩度(Saturation)(など) と書いた調節つまみがあった。
- 今でも、業務用モニターなどでは調整できるようになっているらしい。
さらに発展課題
出席確認
- 本日作成した 最後のプログラム をメールの本文に記入して、菊地・画像処理論用 に送信。本文の最初に感想等入れるも可。