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
拥有一颗比九万五千公里还辽阔的心,