Hack and Play

プログラミングやCG、ゲーム、コンピュータのネタを投稿していくブログ。不定期更新。

【python】matplotlibを使って画像のカラーヒストグラムを出力

2009年11月09日 | CG関連
MathematicaのHistogram3Dは見にくくて、bivariateな分布が見辛いので、無理矢理ListDensityPlotにしてましたが、かなり遅いので、他の方法を探してたら、pythonでmatplotlibなるものを発見。使ってみました。
本来は違うグラフを書くのが目的でしたが、練習として画像のrgbヒストグラムを出力するプログラムを書いてみました。

--------------以下ソース--------------
import sys, pygame
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt

pygame.init()
pygame.display.set_mode((150, 150), 0, 32)
buf = pygame.image.load(sys.argv[1]).convert()

rect_hist_b = [0.10, 0.03, 0.85, 0.25]
rect_hist_g = [0.10, 0.36, 0.85, 0.25]
rect_hist_r = [0.10, 0.69, 0.85, 0.25]

axHist_b = plt.axes(rect_hist_b)
axHist_g = plt.axes(rect_hist_g)
axHist_r = plt.axes(rect_hist_r)

w, h = buf.get_size()
r = np.zeros((w*h,), dtype=np.int)
g = np.zeros((w*h,), dtype=np.int)
b = np.zeros((w*h,), dtype=np.int)

for j in range(h):
	for i in range(w):
		#color = (R, G, B, A)
		color = buf.get_at((i, j))
		r[j*w + i] = color[0]
		g[j*w + i] = color[1]
		b[j*w + i] = color[2]
		
axHist_r.set_title('red component')
axHist_g.set_title('green component')
axHist_b.set_title('blue component')
axHist_r.hist(r, 256, normed=1, facecolor='red')
axHist_g.hist(g, 256, normed=1, facecolor='green')
axHist_b.hist(b, 256, normed=1, facecolor='blue')

axHist_r.set_xlim(0, 255)
axHist_g.set_xlim(0, 255)
axHist_b.set_xlim(0, 255)

plt.savefig(sys.argv[2],dpi=72)


--------------コマンドプロンプト--------------

$:python hist.py [入力画像] [出力画像]

--------------

プログラムを使うとこんな画像が

こんな感じに出力されます。

【python】同じサイズの画像の色を合成して出力するプログラム

2009年11月07日 | プログラミング


研究で必要になったので、3分間クッキング。
Illustratorでやる方法が分かりませんでした。

以下ソース
-------------------
#color.py

import sys, pygame

_gSrc = None

tex1 = sys.argv[1]
tex2 = sys.argv[2]
save_name = sys.argv[3]

pygame.init()
pygame.display.set_mode((150, 150), 0, 32)
_gScr = pygame.display.get_surface()
tBuf1 = pygame.image.load(tex1).convert()
tBuf2 = pygame.image.load(tex2).convert()

w, h = tBuf1.get_size()
pygame.display.set_mode((w, h), 0, 32)

for j in range(h):
	for i in range(w):
		color1 = tBuf1.get_at((i, j))
		color2 = tBuf2.get_at((i, j))
		# RGB to GRB
		tBuf1.set_at((i, j), (
		(color1[0] + color2[0]) / 2,
		(color1[1] + color2[1]) / 2,
		(color1[2] + color2[2]) / 2,
		255))

_gScr.blit(tBuf1, (0, 0), tBuf1.get_rect())
pygame.image.save(_gScr, save_name)
print "finished"

while True:
	_gScr.blit(tBuf1, (0, 0), tBuf1.get_rect())
	pygame.display.update()
	pygame.time.wait(10)

-----------------------------------
コマンドプロンプト
$:python color.py [入力画像1] [入力画像2] [出力画像]

-----------------------------------

参考サイト
http://www5f.biglobe.ne.jp/~kenmo/program/graphics/pygame/pygame.html