Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add preserve_tone option to autocontrast #5350

Merged
merged 16 commits into from Mar 29, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 48 additions & 0 deletions Tests/test_imageops.py
Expand Up @@ -363,3 +363,51 @@ def test_auto_contrast_mask_real_input():
threshold=2,
msg="autocontrast without mask pixel incorrect",
)


def test_autocontrast_preserve_gradient():
from PIL import _imaging as core

gradient = Image.Image()._new(core.linear_gradient("L"))
elejke marked this conversation as resolved.
Show resolved Hide resolved

# test with a grayscale gradient that extends to 0,255.
# Should be a noop.
out = ImageOps.autocontrast(gradient, cutoff=0, preserve_tone=True)

assert_image_equal(gradient, out)

# cutoff the top and bottom
# autocontrast should make the first and list histogram entries equal
elejke marked this conversation as resolved.
Show resolved Hide resolved
# and should be 10% of the image pixels (+-, because integers)
elejke marked this conversation as resolved.
Show resolved Hide resolved
out = ImageOps.autocontrast(gradient, cutoff=10, preserve_tone=True)
hist = out.histogram()
assert hist[0] == hist[-1]
assert hist[-1] == 256 * round(256 * 0.10)

# in rgb
img = gradient.convert("RGB")
out = ImageOps.autocontrast(img, cutoff=0, preserve_tone=True)
assert_image_equal(img, out)


def test_autocontrast_preserve_onecolor():
def _test_one_color(color):
img = Image.new("RGB", (10, 10), color)

# single color images shouldn't change
out = ImageOps.autocontrast(img, cutoff=0, preserve_tone=True)
# remove when production
elejke marked this conversation as resolved.
Show resolved Hide resolved
assert_image_equal(img, out) # single color, no cutoff

# even if there is a cutoff
out = ImageOps.autocontrast(
img, cutoff=0, preserve_tone=True
) # single color 10 cutoff
radarhere marked this conversation as resolved.
Show resolved Hide resolved
assert_image_equal(img, out)

# succeeding
_test_one_color((255, 255, 255))
_test_one_color((127, 255, 0))
# failing
elejke marked this conversation as resolved.
Show resolved Hide resolved
_test_one_color((127, 127, 127))
_test_one_color((0, 0, 0))