Я бы придерживался идеи использовать цветовое пространство HSV для идентификации областей с цветами, подобными сепии - как также упоминалось в одном из комментариев. Тем не менее, я бы выполнил обработку, используя NumPy и OpenCV , поскольку операции с массивами выполняются намного быстрее, чем итерирование пикселей в Pillow (PIL).
Вот мое решение:
import cv2
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image
# Calculate "sepia mask" using HSV color space; empirically set parameters
def sepia_mask(img):
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
sepia_lower = np.array([np.round( 30 / 2), np.round(0.10 * 255), np.round(0.10 * 255)])
sepia_upper = np.array([np.round( 45 / 2), np.round(0.60 * 255), np.round(0.90 * 255)])
return cv2.inRange(hsv, sepia_lower, sepia_upper)
# "Sepia kernel" for filtering; https://amin-ahmadi.com/2016/03/24/sepia-filter-opencv/
sepia_kernel = np.array([
[0.272, 0.534, 0.131],
[0.349, 0.686, 0.168],
[0.393, 0.769, 0.189]])
# Read image via Pillow; processing using OpenCV; sepia filtering
image_pil = Image.open('path/to/your/image.png')
image = np.flip(np.array(image_pil), 2)
sepia = cv2.transform(image, sepia_kernel)
# Outputs and sepia percentages
plt.figure(1, figsize=(9, 9))
plt.subplot(2, 2, 1), plt.imshow(np.flip(image, 2)), plt.title('Original image')
plt.subplot(2, 2, 2), plt.imshow(sepia_mask(image), cmap='gray')
perc = cv2.countNonZero(sepia_mask(image)) / np.prod(image.shape[:2])
plt.title('Sepia mask [' + str(perc) + ']')
plt.subplot(2, 2, 3), plt.imshow(np.flip(sepia, 2)), plt.title('Sepia filtered image')
plt.subplot(2, 2, 4), plt.imshow(sepia_mask(sepia), cmap='gray')
perc = cv2.countNonZero(sepia_mask(sepia)) / np.prod(sepia.shape[:2])
plt.title('Sepia mask [' + str(perc) + ']')
plt.tight_layout()
plt.show()
Вот несколько примерных выводов:
В зависимости от фактического "сепия" "вы хотите обнаружить, вам нужно адаптировать параметры в методе sepia_mask
. Как видите, я подсчитал некоторые «проценты сепии». Установите некоторые ограничения для классификации сепия / не сепия.
Надеюсь, что помогает!
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.1
Matplotlib: 3.2.0rc1
NumPy: 1.18.1
OpenCV: 4.1.2
Pillow: 7.0.0
----------------------------------------