« Python.use(better, GUI=Tkinter)《32》事例:ヒストグラムと2値化(2)★★ | トップページ | Shall_we_Agile = Java.use(better, Python) # Swing《31》Arc(1)★ »

2007年2月21日 (水)

Python.use(better, GUI=Tkinter)《33》事例:ヒストグラムと2値化(3)★★

♪都合により「 続・ひよ子のきもち 」にお引越し致します。(^_^)/~

★引越し後は(予告なしに)削除しますので、新しい記事をご覧ください。m(_o_)m

-----------------------( きりとれません )-----------------------------


------------ 序 ------------

ここで公開している記事は「キーワード検索」を利用するための便宜的なものです。詳細は、正式版(PDF)をダウンロードしてご覧ください。
「piyo070221.pdf」をダウンロード 

【目次】関連記事
〔Python/Jython/Tkinter 入門〕Python.use(better, GUI=Tkinter)

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

------------ 本文 ------------

《33》事例:ヒストグラムと2値化(3)★★

(承前)

    def draw_histo(self, canvas, median, histo):
        self._draw_graph(canvas, median,
            histo,
            histo.items(),
            max(histo.values()))

 draw_histo では、ヒストグラム histo を図に描きます。

    def draw_CDF(self, canvas, median, cdf):
        self._draw_graph(canvas, median,
            cdf,
            enumerate(cdf),
            self.image.width()*self.image.height())       

 draw_CDF では、累積ヒストグラム cdf を図に描きます。

    def _draw_graph(self, canvas, median, table, items, max):
        ox, dx, H = self.context
        for i, e in items:
            x = ox+dx*i
            y = H*(1-e/float(max))
            canvas.create_line(x, y, x, H)
        x = ox+dx*median
        y = H*(1-table[median]/float(max))
        canvas.create_line(x, y, x, H, fill=self.fill_color)

 _draw_graph は(draw_histo および draw_CDF に共通する)実際に図を描くための補助関数です。中央値 median に相当するバーを self.fill_color(赤色)で描きます。表 table は、濃淡レベルごとの画素数を参照します。最大値 max が、最も高いパーの長さ(画素数)H と等しくなるように正規化されます。

    def draw_image(self, canvas, median):
        src = self.image
        dst = self.dest = src.copy()
        dst.blank()
        for y in range(src.height()):
            for x in range(src.width()):
                color = src.get(x, y).split(" ")
                r, g, b = tuple(map(int, color))
                if g < median:
                    dst.put(self.on_color, to=(x, y))
        canvas.create_image(0, 0, anchor=NW, image=dst)

 draw_image では、中央値 median を閾値として2値化した画像を描きます。copy(self) は、同じデータを持つ画像を作成(複製)します。put(self, data, to=None) は、行方向に連続する画像データ(画素の色情報)data を、to= から始まる座標の位置に設定します。ここでは、閾値を超えない緑成分のデータに対しては、各画素ごとに self.on_color(黒色)を設定しています。

    file = "image/boat.gif"

    tk_image = Tk(); tk_image.title("画像(2値化): %s"%file)   
    canvas_image = Canvas(tk_image, width=280, height=260)
    canvas_image.pack()

    tk_histo = Tk(); tk_histo.title("ヒストグラム: %s"%file)   
    canvas_histo = Canvas(tk_histo, width=540, height=100)
    canvas_histo.pack()

    tk_CDF = Tk(); tk_CDF.title("累積密度関数(CDF): %s"%file)
    canvas_CDF = Canvas(tk_CDF, width=540, height=100)
    canvas_CDF.pack()

    dip = DIP(file)
    med, histo, cdf = dip.median()
    dip.draw_histo(canvas_histo, med, histo)
    dip.draw_CDF  (canvas_CDF  , med, cdf)
    dip.draw_image(canvas_image, med)

    canvas_histo.mainloop()
    canvas_CDF.mainloop()
    canvas_image.mainloop()

 このコードを実行すると、3つのウィンドウが現われます。それぞれに、ヒストグラム、累積ヒストグラム、2値化画像が描かれます。

==============================================
森こねこ 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

|

« Python.use(better, GUI=Tkinter)《32》事例:ヒストグラムと2値化(2)★★ | トップページ | Shall_we_Agile = Java.use(better, Python) # Swing《31》Arc(1)★ »

.連載: Python.use(better, GUI=Tkinter)」カテゴリの記事

JML/Java/Eclipse」カテゴリの記事

Jython/Python」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/79839/6489869

この記事へのトラックバック一覧です: Python.use(better, GUI=Tkinter)《33》事例:ヒストグラムと2値化(3)★★:

« Python.use(better, GUI=Tkinter)《32》事例:ヒストグラムと2値化(2)★★ | トップページ | Shall_we_Agile = Java.use(better, Python) # Swing《31》Arc(1)★ »