Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import cv2
- import numpy as np
- import xml.etree.ElementTree as ET
- # Функция для извлечения настроек из XMP файла
- def extract_xmp_settings(xmp_data):
- settings = {}
- root = ET.fromstring(xmp_data)
- ns = {'crs': 'http://ns.adobe.com/camera-raw-settings/1.0/'}
- for elem in root.findall('.//crs:*', ns):
- key = elem.tag.split('}')[-1]
- value = elem.text.strip() # Удаление пробелов и переносов строк
- if value:
- try:
- # Попытка преобразовать значение в float или int
- settings[key] = float(value) if '.' in value else int(value)
- except ValueError:
- # Обработка исключения, если преобразование не удалось
- print(f"Не удалось преобразовать значение '{value}' для настройки '{key}'")
- return settings
- # Функция для применения настроек к изображению
- def apply_adjustments(image, settings):
- if 'Exposure2012' in settings:
- exposure = settings['Exposure2012']
- image = cv2.add(image, np.array([exposure * 255]).astype(np.uint8))
- if 'Contrast2012' in settings:
- contrast = settings['Contrast2012']
- image = cv2.convertScaleAbs(image, alpha=1 + contrast / 100)
- if 'Highlights2012' in settings:
- highlights = settings['Highlights2012']
- image = apply_highlights_adjustment(image, highlights)
- if 'Shadows2012' in settings:
- shadows = settings['Shadows2012']
- image = apply_shadows_adjustment(image, shadows)
- if 'Temperature' in settings:
- temperature = settings['Temperature']
- image = apply_temperature_adjustment(image, temperature)
- if 'Saturation' in settings:
- saturation = settings['Saturation']
- image = apply_saturation_adjustment(image, saturation)
- if 'Texture' in settings:
- texture = settings['Texture']
- image = apply_texture_adjustment(image, texture)
- if 'Dehaze' in settings:
- # Применение настройки устранения тумана
- dehaze = settings['Dehaze']
- image = apply_dehaze_adjustment(image, dehaze)
- if 'Vibrance' in settings:
- # Применение настройки вибрантности
- vibrance = settings['Vibrance']
- image = apply_vibrance_adjustment(image, vibrance)
- return image
- def apply_vibrance_adjustment(image, vibrance):
- hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
- h, s, v = cv2.split(hsv_image)
- increase_function = np.vectorize(lambda x: x + (1 - x / 255.0) * vibrance)
- s = increase_function(s).clip(0, 255).astype(np.uint8)
- final_hsv = cv2.merge((h, s, v))
- vibrant_image = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
- return vibrant_image
- def apply_dehaze_adjustment(image, dehaze):
- # Увеличение контраста
- contrast_enhanced = cv2.convertScaleAbs(image, alpha=1.0 + dehaze / 100)
- # Уменьшение серого оттенка (простая коррекция цвета)
- # Можно настроить коэффициенты для более точной коррекции
- gray_world = np.mean(contrast_enhanced, axis=(0, 1))
- gray_world_correction = contrast_enhanced * (gray_world / 255.0)
- corrected_image = np.clip(gray_world_correction, 0, 255).astype(np.uint8)
- return corrected_image
- def apply_saturation_adjustment(image, saturation):
- # Реализация применения насыщенности
- hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
- h, s, v = cv2.split(hsv)
- s = cv2.convertScaleAbs(s, alpha=1 + saturation / 100)
- final_hsv = cv2.merge((h, s, v))
- return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
- def apply_highlights_adjustment(image, highlights):
- hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
- h, s, v = cv2.split(hsv)
- highlight_mask = cv2.inRange(v, 150, 255)
- v = cv2.add(v, np.array([highlights], dtype=np.uint8), mask=highlight_mask)
- final_hsv = cv2.merge((h, s, v))
- return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
- def apply_shadows_adjustment(image, shadows):
- hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
- h, s, v = cv2.split(hsv)
- shadows_mask = cv2.inRange(v, 0, 105)
- v = cv2.add(v, np.array([shadows], dtype=np.uint8), mask=shadows_mask)
- final_hsv = cv2.merge((h, s, v))
- return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
- def apply_temperature_adjustment(image, temperature):
- adjustment = (temperature - 5000) / 10000.0
- b, g, r = cv2.split(image)
- if adjustment > 0:
- r = cv2.addWeighted(r, 1.0 + adjustment, r, 0, 0)
- else:
- b = cv2.addWeighted(b, 1.0 - adjustment, b, 0, 0)
- return cv2.merge((b, g, r))
- def apply_saturation_adjustment(image, saturation):
- hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
- h, s, v = cv2.split(hsv)
- s = cv2.convertScaleAbs(s, alpha=1 + saturation / 100)
- final_hsv = cv2.merge((h, s, v))
- return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
- def apply_texture_adjustment(image, texture):
- # Базовая реализация эффекта текстуры
- kernel_size = 3 # Размер ядра может быть настроен
- blurred = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
- texture_effect = cv2.addWeighted(image, 1.5, blurred, -0.5, 0)
- texture_effect = cv2.addWeighted(texture_effect, 1 + texture / 100, image, 0, 0)
- return texture_effect
- # Чтение XMP файла
- with open('settings/@danillainspiredpresetsbyiqbaal.xmp', 'r') as file:
- xmp_content = file.read()
- # Извлечение настроек из XMP
- xmp_settings = extract_xmp_settings(xmp_content)
- # Чтение изображения
- image = cv2.imread('example.jpg')
- # Применение настроек
- processed_image = apply_adjustments(image, xmp_settings)
- # Сохранение результата
- cv2.imwrite('processed_example.jpg', processed_image)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement