Snippets

cia_rana sauvolaの手法による二値化

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))

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.