from cv2 import threshold import keras_ocr import cv2 import math import numpy as np import gradio as gr def midpoint(x1, y1, x2, y2): x_mid = int((x1 + x2)/2) y_mid = int((y1 + y2)/2) return (x_mid, y_mid) def segment_img(img): hsv=cv2.cvtColor(img,cv2.COLOR_RGB2HSV) #mask mask=cv2.inRange(hsv,(40,25,25),(70,255,255)) imask=mask>0 threshold=np.zeros_like(img,np.uint8) threshold[imask]=img[imask] return threshold #Main function that detects text and inpaints. #Inputs are the image path and kreas_ocr pipeline def inpaint_text(img_path, pipeline): # read the image img = keras_ocr.tools.read(img_path) #img=segment_img(img) # Recogize text (and corresponding regions) # Each list of predictions in prediction_groups is a list of # (word, box) tuples. prediction_groups = pipeline.recognize([img]) #Define the mask for inpainting mask = np.zeros(img.shape[:2], dtype="uint8") for box in prediction_groups[0]: x0, y0 = box[1][0] x1, y1 = box[1][1] x2, y2 = box[1][2] x3, y3 = box[1][3] x_mid0, y_mid0 = midpoint(x1, y1, x2, y2) x_mid1, y_mi1 = midpoint(x0, y0, x3, y3) #For the line thickness, we will calculate the length of the line between #the top-left corner and the bottom-left corner. thickness = int(math.sqrt( (x2 - x1)**2 + (y2 - y1)**2 )) #Define the line and inpaint cv2.line(mask, (x_mid0, y_mid0), (x_mid1, y_mi1), 255, thickness) inpainted_img = cv2.inpaint(img, mask, 7, cv2.INPAINT_NS) return (inpainted_img) # keras-ocr will automatically download pretrained # weights for the detector and recognizer. pipeline = keras_ocr.pipeline.Pipeline() def RemoveText(image): img_text_removed = inpaint_text(image, pipeline) return cv2.cvtColor(img_text_removed, cv2.COLOR_BGR2RGB) iface = gr.Interface(fn=RemoveText, inputs=gr.inputs.Image(label="Image to Remove Text From", type="numpy"), outputs="image", examples=[["1.jpg"]], title="Remove Text for Image") iface.launch(debug=True)