Spaces:
Sleeping
Sleeping
import gradio as gr | |
import cv2 | |
import numpy as np | |
from PIL import Image, ImageEnhance | |
from gradio_imageslider import ImageSlider | |
def apply_filter(image, filter_type, intensity): | |
image = np.array(image) | |
normalized_intensity = intensity / 100.0 | |
if filter_type == "Grayscale": | |
return convert_to_grayscale(image) | |
elif filter_type == "Soft Glow": | |
base_intensity = 0.1 | |
adjusted_intensity = base_intensity + (normalized_intensity * (1 - base_intensity)) | |
gaussian = cv2.GaussianBlur(image, (15, 15), 0) | |
soft_glow = cv2.addWeighted(image, 1 - adjusted_intensity, gaussian, adjusted_intensity, 0) | |
return soft_glow | |
elif filter_type == "Portrait Enhancer": | |
base_intensity = 0.5 | |
adjusted_intensity = base_intensity + (normalized_intensity * (1 - base_intensity)) | |
image_pil = Image.fromarray(image) | |
enhancer = ImageEnhance.Sharpness(image_pil) | |
image_pil = enhancer.enhance(1 + 0.5 * adjusted_intensity) | |
enhancer = ImageEnhance.Color(image_pil) | |
image_pil = enhancer.enhance(1 + 0.5 * adjusted_intensity) | |
enhanced_image = np.array(image_pil) | |
return enhanced_image | |
elif filter_type == "Warm Tone": | |
warm_image = cv2.addWeighted(image, 1.0, np.full(image.shape, (20, 66, 112), dtype=np.uint8), 0.3 * normalized_intensity, 0) | |
return warm_image | |
elif filter_type == "Cold Tone": | |
cold_image = cv2.addWeighted(image, 1.0, np.full(image.shape, (112, 66, 20), dtype=np.uint8), 0.3 * normalized_intensity, 0) | |
return cold_image | |
elif filter_type == "High-Key": | |
high_key = cv2.convertScaleAbs(image, alpha=1.0 + 0.3 * normalized_intensity, beta=20) | |
return high_key | |
elif filter_type == "Low-Key": | |
low_key = cv2.convertScaleAbs(image, alpha=1.0 - 0.1 * normalized_intensity, beta=-10) | |
return low_key | |
elif filter_type == "Haze": | |
haze = cv2.addWeighted(image, 1.0, np.full(image.shape, 255, dtype=np.uint8), 0.3 * normalized_intensity, 0) | |
return haze | |
else: | |
return image | |
def convert_to_grayscale(image): | |
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
return cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR) | |
def convert_and_save(image, filter_type, intensity): | |
image_cv = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) | |
filtered_image = apply_filter(image_cv, filter_type, intensity) | |
filtered_image_pil = Image.fromarray(cv2.cvtColor(filtered_image, cv2.COLOR_BGR2RGB)) | |
output_path = "filtered_image.jpg" | |
filtered_image_pil.save(output_path) | |
return filtered_image_pil, output_path | |
def generate_slider_images(image, filter_type, intensity): | |
image_cv = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) | |
filtered_image = apply_filter(image_cv, filter_type, intensity) | |
filtered_image_pil = Image.fromarray(cv2.cvtColor(filtered_image, cv2.COLOR_BGR2RGB)) | |
return [image, filtered_image_pil] | |
def get_filter_description(filter_type): | |
descriptions = { | |
"Grayscale": "이미지를 흑백으로 변환합니다.", | |
"Soft Glow": "부드러운 빛을 추가하여 이미지를 은은하게 만듭니다.", | |
"Portrait Enhancer": "피부 톤을 균일하게 하고 선명도를 조절하여 인물을 더욱 돋보이게 만듭니다.", | |
"Warm Tone": "따뜻한 색조를 추가하여 이미지에 온기를 더합니다.", | |
"Cold Tone": "차가운 색조를 추가하여 이미지에 시원함을 더합니다.", | |
"High-Key": "밝고 화사한 이미지를 만들어냅니다.", | |
"Low-Key": "어두운 톤을 강조하여 분위기 있는 이미지를 만듭니다.", | |
"Haze": "부드럽고 흐릿한 효과를 추가하여 몽환적인 이미지를 만듭니다." | |
} | |
return descriptions.get(filter_type, "") | |
with gr.Blocks() as iface: | |
with gr.Row(): | |
with gr.Column(): | |
image_input = gr.Image(type="pil", label="이미지 업로드") | |
filter_input = gr.Radio( | |
["Grayscale", "Soft Glow", "Portrait Enhancer", "Warm Tone", "Cold Tone", "High-Key", "Low-Key", "Haze"], | |
label="필터 선택", | |
value="Soft Glow" | |
) | |
intensity_slider = gr.Slider(1, 100, value=50, label="필터 강도") | |
description_output = gr.Markdown(get_filter_description("Soft Glow")) | |
with gr.Column(): | |
image_slider = ImageSlider(label="필터 전후 비교", type="pil") | |
download_link = gr.File(label="Download Filtered Image") | |
filter_input.change(fn=get_filter_description, inputs=filter_input, outputs=description_output) | |
process_button = gr.Button("필터 적용") | |
process_button.click( | |
fn=generate_slider_images, | |
inputs=[image_input, filter_input, intensity_slider], | |
outputs=[image_slider] | |
) | |
iface.title = "인물 사진에 최적화된 필터" | |
iface.description = "인물 사진에 최적화된 다양한 필터를 적용할 수 있습니다." | |
iface.launch() | |