Python.use(better,Tkinter)《余録》事例:ヒストグラムと2値化(2)

記事一覧《こちらに移動中です》2007年2月20日 (火)

Python.use(better, Tkinter)
事例:ヒストグラムと2値化(2)《Python3.1》

《著》森こねこ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2006/10/28

■ 概要

Canvas 部品の理解を確認するために、簡単なアプリケーションを作成します。

Tkinter によるオブジェクト指向プログラミングへの扉を開きます。

■ 関連記事

前の記事次の記事

事例:ヒストグラムと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 では、画像データをもとに、ヒストグラムを作成します。各画素を順に走査しながら、同じ濃淡レベルの画素がいくつあるかを記録します。

  • height は、画像の高さ(縦方向の画素数)を獲得します。
  • width は、画像の幅(横方向の画素数)を獲得します。

《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