import PIL.Image import numpy as nd import cv2 import io import base64 from io import BytesIO def toPIL(array: nd.array) -> PIL.Image: return PIL.Image.fromarray(array).convert('RGB') def toBytes(pilImage : PIL.Image) -> bytes: img_byte_arr = io.BytesIO() pilImage.save(img_byte_arr, format='JPEG') return img_byte_arr.getvalue() def toBASE64(pilImage : PIL.Image) -> str: buffered = BytesIO() pilImage.save(buffered, format="JPEG") img_str = base64.b64encode(buffered.getvalue()) def redLines(bgr) -> nd.array: # Convert the image to grayscale# if len(bgr) == 0: return bgr cont = bgr.copy() gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY) # Threshold the image to create a binary mask _, thresh = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV) # Set the line size (adjust as needed) linesize = 25 # Remove horizontal lines horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (linesize, 1)) remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2) cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(cont, [c], -1, (255, 0, 0), 2) # Draw in red # Remove vertical lines vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, linesize)) remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2) cnts = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(cont, [c], -1, (255, 0, 0), 2) # Draw in red return cont