Skip to content

Instantly share code, notes, and snippets.

@cia-rana
Created May 29, 2017 18:57
Show Gist options
  • Save cia-rana/c5f5acf632eb75a090a9a65ded749f15 to your computer and use it in GitHub Desktop.
Save cia-rana/c5f5acf632eb75a090a9a65ded749f15 to your computer and use it in GitHub Desktop.
sauvolaの手法による二値化
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))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment