Skip to main content

Calculator for Circle of Confusion (CoC) to calculate the size in pixels of an area, used for depth of field processing.

Project description

Tests License Version PyPI - Downloads Python Versions

Circle of Confusion

Calculator for Circle of Confusion (CoC) to calculate the size in pixels of an area, used for depth of field processing.

It's built in Rust and compiled to Web Assembly (wasm32) for non-rust targets.

In Rust to use the library in no-std: enable the no-std feature. Add the project to your Cargo.toml by using

cargo add circle-of-confusion

# or for no-std:
cargo add circle-of-confusion --features no-std

Or in your Python project:

uv add circle-of-confusion

To build yourself, you need to have protoc installed and Rust. For wasm packages you need to have the wasm32-unknown-unknown target installed.

It is not made compatible with Windows, but you can build it in a Linux based container.

Usage

The calculator is able to calculate the Circle of Confusion based on the provided settings. The size in px is the radius of the convolution. A CoC of 10 would mean a diameter of 20 pixels.

Output:

  • + is for far field pixels
  • - is for near field pixels

Modes

The calculator supports two modes, one is physically accurate, the other lets you tune your own DoF size.

Manually

When no camera data is provided to the Settings struct (just give the parameter a None), the manual mode will be used. This creates a smooth falloff to the focal plane point, based on the size and max size added. It will gradually apply the size based on the distance from the focal plane. When using a larger size, the CoC will be increased. Protect can be used to apply a safe region to the focal plane.

Camera

When the camera data is applied to the settings, the camera values will be used instead. This matches real world CoC values. Lowering f-stop will increase the CoC values, just like increasing the focal-length would. This calculation is based on the CoC algorithm: Wikipedia

Examples

It's really simple to use, you need to assemble the settings to calculate the circle of confusion. The interface identical (besides the obvious syntax differences) for Rust and Python. For example for camera based calculations:

Python

from circle_of_confusion import (
    CircleOfConfusionCalculator,
    calculate,
    CircleOfConfusionSettings,
    Math,
    CameraData,
    WorldUnit,
    Resolution,
    Filmback,
)

camera_data = CameraData(
    focal_length=100.0,
    f_stop=2.0,
    filmback=Filmback(width=24.576, height=18.672),
    near_field=0.1,
    far_field=10000.0,
    world_unit=WorldUnit.M,
    resolution=Resolution(width=1920, height=1080),
)
settings = CircleOfConfusionSettings(
    size=10.0,
    max_size=100.0,
    math=Math.REAL,
    focal_plane=30.0,
    protect=0.0,
    pixel_aspect=1.0,
    camera_data=camera_data,
)
calculator = CircleOfConfusionCalculator(settings)
result = calculate(calculator, 10.0)  # input distance value from Z-depth
assert result == -11.93532943725586

Rust

use circle_of_confusion::{CircleOfConfusionCalculator, CircleOfConfusionSettings, Math, CameraData, WorldUnit, Filmback, Resolution};

fn main() {
    let camera_data = CameraData {
        focal_length: 100.0,
        f_stop: 2.0,
        filmback: Filmback { width: 24.576, height: 18.672 },
        near_field: 0.1,
        far_field: 10000.0,
        world_unit: WorldUnit::M.into(),
        resolution: Resolution { width: 1920, height: 1080 },
    };
    let settings = CircleOfConfusionSettings {
        size: 10.0,
        max_size: 100.0,
        math: Math::Real.into(),
        focal_plane: 30.0,
        protect: 0.0,
        pixel_aspect: 1.0,
        camera_data: Some(camera_data),
    };
    let calculator = CircleOfConfusionCalculator::new(settings);
    let result = calculator.calculate(10.0); // input distance value from Z-depth
    assert_eq!(result, -11.935329);
}

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

circle_of_confusion-0.2.2.tar.gz (20.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

circle_of_confusion-0.2.2-py3-none-any.whl (45.4 kB view details)

Uploaded Python 3

File details

Details for the file circle_of_confusion-0.2.2.tar.gz.

File metadata

  • Download URL: circle_of_confusion-0.2.2.tar.gz
  • Upload date:
  • Size: 20.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.8

File hashes

Hashes for circle_of_confusion-0.2.2.tar.gz
Algorithm Hash digest
SHA256 b70271346e4ad20487a1b7369c47eafac8ab0a350dfdcbaf2fded4dcd0476b46
MD5 d7acbe4aac41744c1499e754e7cfd4c4
BLAKE2b-256 9756301948ab7625771d00196a6c5cd98184c78e1b64b2ec249ed16d840fd752

See more details on using hashes here.

File details

Details for the file circle_of_confusion-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for circle_of_confusion-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ef1a2ade3d9a9b64a6037ff896f95b2a03bd0260ec3676fa116d4d90cccc3a99
MD5 edff190343a680c2f789440caa415d57
BLAKE2b-256 0796d26c07f508c5e8db83509b3486d6b110337c9bdc1adc567151abacf87a6f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page