|
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": |
|
|
|
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 |
|
|
|
|
|
if denoise_strength > 0: |
|
|
|
denoised_img = cv2.fastNlMeansDenoisingColored(resized_img, None, h=denoise_strength, templateWindowSize=7, searchWindowSize=21) |
|
else: |
|
denoised_img = resized_img |
|
|
|
|
|
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) |
|
|
|
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 |
|
|
|
|
|
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() |