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

100 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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]
# 创建九个掩码,初始化为全黑
masks = [np.zeros((height, width), dtype=np.uint8) for _ in range(9)]
# 定义曲线参数
num_bends = 9 # 弯曲次数
amplitude_h = height / 30 # 横向曲线的最大幅度
amplitude_v = width / 30 # 纵向曲线的最大幅度
# 定义幅度调节函数,使曲线在交点处的幅度为零,并平滑过渡
def amplitude_modifier(pos, center_pos, width):
return np.sin(np.pi * (pos - center_pos) / (2 * width)) ** 2
# 定义两条横向曲线(沿着 x 轴变化)
x = np.arange(width)
frequency_h = num_bends * np.pi / width
# 计算横向曲线的幅度调节,使在交点处幅度为零
amplitude_modifier_h1 = 1 - amplitude_modifier(x, width / 3, width / 6)
amplitude_modifier_h2 = 1 - amplitude_modifier(x, 2 * width / 3, width / 6)
# 计算横向曲线的 y 值
y_h1 = (height / 3) + (amplitude_h * amplitude_modifier_h1) * np.sin(frequency_h * x)
y_h2 = (2 * height / 3) + (amplitude_h * amplitude_modifier_h2) * np.sin(frequency_h * x)
y_h1 = np.clip(y_h1, 0, height - 1).astype(int)
y_h2 = np.clip(y_h2, 0, height - 1).astype(int)
# 定义两条纵向曲线(沿着 y 轴变化)
y = np.arange(height)
frequency_v = num_bends * np.pi / height
# 计算纵向曲线的幅度调节,使在交点处幅度为零
amplitude_modifier_v1 = 1 - amplitude_modifier(y, height / 3, height / 6)
amplitude_modifier_v2 = 1 - amplitude_modifier(y, 2 * height / 3, height / 6)
# 计算纵向曲线的 x 值
x_v1 = (width / 3) + (amplitude_v * amplitude_modifier_v1) * np.sin(frequency_v * y)
x_v2 = (2 * width / 3) + (amplitude_v * amplitude_modifier_v2) * np.sin(frequency_v * y)
x_v1 = np.clip(x_v1, 0, width - 1).astype(int)
x_v2 = np.clip(x_v2, 0, width - 1).astype(int)
# 创建掩码
for i in range(height):
for j in range(width):
y_curve1 = y_h1[j]
y_curve2 = y_h2[j]
x_curve1 = x_v1[i]
x_curve2 = x_v2[i]
# 判断所在区域
if i <= y_curve1:
if j <= x_curve1:
masks[0][i, j] = 255 # 左上角
elif j <= x_curve2:
masks[1][i, j] = 255 # 上中
else:
masks[2][i, j] = 255 # 右上角
elif i <= y_curve2:
if j <= x_curve1:
masks[3][i, j] = 255 # 中左
elif j <= x_curve2:
masks[4][i, j] = 255 # 中间
else:
masks[5][i, j] = 255 # 中右
else:
if j <= x_curve1:
masks[6][i, j] = 255 # 左下角
elif j <= x_curve2:
masks[7][i, j] = 255 # 下中
else:
masks[8][i, j] = 255 # 右下角
# 确保输出目录存在
output_dir = 'output'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 应用掩码并保存图片
for idx, mask in enumerate(masks):
img_part = cv2.bitwise_and(image, image, mask=mask)
cv2.imwrite(os.path.join(output_dir, f'output{idx+1}.png'), img_part)
print("图片已成功切割成9张并保存到 'output' 目录下。")