大津法(Python實現)

來源:互聯網
上載者:User

標籤:電腦視覺   影像處理   python   numpy   

在電腦視覺和影像處理中,大津法被用於自動擷取映像的閾值,或者將灰階映像轉換為二值化映像。該演算法假設映像包含兩個類別的像素(前景像素和背景像素),然後它計算一個最優的閾值用於分離前景和背景,使得前景和背景的類間方差最小。

下面定義類間方差的計算公式:
假設我們使用閾值T將灰階映像分割為前景和背景size:映像總像素個數
u:映像的平均灰階
w0:前景像素點占整幅映像大小的比例u0:前景像素點的平均值
w1:背景像素點占整幅映像大小的比例
u0:背景像素點的平均值
g:類間方差

u = w0 * u0 + w1 * u1  (1)
g = w0*(u - u0)^2 + w1*(u - u1)^2 (2)
將(1)代入(2)得:
g = w0 * w1 * (u0 - u1)^2

採用遍曆的方法,遍曆所有閾值,當g最大時,該閾值就是我們所求的認為最合適的閾值了。
偷偷告訴你,opencv有內建的使用大津法閾值化的方法,如下:
cv2.threshold(img, th1, max_val, cv2.THRESH_OTSU) 
使用參數cv2.THRESH_OTSU後,前面的th1就無效了。

以下是我自己寫的Python版函數:
import numpy as npdef OTSU_enhance(img_gray, th_begin=0, th_end=256, th_step=1):    assert img_gray.ndim == 2, "must input a gary_img"    max_g = 0    suitable_th = 0    for threshold in xrange(th_begin, th_end, th_step):        bin_img = img_gray > threshold        bin_img_inv = img_gray <= threshold        fore_pix = np.sum(bin_img)        back_pix = np.sum(bin_img_inv)        if 0 == fore_pix:            break        if 0 == back_pix:            continue        w0 = float(fore_pix) / img_gray.size        u0 = float(np.sum(img_gray * bin_img)) / fore_pix        w1 = float(back_pix) / img_gray.size        u1 = float(np.sum(img_gray * bin_img_inv)) / back_pix        # intra-class variance        g = w0 * w1 * (u0 - u1) * (u0 - u1)        if g > max_g:            max_g = g            suitable_th = threshold    return suitable_th



大津法(Python實現)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.