adathres.py 1.1 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9
import numpy as np
from scipy import signal
import cv2
import re
import os
from os import path
import sys

def adathres_bts(img, win=9, beta=0.9):
W
wizardforcel 已提交
10 11
    img = np.frombuffer(img, np.uint8)
    img = cv2.imdecode(img, cv2.IMREAD_GRAYSCALE)
W
wizardforcel 已提交
12
    if img is None: return None
W
init  
wizardforcel 已提交
13
    img = adathres(img, win, beta).astype(np.uint8)
W
wizardforcel 已提交
14 15 16 17 18
    img = cv2.imencode(
        '.png', img, 
        [cv2.IMWRITE_PNG_BILEVEL, 1]
    )[1]
    return bytes(img)
W
init  
wizardforcel 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

def adathres(img, win=9, beta=0.9):
    if win % 2 == 0: win = win - 1
    # 边界的均值有点麻烦
    # 这里分别计算和和邻居数再相除
    kern = np.ones([win, win])
    sums = signal.correlate2d(img, kern, 'same')
    cnts = signal.correlate2d(np.ones_like(img), kern, 'same')
    means = sums // cnts
    # 如果直接采用均值作为阈值,背景会变花
    # 但是相邻背景颜色相差不大
    # 所以乘个系数把它们过滤掉
    img = np.where(img < means * beta, 0, 255)
    return img
    
def main():
    fname = sys.argv[1]
    img = open(fname, 'rb').read()
    img = adathres_bts(img)
    with open(fname, 'wb') as f:
        f.write(img)

if __name__ == '__main__': main()