Skip to main content

Δoxa Binarization Framework - Python

Introduction

DoxaPy is an image binarization library focusing on local adaptive thresholding algorithms. In English, this means that it has the ability to turn a color or gray scale image into a black and white image.

Algorithms

  • Otsu - "A threshold selection method from gray-level histograms", 1979.
  • Bernsen - "Dynamic thresholding of gray-level images", 1986.
  • Niblack - "An Introduction to Digital Image Processing", 1986.
  • Wellner - "Interacting with Paper on the DigitalDesk", 1994.
  • Sauvola - "Adaptive document image binarization", 2000.
  • Wolf - "Extraction and Recognition of Artificial Text in Multimedia Documents", 2003.
  • Feng - "Adaptive Binarization Method for Document Image Analysis", 2004.
  • Gatos - "Adaptive degraded document image binarization", 2005. (Partial)
  • Bradley - "Adaptive Thresholding Using the Integral Image", 2007.
  • NICK - "Comparison of Niblack inspired Binarization methods for ancient documents", 2009.
  • AdOtsu - "A multi-scale framework for adaptive binarization of degraded document images", 2010. (Under Review)
  • Su - "Binarization of Historical Document Images Using the Local Maximum and Minimum", 2010.
  • T.R. Singh - "A New local Adaptive Thresholding Technique in Binarization", 2011.
  • Bataineh - "An adaptive local binarization method for document images based on a novel thresholding method and dynamic windows", 2011. (unreproducible)
  • Phansalkar - "Adaptive Local Thresholding for Detection of Nuclei in Diversely Stained Cytology Images", 2011.
  • XDoG - "XDoG: An eXtended difference-of-Gaussians compendium including advanced image stylization", 2012.
  • ISauvola - "ISauvola: Improved Sauvola’s Algorithm for Document Image Binarization", 2016.
  • WAN - "Binarization of Document Image Using Optimum Threshold Modification", 2018.

Optimizations

  • Shafait - "Efficient Implementation of Local Adaptive Thresholding Techniques Using Integral Images", 2008.
  • van Herk - "A fast algorithm for local minimum and maximum filters on rectangular and octagonal kernels", 1992.
  • Gil, Werman - "Computing 2-D min, median, and max filters", 1993.
  • Chan - "Memory-efficient and fast implementation of local adaptive binarization methods", 2019.
  • SIMD - SSE2, ARM NEON

Performance Metrics

  • Overall Accuracy
  • F-Measure, Precision, Recall
  • Pseudo F-Measure, Precision, Recall - "Performance Evaluation Methodology for Historical Document Image Binarization", 2013.
  • Peak Signal-To-Noise Ratio (PSNR)
  • Negative Rate Metric (NRM)
  • Matthews Correlation Coefficient (MCC)
  • Distance-Reciprocal Distortion Measure (DRDM) - "An Objective Distortion Measure for Binary Document Images Based on Human Visual Perception", 2002.

Overview

DoxaPy uses the Δoxa Binarization Framework for quickly processing python Image files. It is comprised of three major sets of algorithms: Color to Grayscale, Grayscale to Binary, and Performance Metrics. It can be used as a full DIBCO Metrics replacement that is significantly smaller, faster, and easier to integrate into existing projects.

Example

This short demo uses DoxaPy to read in a color image, converts it to binary, and then compares it to a Ground Truth image in order to calculate performance.

from PIL import Image
import numpy as np
import doxapy


def read_image(file, algorithm=doxapy.GrayscaleAlgorithms.MEAN):
    """Read an image.  If its color, use one of our many Grayscale algorithms to convert it."""
    image = Image.open(file)

    # If already in grayscale or binary, do not convert it
    if image.mode == 'L':
        return np.array(image)
    
    # Read the color image
    rgb_image = np.array(image.convert('RGB') if image.mode not in ('RGB', 'RGBA') else image)

    # Use Doxa to convert grayscale
    return doxapy.to_grayscale(algorithm, rgb_image)


# Read our target image and convert it to grayscale
grayscale_image = read_image("2JohnC1V3.png")

# Convert the grayscale image to a binary image (algorithm parameters optional)
binary_image = doxapy.to_binary(doxapy.Binarization.Algorithms.SAUVOLA, grayscale_image, {"window": 75, "k": 0.2})

# Calculate the binarization performance using a Ground Truth image
groundtruth_image = read_image("2JohnC1V3-GroundTruth.png")
performance = doxapy.calculate_performance(groundtruth_image, binary_image)
print(performance)

# Display our resulting image
Image.fromarray(binary_image).show()

DoxaPy Notebook

For more details, open the DoxaPy Notebook and to get an interactive demo.

Building and Test

DoxaPy supports 64b Linux, Windows, and Mac OSX on Python 3.x. Starting with DoxaPy 0.9.4, Python 3.12 and above are supported with full ABI compatibility. This means that new versions of DoxaPy will only be published due to feature enhancements, not Python version support.

Build from Project Root

# From the Doxa project root
git clone --depth 1 https://github.com/brandonmpetty/Doxa.git
cd Doxa
cmake --preset python
cmake --build build-python --config Release
pip install -r Bindings/Python/requirements.txt
ctest --test-dir build-python -C Release

Local Package Build

python -m build

Local Wheel Build

pip wheel . --no-deps

License

CC0 - Brandon M. Petty, 2026

To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.

View Online

"Freely you have received; freely give." - Matt 10:8

Metadata

Release files for doxapy 0.9.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for doxapy 0.9.9
File Size Uploaded
doxapy-0.9.9.tar.gz 78.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for doxapy 0.9.9
File
doxapy-0.9.9-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
doxapy-0.9.9-cp312-abi3-musllinux_1_2_x86_64.whl CPython 3.12 abi3 Linux musl 1.2+ x86-64 Details
doxapy-0.9.9-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 abi3 Linux glibc 2.17+ x86-64 Details
doxapy-0.9.9-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details

Total release size: 1.2 MB

Release files / doxapy-0.9.9.tar.gz

Download URL doxapy-0.9.9.tar.gz
Size 78.5 kB
Tags Source
SHA-256 checksum
How to use checksums
36389648ca759bc11a9543354819a06705e022d3ccfa007cc6fca2e37137d768
BLAKE2b-256 checksum
How to use checksums
45cc4fd21c99565e6803ecbebcda70f01f97fe56364549e2d963cb6927b583cc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release files / doxapy-0.9.9-cp312-abi3-win_amd64.whl

Download URL doxapy-0.9.9-cp312-abi3-win_amd64.whl
Size 139.9 kB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
e0e367bd8bca2665330dd5ad611cfdaa3b060174b9a0257c19865c18e2c7d78d
BLAKE2b-256 checksum
How to use checksums
09d71f3ef8ee1728d1da865d9b562d2bc524633f3364c2fd66820800b6a71302
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release files / doxapy-0.9.9-cp312-abi3-musllinux_1_2_x86_64.whl

Download URL doxapy-0.9.9-cp312-abi3-musllinux_1_2_x86_64.whl
Size 612.7 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
e6d9836ee423ffa815ae331b8d93f64c6f974be234dd0a311c5234bc0e646f6d
BLAKE2b-256 checksum
How to use checksums
4b98e06ae6ea5afb704a4a141cb076e80dbda318485b6526ef87f8968f92023d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release files / doxapy-0.9.9-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL doxapy-0.9.9-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 190.5 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
7bf615cd4c5eec89086e1f4a5a278684bfa7442872eea54e5f76185f53dacd74
BLAKE2b-256 checksum
How to use checksums
c057afd69ddb48d139765268a49f3c902eb0583d16baa54ff765b784132000fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release files / doxapy-0.9.9-cp312-abi3-macosx_11_0_arm64.whl

Download URL doxapy-0.9.9-cp312-abi3-macosx_11_0_arm64.whl
Size 135.7 kB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b3f656b3b1f30022b6f54c5c314bf67af94acb43ff71ffadee4b893ed82c6367
BLAKE2b-256 checksum
How to use checksums
8f092021d563f95f17bcaa65c34bc176bda573b121bd0456f5aafeddba230ba6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release history Release notifications | RSS feed

This release

0.9.9 This release

5 release files

0.9.8

5 release files

0.9.7

5 release files

0.9.6

5 release files

0.9.5

5 release files

0.9.4

5 release files

0.9.2

34 release files

0.9.1

19 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page