|
import os |
|
import cv2 |
|
import tempfile |
|
from pathlib import Path |
|
|
|
import gradio as gr |
|
import numpy as np |
|
from PIL import Image, ImageEnhance, ImageFilter |
|
from modelscope.outputs import OutputKeys |
|
from modelscope.pipelines import pipeline |
|
from modelscope.utils.constant import Tasks |
|
|
|
|
|
img_colorization = pipeline( |
|
Tasks.image_colorization, |
|
model="iic/cv_ddcolor_image-colorization" |
|
) |
|
|
|
def colorize_image(img_path: str) -> str: |
|
image = cv2.imread(str(img_path)) |
|
output = img_colorization(image[..., ::-1]) |
|
result = output[OutputKeys.OUTPUT_IMG].astype(np.uint8) |
|
|
|
temp_dir = tempfile.mkdtemp() |
|
out_path = os.path.join(temp_dir, "colorized.png") |
|
cv2.imwrite(out_path, result) |
|
return out_path |
|
|
|
def enhance_image( |
|
img_path: str, |
|
brightness: float = 1.0, |
|
contrast: float = 1.0, |
|
edge_enhance: bool = False |
|
) -> str: |
|
image = Image.open(img_path) |
|
|
|
|
|
image = ImageEnhance.Brightness(image).enhance(brightness) |
|
|
|
image = ImageEnhance.Contrast(image).enhance(contrast) |
|
|
|
if edge_enhance: |
|
image = image.filter(ImageFilter.EDGE_ENHANCE) |
|
|
|
temp_dir = tempfile.mkdtemp() |
|
enhanced_path = os.path.join(temp_dir, "enhanced.png") |
|
image.save(enhanced_path) |
|
return enhanced_path |
|
|
|
def process_image( |
|
img_path: str, |
|
brightness: float, |
|
contrast: float, |
|
edge_enhance: bool, |
|
output_format: str |
|
): |
|
|
|
colorized_path = colorize_image(img_path) |
|
|
|
enhanced_path = enhance_image(colorized_path, brightness, contrast, edge_enhance) |
|
|
|
img = Image.open(enhanced_path) |
|
temp_dir = tempfile.mkdtemp() |
|
filename = f"colorized_image.{output_format.lower()}" |
|
output_path = os.path.join(temp_dir, filename) |
|
img.save(output_path, format=output_format.upper()) |
|
|
|
|
|
return ([img_path, enhanced_path], output_path) |
|
|
|
|
|
custom_css = """ |
|
/* Overall background */ |
|
body { |
|
background-color: #f0f2f5; |
|
} |
|
|
|
/* Center the Gradio container and give it a max width */ |
|
.gradio-container { |
|
max-width: 900px !important; |
|
margin: auto !important; |
|
} |
|
|
|
/* Header styling */ |
|
#header { |
|
background-color: #4CAF50; |
|
padding: 20px; |
|
border-radius: 8px; |
|
text-align: center; |
|
margin-bottom: 20px; |
|
} |
|
#header h2 { |
|
color: white; |
|
margin: 0; |
|
font-size: 2rem; |
|
} |
|
#header p { |
|
color: white; |
|
margin: 5px 0 0 0; |
|
font-size: 1rem; |
|
} |
|
|
|
/* White panel for controls */ |
|
#control-panel { |
|
background-color: white; |
|
padding: 20px; |
|
border-radius: 8px; |
|
box-shadow: 0px 2px 8px rgba(0,0,0,0.1); |
|
margin-bottom: 20px; |
|
} |
|
|
|
/* Style the “Colorize” button */ |
|
#submit-btn { |
|
background-color: #4CAF50 !important; |
|
color: white !important; |
|
border-radius: 8px !important; |
|
font-weight: bold; |
|
padding: 10px 20px !important; |
|
margin-top: 10px !important; |
|
} |
|
|
|
/* Add some spacing around sliders and checkbox */ |
|
#control-panel .gr-row { |
|
gap: 15px; |
|
} |
|
.gr-slider, .gr-checkbox, .gr-dropdown { |
|
margin-top: 10px; |
|
} |
|
|
|
/* Gallery panel styling */ |
|
#comparison_gallery { |
|
background-color: white; |
|
padding: 10px; |
|
border-radius: 8px; |
|
box-shadow: 0px 2px 8px rgba(0,0,0,0.1); |
|
} |
|
|
|
/* Download button spacing */ |
|
#download-btn { |
|
margin-top: 15px !important; |
|
} |
|
""" |
|
|
|
TITLE = "🌈 Color Restorization Model" |
|
DESCRIPTION = "Bring your old black & white photos back to life—upload, adjust, and download in vivid color." |
|
|
|
with gr.Blocks(title=TITLE, css=custom_css) as app: |
|
|
|
gr.HTML( |
|
""" |
|
<div id="header"> |
|
<h2>🌈 Color Restorization Model</h2> |
|
<p>Bring your old black & white photos back to life—upload, adjust, and download in vivid color.</p> |
|
</div> |
|
""" |
|
) |
|
|
|
|
|
with gr.Column(elem_id="control-panel"): |
|
with gr.Row(): |
|
|
|
with gr.Column(): |
|
input_image = gr.Image( |
|
type="filepath", |
|
label="Upload B&W Image", |
|
tool="editor", |
|
interactive=True |
|
) |
|
brightness_slider = gr.Slider( |
|
minimum=0.5, maximum=2.0, value=1.0, |
|
label="Brightness" |
|
) |
|
contrast_slider = gr.Slider( |
|
minimum=0.5, maximum=2.0, value=1.0, |
|
label="Contrast" |
|
) |
|
edge_enhance_checkbox = gr.Checkbox( |
|
label="Apply Edge Enhancement" |
|
) |
|
output_format_dropdown = gr.Dropdown( |
|
choices=["PNG", "JPEG", "TIFF"], |
|
value="PNG", |
|
label="Output Format" |
|
) |
|
submit_btn = gr.Button( |
|
"Colorize", |
|
elem_id="submit-btn" |
|
) |
|
|
|
|
|
with gr.Column(): |
|
comparison_gallery = gr.Gallery( |
|
label="Original vs. Colorized", |
|
columns=2, |
|
elem_id="comparison_gallery", |
|
height="auto" |
|
) |
|
download_btn = gr.File( |
|
label="Download Colorized Image", |
|
elem_id="download-btn" |
|
) |
|
|
|
submit_btn.click( |
|
fn=process_image, |
|
inputs=[ |
|
input_image, |
|
brightness_slider, |
|
contrast_slider, |
|
edge_enhance_checkbox, |
|
output_format_dropdown |
|
], |
|
outputs=[comparison_gallery, download_btn] |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
port = int(os.environ.get("PORT", 7860)) |
|
app.queue().launch(server_name="0.0.0.0", server_port=port) |
|
|