Python.use(better,Tkinter)《余録》事例:ヒストグラムと2値化(2)
|記事一覧|《こちらに移動中です》2007年2月20日 (火)
Python.use(better, Tkinter)
事例:ヒストグラムと2値化(2)《Python3.1》
《著》森こねこ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2006/10/28
事例:ヒストグラムと2値化(2)
from Tkinter import * class DIP: # digital image processing offset, dx, height = 2, 2, 100 context = offset, dx, height fill_color, on_color = "red", "black" def __init__(self, file): self.image = PhotoImage(file=file)
__init__ では、ファイル file のデータをもとに、画像 PhotoImage を生成します。
def histogram(self): histo = {} for y in range(self.image.height()): for x in range(self.image.width()): color = self.image.get(x, y).split(" ") r, g, b = tuple(map(int, color)) if g in histo: histo[g] += 1 else: histo[g] = 1 return histo
histogram では、画像データをもとに、ヒストグラムを作成します。各画素を順に走査しながら、同じ濃淡レベルの画素がいくつあるかを記録します。
《Note》 class PhotoImage(Image): # /Python-3.0/Lib/tkinter/__init__.py
"""Widget which can display colored images in GIF, PPM/PGM format.""" def get(self, x, y): """Return the color (red, green, blue) of the pixel at X,Y."""
- get(self, x, y) は、座標 (x,y) にある画素の色情報を獲得します。
色情報は、赤緑青の各成分を空白で区切った文字列です。そこで、この文字列から各成分を抽出 split して、それを整数に変換 map した値を列挙した、タプル r,g,b を生成します。ここでは、緑成分を対象にヒストグラムを作成します。
def CDF(self):
histo = self.histogram()
acc, cdf = 0, []
for e in range(256):
acc += histo.get(e, 0)
cdf.append(acc)
return histo, cdf
CDF では、ヒストグラム histo から累積ヒストグラムを作成します。濃淡レベル 0..255 の範囲内で、histo の各度数を順に加算します。
def median(self):
histo, cdf = self.CDF()
m = self.image.width()*self.image.height()/2
for i, e in enumerate(cdf):
if e > m: break
return i, histo, cdf
median では、累積ヒストグラム cdf から中央値を求めます。総画素数の半分をオフセット値 m として、その値を含む濃淡レベル i を検出します。
Last updated♪2009/08/21