OpenCV Python 带mask的大津法阈值分割 快速实现版本
在另一位博主的代码基础上修改的,程序运行时间,在我的电脑上,从55s缩减到了0.13s。
如果有错误的地方或者可以改进的地方,请给我留言。
import cv2
import numpy as np
import time
def OTSU_with_mask(img_gray, mask):
"""带mask的大津法
mask:0和255
"""
start = time.clock()
mask_size = np.count_nonzero(mask)
max_g = 0
suitable_th = 0
hist = cv2.calcHist([img_gray], [0], mask, [256], [0,256])
cum_hist = np.cumsum(hist)
pixel_sum_hist = [hist[i] * i for i in range(256)]
cum_pixel_sum_hist = np.cumsum(pixel_sum_hist)
th_list = [i for i in range(0, 256) if int(hist[i][0]) != 0] # 如果可以确定阈值大致范围,可以在这里设置,缩小阈值遍历次数
for threshold in th_list:
fore_pix = cum_hist[-1] - cum_hist[threshold]
back_pix = cum_hist[threshold