|
from typing import List, Tuple, Union |
|
import cv2 |
|
import numpy as np |
|
from PIL import Image |
|
|
|
class TableVisualizer: |
|
""" |
|
Utility class for visualizing detected tables and OCR results. |
|
""" |
|
|
|
@staticmethod |
|
def draw_boxes( |
|
image: Union[np.ndarray, Image.Image], |
|
boxes: List[List[int]], |
|
color: Tuple[int, int, int] = (0, 255, 0), |
|
thickness: int = 2 |
|
) -> Image.Image: |
|
""" |
|
Draw bounding boxes on an image. |
|
|
|
Args: |
|
image: Input image |
|
boxes: List of bounding box coordinates [x1, y1, x2, y2] |
|
color: RGB color for the boxes |
|
thickness: Line thickness |
|
|
|
Returns: |
|
Image with drawn bounding boxes |
|
""" |
|
if isinstance(image, Image.Image): |
|
image = np.array(image) |
|
|
|
if len(image.shape) == 2: |
|
image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) |
|
elif image.shape[2] == 4: |
|
image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB) |
|
|
|
image_copy = image.copy() |
|
|
|
for box in boxes: |
|
cv2.rectangle( |
|
image_copy, |
|
(box[0], box[1]), |
|
(box[2], box[3]), |
|
color, |
|
thickness |
|
) |
|
|
|
return Image.fromarray(image_copy) |
|
|
|
@staticmethod |
|
def draw_text_boxes( |
|
image: Union[np.ndarray, Image.Image], |
|
text_data: List[Tuple[str, List[int]]], |
|
color: Tuple[int, int, int] = (255, 0, 0), |
|
thickness: int = 1 |
|
) -> Image.Image: |
|
""" |
|
Draw text boxes with labels on an image. |
|
|
|
Args: |
|
image: Input image |
|
text_data: List of (text, bbox) tuples |
|
color: RGB color for the boxes |
|
thickness: Line thickness |
|
|
|
Returns: |
|
Image with drawn text boxes |
|
""" |
|
if isinstance(image, Image.Image): |
|
image = np.array(image) |
|
|
|
image_copy = image.copy() |
|
|
|
for text, bbox in text_data: |
|
cv2.rectangle( |
|
image_copy, |
|
(bbox[0], bbox[1]), |
|
(bbox[2], bbox[3]), |
|
color, |
|
thickness |
|
) |
|
cv2.putText( |
|
image_copy, |
|
text[:20], |
|
(bbox[0], bbox[1] - 5), |
|
cv2.FONT_HERSHEY_SIMPLEX, |
|
0.5, |
|
color, |
|
thickness |
|
) |
|
|
|
return Image.fromarray(image_copy) |