import cv2 import numpy as np import os # 读取输入图像 image = cv2.imread('input.jpg') # 检查图像是否读取成功 if image is None: print("无法读取 'input.jpg',请确保文件存在且路径正确。") exit() # 获取图像的尺寸 height, width = image.shape[:2] # 定义小图片的数量(例如,将图像分割成 3 x 3 个小正方形) num_rows = 3 num_cols = 3 # 计算每个小正方形的尺寸 cell_height = height // num_rows cell_width = width // num_cols # 定义曲线的参数 curve_amplitude = min(cell_height, cell_width) / 6 # 曲线的幅度,可根据需要调整 curve_length_ratio = 1 / 3 # 曲线占分割线长度的中间三分之一 # 创建输出目录 output_dir = 'output' if not os.path.exists(output_dir): os.makedirs(output_dir) # 创建掩码列表,每个小图片对应一个掩码 masks = [] # 初始化掩码 for _ in range(num_rows * num_cols): mask = np.zeros((height, width), dtype=np.uint8) masks.append(mask) # 生成曲线偏移量的函数 def generate_curve(length, amplitude): x = np.linspace(0, length - 1, num=length) y = amplitude * np.sin(np.pi * (x / (length - 1))) return y.astype(int) # 设置每个小图片的区域为白色,并创建曲线分割线 for row in range(num_rows): for col in range(num_cols): index = row * num_cols + col mask = masks[index] # 定义当前小图片的边界 y_start = row * cell_height y_end = y_start + cell_height if row != num_rows - 1 else height x_start = col * cell_width x_end = x_start + cell_width if col != num_cols - 1 else width # 在掩码上设置小图片区域为白色 mask[y_start:y_end, x_start:x_end] = 255 # 创建垂直曲线分割线(列之间) for col in range(1, num_cols): x_line = col * cell_width # 曲线应用于垂直分割线的中间三分之一 curve_y_start = int(height * (1 - curve_length_ratio) / 2) curve_y_end = int(height * (1 + curve_length_ratio) / 2) curve_length = curve_y_end - curve_y_start # 生成曲线偏移量 y_offsets = generate_curve(curve_length, curve_amplitude) for i, y_offset in enumerate(y_offsets): y_pos = curve_y_start + i # 左侧小图片的掩码 left_index = (y_pos // cell_height) * num_cols + col - 1 if 0 <= left_index < len(masks): masks[left_index][y_pos, x_line - y_offset:] = 0 # 将右侧区域设为黑色 # 右侧小图片的掩码 right_index = (y_pos // cell_height) * num_cols + col if 0 <= right_index < len(masks): masks[right_index][y_pos, :x_line + y_offset] = 0 # 将左侧区域设为黑色 # 创建水平曲线分割线(行之间) for row in range(1, num_rows): y_line = row * cell_height # 曲线应用于水平分割线的中间三分之一 curve_x_start = int(width * (1 - curve_length_ratio) / 2) curve_x_end = int(width * (1 + curve_length_ratio) / 2) curve_length = curve_x_end - curve_x_start # 生成曲线偏移量 x_offsets = generate_curve(curve_length, curve_amplitude) for i, x_offset in enumerate(x_offsets): x_pos = curve_x_start + i # 上方小图片的掩码 top_index = (row - 1) * num_cols + (x_pos // cell_width) if 0 <= top_index < len(masks): masks[top_index][y_line - x_offset:, x_pos] = 0 # 将下方区域设为黑色 # 下方小图片的掩码 bottom_index = row * num_cols + (x_pos // cell_width) if 0 <= bottom_index < len(masks): masks[bottom_index][:y_line + x_offset, x_pos] = 0 # 将上方区域设为黑色 # 应用掩码并保存小图片 for index, mask in enumerate(masks): img_part = cv2.bitwise_and(image, image, mask=mask) output_path = os.path.join(output_dir, f'output{index + 1}.png') cv2.imwrite(output_path, img_part) print(f"图片已成功切割成 {num_rows * num_cols} 张,并保存到 'output' 目录下。")