File size: 1,314 Bytes
fd4e724 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import io
import numpy as np
from PIL import Image, ImageFilter
def features(image: bytes) -> dict:
with Image.open(io.BytesIO(image)) as im:
gray = im.convert("L").resize((256, 256))
a = np.asarray(gray, dtype=float)
ink = a < 180
contrast = float(a.std())
edge = float(np.asarray(gray.filter(ImageFilter.FIND_EDGES), dtype=float).var())
horizontal = int((ink.mean(axis=1) > 0.7).sum())
vertical = int((ink.mean(axis=0) > 0.7).sum())
# These are proxies, never semantic handwriting/table claims.
density = float(ink.mean())
ink_contrast = contrast / max(0.001, density**0.5)
return dict(
blank=density < 0.0001,
contrast=contrast,
ink_contrast=ink_contrast,
edge_variance=edge,
line_density=density,
table_rulings=horizontal + vertical,
possible_columns=bool(
ink[:, :100].mean() > 0.03
and ink[:, 156:].mean() > 0.03
and ink[:, 120:136].mean() < 0.01
),
complex=horizontal + vertical > 8 or (ink_contrast < 145 and density > 0.001),
handwriting_proxy="unknown",
orientation="landscape" if im.width > im.height else "portrait",
)
|