Hekaya7 / utils /comic_panel_splitter.py
XA7's picture
First
ff489da
import cv2
import numpy as np
import os
import time
from datetime import datetime
def log_execution(func):
def wrapper(*args, **kwargs):
start_time = time.time()
start_str = datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:%S')
result = func(*args, **kwargs)
end_time = time.time()
end_str = datetime.fromtimestamp(end_time).strftime('%Y-%m-%d %H:%M:%S')
duration = end_time - start_time
return result
return wrapper
@log_execution
def split_comic_panels(image_path, output_dir):
img = cv2.imread(image_path)
if img is None:
print(f"Error: Could not read image from {image_path}")
return
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th = cv2.adaptiveThreshold(gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,
blockSize=51, C=10)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,15))
clean = cv2.morphologyEx(th, cv2.MORPH_CLOSE, kernel)
cnts, _ = cv2.findContours(clean, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
panels = []
for c in cnts:
area = cv2.contourArea(c)
if area < 10000:
continue
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
panels.append((cv2.boundingRect(approx), c))
@log_execution
def panel_key(item):
(x,y,w,h), _ = item
return (y//50, x)
panels_sorted = sorted(panels, key=panel_key)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for i, ((x,y,w,h), contour) in enumerate(panels_sorted, 1):
crop = img[y:y+h, x:x+w]
cv2.imwrite(os.path.join(output_dir, f"panel_{i:02d}.png"), crop)
if __name__ == "__main__":
if not os.path.exists("comic_page.jpg"):
dummy_image = np.zeros((600, 800, 3), dtype=np.uint8)
cv2.putText(dummy_image, "Comic Page", (300, 300), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
cv2.rectangle(dummy_image, (50, 50), (350, 250), (255,255,255), 5)
cv2.rectangle(dummy_image, (400, 50), (750, 250), (255,255,255), 5)
cv2.rectangle(dummy_image, (50, 300), (750, 550), (255,255,255), 5)
cv2.imwrite("comic_page.jpg", dummy_image)
if not os.path.exists("output_panels"):
os.makedirs("output_panels")
split_comic_panels("comic_page.jpg", "output_panels")
print("Comic panels split and saved to output_panels directory.")