Created by
cia_rana
| import numpy as np
import cv2
def sauvola(src, kernel_size, k, r):
''' sauvolaの手法により二値化を行う '''
height, width = src.shape[:2]
border_size = kernel_size / 2 + 1
kernel_pixels = kernel_size * kernel_size
src_with_border = cv2.copyMakeBorder(src, border_size, border_size, border_size, border_size, cv2.BORDER_REPLICATE)
sum, sq_sum = cv2.integral2(src_with_border)
dw = width + kernel_size
dh = height + kernel_size
mean = (sum[0:height, 0:width] + sum[kernel_size:dh, kernel_size:dw] - sum[kernel_size:dh, 0:width] - sum[0:height, kernel_size:dw]) / kernel_pixels
var = (sq_sum[0:height, 0:width] + sq_sum[kernel_size:dh, kernel_size:dw] - sq_sum[kernel_size:dh, 0:width] - sq_sum[0:height, kernel_size:dw]) / kernel_pixels - mean**2
var[var < 0.] = 0.
threshold = mean * (1. + k * (np.sqrt(var) / r - 1.))
return np.uint8(np.where(src < threshold, 0, 255))
|