|
import cv2 |
|
import numpy as np |
|
import os |
|
import zipfile |
|
import uuid |
|
import gradio as gr |
|
import uuid |
|
|
|
|
|
def remove_watermark_area(original_image, text_mask_path): |
|
|
|
text_mask = cv2.imread(text_mask_path, cv2.IMREAD_GRAYSCALE) |
|
_, binary_mask = cv2.threshold(text_mask, 1, 255, cv2.THRESH_BINARY) |
|
|
|
|
|
mask_resized = cv2.resize(binary_mask, (original_image.shape[1], original_image.shape[0])) |
|
|
|
|
|
kernel = np.ones((5, 5), np.uint8) |
|
expanded_mask = cv2.dilate(mask_resized, kernel, iterations=1) |
|
|
|
|
|
inpainted_image = cv2.inpaint(original_image, expanded_mask, inpaintRadius=5, flags=cv2.INPAINT_TELEA) |
|
|
|
|
|
cleaned_image = cv2.GaussianBlur(inpainted_image, (3, 3), 0) |
|
|
|
return cleaned_image |
|
from PIL import Image |
|
|
|
def remove_watermark(image_path,file_type="",saved_path=""): |
|
|
|
|
|
|
|
if file_type=="filepath": |
|
|
|
image = cv2.imread(image_path) |
|
if file_type=="pil": |
|
image = cv2.cvtColor(image_path, cv2.COLOR_RGB2BGR) |
|
if file_type=="opencv": |
|
image=image_path |
|
|
|
image=cv2.resize(image,(1280,1280)) |
|
|
|
height, width, _ = image.shape |
|
watermark_width = 185 |
|
watermark_height = 185 |
|
x_start = 50 |
|
y_start = height - watermark_height+17 |
|
x_end = watermark_width-17 |
|
y_end = height-50 |
|
|
|
|
|
watermark_area = image[y_start:y_end, x_start:x_end] |
|
|
|
|
|
|
|
|
|
text_mask_path ='./mask/mask_1.png' |
|
|
|
cleaned_image = remove_watermark_area(watermark_area, text_mask_path) |
|
|
|
|
|
image[y_start:y_end, x_start:x_end] = cleaned_image |
|
if saved_path=="": |
|
pass |
|
else: |
|
cv2.imwrite(saved_path, image) |
|
return image |
|
|
|
def make_zip(image_list): |
|
zip_path = f"./temp/{uuid.uuid4().hex[:6]}.zip" |
|
with zipfile.ZipFile(zip_path, 'w') as zipf: |
|
for image in image_list: |
|
zipf.write(image, os.path.basename(image)) |
|
return zip_path |
|
|
|
def random_image_name(): |
|
"""Generate a random image name.""" |
|
return str(uuid.uuid4())[:8] |
|
|
|
|
|
def process_file(pil_image): |
|
saved_path = f"./temp/{random_image_name()}.jpg" |
|
remove_watermark(pil_image,"pil",saved_path) |
|
return saved_path, saved_path |
|
|
|
|
|
def process_files(image_files): |
|
image_list = [] |
|
if len(image_files) == 1: |
|
|
|
|
|
saved_path = f"./temp/{random_image_name()}.jpg" |
|
remove_watermark(image_files[0],"filepath", saved_path) |
|
return saved_path, saved_path |
|
else: |
|
for image_path in image_files: |
|
|
|
|
|
saved_path = f"./temp/{random_image_name()}.jpg" |
|
remove_watermark(image_path,"filepath",saved_path) |
|
image_list.append(saved_path) |
|
zip_path = make_zip(image_list) |
|
return zip_path,None |
|
|
|
|
|
import cv2 |
|
import numpy as np |
|
|
|
|
|
|
|
def process_video(input_video_path): |
|
print(input_video_path) |
|
|
|
|
|
output_video_path=f"./temp/{random_image_name()}.mp4" |
|
cap = cv2.VideoCapture(input_video_path) |
|
|
|
if not cap.isOpened(): |
|
raise ValueError(f"Unable to open video file {input_video_path}") |
|
|
|
fps = cap.get(cv2.CAP_PROP_FPS) |
|
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
|
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
|
|
|
|
|
fourcc = cv2.VideoWriter_fourcc(*'mp4v') |
|
video_writer = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height)) |
|
|
|
|
|
while cap.isOpened(): |
|
ret, frame = cap.read() |
|
if not ret: |
|
break |
|
no_watermark_frame=remove_watermark(frame,"opencv") |
|
|
|
|
|
if no_watermark_frame.shape[1] != width or no_watermark_frame.shape[0] != height: |
|
no_watermark_frame = cv2.resize(no_watermark_frame, (width, height)) |
|
|
|
video_writer.write(no_watermark_frame) |
|
|
|
cap.release() |
|
video_writer.release() |
|
return output_video_path,output_video_path |
|
|
|
if not os.path.exists("./temp"): |
|
os.mkdir("./temp") |
|
|
|
|
|
meta_examples = ["./images/7.jpg","./images/6.jpg","./images/1.jpg", "./images/2.jpg", "./images/3.jpg", "./images/4.jpg", "./images/5.jpg"] |
|
|
|
gradio_input=[gr.Image(label='Upload an Image')] |
|
gradio_Output=[gr.File(label='Download Image'),gr.Image(label='Display Image')] |
|
gradio_interface = gr.Interface(fn=process_file, inputs=gradio_input,outputs=gradio_Output , |
|
title="Meta Watermark Remover For Image", |
|
examples=meta_examples) |
|
|
|
|
|
|
|
|
|
gradio_multiple_images = gr.Interface( |
|
process_files, |
|
[gr.File(type='filepath', file_count='multiple',label='Upload Images')], |
|
[gr.File(label='Download File'),gr.Image(label='Display Image')], |
|
title='Meta Watermark Remover For Bulk Images', |
|
cache_examples=True |
|
) |
|
|
|
|
|
meta_video_examples = [ "./videos/2.mp4","./videos/1.mp4"] |
|
|
|
gradio_video_input=[gr.Video(label='Upload Video')] |
|
gradio_video_Output=[gr.File(label='Download Video'),gr.Video(label='Display Video')] |
|
gradio_video_interface = gr.Interface(fn=process_video, inputs=gradio_video_input,outputs=gradio_video_Output , |
|
title="Meta Watermark Remover For Video", |
|
examples=meta_video_examples) |
|
|
|
|
|
demo = gr.TabbedInterface([gradio_interface, gradio_video_interface,gradio_multiple_images], ["Meta Watermark Remover For Image","Meta Watermark Remover For Video","Meta Watermark Remover For Bulk Images"],title="Meta Watermark Remover") |
|
|
|
demo.queue().launch() |