import gradio as gr from PIL import Image, ImageEnhance, ImageOps, ImageFilter from gradio_imageslider import ImageSlider def apply_filter(image, filter_name, intensity): if filter_name == "Soft Glow": glow = image.filter(ImageFilter.GaussianBlur(intensity)) enhanced_image = Image.blend(image, glow, 0.5) return enhanced_image elif filter_name == "Portrait Enhancer": enhancer = ImageEnhance.Sharpness(image) image = enhancer.enhance(1 + 0.1 * intensity) enhancer = ImageEnhance.Color(image) image = enhancer.enhance(1 + 0.1 * intensity) return image elif filter_name == "Warm Tone": warm_tone = ImageEnhance.Color(image).enhance(1 + 0.1 * intensity) return warm_tone elif filter_name == "Cold Tone": # 청록색 오버레이 적용 blue_overlay = Image.new('RGB', image.size, (173, 216, 230)) blended_image = Image.blend(image, blue_overlay, 0.05 * intensity) # 선명도 강화 enhancer = ImageEnhance.Sharpness(blended_image) sharpened_image = enhancer.enhance(1 + 0.3 * intensity) # 선명도 조정 return sharpened_image elif filter_name == "High-Key": enhancer = ImageEnhance.Brightness(image) high_key = enhancer.enhance(1 + 0.1 * intensity) enhancer = ImageEnhance.Contrast(high_key) high_key = enhancer.enhance(0.8 + 0.02 * intensity) return high_key elif filter_name == "Low-Key": enhancer = ImageEnhance.Contrast(image) low_key = enhancer.enhance(1 + 0.1 * intensity) enhancer = ImageEnhance.Brightness(low_key) low_key = enhancer.enhance(1 - 0.05 * intensity) return low_key elif filter_name == "Haze": haze = image.filter(ImageFilter.GaussianBlur(2 * intensity)) enhancer = ImageEnhance.Brightness(haze) haze = enhancer.enhance(1 + 0.05 * intensity) return haze elif filter_name == "Monochrome": mono = image.convert("L") mono = ImageOps.colorize(mono, black="black", white="white") enhancer = ImageEnhance.Contrast(mono) mono = enhancer.enhance(1 + 0.1 * intensity) return mono return image def get_filter_description(filter_name): descriptions = { "Soft Glow": "얼굴의 피부를 부드럽게 하면서 은은한 빛을 더해주는 필터입니다.", "Portrait Enhancer": "피부 톤을 균일하게 만들고, 눈을 밝게 하며, 얼굴의 입체감을 강조하는 필터입니다.", "Warm Tone": "사진에 따뜻한 색조를 적용하여 피부를 건강하게 보이게 합니다.", "Cold Tone": "아주 은은한 파란색 오버레이를 적용하고 선명도를 강화하여 시원하고 선명한 느낌을 주는 필터입니다.", "High-Key": "밝고 화사한 이미지를 만들어주는 필터입니다. 인물 사진에서 특히 화사한 분위기를 연출합니다.", "Low-Key": "어두운 톤을 강조하여 인물의 감정이나 분위기를 극적으로 표현하는 필터입니다.", "Haze": "부드럽고 흐릿한 효과를 주어 몽환적이고 로맨틱한 느낌을 주는 필터입니다.", "Monochrome": "특정 색조 하나만 사용하여 인물 사진을 단색으로 표현하는 필터입니다." } return descriptions.get(filter_name, "") def update_description(filter_name): return get_filter_description(filter_name) def process_image(image, filter_name, intensity): filtered_image = apply_filter(image, filter_name, intensity) return image, filtered_image # 원본 이미지와 필터 적용된 이미지 반환 with gr.Blocks() as iface: with gr.Row(): with gr.Column(): image_input = gr.Image(type="pil", label="이미지 업로드") filter_input = gr.Radio( ["Soft Glow", "Portrait Enhancer", "Warm Tone", "Cold Tone", "High-Key", "Low-Key", "Haze", "Monochrome"], label="필터 선택", value="Soft Glow" ) intensity_slider = gr.Slider(1, 10, value=5, step=1, label="필터 강도") description_output = gr.Markdown(get_filter_description("Soft Glow")) with gr.Column(): slider_output = ImageSlider(label="Before and After", type="pil") filter_input.change(fn=update_description, inputs=filter_input, outputs=description_output) process_button = gr.Button("필터 적용") process_button.click( fn=process_image, inputs=[image_input, filter_input, intensity_slider], outputs=slider_output ) iface.title = "인물 사진에 최적화된 필터" iface.description = "인물 사진에 최적화된 다양한 필터를 적용할 수 있습니다." if __name__ == "__main__": iface.launch()