lanzox / app.py
Serg4451D's picture
Update app.py
ca0a7fb verified
raw
history blame
4.09 kB
import gradio as gr
import cv2
import numpy as np
from PIL import Image, ImageEnhance
def compress_and_enhance(img, mode, denoise_strength):
"""
Сжимает изображение, уменьшая его в 2 раза по ширине, высоте или обоим измерениям,
затем увеличивает обратно с помощью интерполяции Ланцоша, применяет
агрессивное шумоподавление и корректирует насыщенность.
Args:
img: Изображение в формате PIL Image.
mode: Режим сжатия ("Width", "Height", "Both").
denoise_strength: Сила шумоподавления (от 0 до 10, где 0 - нет шумоподавления, 10 - максимальное).
Returns:
Обработанное изображение в формате PIL Image.
"""
img = np.array(img)
original_height, original_width = img.shape[:2]
if mode == "Width":
# Уменьшение по ширине
small_img = cv2.resize(img, (original_width // 2, original_height), interpolation=cv2.INTER_AREA)
# Увеличение обратно по ширине
resized_img = cv2.resize(small_img, (original_width, original_height), interpolation=cv2.INTER_LANCZOS4)
elif mode == "Height":
# Уменьшение по высоте
small_img = cv2.resize(img, (original_width, original_height // 2), interpolation=cv2.INTER_AREA)
# Увеличение обратно по высоте
resized_img = cv2.resize(small_img, (original_width, original_height), interpolation=cv2.INTER_LANCZOS4)
elif mode == "Both":
# Уменьшение в 2 раза
small_img = cv2.resize(img, (original_width // 2, original_height // 2), interpolation=cv2.INTER_AREA)
# Увеличение обратно
resized_img = cv2.resize(small_img, (original_width, original_height), interpolation=cv2.INTER_LANCZOS4)
else:
resized_img = img
# Агрессивное шумоподавление (Non-Local Means Denoising)
if denoise_strength > 0:
# h values from 3 (very low) to 10 (very high)
denoised_img = cv2.fastNlMeansDenoisingColored(resized_img, None, h=denoise_strength, templateWindowSize=7, searchWindowSize=21)
else:
denoised_img = resized_img
# Нерезкое маскирование (Unsharp Masking)
blurred = cv2.GaussianBlur(denoised_img, (0, 0), 3)
sharpened = cv2.addWeighted(denoised_img, 1.5, blurred, -0.5, 0)
# Коррекция насыщенности
pil_img = Image.fromarray(sharpened)
enhancer = ImageEnhance.Color(pil_img)
enhanced_img = enhancer.enhance(1.2) # Увеличение насыщенности на 20%
return enhanced_img
def process_image(img, mode, denoise_strength):
"""
Обрабатывает изображение.
Args:
img: Изображение.
mode: Режим сжатия.
denoise_strength: Сила шумоподавления.
Returns:
Обработанное изображение в формате PIL Image или None.
"""
if img is not None:
pil_img = Image.fromarray(img.astype('uint8'), 'RGB')
return compress_and_enhance(pil_img, mode, denoise_strength)
else:
return None
# Интерфейс Gradio
iface = gr.Interface(
fn=process_image,
inputs=[
gr.Image(type="numpy", label="Upload Image"),
gr.Radio(choices=["Width", "Height", "Both"], label="Compression Mode", value="Both"),
gr.Slider(minimum=0, maximum=10, step=1, label="Denoise Strength", value=0)
],
outputs=gr.Image(type="pil", label="Processed Image"),
title="Image Compression and Enhancement",
description="Compresses an image, applies aggressive denoising, and enhances saturation. Adjust the denoise strength for smoother results.",
)
iface.launch()