大津法(Python实现)

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 = 0suitable_th = 0for threshold in xrange(th_begin, th_end, th_step):bin_img = img_gray > thresholdbin_img_inv = img_gray <= thresholdfore_pix = np.sum(bin_img)back_pix = np.sum(bin_img_inv)if 0 == fore_pix:breakif 0 == back_pix:continuew0 = float(fore_pix) / img_gray.sizeu0 = float(np.sum(img_gray * bin_img)) / fore_pixw1 = float(back_pix) / img_gray.sizeu1 = float(np.sum(img_gray * bin_img_inv)) / back_pix# intra-class varianceg = w0 * w1 * (u0 – u1) * (u0 – u1)if g > max_g:max_g = gsuitable_th = thresholdreturn suitable_th

拥有一颗比九万五千公里还辽阔的心,

大津法(Python实现)

相关文章:

你感兴趣的文章:

标签云: