From 8277768df8050c233d2b908cbe979b225c6751e0 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Tue, 18 Jun 2024 22:55:07 +0100 Subject: [PATCH] Add gamma --- src/editor/operations/gamma.ipynb | 58 +++++++++++++++++++++++++++++++ src/editor/operations/gamma.py | 12 +++++++ 2 files changed, 70 insertions(+) create mode 100644 src/editor/operations/gamma.ipynb create mode 100644 src/editor/operations/gamma.py diff --git a/src/editor/operations/gamma.ipynb b/src/editor/operations/gamma.ipynb new file mode 100644 index 0000000..627aeb6 --- /dev/null +++ b/src/editor/operations/gamma.ipynb @@ -0,0 +1,58 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from gamma import get_random_gamma\n", + "\n", + "\n", + "all = np.array([])\n", + "for i in range(100000):\n", + " img = np.power(np.linspace(0, 1, 256), get_random_gamma()) / 128\n", + " all = np.append(all, np.sum(img))\n", + "\n", + "hist, bin_edges = np.histogram(all, bins=100)\n", + "plt.figure(figsize=(5, 3))\n", + "plt.plot(bin_edges[1:], list(hist))\n", + "plt.grid(True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "bipolaroid", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/editor/operations/gamma.py b/src/editor/operations/gamma.py new file mode 100644 index 0000000..6aca821 --- /dev/null +++ b/src/editor/operations/gamma.py @@ -0,0 +1,12 @@ +import numpy as np +from random import choice +from PIL import Image + + +def adjust_gamma(img: Image, gamma: float) -> Image: + return img.point(lambda x: (x / 255) ** gamma * 255) + + +def get_random_gamma() -> float: + gamma = np.random.beta(1, 2) * 0.6 + return 1 / (1 + gamma) if choice([True, False]) else (gamma + 1)