~/image/e6 で演習
# -*- coding: utf-8 -*-
# ClusterImg.py
import Image
def calcavr(clusterid, data, N):
""" クラスタごとに (R,G,B) の平均を求める
clusterid ... クラスタリング結果
data ........ 元のデータ (R,G,B) のリスト
N ........... クラスタ数
"""
clustavr = []
for i in range(N):
R = G = B = 0
count = 0
pos = 0
for x in list(clusterid):
if x == i:
r, g, b = data[pos]
R += r
G += g
B += b
count += 1
pos += 1
R = R/count
G = G/count
B = B/count
clustavr.append((R,G,B))
return clustavr
def clusterimg(size, clusterid, clustavr):
""" クラスタリングの結果をそれぞれのクラスタ内の平均値で色を付けて画像にする
size ... 画像サイズ (width, height) のタプル
clusterid ... クラスタリング結果
clustavr .... 各クラスタの平均値(R,G,B)
"""
cimg = Image.new('RGB', size)
cdata = [clustavr[clusterid[i]] for i in range(size[0]*size[1])]
cimg.putdata(cdata)
return cimg
# -*- coding: utf-8 -*-
# e601.py
import Image
from Pycluster import *
import ClusterImg
img = Image.open('1.ppm')
width , height = img.size
N = 10
data = list(img.getdata())
# kcluster をデフォルト設定で使用
clusterid, error, nfound = kcluster(data, N)
# 後処理と表示
clustavr = ClusterImg.calcavr(clusterid, data, N)
print clustavr
cimg = ClusterImg.clusterimg(img.size, clusterid, clustavr)
cimg.show()
imx = img.convert('L')
imx = imx.filter(ImageFilter.FIND_EDGES)
imx = imx.filter(ImageFilter.SMOOTH_MORE)
enh = ImageEnhance.Brightness(imx)
imx = enh.enhance(6.0)
datx = Numeric.transpose(Numeric.array([list(imx.getdata())]))
data = Numeric.array(img.getdata())
datx = Numeric.concatenate((data, datx), 1)
ImageFilter, ImageEnhance, Numeric など必要なモジュールを import しておくことも忘れずに。e602.py で作成、結果は s602.ppm に保存。uv = []
for x in data:
r, g, b = x
u = -0.14713 * r - 0.28886 * g + 0.436 * b
v = 0.615 * r - 0.51499 * g - 0.10001 * b
uv.append((u, v))
uv をクラスタリングするための data として与える。e603.py で作成、結果は s603.ppm に保存。# e604.py ... PCA example
import Numeric
import LinearAlgebra
import random
import Gnuplot
# Generate skewed random data.
z = []
for i in range(100):
x = random.gauss(0, 2.0)
y = random.gauss(0, 1.0)
z.append(((x + y), (x - y)))
z = Numeric.array(z)
g1 = Gnuplot.Gnuplot()
g1.plot(z)
# Perform PCA
a = LinearAlgebra.singular_value_decomposition(z)
g2 = Gnuplot.Gnuplot()
g2.plot(a[0])
raw_input('done? ')
# e605.py
import Image
import Numeric
import LinearAlgebra
from Pycluster import *
img1 = Image.open('IR1.pgm')
img2 = Image.open('IR2.pgm')
img3 = Image.open('IR3.pgm')
img4 = Image.open('IR4.pgm')
img5 = Image.open('VIS.pgm')
width , height = img1.size
N = 8
dat1 = Numeric.transpose(Numeric.array([list(img1.getdata())]))
dat2 = Numeric.transpose(Numeric.array([list(img2.getdata())]))
dat3 = Numeric.transpose(Numeric.array([list(img3.getdata())]))
dat4 = Numeric.transpose(Numeric.array([list(img4.getdata())]))
dat5 = Numeric.transpose(Numeric.array([list(img5.getdata())]))
data = Numeric.concatenate((dat1, dat2, dat3, dat4, dat5), 1)
x = LinearAlgebra.singular_value_decomposition(data)
y = [(p[0], p[1], p[2]) for p in x[0]]
clusterid, error, nfound = kcluster(y, N)
clustclr = [(0,0,0),(255,0,0),(0,255,0),(0,0,255),
(255,255,0),(0,255,255),(255,0,255),(255,255,255)]
cimg = Image.new('RGB', img1.size)
cdata = [clustclr[clusterid[i]] for i in range(len(data))]
cimg.putdata(cdata)
cimg.show()