Skip to main content

Anshitsu

Testing

codecov

Anshitsu is a small digital photographic utility.

It was originally created as a simple retouching tool for batch processing photos from the command line. "Anshitsu" means "darkroom" in Japanese.

The goal is not to replace a full photo editor. Anshitsu aims to provide practical retouching presets that get images roughly 80 percent of the way there with a short command.

Install

Run this command in an environment where a currently supported Python version is installed.

We have tested it on Windows, Mac, and Ubuntu on GitHub Actions, but we have not tested it on Macs with Apple Silicon, so please use it at your own risk on Macs with Apple Silicon.

pip install anshitsu

Usage

It is as described in the following help.

NAME
    anshitsu - Process Runnner for Command Line Interface

SYNOPSIS
    anshitsu <flags>

DESCRIPTION
    This utility converts the colors of images such as photos.

    If you specify a directory path, it will convert
    the image files in the specified directory.
    If you specify a file path, it will convert the specified file.
    If you specify an option, the specified conversion will be performed.

    Tosaka mode is named after Tosaka-senpai's "Tri-X de banzen"
    line from "Kyūkyoku Chōjin R". It aims for a grainy
    black-and-white photo look similar to Kodak Tri-X film.
    This mode converts the image to grayscale and adjusts contrast.
    Use floating-point numbers; values around 2.4 usually work well.

FLAGS
    --path=PATH
        Type: Optional[Union]
        Default: None
        Directory or file path. Defaults to None.
    -k, --keep_alpha=KEEP_ALPHA
        Type: bool
        Default: False
        Keep the alpha channel. Defaults to False.
    --colorautoadjust=COLORAUTOADJUST
        Type: bool
        Default: False
        Correct colors using Automatic Color Equalization. Defaults to False.
    --colorstretch=COLORSTRETCH
        Type: bool
        Default: False
        Apply gray-world white balance and color stretching. Defaults to False.
    -g, --grayscale=GRAYSCALE
        Type: bool
        Default: False
        Convert to grayscale. Defaults to False.
    --orthochromatic=ORTHOCHROMATIC
        Type: bool
        Default: False
        Convert to orthochromatic-style grayscale. Defaults to False.
    -i, --invert=INVERT
        Type: bool
        Default: False
        Invert image colors. Defaults to False.
    --color=COLOR
        Type: Optional[Union]
        Default: None
        Adjust color. Defaults to None.
    -b, --brightness=BRIGHTNESS
        Type: Optional[Union]
        Default: None
        Adjust brightness. Defaults to None.
    --sharpness=SHARPNESS
        Type: Optional[Union]
        Default: None
        Adjust sharpness. Defaults to None.
    --contrast=CONTRAST
        Type: Optional[Union]
        Default: None
        Adjust contrast. Defaults to None.
    -t, --tosaka=TOSAKA
        Type: Optional[Union]
        Default: None
        Use Tosaka mode. Defaults to None.
    --outputrgb=OUTPUTRGB
        Type: bool
        Default: False
        Convert a monochrome image to RGB. Defaults to False.
    --sepia=SEPIA
        Type: bool
        Default: False
        Colorize a monochrome image with sepia tones. Defaults to False.
    --cyanotype=CYANOTYPE
        Type: bool
        Default: False
        Colorize a monochrome image with cyanotype-like Prussian blue. Defaults to False.
    --rochester=ROCHESTER
        Type: bool
        Default: False
        Apply a warm color grade inspired by Kodak PORTRA 400. Defaults to False.
    --ashigara=ASHIGARA
        Type: bool
        Default: False
        Apply a vivid color grade inspired by Fujifilm Velvia 100. Defaults to False.
    --crossprocess=CROSSPROCESS
        Type: bool
        Default: False
        Apply a random cross-process-style color grade. Defaults to False.
    --apocalypse=APOCALYPSE
        Type: bool
        Default: False
        Apply a red-orange Velvia 100 cross-process preset. Defaults to False.
    --ultramarine=ULTRAMARINE
        Type: bool
        Default: False
        Apply a blue-forward color grade inspired by Kodak Ultramax. Defaults to False.
    --roppongi=ROPPONGI
        Type: bool
        Default: False
        Apply a smooth fine-grain monochrome preset. Defaults to False.
    --classic=CLASSIC
        Type: bool
        Default: False
        Apply a classic high-acutance monochrome preset. Defaults to False.
    -n, --noise=NOISE
        Type: Optional[Union]
        Default: None
        Add Gaussian noise. Defaults to None.
    --overwrite=OVERWRITE
        Type: bool
        Default: False
        Overwrite original files. Defaults to False.
    --jpeg=JPEG
        Type: bool
        Default: False
        Save the processed image as JPEG instead of the default PNG.
    --version=VERSION
        Type: bool
        Default: False
        Show version. Defaults to False.
    -l, --line_drawing=LINE_DRAWING
        Type: bool
        Default: False
        Convert to a line drawing. Defaults to False.
    --posterize=POSTERIZE
        Type: Optional[Union]
        Default: None
        Posterize the image. Defaults to None.
    --vignette=VIGNETTE
        Type: Optional[Union]
        Default: None
        Darken image edges with a radial vignette. Defaults to None.

If a directory is specified in the path, an anshitsu_out directory will be created in the specified directory. Converted JPEG, PNG, and supported RAW images are stored in PNG format by default. Add --jpeg to save them as JPEG instead.

If you specify a JPEG, PNG, or supported RAW image file as the path, an anshitsu_out directory will be created in the directory where the image is stored. The same PNG default and --jpeg selection apply.

anshitsu photo.png
anshitsu photo.png --jpeg

RAW images are developed with rawpy before entering the normal Anshitsu processing pipeline. RAW support depends on the LibRaw support available through the installed rawpy version.

Note: Unsupported file formats are skipped during directory processing. If an unsupported file is specified directly, Pillow or the RAW loader will report an error.

Library Usage

Anshitsu can also be used as a small image processing library. The core API is Processor, which accepts a Pillow Image and returns a processed Pillow Image.

from anshitsu.image_io import open_image
from anshitsu.process.processor import Processor


image = open_image("input.jpg")

processed = Processor(
    image=image,
    rochester=True,
    vignette=0.4,
    noise=2.0,
).process()

processed.save("output.png")

The same API can be used from a web API, a desktop GUI application, or another Python script. The caller is responsible for reading the input image and saving or returning the processed image.

Processing Flow

Anshitsu applies selected operations in a fixed order. When multiple options are specified, this flow defines how they are combined.

flowchart TD
    input[Input image] --> alpha[Prepare input]
    alpha --> invert[Invert]
    invert --> correction[Base color correction]
    correction --> colorPresets[Color presets]
    colorPresets --> manual[Manual adjustments]
    manual --> monochrome[Monochrome presets]
    monochrome --> finishing[Finishing adjustments]
    finishing --> toning[Toning]
    toning --> output[Output conversion]
    output --> restoreAlpha[Restore alpha]
    restoreAlpha --> saved[Saved image]

    alpha -. keep_alpha .-> restoreAlpha

    correction --> caa[colorautoadjust]
    correction --> stretch[colorstretch]

    colorPresets --> rochester[rochester]
    colorPresets --> ashigara[ashigara]
    colorPresets --> crossprocess[crossprocess]
    colorPresets --> apocalypse[apocalypse]
    colorPresets --> ultramarine[ultramarine]

    manual --> color[color]
    manual --> brightness[brightness]
    manual --> sharpness[sharpness]
    manual --> posterize[posterize]

    monochrome --> grayscale[grayscale]
    monochrome --> ortho[orthochromatic]
    monochrome --> roppongi[roppongi]
    monochrome --> classic[classic]

    finishing --> contrast[contrast and tosaka contrast]
    finishing --> lineDrawing[line_drawing]
    finishing --> noise[noise]
    finishing --> vignette[vignette]

    toning --> sepia[sepia]
    toning --> cyanotype[cyanotype]

    output --> outputrgb[outputrgb]

Algorithms

The following algorithms are available in this tool.

RGBA to RGB Convert

Converts an image that contains Alpha, such as RGBA, to image data that does not contain Alpha. Transparent areas will be filled with white.

This algorithm is performed on any image file.

invert

Inverts the colors of an image using Pillow's built-in algorithm.

In the case of negative film, color conversion that takes into account the film base color is not performed, but we plan to follow up with a feature to be developed in the future.

colorautoadjust

Applies color correction using the Automatic Color Equalization algorithm described in the following paper.

This process is more time consuming than the algorithm used in "colorstretch", but it can reproduce more natural colors.

(References)

A. Rizzi, C. Gatta and D. Marini, "A new algorithm for unsupervised global and local color correction.", Pattern Recognition Letters, vol. 24, no. 11, 2003.

colorstretch

The "gray world" and "stretch" algorithms described in the following paper are combined to apply color correction.

This process is faster than the algorithm used in "colorautoadjust".

(References)

D. Nikitenko, M. Wirth and K. Trudel, "Applicability Of White-Balancing Algorithms to Restoring Faded Colour Slides: An Empirical Evaluation.", Journal of Multimedia, vol. 3, no. 5, 2008.

grayscale

Convert a color image to grayscale using the algorithm described in the following article.

Python でグレースケール(grayscale)化

Note: This article is written in Japanese.

orthochromatic

Converts a color image to orthochromatic-style grayscale.

This conversion darkens red tones and lifts blue tones to approximate the look of older orthochromatic film.

Tosaka mode

Tosaka mode is named after Tosaka-senpai's "Tri-X de banzen" line from "Kyūkyoku Chōjin R". It aims for a grainy black-and-white photo look similar to Kodak Tri-X film.

Use floating-point numbers when using this mode; values around 2.4 usually work well.

When this mode is specified, color images will also be converted to grayscale.

roppongi

Applies a smooth fine-grain monochrome preset inspired by Fujifilm ACROS.

This preset uses a mild orthopanchromatic response, compresses highlights, keeps blacks firm, and adds restrained fine grain.

classic

Applies a classic high-acutance monochrome preset inspired by Kodak TRI-X in Rodinal.

This preset is less aggressive than Tosaka mode. It uses a firm tone curve, visible but restrained grain, mild sharpening, and highlight protection.

outputrgb

Converts a monochrome image to RGB.

rochester

Applies a warm, low-saturation color grade inspired by Kodak PORTRA 400.

ashigara

Applies a vivid, high-contrast color grade inspired by Fujifilm Velvia 100.

crossprocess

Applies a random cross-process-style color grade.

Cross processing can produce unpredictable color shifts depending on film, chemistry, and exposure. This preset intentionally varies the color response each time it runs.

apocalypse

Applies a red-orange cross-process preset inspired by Fujifilm Velvia 100.

This preset leans into the orange-to-red color cast associated with cross-processing Velvia 100. The strength of the red shift varies slightly each time it runs.

ultramarine

Applies a blue-forward consumer color film grade inspired by Kodak Ultramax.

This preset emphasizes blues while keeping reds slightly restrained, with highlight compression to avoid harsh clipping.

noise

Add Gaussian noise.

To add noise, you need to specify a floating-point number; a value of about 10.0 will be just right.

vignette

Darkens image edges with a radial vignette.

To add a vignette, specify a floating-point number between 0.0 and 1.0.

Special Thanks

We are using the following libraries.

shunsukeaihara/colorcorrect

Metadata

Release files for anshitsu 4.2.0

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

Source distribution (sdist)

Source distribution for anshitsu 4.2.0
File Size Uploaded Provenance
anshitsu-4.2.0.tar.gz 25.1 kB Without provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for anshitsu 4.2.0
File Interpreter ABI Platform
anshitsu-4.2.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
anshitsu-4.2.0-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
anshitsu-4.2.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details

Total release size: 500.9 kB

Release files / anshitsu-4.2.0.tar.gz

Download URL anshitsu-4.2.0.tar.gz
Size 25.1 kB
Tags Source
SHA-256 checksum
How to use checksums
de9b152a085844d440996242e3b7b697440a64e7777eb7eb174fa9f457d63626
BLAKE2b-256 checksum
How to use checksums
81e61e7f99e52107213ce92cd9d27724e93ca3b7bb6cbbcbadd062d63dfe0c02
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.2 CPython/3.12.3 Linux/6.17.0-1020-azure

Release files / anshitsu-4.2.0-py3-none-win_amd64.whl

Download URL anshitsu-4.2.0-py3-none-win_amd64.whl
Size 100.7 kB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
4ce47632200a13a19a66c18bf90a88e9c457d09c698a5d0076aa8d69e026437e
BLAKE2b-256 checksum
How to use checksums
882fb0fdf77c6a942ae153a7a6aa5f6f21a48c8c38128ad687737983af0f150f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.2 CPython/3.12.3 Linux/6.17.0-1020-azure

Release files / anshitsu-4.2.0-py3-none-manylinux_2_28_x86_64.whl

Download URL anshitsu-4.2.0-py3-none-manylinux_2_28_x86_64.whl
Size 196.8 kB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
51c4a32166cdf941c3240f3647510d59c2c3a290a9e44d158fc6f1a00af1a405
BLAKE2b-256 checksum
How to use checksums
1113f9439497a88408b83c02ca4f2c3096adcd742573745d87e514cc1a479fbf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.2 CPython/3.12.3 Linux/6.17.0-1020-azure

Release files / anshitsu-4.2.0-py3-none-macosx_11_0_arm64.whl

Download URL anshitsu-4.2.0-py3-none-macosx_11_0_arm64.whl
Size 178.2 kB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f0192569dd447e5ea7299032e087b30974cfd2241f38e620ca759c058b880d00
BLAKE2b-256 checksum
How to use checksums
da472503dc2dbb0b0836e48bdc86cbadb1c1ec4d46c7bce68b34b3756ff47d51
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.2 CPython/3.12.3 Linux/6.17.0-1020-azure

Security for anshitsu 4.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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