Pontarids's picture
Update app.py
4400fe0 verified
import gradio as gr
from rembg import remove
from PIL import Image as PILImage, ImageFilter, Image
from io import BytesIO
import requests
import cv2
import numpy as np
import webbrowser
def remove_and_replace_background(subject, background, blur_radius, replace_background, use_color_picker, color):
with open(subject, 'rb') as subject_img_file:
subject_img = subject_img_file.read()
subject_no_bg = remove(subject_img, alpha_matting=True, alpha_matting_foreground_threshold=10)
subject_img_no_bg = PILImage.open(BytesIO(subject_no_bg)).convert("RGBA")
if replace_background:
if use_color_picker:
background_img = PILImage.new("RGBA", subject_img_no_bg.size, color)
else:
background_img = PILImage.open(background).convert("RGBA")
background_img = background_img.filter(ImageFilter.GaussianBlur(radius=blur_radius))
background_img = background_img.resize(subject_img_no_bg.size)
combined_img = PILImage.alpha_composite(background_img, subject_img_no_bg)
combined_img.save("combined_image.png")
return "combined_image.png"
else:
subject_img_no_bg.save("subject_no_bg.png")
return "subject_no_bg.png"
def upscale_image(input_image_path, output_image_path, engine_id, api_key, api_host="https://api.stability.ai", width=None, height=None):
with open(input_image_path, "rb") as file:
image_data = file.read()
headers = {
"Accept": "image/png",
"Authorization": f"Bearer {api_key}",
}
files = {
"image": image_data,
}
data = {}
if width:
data["width"] = width
if height:
data["height"] = height
response = requests.post(
f"{api_host}/v1/generation/{engine_id}/image-to-image/upscale",
headers=headers,
files=files,
data=data
)
if response.status_code != 200:
raise Exception(f"Non-200 response: {response.text}")
try:
nparr = np.frombuffer(response.content, np.uint8)
img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
img_np = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
except Exception as e:
raise Exception(f"Invalid image data: {e}")
cv2.imwrite(output_image_path, img_np)
return output_image_path
def upscale_gradio(input_image):
output_image_path = "upscaled_image.png"
input_image_path = "input_image.png"
if np.max(input_image) > 1:
cv2.imwrite(input_image_path, np.array(input_image))
else:
cv2.imwrite(input_image_path, np.array(input_image) * 255)
upscale_image(input_image_path, output_image_path, "esrgan-v1-x2plus", "sk-snxMfG2LVsLyezE46G9GSxgEBMy9a2rBVsIBQWCrd3n6L5pP", width=1024)
return output_image_path
def gray(input_img):
image_path = 'image_gray.png'
image = cv2.cvtColor(input_img, cv2.COLOR_RGB2GRAY)
cv2.imwrite(image_path, image)
return image_path
def adjust_brightness_and_darkness(input_img, brightness_enabled, brightness_value, darkness_enabled, darkness_value):
image = input_img.copy()
if brightness_enabled:
mat = np.ones(image.shape, dtype='uint8') * brightness_value
image = cv2.add(image, mat)
if darkness_enabled:
mat = np.ones(image.shape, dtype='uint8') * darkness_value
image = cv2.subtract(image, mat)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_path = 'adjusted_image.png'
cv2.imwrite(image_path, image_rgb)
return image_path
def rotate_image(img_input, degrees):
image_path = 'rotated.png'
height, width = img_input.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((width / 2, height / 2), degrees, 1)
rotated_image = cv2.warpAffine(img_input, rotation_matrix, (width, height))
rotated_image_rgb = cv2.cvtColor(rotated_image, cv2.COLOR_BGR2RGB)
cv2.imwrite(image_path, rotated_image_rgb)
return image_path
def generate_iopaint_link():
return "https://huggingface.co/spaces/Pontarids/IOPaint_Runner"
def skew_image(image, horizontal_skew, vertical_skew):
image_np = np.array(image)
rows, cols, ch = image_np.shape
horizontal_factor = horizontal_skew / 100.0
vertical_factor = vertical_skew / 100.0
M_horizontal = np.float32([[1, horizontal_factor, 0],
[0, 1, 0],
[0, 0, 1]])
M_vertical = np.float32([[1, 0, 0],
[vertical_factor, 1, 0],
[0, 0, 1]])
skewed_image_horizontal = cv2.warpPerspective(image_np, M_horizontal, (cols, rows))
skewed_image_vertical = cv2.warpPerspective(skewed_image_horizontal, M_vertical, (cols, rows))
skewed_image = Image.fromarray(skewed_image_vertical)
return skewed_image
with gr.Blocks() as demo:
with gr.Tab("Remove and Replace Background"):
subject_img_input = gr.Image(type="filepath")
background_img_input = gr.Image(type="filepath")
blur_radius_slider = gr.Slider(0, 100, label="Blur Radius")
replace_bg_checkbox = gr.Checkbox(label="Replace Background")
use_color_picker_checkbox = gr.Checkbox(label="Use Color Picker")
color_picker = gr.ColorPicker(label="Background Color")
processed_img_output = gr.Image()
submit_button = gr.Button("Submit")
submit_button.click(remove_and_replace_background, inputs=[subject_img_input, background_img_input, blur_radius_slider, replace_bg_checkbox, use_color_picker_checkbox, color_picker], outputs=processed_img_output)
with gr.Tab("Upscale Image"):
img_input_upscale = gr.Image()
img_output_upscale = gr.Image()
img_button_upscale = gr.Button("Submit")
img_button_upscale.click(upscale_gradio, inputs=img_input_upscale, outputs=img_output_upscale)
with gr.Tab("Gray"):
img_input_gray = gr.Image()
img_output_gray = gr.Image()
img_button_gray = gr.Button("Submit")
img_button_gray.click(gray, inputs=img_input_gray, outputs=img_output_gray)
with gr.Tab("Brightness and Darkness"):
img_input_contrast = gr.Image()
brightness_checkbox = gr.Checkbox(label="Enable Brightness Adjustment")
brightness_slider = gr.Slider(0, 255, label="Brightness Value")
darkness_checkbox = gr.Checkbox(label="Enable Darkness Adjustment")
darkness_slider = gr.Slider(0, 255, label="Darkness Value")
img_output_contrast = gr.Image()
img_button_contrast = gr.Button("Submit")
img_button_contrast.click(adjust_brightness_and_darkness, inputs=[img_input_contrast, brightness_checkbox, brightness_slider, darkness_checkbox, darkness_slider], outputs=img_output_contrast)
with gr.Tab("Rotate Image"):
temp_slider = gr.Slider(minimum=0, maximum=360, interactive=True, label="Slide me")
img_input_rotate = gr.Image()
img_output_rotate = gr.Image()
img_button_rotate = gr.Button("Submit")
img_button_rotate.click(rotate_image, inputs=[img_input_rotate, temp_slider], outputs=img_output_rotate)
with gr.Tab("Skew Tool"):
image_input = gr.Image(type="pil", label="Upload an image")
horizontal_slider = gr.Slider(minimum=-100, maximum=100, value=0, label="Horizontal Skew")
vertical_slider = gr.Slider(minimum=-100, maximum=100, value=0, label="Vertical Skew")
output_image = gr.Image(type="pil", label="Skewed Image")
submit_button_skew = gr.Button("Submit")
submit_button_skew.click(skew_image, inputs=[image_input, horizontal_slider, vertical_slider], outputs=output_image)
with gr.Tab("Object Remover πŸ‘‘"):
link_output = gr.Markdown()
link_button = gr.Button("Generate IOPaint Link")
link_button.click(generate_iopaint_link, outputs=link_output)
demo.launch(share=True)