Files
jigsaw/split05.py
2024-12-03 11:34:51 +13:00

65 lines
2.2 KiB
Python

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)