Source code for src.cytodataframe.image
"""
Helper functions for working with images in the context of CytoDataFrames.
"""
import cv2
import numpy as np
from PIL import Image, ImageEnhance
[docs]
def is_image_too_dark(image: Image, pixel_brightness_threshold: float = 10.0) -> bool:
"""
Check if the image is too dark based on the mean brightness.
By "too dark" we mean not as visible to the human eye.
Args:
image (Image):
The input PIL Image.
threshold (float):
The brightness threshold below which the image is considered too dark.
Returns:
bool:
True if the image is too dark, False otherwise.
"""
# Convert the image to a numpy array and then to grayscale
img_array = np.array(image)
gray_image = cv2.cvtColor(img_array, cv2.COLOR_RGBA2GRAY)
# Calculate the mean brightness
mean_brightness = np.mean(gray_image)
return mean_brightness < pixel_brightness_threshold
[docs]
def adjust_image_brightness(image: Image) -> Image:
"""
Adjust the brightness of an image using histogram equalization.
Args:
image (Image):
The input PIL Image.
Returns:
Image:
The brightness-adjusted PIL Image.
"""
# Convert the image to numpy array and then to grayscale
img_array = np.array(image)
gray_image = cv2.cvtColor(img_array, cv2.COLOR_RGBA2GRAY)
# Apply histogram equalization to improve the contrast
equalized_image = cv2.equalizeHist(gray_image)
# Convert back to RGBA
img_array[:, :, 0] = equalized_image # Update only the R channel
img_array[:, :, 1] = equalized_image # Update only the G channel
img_array[:, :, 2] = equalized_image # Update only the B channel
# Convert back to PIL Image
enhanced_image = Image.fromarray(img_array)
# Slightly reduce the brightness
enhancer = ImageEnhance.Brightness(enhanced_image)
reduced_brightness_image = enhancer.enhance(0.7)
return reduced_brightness_image