import cv2 import numpy as np def generate_curve_points(width, height, num_points=10): """生成曲线的控制点,并绘制平滑曲线""" # 随机生成控制点 points = np.array([(x, np.random.randint(0, height)) for x in np.linspace(0, width, num_points)]) # 使用样条曲线生成平滑曲线 curve = cv2.approxPolyDP(points, 1, closed=False) return curve.reshape(-1, 2) def split_image_with_curve(image, curve, grid_size=10): """使用曲线将图像分割为小块""" h, w = image.shape[:2] grid_h, grid_w = h // grid_size, w // grid_size pieces = [] # 遍历每个网格块 for i in range(grid_size): for j in range(grid_size): # 计算网格块的范围 x_start, y_start = j * grid_w, i * grid_h x_end, y_end = x_start + grid_w, y_start + grid_h # 创建一个空白掩膜并绘制曲线 mask = np.zeros((grid_h, grid_w), dtype=np.uint8) curve_segment = curve[np.logical_and(curve[:, 0] >= x_start, curve[:, 0] <= x_end)] for k in range(len(curve_segment) - 1): cv2.line(mask, tuple(curve_segment[k]), tuple(curve_segment[k + 1]), 255, 2) # 将网格块切成上下两部分 part1 = cv2.bitwise_and(image[y_start:y_end, x_start:x_end], image[y_start:y_end, x_start:x_end], mask=mask) part2 = cv2.bitwise_and(image[y_start:y_end, x_start:x_end], image[y_start:y_end, x_start:x_end], mask=cv2.bitwise_not(mask)) pieces.append((part1, part2)) return pieces # 主程序 if __name__ == "__main__": # 加载正方形图片 image_path = "input.jpg" # 替换为你的图片路径 image = cv2.imread(image_path) if image is None: print("无法加载图片,请检查路径!") exit() # 确保图片是正方形 h, w = image.shape[:2] if h != w: print("图片不是正方形,请提供正方形图片!") exit() # 生成曲线 curve = generate_curve_points(w, h) # 切割图片 pieces = split_image_with_curve(image, curve) # 保存分割块 for idx, (part1, part2) in enumerate(pieces): cv2.imwrite(f"part1_{idx}.png", part1) cv2.imwrite(f"part2_{idx}.png", part2)