Spaces:
Sleeping
Sleeping
""" | |
Grid splitting functionality. | |
""" | |
import os | |
import cv2 | |
import numpy as np | |
from loguru import logger | |
def create_output_directory(output_dir): | |
""" | |
Create output directory if it doesn't exist. | |
Args: | |
output_dir (str): Path to output directory | |
Returns: | |
str: Path to created directory | |
""" | |
if not os.path.exists(output_dir): | |
os.makedirs(output_dir) | |
logger.info(f"Created output directory: {output_dir}") | |
return output_dir | |
def split_animal_illustrations(image_path, output_dir='split_animals', rows=3, cols=6): | |
""" | |
Split a grid of animal illustrations into individual images. | |
Args: | |
image_path (str): Path to the input image with multiple animal illustrations | |
output_dir (str): Directory where individual animal images will be saved | |
rows (int): Number of rows in the grid | |
cols (int): Number of columns in the grid | |
Returns: | |
list: Paths to the extracted animal images | |
""" | |
# Create output directory | |
output_dir = create_output_directory(output_dir) | |
extracted_paths = [] | |
# Read the image | |
logger.info(f"Reading image from: {image_path}") | |
img = cv2.imread(image_path) | |
if img is None: | |
logger.error(f"Could not read image from {image_path}") | |
return extracted_paths | |
# Convert to grayscale for processing | |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
# Get image dimensions | |
height, width = img.shape[:2] | |
# Calculate cell dimensions | |
cell_height = height // rows | |
cell_width = width // cols | |
# Extract each cell | |
count = 0 | |
for row in range(rows): | |
for col in range(cols): | |
# Calculate coordinates | |
x1 = col * cell_width | |
y1 = row * cell_height | |
x2 = x1 + cell_width | |
y2 = y1 + cell_height | |
# Extract the region | |
cell_img = img[y1:y2, x1:x2] | |
# Check if cell contains significant content | |
gray_cell = cv2.cvtColor(cell_img, cv2.COLOR_BGR2GRAY) | |
if np.mean(gray_cell) > 240: # Skip nearly blank cells | |
logger.debug(f"Skipping blank cell at row {row+1}, col {col+1}") | |
continue | |
# Save the extracted image | |
count += 1 | |
output_path = os.path.join(output_dir, f"animal_{count:02d}.png") | |
cv2.imwrite(output_path, cell_img) | |
extracted_paths.append(output_path) | |
logger.info(f"Saved: {output_path}") | |
logger.info(f"Extraction complete. {count} images extracted to {output_dir}") | |
return extracted_paths | |
def is_blank_image(image, threshold=240): | |
""" | |
Check if an image is mostly blank (white). | |
Args: | |
image (numpy.ndarray): Image array | |
threshold (int): Brightness threshold (0-255) | |
Returns: | |
bool: True if image is mostly blank | |
""" | |
if len(image.shape) == 3: | |
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
else: | |
gray = image | |
return np.mean(gray) > threshold | |